From 6834b95aa979dbb197ca1b9a5bced576cce4e96f Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 11 Oct 2009 10:12:22 +0000 Subject: lwIP demo added. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1209 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile | 1 + demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.c | 3 + demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.h | 5 + demos/ARM7-AT91SAM7X-LWIP-GCC/main.c | 13 ++- demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt | 8 +- demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c | 118 ++++++++++++++++++++++++ demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h | 54 +++++++++++ 7 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c create mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h (limited to 'demos') diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile b/demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile index e38c35681..62a8d217c 100644 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile +++ b/demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile @@ -70,6 +70,7 @@ CSRC = ${PORTSRC} \ ${LWAPISRC} \ ./lwip/arch/sys_arch.c \ ./lwip/lwipthread.c \ + ./web/web.c \ board.c main.c # C++ sources that can be compiled in ARM or THUMB mode depending on the global diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.c b/demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.c index 73b670312..bb9f8ae5b 100644 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.c +++ b/demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.c @@ -254,6 +254,9 @@ msg_t lwip_thread(void *p) { chEvtRegisterMask(macGetReceiveEventSource(Ð1), &el1, FRAME_RECEIVED_ID); chEvtPend(PERIODIC_TIMER_ID | FRAME_RECEIVED_ID); + /* Goes to the final priority after initialization.*/ + chThdSetPriority(LWIP_THREAD_PRIORITY); + while (TRUE) { eventmask_t mask = chEvtWaitAny(ALL_EVENTS); if (mask & PERIODIC_TIMER_ID) diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.h b/demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.h index 85969bede..fe939a178 100644 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.h +++ b/demos/ARM7-AT91SAM7X-LWIP-GCC/lwip/lwipthread.h @@ -27,6 +27,11 @@ #ifndef _LWIPTHREAD_H_ #define _LWIPTHREAD_H_ +/** @brief MAC thread priority.*/ +#ifndef LWIP_THREAD_PRIORITY +#define LWIP_THREAD_PRIORITY LOWPRIO +#endif + /** @brief IP Address. */ #if !defined(LWIP_IPADDR) || defined(__DOXYGEN__) #define LWIP_IPADDR(p) IP4_ADDR(p, 192, 168, 1, 20) diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/main.c b/demos/ARM7-AT91SAM7X-LWIP-GCC/main.c index 098e764a5..d7d1836da 100644 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/main.c +++ b/demos/ARM7-AT91SAM7X-LWIP-GCC/main.c @@ -23,7 +23,8 @@ #include #include "board.h" -#include "lwipthread.h" +#include "lwip\lwipthread.h" +#include "web\web.h" static WORKING_AREA(waThread1, 64); static msg_t Thread1(void *arg) { @@ -54,11 +55,17 @@ int main(int argc, char **argv) { chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); /* - * Creates the LWIP threads. + * Creates the LWIP threads (it changes priority internally). */ - chThdCreateStatic(wa_lwip_thread, LWIP_THREAD_STACK_SIZE, LOWPRIO, + chThdCreateStatic(wa_lwip_thread, LWIP_THREAD_STACK_SIZE, NORMALPRIO + 1, lwip_thread, NULL); + /* + * Creates the HTTP thread (it changes priority internally). + */ + chThdCreateStatic(wa_http_server, sizeof(wa_http_server), NORMALPRIO + 1, + http_server, NULL); + /* * Normal main() thread activity. */ diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt b/demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt index 986d5ec7c..7b6460326 100644 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt +++ b/demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt @@ -8,7 +8,9 @@ The demo runs on an Olimex SAM7-EX256 board. ** The Demo ** -The demo currently just flashes the LCD background using a thread. +The demo currently just flashes the LCD background using a thread and serves +HTTP requests at address 192.168.1.20 on port 80 (remember to change it IP +address into web.c in order to adapt it to your network settings). The button SW1 prints an "Hello World!" string on COM1, the button SW2 activates che ChibiOS/RT test suite, output on COM1. @@ -16,6 +18,7 @@ activates che ChibiOS/RT test suite, output on COM1. The demo was built using the YAGARTO toolchain but any toolchain based on GCC and GNU userspace programs will work. +The demo requires the patcher lwIP 1.3.1 stack, see: ./ext/readme.txt ** Notes ** @@ -26,3 +29,6 @@ Also note that not all the files present in the Atmel library are distribuited with ChibiOS/RT, you can find the whole library on the Atmel web site: http://www.atmel.com + +The lwIP stack also has its own license, please read the info into the included +lwIP distribution files. diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c b/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c new file mode 100644 index 000000000..88701ce3e --- /dev/null +++ b/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c @@ -0,0 +1,118 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/* + * This file is a modified version of the lwIP web server demo. The original + * author is unknown because the file didn't contain any license information. + */ + +/** + * @file web.c + * @brief HTTP server wrapper thread code. + * @addtogroup WEB_THREAD + * @{ + */ + +#include + +#include "lwip/opt.h" +#include "lwip/arch.h" +#include "lwip/api.h" + +#include "web.h" + +#if LWIP_NETCONN + +const static char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; +const static char http_index_html[] = "Congrats!

