From 16e097d23edef273e73f64d9f7ea51ecc0636e77 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 27 May 2008 13:26:10 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@311 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARM7-AT91SAM7X-WEB-GCC/Makefile | 1 - demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c | 121 ++++++++++++++------------- 2 files changed, 65 insertions(+), 57 deletions(-) diff --git a/demos/ARM7-AT91SAM7X-WEB-GCC/Makefile b/demos/ARM7-AT91SAM7X-WEB-GCC/Makefile index 0f9806151..a1ebaba71 100644 --- a/demos/ARM7-AT91SAM7X-WEB-GCC/Makefile +++ b/demos/ARM7-AT91SAM7X-WEB-GCC/Makefile @@ -74,7 +74,6 @@ KSRC = ../../src/chinit.c ../../src/chdebug.c \ # List of the required uIP source files. USRC = ../../ext/uip-1.0/uip/uip_arp.c \ ../../ext/uip-1.0/uip/psock.c \ - ../../ext/uip-1.0/uip/timer.c \ ../../ext/uip-1.0/uip/uip.c \ ../../ext/uip-1.0/apps/webserver/httpd.c \ ../../ext/uip-1.0/apps/webserver/http-strings.c \ diff --git a/demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c b/demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c index 425a6366d..825ff1eff 100644 --- a/demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c +++ b/demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c @@ -26,7 +26,6 @@ #include #include #include -#include #include //#define IPADDR0 192 @@ -45,9 +44,6 @@ static const struct uip_eth_addr macaddr = { {0xC2, 0xAF, 0x51, 0x03, 0xCF, 0x46} }; -static EvTimer evt; -struct EventListener el0, el1; - #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) /* @@ -95,79 +91,92 @@ clock_time_t clock_time( void ) } /* - * Ethernet link status monitor. + * TCP/IP periodic timer. + */ +static void PeriodicTimerHandler(eventid_t id) { + int i; + + for (i = 0; i < UIP_CONNS; i++) { + uip_periodic(i); + if (uip_len > 0) { + uip_arp_out(); + network_device_send(); + } + } +} + +/* + * ARP periodic timer. */ -static void TimerHandler(eventid_t id) { +static void ARPTimerHandler(eventid_t id) { + uip_arp_timer(); (void)EMACGetLinkStatus(); } +/* + * Ethernet frame received. + */ +static void FrameReceivedHandler(eventid_t id) { + + while ((uip_len = network_device_read()) > 0) { + if (BUF->type == HTONS(UIP_ETHTYPE_IP)) { + uip_arp_ipin(); + uip_input(); + if (uip_len > 0) { + uip_arp_out(); + network_device_send(); + } + } + else if (BUF->type == HTONS(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + if (uip_len > 0) + network_device_send(); + } + } +} + +#define FRAME_RECEIVED_ID 0 +#define PERIODIC_TIMER_ID 1 +#define ARP_TIMER_ID 2 + +static const evhandler_t evhndl[] = { + FrameReceivedHandler, + PeriodicTimerHandler, + ARPTimerHandler +}; + msg_t WebThread(void *p) { - static const evhandler_t evhndl[] = { - TimerHandler, - NULL - }; + EvTimer evt1, evt2; + EventListener el0, el1, el2; uip_ipaddr_t ipaddr; - struct timer periodic_timer, arp_timer; EMACSetAddress(&macaddr.addr[0]); + (void)EMACGetLinkStatus(); /* * Event sources setup. */ - evtInit(&evt, 1000); /* Initializes an event timer object. */ - evtStart(&evt); /* Starts the event timer. */ - chEvtRegister(&evt.et_es, &el0, 0); /* Registers on the timer event source. */ - chEvtRegister(&EMACFrameReceived, &el1, 1); + chEvtRegister(&EMACFrameReceived, &el0, FRAME_RECEIVED_ID); - /* + evtInit(&evt1, CH_FREQUENCY / 2); + evtStart(&evt1); + chEvtRegister(&evt1.et_es, &el1, PERIODIC_TIMER_ID); + + evtInit(&evt2, CH_FREQUENCY * 10); + evtStart(&evt2); + chEvtRegister(&evt2.et_es, &el2, ARP_TIMER_ID); + + /* * uIP initialization. */ - timer_set(&periodic_timer, CLOCK_SECOND / 2); - timer_set(&arp_timer, CLOCK_SECOND * 10); uip_init(); uip_setethaddr(macaddr); uip_ipaddr(ipaddr, IPADDR0, IPADDR1, IPADDR2, IPADDR3); uip_sethostaddr(ipaddr); httpd_init(); - while (TRUE) { - uip_len = network_device_read(); - if (uip_len > 0) { - if (BUF->type == HTONS(UIP_ETHTYPE_IP)) { - uip_arp_ipin(); - uip_input(); - if (uip_len > 0) { - uip_arp_out(); - network_device_send(); - } - } - else if (BUF->type == HTONS(UIP_ETHTYPE_ARP)) { - uip_arp_arpin(); - if (uip_len > 0) - network_device_send(); - } - } - else { - if (timer_expired(&periodic_timer)) { - int i; - timer_reset(&periodic_timer); - for (i = 0; i < UIP_CONNS; i++) { - uip_periodic(i); - if (uip_len > 0) { - uip_arp_out(); - network_device_send(); - } - } - if (timer_expired(&arp_timer)) { - timer_reset(&arp_timer); - uip_arp_timer(); - } - } - else { - chEvtWait(ALL_EVENTS, evhndl); - } - } - } + while (TRUE) + chEvtWait(ALL_EVENTS, evhndl); return 0; } -- cgit v1.2.3