00001 #include <AT91SAM7S64.h>
00002 #include <interrupt-utils.h>
00003 #include <string.h>
00004 #include <debug-uart.h>
00005 #include <ctype.h>
00006 #include <stdio.h>
00007 #include <dev/cc2420.h>
00008 #include <dev/cc2420_const.h>
00009 #include <dev/spi.h>
00010 #include <dev/leds.h>
00011 #include <sys/process.h>
00012 #include <sys/procinit.h>
00013 #include <sys/autostart.h>
00014 #include <sys/etimer.h>
00015 #include <net/psock.h>
00016 #include <unistd.h>
00017
00018 #include <stepper-steps.h>
00019 #include <stepper.h>
00020 #include <stepper-move.h>
00021
00022 #include "net/mac/nullmac.h"
00023 #include "net/rime.h"
00024
00025
00026 #ifndef RF_CHANNEL
00027 #define RF_CHANNEL 15
00028 #endif
00029
00030 #ifndef WITH_UIP
00031 #define WITH_UIP 1
00032 #endif
00033
00034 #if WITH_UIP
00035 #include "net/uip.h"
00036 #include "net/uip-fw.h"
00037 #include "net/uip-fw-drv.h"
00038 #include "net/uip-over-mesh.h"
00039
00040 static struct uip_fw_netif meshif =
00041 {UIP_FW_NETIF(172,16,0,0, 255,255,0,0, uip_over_mesh_send)};
00042
00043 #define UIP_OVER_MESH_CHANNEL 9
00044
00045 #endif
00046
00047 static rimeaddr_t node_addr = {{0,2}};
00048
00049 extern char __heap_end__;
00050 extern char __heap_start__;
00051
00052
00053 static const uint32_t stepper0_steps_acc[] = MICRO_STEP(0,3);
00054 static const uint32_t stepper0_steps_run[] = MICRO_STEP(0,2);
00055 static const uint32_t stepper0_steps_hold[] = MICRO_STEP(0,1);
00056
00057 static const uint32_t stepper1_steps_acc[] = MICRO_STEP(1,3);
00058 static const uint32_t stepper1_steps_run[] = MICRO_STEP(1,2);
00059 static const uint32_t stepper1_steps_hold[] = MICRO_STEP(1,1);
00060
00061 static StepperAccSeq seq_heap[40];
00062
00063 static void
00064 init_seq_heap()
00065 {
00066 unsigned int i;
00067 for(i = 0; i < sizeof(seq_heap)/sizeof(seq_heap[0]); i++) {
00068 seq_heap[i].next = NULL;
00069 stepper_free_seq(&seq_heap[i]);
00070 }
00071 }
00072
00073 static void
00074 robot_stepper_init()
00075 {
00076 init_seq_heap();
00077 stepper_init(AT91C_BASE_TC0, AT91C_ID_TC0);
00078 *AT91C_PIOA_OER = STEPPER_INHIBIT;
00079 *AT91C_PIOA_MDER = STEPPER_INHIBIT;
00080 *AT91C_PIOA_CODR = STEPPER_INHIBIT;
00081 stepper_init_io(1, STEPPER_IOMASK(0), stepper0_steps_acc,
00082 stepper0_steps_run, stepper0_steps_hold,
00083 (sizeof(stepper0_steps_run) / sizeof(stepper0_steps_run[0])));
00084 stepper_init_io(0, STEPPER_IOMASK(1), stepper1_steps_acc,
00085 stepper1_steps_run, stepper1_steps_hold,
00086 (sizeof(stepper1_steps_run) / sizeof(stepper1_steps_run[0])));}
00087
00088
00089 #if 0
00090
00091 static void
00092 wdt_setup()
00093 {
00094
00095 }
00096 #endif
00097
00098 static void
00099 wdt_reset()
00100 {
00101 *AT91C_WDTC_WDCR = (0xa5<<24) | AT91C_WDTC_WDRSTT;
00102 }
00103
00104 #if 0
00105 static uip_ipaddr_t gw_addr = {{172,16,0,1}};
00106 #endif
00107
00108
00109 int
00110 main()
00111 {
00112 disableIRQ();
00113 disableFIQ();
00114 *AT91C_AIC_IDCR = 0xffffffff;
00115 *AT91C_PMC_PCDR = 0xffffffff;
00116 *AT91C_PMC_PCER = (1 << AT91C_ID_PIOA);
00117
00118 dbg_setup_uart();
00119 printf("Initialising\n");
00120 leds_arch_init();
00121 clock_init();
00122 process_init();
00123 process_start(&etimer_process, NULL);
00124 ctimer_init();
00125
00126 robot_stepper_init();
00127
00128 enableIRQ();
00129
00130 cc2420_init();
00131 cc2420_set_pan_addr(0x2024, 0, &uip_hostaddr.u16[1]);
00132 cc2420_set_channel(RF_CHANNEL);
00133 rime_init(nullmac_init(&cc2420_driver));
00134 printf("CC2420 setup done\n");
00135
00136 rimeaddr_set_node_addr(&node_addr);
00137
00138 #if WITH_UIP
00139 {
00140 uip_ipaddr_t hostaddr, netmask;
00141
00142 uip_init();
00143
00144 uip_ipaddr(&hostaddr, 172,16,
00145 rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1]);
00146 uip_ipaddr(&netmask, 255,255,0,0);
00147 uip_ipaddr_copy(&meshif.ipaddr, &hostaddr);
00148 printf("Host addr\n");
00149 uip_sethostaddr(&hostaddr);
00150 uip_setnetmask(&netmask);
00151 uip_over_mesh_set_net(&hostaddr, &netmask);
00152
00153
00154 uip_fw_default(&meshif);
00155 printf("Mesh init\n");
00156 uip_over_mesh_init(UIP_OVER_MESH_CHANNEL);
00157 printf("uIP started with IP address %d.%d.%d.%d\n",
00158 uip_ipaddr_to_quad(&hostaddr));
00159 }
00160 #endif
00161
00162
00163 #if WITH_UIP
00164 process_start(&tcpip_process, NULL);
00165 process_start(&uip_fw_process, NULL);
00166 #endif
00167
00168 printf("Heap size: %ld bytes\n", &__heap_end__ - (char*)sbrk(0));
00169 printf("Started\n");
00170
00171 autostart_start(autostart_processes);
00172 printf("Processes running\n");
00173 while(1) {
00174 do {
00175
00176 wdt_reset();
00177 } while(process_run() > 0);
00178
00179
00180 *AT91C_PMC_SCDR |= AT91C_PMC_PCK;
00181 }
00182 return 0;
00183 }