Welcome to our lwIP HTTP server!

This is a small test page."; + +static void http_server_serve(struct netconn *conn) { + struct netbuf *inbuf; + char *buf; + u16_t buflen; + + /* Read the data from the port, blocking if nothing yet there. + We assume the request (the part we care about) is in one netbuf */ + inbuf = netconn_recv(conn); + + if (netconn_err(conn) == ERR_OK) { + netbuf_data(inbuf, (void **)&buf, &buflen); + + /* Is this an HTTP GET command? (only check the first 5 chars, since + there are other formats for GET, and we're keeping it very simple )*/ + if (buflen>=5 && + buf[0]=='G' && + buf[1]=='E' && + buf[2]=='T' && + buf[3]==' ' && + buf[4]=='/' ) { + + /* Send the HTML header + * subtract 1 from the size, since we dont send the \0 in the string + * NETCONN_NOCOPY: our data is const static, so no need to copy it + */ + netconn_write(conn, http_html_hdr, sizeof(http_html_hdr)-1, NETCONN_NOCOPY); + + /* Send our HTML page */ + netconn_write(conn, http_index_html, sizeof(http_index_html)-1, NETCONN_NOCOPY); + } + } + /* Close the connection (server closes in HTTP) */ + netconn_close(conn); + + /* Delete the buffer (netconn_recv gives us ownership, + so we have to make sure to deallocate the buffer) */ + netbuf_delete(inbuf); +} + +/** + * Stack area for the http thread. + */ +WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); + +/** + * HTTP server thread. + */ +msg_t http_server(void *p) { + struct netconn *conn, *newconn; + + /* Create a new TCP connection handle */ + conn = netconn_new(NETCONN_TCP); + LWIP_ERROR("http_server: invalid conn", (conn != NULL), return RDY_RESET;); + + /* Bind to port 80 (HTTP) with default IP address */ + netconn_bind(conn, NULL, WEB_THREAD_PORT); + + /* Put the connection into LISTEN state */ + netconn_listen(conn); + + /* Goes to the final priority after initialization.*/ + chThdSetPriority(WEB_THREAD_PRIORITY); + + while(1) { + newconn = netconn_accept(conn); + http_server_serve(newconn); + netconn_delete(newconn); + } + return RDY_OK; +} + +#endif /* LWIP_NETCONN */ + +/** @} */ diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h b/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h new file mode 100644 index 000000000..f53cfcb44 --- /dev/null +++ b/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h @@ -0,0 +1,54 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file web.h + * @brief HTTP server wrapper thread macros and structures. + * @addtogroup WEB_THREAD + * @{ + */ + +#ifndef _WEB_H_ +#define _WEB_H_ + +#ifndef WEB_THREAD_STACK_SIZE +#define WEB_THREAD_STACK_SIZE 1024 +#endif + +#ifndef WEB_THREAD_PORT +#define WEB_THREAD_PORT 80 +#endif + +#ifndef WEB_THREAD_PRIORITY +#define WEB_THREAD_PRIORITY (LOWPRIO + 2) +#endif + +extern WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); + +#ifdef __cplusplus +extern "C" { +#endif + msg_t http_server(void *p); +#ifdef __cplusplus +} +#endif + +#endif /* _WEB_H_ */ + +/** @} */ -- cgit v1.2.3