These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
EMAC/uIP/lpc17xx_port/main.c@0:bf7b9fba3924, 2011-03-20 (annotated)
- Committer:
- frank26080115
- Date:
- Sun Mar 20 05:38:56 2011 +0000
- Revision:
- 0:bf7b9fba3924
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frank26080115 | 0:bf7b9fba3924 | 1 | #include <stdio.h> |
frank26080115 | 0:bf7b9fba3924 | 2 | #include <string.h> |
frank26080115 | 0:bf7b9fba3924 | 3 | |
frank26080115 | 0:bf7b9fba3924 | 4 | #include "debug_frmwrk.h" |
frank26080115 | 0:bf7b9fba3924 | 5 | #include "clock-arch.h" |
frank26080115 | 0:bf7b9fba3924 | 6 | #include "timer.h" |
frank26080115 | 0:bf7b9fba3924 | 7 | #include "uip-conf.h" |
frank26080115 | 0:bf7b9fba3924 | 8 | #include "uipopt.h" |
frank26080115 | 0:bf7b9fba3924 | 9 | #include "uip_arp.h" |
frank26080115 | 0:bf7b9fba3924 | 10 | #include "uip.h" |
frank26080115 | 0:bf7b9fba3924 | 11 | #include "emac.h" |
frank26080115 | 0:bf7b9fba3924 | 12 | #include "lpc_types.h" |
frank26080115 | 0:bf7b9fba3924 | 13 | #include "lpc17xx_libcfg.h" |
frank26080115 | 0:bf7b9fba3924 | 14 | #include "lpc17xx_pinsel.h" |
frank26080115 | 0:bf7b9fba3924 | 15 | #include "lpc17xx_gpio.h" |
frank26080115 | 0:bf7b9fba3924 | 16 | |
frank26080115 | 0:bf7b9fba3924 | 17 | |
frank26080115 | 0:bf7b9fba3924 | 18 | #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) |
frank26080115 | 0:bf7b9fba3924 | 19 | |
frank26080115 | 0:bf7b9fba3924 | 20 | #define LED_PIN (1<<6) |
frank26080115 | 0:bf7b9fba3924 | 21 | #define LED2_MASK ((1<<2) | (1<<3) | (1<<4) | (1<<5) | (1<<6)) |
frank26080115 | 0:bf7b9fba3924 | 22 | #define LED1_MASK ((1<<28) | (1<<29) | (1<<31)) |
frank26080115 | 0:bf7b9fba3924 | 23 | |
frank26080115 | 0:bf7b9fba3924 | 24 | |
frank26080115 | 0:bf7b9fba3924 | 25 | /* For debugging... */ |
frank26080115 | 0:bf7b9fba3924 | 26 | #include <stdio.h> |
frank26080115 | 0:bf7b9fba3924 | 27 | #define DB _DBG((uint8_t *)_db) |
frank26080115 | 0:bf7b9fba3924 | 28 | char _db[64]; |
frank26080115 | 0:bf7b9fba3924 | 29 | |
frank26080115 | 0:bf7b9fba3924 | 30 | void LED_Init (void) |
frank26080115 | 0:bf7b9fba3924 | 31 | { |
frank26080115 | 0:bf7b9fba3924 | 32 | PINSEL_CFG_Type PinCfg; |
frank26080115 | 0:bf7b9fba3924 | 33 | |
frank26080115 | 0:bf7b9fba3924 | 34 | uint8_t temp; |
frank26080115 | 0:bf7b9fba3924 | 35 | |
frank26080115 | 0:bf7b9fba3924 | 36 | PinCfg.Funcnum = 0; |
frank26080115 | 0:bf7b9fba3924 | 37 | PinCfg.OpenDrain = 0; |
frank26080115 | 0:bf7b9fba3924 | 38 | PinCfg.Pinmode = 0; |
frank26080115 | 0:bf7b9fba3924 | 39 | PinCfg.Portnum = 2; |
frank26080115 | 0:bf7b9fba3924 | 40 | for (temp = 2; temp <= 6; temp++){ |
frank26080115 | 0:bf7b9fba3924 | 41 | PinCfg.Pinnum = temp; |
frank26080115 | 0:bf7b9fba3924 | 42 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 43 | } |
frank26080115 | 0:bf7b9fba3924 | 44 | |
frank26080115 | 0:bf7b9fba3924 | 45 | PinCfg.Funcnum = 0; |
frank26080115 | 0:bf7b9fba3924 | 46 | PinCfg.OpenDrain = 0; |
frank26080115 | 0:bf7b9fba3924 | 47 | PinCfg.Pinmode = 0; |
frank26080115 | 0:bf7b9fba3924 | 48 | PinCfg.Portnum = 1; |
frank26080115 | 0:bf7b9fba3924 | 49 | PinCfg.Pinnum = 28; |
frank26080115 | 0:bf7b9fba3924 | 50 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 51 | PinCfg.Pinnum = 29; |
frank26080115 | 0:bf7b9fba3924 | 52 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 53 | PinCfg.Pinnum = 31; |
frank26080115 | 0:bf7b9fba3924 | 54 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 55 | |
frank26080115 | 0:bf7b9fba3924 | 56 | // Set direction to output |
frank26080115 | 0:bf7b9fba3924 | 57 | GPIO_SetDir(2, LED2_MASK, 1); |
frank26080115 | 0:bf7b9fba3924 | 58 | GPIO_SetDir(1, LED1_MASK, 1); |
frank26080115 | 0:bf7b9fba3924 | 59 | |
frank26080115 | 0:bf7b9fba3924 | 60 | /* Turn off all LEDs */ |
frank26080115 | 0:bf7b9fba3924 | 61 | GPIO_ClearValue(2, LED2_MASK); |
frank26080115 | 0:bf7b9fba3924 | 62 | GPIO_ClearValue(1, LED1_MASK); |
frank26080115 | 0:bf7b9fba3924 | 63 | } |
frank26080115 | 0:bf7b9fba3924 | 64 | |
frank26080115 | 0:bf7b9fba3924 | 65 | /************************************************************************* |
frank26080115 | 0:bf7b9fba3924 | 66 | * Function Name: uip_log |
frank26080115 | 0:bf7b9fba3924 | 67 | * Parameters: none |
frank26080115 | 0:bf7b9fba3924 | 68 | * |
frank26080115 | 0:bf7b9fba3924 | 69 | * Return: none |
frank26080115 | 0:bf7b9fba3924 | 70 | * |
frank26080115 | 0:bf7b9fba3924 | 71 | * Description: Events logging |
frank26080115 | 0:bf7b9fba3924 | 72 | * |
frank26080115 | 0:bf7b9fba3924 | 73 | *************************************************************************/ |
frank26080115 | 0:bf7b9fba3924 | 74 | void uip_log (char *m) |
frank26080115 | 0:bf7b9fba3924 | 75 | { |
frank26080115 | 0:bf7b9fba3924 | 76 | _DBG("uIP log message: "); |
frank26080115 | 0:bf7b9fba3924 | 77 | _DBG(m); |
frank26080115 | 0:bf7b9fba3924 | 78 | _DBG_(""); |
frank26080115 | 0:bf7b9fba3924 | 79 | } |
frank26080115 | 0:bf7b9fba3924 | 80 | |
frank26080115 | 0:bf7b9fba3924 | 81 | /************************************************************************* |
frank26080115 | 0:bf7b9fba3924 | 82 | * Function Name: main |
frank26080115 | 0:bf7b9fba3924 | 83 | * Parameters: none |
frank26080115 | 0:bf7b9fba3924 | 84 | * |
frank26080115 | 0:bf7b9fba3924 | 85 | * Return: none |
frank26080115 | 0:bf7b9fba3924 | 86 | * |
frank26080115 | 0:bf7b9fba3924 | 87 | * Description: main |
frank26080115 | 0:bf7b9fba3924 | 88 | * |
frank26080115 | 0:bf7b9fba3924 | 89 | *************************************************************************/ |
frank26080115 | 0:bf7b9fba3924 | 90 | int c_entry(void) |
frank26080115 | 0:bf7b9fba3924 | 91 | { |
frank26080115 | 0:bf7b9fba3924 | 92 | UNS_32 i, delay; |
frank26080115 | 0:bf7b9fba3924 | 93 | uip_ipaddr_t ipaddr; |
frank26080115 | 0:bf7b9fba3924 | 94 | struct timer periodic_timer, arp_timer; |
frank26080115 | 0:bf7b9fba3924 | 95 | |
frank26080115 | 0:bf7b9fba3924 | 96 | /* Initialize debug via UART0 |
frank26080115 | 0:bf7b9fba3924 | 97 | * 115200bps |
frank26080115 | 0:bf7b9fba3924 | 98 | * 8 data bit |
frank26080115 | 0:bf7b9fba3924 | 99 | * No parity |
frank26080115 | 0:bf7b9fba3924 | 100 | * 1 stop bit |
frank26080115 | 0:bf7b9fba3924 | 101 | * No flow control |
frank26080115 | 0:bf7b9fba3924 | 102 | */ |
frank26080115 | 0:bf7b9fba3924 | 103 | debug_frmwrk_init(); |
frank26080115 | 0:bf7b9fba3924 | 104 | |
frank26080115 | 0:bf7b9fba3924 | 105 | _DBG_("Hello NXP Semiconductors"); |
frank26080115 | 0:bf7b9fba3924 | 106 | _DBG_("uIP porting on LPC17xx"); |
frank26080115 | 0:bf7b9fba3924 | 107 | |
frank26080115 | 0:bf7b9fba3924 | 108 | |
frank26080115 | 0:bf7b9fba3924 | 109 | // Initialize LED for system tick timer |
frank26080115 | 0:bf7b9fba3924 | 110 | LED_Init(); |
frank26080115 | 0:bf7b9fba3924 | 111 | |
frank26080115 | 0:bf7b9fba3924 | 112 | _DBG_("Init Clock"); |
frank26080115 | 0:bf7b9fba3924 | 113 | // Sys timer init 1/100 sec tick |
frank26080115 | 0:bf7b9fba3924 | 114 | clock_init(); |
frank26080115 | 0:bf7b9fba3924 | 115 | |
frank26080115 | 0:bf7b9fba3924 | 116 | timer_set(&periodic_timer, CLOCK_SECOND / 2); /*0.5s */ |
frank26080115 | 0:bf7b9fba3924 | 117 | timer_set(&arp_timer, CLOCK_SECOND * 10); /*10s */ |
frank26080115 | 0:bf7b9fba3924 | 118 | |
frank26080115 | 0:bf7b9fba3924 | 119 | _DBG_("Init EMAC"); |
frank26080115 | 0:bf7b9fba3924 | 120 | // Initialize the ethernet device driver |
frank26080115 | 0:bf7b9fba3924 | 121 | while(!tapdev_init()){ |
frank26080115 | 0:bf7b9fba3924 | 122 | // Delay for a while then continue initializing EMAC module |
frank26080115 | 0:bf7b9fba3924 | 123 | _DBG_("Error during initializing EMAC, restart after a while"); |
frank26080115 | 0:bf7b9fba3924 | 124 | for (delay = 0x100000; delay; delay--); |
frank26080115 | 0:bf7b9fba3924 | 125 | } |
frank26080115 | 0:bf7b9fba3924 | 126 | |
frank26080115 | 0:bf7b9fba3924 | 127 | |
frank26080115 | 0:bf7b9fba3924 | 128 | #if 1 |
frank26080115 | 0:bf7b9fba3924 | 129 | |
frank26080115 | 0:bf7b9fba3924 | 130 | _DBG_("Init uIP"); |
frank26080115 | 0:bf7b9fba3924 | 131 | // Initialize the uIP TCP/IP stack. |
frank26080115 | 0:bf7b9fba3924 | 132 | uip_init(); |
frank26080115 | 0:bf7b9fba3924 | 133 | |
frank26080115 | 0:bf7b9fba3924 | 134 | // init MAC address |
frank26080115 | 0:bf7b9fba3924 | 135 | uip_ethaddr.addr[0] = EMAC_ADDR0; |
frank26080115 | 0:bf7b9fba3924 | 136 | uip_ethaddr.addr[1] = EMAC_ADDR1; |
frank26080115 | 0:bf7b9fba3924 | 137 | uip_ethaddr.addr[2] = EMAC_ADDR2; |
frank26080115 | 0:bf7b9fba3924 | 138 | uip_ethaddr.addr[3] = EMAC_ADDR3; |
frank26080115 | 0:bf7b9fba3924 | 139 | uip_ethaddr.addr[4] = EMAC_ADDR4; |
frank26080115 | 0:bf7b9fba3924 | 140 | uip_ethaddr.addr[5] = EMAC_ADDR5; |
frank26080115 | 0:bf7b9fba3924 | 141 | uip_setethaddr(uip_ethaddr); |
frank26080115 | 0:bf7b9fba3924 | 142 | |
frank26080115 | 0:bf7b9fba3924 | 143 | |
frank26080115 | 0:bf7b9fba3924 | 144 | uip_ipaddr(ipaddr, 192,168,0,100); |
frank26080115 | 0:bf7b9fba3924 | 145 | sprintf(_db, "Set own IP address: %d.%d.%d.%d \n\r", \ |
frank26080115 | 0:bf7b9fba3924 | 146 | ((uint8_t *)ipaddr)[0], ((uint8_t *)ipaddr)[1], \ |
frank26080115 | 0:bf7b9fba3924 | 147 | ((uint8_t *)ipaddr)[2], ((uint8_t *)ipaddr)[3]); |
frank26080115 | 0:bf7b9fba3924 | 148 | DB; |
frank26080115 | 0:bf7b9fba3924 | 149 | uip_sethostaddr(ipaddr); |
frank26080115 | 0:bf7b9fba3924 | 150 | |
frank26080115 | 0:bf7b9fba3924 | 151 | uip_ipaddr(ipaddr, 192,168,0,1); |
frank26080115 | 0:bf7b9fba3924 | 152 | sprintf(_db, "Set Router IP address: %d.%d.%d.%d \n\r", \ |
frank26080115 | 0:bf7b9fba3924 | 153 | ((uint8_t *)ipaddr)[0], ((uint8_t *)ipaddr)[1], \ |
frank26080115 | 0:bf7b9fba3924 | 154 | ((uint8_t *)ipaddr)[2], ((uint8_t *)ipaddr)[3]); |
frank26080115 | 0:bf7b9fba3924 | 155 | DB; |
frank26080115 | 0:bf7b9fba3924 | 156 | uip_setdraddr(ipaddr); |
frank26080115 | 0:bf7b9fba3924 | 157 | |
frank26080115 | 0:bf7b9fba3924 | 158 | uip_ipaddr(ipaddr, 255,255,255,0); |
frank26080115 | 0:bf7b9fba3924 | 159 | sprintf(_db, "Set Subnet mask: %d.%d.%d.%d \n\r", \ |
frank26080115 | 0:bf7b9fba3924 | 160 | ((uint8_t *)ipaddr)[0], ((uint8_t *)ipaddr)[1], \ |
frank26080115 | 0:bf7b9fba3924 | 161 | ((uint8_t *)ipaddr)[2], ((uint8_t *)ipaddr)[3]); |
frank26080115 | 0:bf7b9fba3924 | 162 | DB; |
frank26080115 | 0:bf7b9fba3924 | 163 | uip_setnetmask(ipaddr); |
frank26080115 | 0:bf7b9fba3924 | 164 | |
frank26080115 | 0:bf7b9fba3924 | 165 | // Initialize the HTTP server ---------------------------- |
frank26080115 | 0:bf7b9fba3924 | 166 | _DBG_("Init HTTP"); |
frank26080115 | 0:bf7b9fba3924 | 167 | httpd_init(); |
frank26080115 | 0:bf7b9fba3924 | 168 | _DBG_("Init complete!"); |
frank26080115 | 0:bf7b9fba3924 | 169 | |
frank26080115 | 0:bf7b9fba3924 | 170 | while(1) |
frank26080115 | 0:bf7b9fba3924 | 171 | { |
frank26080115 | 0:bf7b9fba3924 | 172 | uip_len = tapdev_read(uip_buf); |
frank26080115 | 0:bf7b9fba3924 | 173 | if(uip_len > 0) |
frank26080115 | 0:bf7b9fba3924 | 174 | { |
frank26080115 | 0:bf7b9fba3924 | 175 | if(BUF->type == htons(UIP_ETHTYPE_IP)) |
frank26080115 | 0:bf7b9fba3924 | 176 | { |
frank26080115 | 0:bf7b9fba3924 | 177 | uip_arp_ipin(); |
frank26080115 | 0:bf7b9fba3924 | 178 | uip_input(); |
frank26080115 | 0:bf7b9fba3924 | 179 | /* If the above function invocation resulted in data that |
frank26080115 | 0:bf7b9fba3924 | 180 | should be sent out on the network, the global variable |
frank26080115 | 0:bf7b9fba3924 | 181 | uip_len is set to a value > 0. */ |
frank26080115 | 0:bf7b9fba3924 | 182 | |
frank26080115 | 0:bf7b9fba3924 | 183 | if(uip_len > 0) |
frank26080115 | 0:bf7b9fba3924 | 184 | { |
frank26080115 | 0:bf7b9fba3924 | 185 | uip_arp_out(); |
frank26080115 | 0:bf7b9fba3924 | 186 | tapdev_send(uip_buf,uip_len); |
frank26080115 | 0:bf7b9fba3924 | 187 | } |
frank26080115 | 0:bf7b9fba3924 | 188 | } |
frank26080115 | 0:bf7b9fba3924 | 189 | else if(BUF->type == htons(UIP_ETHTYPE_ARP)) |
frank26080115 | 0:bf7b9fba3924 | 190 | { |
frank26080115 | 0:bf7b9fba3924 | 191 | uip_arp_arpin(); |
frank26080115 | 0:bf7b9fba3924 | 192 | /* If the above function invocation resulted in data that |
frank26080115 | 0:bf7b9fba3924 | 193 | should be sent out on the network, the global variable |
frank26080115 | 0:bf7b9fba3924 | 194 | uip_len is set to a value > 0. */ |
frank26080115 | 0:bf7b9fba3924 | 195 | if(uip_len > 0) |
frank26080115 | 0:bf7b9fba3924 | 196 | { |
frank26080115 | 0:bf7b9fba3924 | 197 | tapdev_send(uip_buf,uip_len); |
frank26080115 | 0:bf7b9fba3924 | 198 | } |
frank26080115 | 0:bf7b9fba3924 | 199 | } |
frank26080115 | 0:bf7b9fba3924 | 200 | } |
frank26080115 | 0:bf7b9fba3924 | 201 | else if(timer_expired(&periodic_timer)) |
frank26080115 | 0:bf7b9fba3924 | 202 | { |
frank26080115 | 0:bf7b9fba3924 | 203 | timer_reset(&periodic_timer); |
frank26080115 | 0:bf7b9fba3924 | 204 | for(i = 0; i < UIP_CONNS; i++) |
frank26080115 | 0:bf7b9fba3924 | 205 | { |
frank26080115 | 0:bf7b9fba3924 | 206 | uip_periodic(i); |
frank26080115 | 0:bf7b9fba3924 | 207 | /* If the above function invocation resulted in data that |
frank26080115 | 0:bf7b9fba3924 | 208 | should be sent out on the network, the global variable |
frank26080115 | 0:bf7b9fba3924 | 209 | uip_len is set to a value > 0. */ |
frank26080115 | 0:bf7b9fba3924 | 210 | if(uip_len > 0) |
frank26080115 | 0:bf7b9fba3924 | 211 | { |
frank26080115 | 0:bf7b9fba3924 | 212 | uip_arp_out(); |
frank26080115 | 0:bf7b9fba3924 | 213 | tapdev_send(uip_buf,uip_len); |
frank26080115 | 0:bf7b9fba3924 | 214 | } |
frank26080115 | 0:bf7b9fba3924 | 215 | } |
frank26080115 | 0:bf7b9fba3924 | 216 | #if UIP_UDP |
frank26080115 | 0:bf7b9fba3924 | 217 | for(i = 0; i < UIP_UDP_CONNS; i++) { |
frank26080115 | 0:bf7b9fba3924 | 218 | uip_udp_periodic(i); |
frank26080115 | 0:bf7b9fba3924 | 219 | /* If the above function invocation resulted in data that |
frank26080115 | 0:bf7b9fba3924 | 220 | should be sent out on the network, the global variable |
frank26080115 | 0:bf7b9fba3924 | 221 | uip_len is set to a value > 0. */ |
frank26080115 | 0:bf7b9fba3924 | 222 | if(uip_len > 0) { |
frank26080115 | 0:bf7b9fba3924 | 223 | uip_arp_out(); |
frank26080115 | 0:bf7b9fba3924 | 224 | tapdev_send(); |
frank26080115 | 0:bf7b9fba3924 | 225 | } |
frank26080115 | 0:bf7b9fba3924 | 226 | } |
frank26080115 | 0:bf7b9fba3924 | 227 | #endif /* UIP_UDP */ |
frank26080115 | 0:bf7b9fba3924 | 228 | /* Call the ARP timer function every 10 seconds. */ |
frank26080115 | 0:bf7b9fba3924 | 229 | if(timer_expired(&arp_timer)) |
frank26080115 | 0:bf7b9fba3924 | 230 | { |
frank26080115 | 0:bf7b9fba3924 | 231 | timer_reset(&arp_timer); |
frank26080115 | 0:bf7b9fba3924 | 232 | uip_arp_timer(); |
frank26080115 | 0:bf7b9fba3924 | 233 | } |
frank26080115 | 0:bf7b9fba3924 | 234 | } |
frank26080115 | 0:bf7b9fba3924 | 235 | } |
frank26080115 | 0:bf7b9fba3924 | 236 | #endif |
frank26080115 | 0:bf7b9fba3924 | 237 | |
frank26080115 | 0:bf7b9fba3924 | 238 | while (1); |
frank26080115 | 0:bf7b9fba3924 | 239 | } |
frank26080115 | 0:bf7b9fba3924 | 240 | |
frank26080115 | 0:bf7b9fba3924 | 241 | int main(void) |
frank26080115 | 0:bf7b9fba3924 | 242 | { |
frank26080115 | 0:bf7b9fba3924 | 243 | return c_entry(); |
frank26080115 | 0:bf7b9fba3924 | 244 | } |
frank26080115 | 0:bf7b9fba3924 | 245 | |
frank26080115 | 0:bf7b9fba3924 | 246 | #ifdef DEBUG |
frank26080115 | 0:bf7b9fba3924 | 247 | /******************************************************************************* |
frank26080115 | 0:bf7b9fba3924 | 248 | * @brief Reports the name of the source file and the source line number |
frank26080115 | 0:bf7b9fba3924 | 249 | * where the CHECK_PARAM error has occurred. |
frank26080115 | 0:bf7b9fba3924 | 250 | * @param[in] file Pointer to the source file name |
frank26080115 | 0:bf7b9fba3924 | 251 | * @param[in] line assert_param error line source number |
frank26080115 | 0:bf7b9fba3924 | 252 | * @return None |
frank26080115 | 0:bf7b9fba3924 | 253 | *******************************************************************************/ |
frank26080115 | 0:bf7b9fba3924 | 254 | void check_failed(uint8_t *file, uint32_t line) |
frank26080115 | 0:bf7b9fba3924 | 255 | { |
frank26080115 | 0:bf7b9fba3924 | 256 | /* User can add his own implementation to report the file name and line number, |
frank26080115 | 0:bf7b9fba3924 | 257 | ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ |
frank26080115 | 0:bf7b9fba3924 | 258 | |
frank26080115 | 0:bf7b9fba3924 | 259 | /* Infinite loop */ |
frank26080115 | 0:bf7b9fba3924 | 260 | while(1); |
frank26080115 | 0:bf7b9fba3924 | 261 | } |
frank26080115 | 0:bf7b9fba3924 | 262 | #endif |