diff options
Diffstat (limited to 'demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c')
-rw-r--r-- | demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c b/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c new file mode 100644 index 000000000..ac4f8779b --- /dev/null +++ b/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c @@ -0,0 +1,183 @@ +/*
+ ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#include <string.h>
+
+#include "ch.h"
+#include "hal.h"
+#include "evtimer.h"
+
+#include "uip.h"
+#include "uip_arp.h"
+#include "httpd.h"
+#include "clock-arch.h"
+
+#define IPADDR0 192
+#define IPADDR1 168
+#define IPADDR2 1
+#define IPADDR3 20
+
+#define SEND_TIMEOUT 50
+
+static const struct uip_eth_addr macaddr = {
+ {0xC2, 0xAF, 0x51, 0x03, 0xCF, 0x46}
+};
+
+static const MACConfig mac_config = {macaddr.addr};
+
+#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
+
+/*
+ * uIP send function wrapping the EMAC functions.
+ */
+static void network_device_send(void) {
+ MACTransmitDescriptor td;
+
+ if (macWaitTransmitDescriptor(ÐD1, &td, MS2ST(SEND_TIMEOUT)) == RDY_OK) {
+ if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN)
+ macWriteTransmitDescriptor(&td, uip_buf, uip_len);
+ else {
+ macWriteTransmitDescriptor(&td, uip_buf, UIP_LLH_LEN + UIP_TCPIP_HLEN);
+ macWriteTransmitDescriptor(&td, uip_appdata,
+ uip_len - (UIP_LLH_LEN + UIP_TCPIP_HLEN));
+ }
+ macReleaseTransmitDescriptor(&td);
+ }
+ /* Dropped... */
+}
+
+/*
+ * uIP receive function wrapping the EMAC function.
+ */
+static size_t network_device_read(void) {
+ MACReceiveDescriptor rd;
+ size_t size;
+
+ if (macWaitReceiveDescriptor(ÐD1, &rd, TIME_IMMEDIATE) != RDY_OK)
+ return 0;
+ size = rd.size;
+ macReadReceiveDescriptor(&rd, uip_buf, size);
+ macReleaseReceiveDescriptor(&rd);
+ return size;
+}
+
+void clock_init(void) {}
+
+clock_time_t clock_time( void )
+{
+ return chTimeNow();
+}
+
+/*
+ * TCP/IP periodic timer.
+ */
+static void PeriodicTimerHandler(eventid_t id) {
+ int i;
+
+ (void)id;
+ 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 ARPTimerHandler(eventid_t id) {
+
+ (void)id;
+ (void)macPollLinkStatus(ÐD1);
+ uip_arp_timer();
+}
+
+/*
+ * Ethernet frame received.
+ */
+static void FrameReceivedHandler(eventid_t id) {
+
+ (void)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) {
+ EvTimer evt1, evt2;
+ EventListener el0, el1, el2;
+ uip_ipaddr_t ipaddr;
+
+ (void)p;
+
+ /*
+ * Event sources setup.
+ */
+ chEvtRegister(macGetReceiveEventSource(ÐD1), &el0, FRAME_RECEIVED_ID);
+ chEvtAddEvents(EVENT_MASK(FRAME_RECEIVED_ID)); /* In case some frames are already buffered */
+
+ evtInit(&evt1, MS2ST(500));
+ evtStart(&evt1);
+ chEvtRegister(&evt1.et_es, &el1, PERIODIC_TIMER_ID);
+
+ evtInit(&evt2, S2ST(10));
+ evtStart(&evt2);
+ chEvtRegister(&evt2.et_es, &el2, ARP_TIMER_ID);
+
+ /*
+ * EMAC driver start.
+ */
+ macStart(ÐD1, &mac_config);
+ (void)macPollLinkStatus(ÐD1);
+
+ /*
+ * uIP initialization.
+ */
+ uip_init();
+ uip_setethaddr(macaddr);
+ uip_ipaddr(ipaddr, IPADDR0, IPADDR1, IPADDR2, IPADDR3);
+ uip_sethostaddr(ipaddr);
+ httpd_init();
+
+ while (TRUE) {
+ chEvtDispatch(evhndl, chEvtWaitOne(ALL_EVENTS));
+ }
+ return 0;
+}
|