æè¿ãMK STM32F4ã«åºã¥ããããŒãããããã¯ãŒã¯äžã§åäœããããšããã¢ã€ãã¢ãçãŸããŸããã ã€ãŒãµãããPHYã³ã³ãããŒã©ãŒãããŒãäžã«ãªãã£ããããå¯äžã®ãªãã·ã§ã³ã¯ãUSB FullSpeedã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠã€ãŒãµãããããã€ã¹ããšãã¥ã¬ãŒãããããšã§ããã ãã®æ©èœãå®è£ ããäžè¬çãªUSBã¯ã©ã¹æšæºã¯ãRNDISãšåŒã°ããŸãã
æ®å¿µãªãããSTM32ã®RNDISãã©ã€ããŒã®æ€çŽ¢ã¯å€±æããŸããã ãã ããããã¯é©ãããšã§ã¯ãããŸããã§ããã ãªãŒãã³STM32 USBããŒãã®äŸã¯ã補é å ããæäŸããããã®ã®ã¿ã«å¶éãããŠããŸãã
ãã®äžæ£ãä¿®æ£ãããã£ãã ãããŠãåæã«å¿ èŠãªãœãŒã¹ãæ§äº€ããããšã§ãå°æ¥çã«ã¯æçã«ãªããŸãã
ã©ã€ãã©ãªã®ãã¢ããŒãžã§ã³ã®æºåãã§ããã®ã§ãMITã©ã€ã»ã³ã¹ãšããŠã©ã€ãã«æçš¿ããŸãã ãããã£ãŠãã©ã€ãã©ãªã«èå³ããããã¹ãŠã®äºº-ãon healthãã䜿çšããŠãã ããã ã©ã€ãã©ãªã¯LRNDISãšåŒã°ããæåã®æåã¯çµã¿èŸŒã¿ã·ã¹ãã ãLwIPãçšã®ãããã¯ãŒã¯ã¹ã¿ãã¯ã®äœ¿çšãæå³ããŸãã
ã©ã€ãã©ãªã®æ©èœã瀺ãããã«ãstm32f4discoveryããŒãã§ãµã³ãã«ãäœæãããŸããã 圌ã®ä»äºã¯ãåºæ¬ãµãŒãã¹ïŒDHCPããã³DNSãµãŒããŒïŒããµããŒãããèŠæ±ãããWEBããŒãžãusbãã¹ãã«è»¢éããããšã§ãã ãããã£ãŠãç§ãã¡ã®çºèŠã¯ãUSBããŒãã§å®è¡ãããã»ãŒå®å šãªWEBãµãŒããŒã«å€ãããŸããïŒ
ãããé©çšãããå Žæã«ã€ããŠã®ããã€ãã®èšèã
æ¥åžžç掻ã§ã¯ãRNDISããã€ã¹ã¯éåžžãã€ã³ã¿ãŒãããã«ã¢ã¯ã»ã¹ããããã®USBã¢ãã ã§ãã éçºè ãPCãšç¡ç·åšæ³¢æ°ïŒãŸãã¯ãã®ä»ã®ïŒãã©ã³ã·ãŒããŒãšã®éã®æ¥ç¶ãã§ãŒã³ãšããŠSTM32ãéžæããå Žåããããããã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯å®éã«æçšã§ããããšãããããŸãã ãããšããèªåã®ãããã¯ãŒã¯ãã€ãŒãµãããã»ã°ã¡ã³ãã«æ¡åŒµãããã®ã§ããããïŒ
ç§ã«ãšã£ãŠäž»ãªå©ç¹ããããšæãå¥ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãè€éãªããã€ã¹ã管çããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ãã®åéã®å žåçãªãœãªã¥ãŒã·ã§ã³ã¯ãã¿ãŒããã«ãœãããŠã§ã¢ã®äœæã§ãã åæã«ãããã€ã¹ã®ãµããŒããšãšãã«ãã®ãµããŒãã«å¯ŸåŠããå¿ èŠããããããã¯äžäŸ¿ã§ãã å®éãWebã€ã³ã¿ãŒãã§ãŒã¹ã管çããããã«ãã®ãããªã¹ããŒã ãæåŠããããšã¯ãã©ã€ãã©ãªã䜿çšããå¯èœæ§ã®æå³ã§ãã ã«ãŒã¿ãŒãæ§æããããã®WebããŒã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ãèŠããŠãããŠãã ããã 䟿å©ã«ã ããã äžèŠãªãœãããŠã§ã¢ãªãã
ããã§ãããèå³ããããªããèªãã§ãã ãã...
1. RNDISãã©ã€ããŒ
å·ç段éã§ã¯ãããã€ã¹ã«çœ²åããRNDISæšæºããµããŒããããšãã2ã€ã®ã¿ã¹ã¯ã解決ãããŸããã
ããã€ã¹ã®çœ²åã¯ãæå¹ãªUSBèšè¿°åãã³ã³ãã€ã«ããããšã«ãªããŸãã VIDå€ã¯0x0483ïŒSTMicroelectronicsïŒãPIDå€ã¯0x0123ïŒä»»æïŒã§ãã ãã¡ãããããã¯åçšã¢ããªã±ãŒã·ã§ã³ã§ã¯è¡ããªãã§ãã ããã
èšè¿°åã衚瀺ãã
ããã€ã¹èšè¿°å | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
---|---|---|---|---|
0 | bLength | 1 | 12æé | |
1 | bDescriptorType | 1 | 01h | è£ çœ® |
2 | bcdUSB | 2 | 0200h | USBã¹ããã¯2.0 |
4 | bDeviceClass | 1 | 02h | Cdcå¶åŸ¡ |
5 | bDeviceSubClass | 1 | 00h | |
6 | bDeviceProtocol | 1 | 00h | |
7 | bMaxPacketSize0 | 1 | 40æé | 64ãã€ã |
8 | idVendor | 2 | 0483h | SGS Thomson Microelectronics |
10 | idProduct | 2 | 0123h | |
12 | bcdDevice | 2 | 0001h | 0.01 |
14 | iManufacturer | 1 | 01h | ããã§ãã£ãœãã»ã«ã²ã€ã |
15 | iProduct | 1 | 02h | ãSTM32F4 RNDISã |
16 | iSerialNumber | 1 | 03h | ã00000000123Cã |
17 | bNumConfigurations | 1 | 01h | |
æ§æèšè¿°å1 | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bLength | 1 | 09h | |
1 | bDescriptorType | 1 | 02h | æ§æ |
2 | wTotalLength | 2 | 0043h | |
4 | bNumInterfaces | 1 | 02h | |
5 | bConfigurationValue | 1 | 01h | |
6 | iConfiguration | 1 | 00h | |
7 | bmAttributes | 1 | 40æé | èªå·±çµŠé» |
8 | bMaxPower | 1 | 01h | 2 mA |
ã€ã³ã¿ãŒãã§ã€ã¹èšè¿°å0/0 CDCã³ã³ãããŒã«ã1ãšã³ããã€ã³ã | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bLength | 1 | 09h | |
1 | bDescriptorType | 1 | 04æé | ã€ã³ã¿ãŒãã§ãŒã¹ |
2 | bInterfaceNumber | 1 | 00h | |
3 | bAlternateSetting | 1 | 00h | |
4 | bNumEndpoints | 1 | 01h | |
5 | bInterfaceClass | 1 | 02h | Cdcå¶åŸ¡ |
6 | bInterfaceSubClass | 1 | 02h | æœè±¡å¶åŸ¡ã¢ãã« |
7 | bInterfaceProtocol | 1 | Ffh | ãã³ããŒåºæ |
8 | iInterface | 1 | 00h | |
ããããŒæ©èœèšè¿°å | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bFunctionLength | 1 | 05h | |
1 | bDescriptorType | 1 | 24æé | CSã€ã³ã¿ãŒãã§ãŒã¹ |
2 | bDescriptorSubtype | 1 | 00h | ããã㌠|
3 | bcdCDC | 2 | 0110h | 1.10 |
ã³ãŒã«ç®¡çæ©èœèšè¿°å | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bFunctionLength | 1 | 05h | |
1 | bDescriptorType | 1 | 24æé | CSã€ã³ã¿ãŒãã§ãŒã¹ |
2 | bDescriptorSubtype | 1 | 01h | é話管ç |
3 | bmCapabilities | 1 | 00h | |
4 | bDataInterface | 1 | 01h | |
æœè±¡å¶åŸ¡ç®¡çæ©èœèšè¿°å | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bFunctionLength | 1 | 04æé | |
1 | bDescriptorType | 1 | 24æé | CSã€ã³ã¿ãŒãã§ãŒã¹ |
2 | bDescriptorSubtype | 1 | 02h | æœè±¡å¶åŸ¡ç®¡ç |
3 | bmCapabilities | 1 | 00h | ãªã¯ãšã¹ã/éç¥ã¯ãµããŒããããŠããŸãã |
ãŠããªã³æ©èœèšè¿°å | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bFunctionLength | 1 | 05h | |
1 | bDescriptorType | 1 | 24æé | CSã€ã³ã¿ãŒãã§ãŒã¹ |
2 | bDescriptorSubtype | 1 | 06h | é£å |
3 | bControlInterface | 1 | 00h | |
4 | bSubordinateInterface0 | 1 | 01h | CdcããŒã¿ |
ãšã³ããã€ã³ãèšè¿°å81 1 Inãå²ã蟌ã¿ã80 ms | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bLength | 1 | 07h | |
1 | bDescriptorType | 1 | 05h | ãšã³ããã€ã³ã |
2 | bEndpointAddress | 1 | 81æé | 1㧠|
3 | bmAttributes | 1 | 03h | å²ã蟌㿠|
4 | wMaxPacketSize | 2 | 0008h | 8ãã€ã |
6 | bInterval | 1 | 50æé | 80ããªç§ |
ã€ã³ã¿ãŒãã§ã€ã¹èšè¿°å1/0 CDCããŒã¿ã2ã€ã®ãšã³ããã€ã³ã | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bLength | 1 | 09h | |
1 | bDescriptorType | 1 | 04æé | ã€ã³ã¿ãŒãã§ãŒã¹ |
2 | bInterfaceNumber | 1 | 01h | |
3 | bAlternateSetting | 1 | 00h | |
4 | bNumEndpoints | 1 | 02h | |
5 | bInterfaceClass | 1 | 0ah | CdcããŒã¿ |
6 | bInterfaceSubClass | 1 | 00h | |
7 | bInterfaceProtocol | 1 | 00h | |
8 | iInterface | 1 | 00h | |
ãšã³ããã€ã³ãèšè¿°å82 2å ¥åããã«ã¯ã64ãã€ã | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bLength | 1 | 07h | |
1 | bDescriptorType | 1 | 05h | ãšã³ããã€ã³ã |
2 | bEndpointAddress | 1 | 82æé | 2㧠|
3 | bmAttributes | 1 | 02h | ãã«ã¯ |
4 | wMaxPacketSize | 2 | 0040h | 64ãã€ã |
6 | bInterval | 1 | 00h | |
ãšã³ããã€ã³ãèšè¿°å03 3åºåããã«ã¯ã64ãã€ã | ||||
ãªãã»ãã | éå | 倧ãã | äŸ¡å€ | 説æ |
0 | bLength | 1 | 07h | |
1 | bDescriptorType | 1 | 05h | ãšã³ããã€ã³ã |
2 | bEndpointAddress | 1 | 03h | 3ã¢ãŠã |
3 | bmAttributes | 1 | 02h | ãã«ã¯ |
4 | wMaxPacketSize | 2 | 0040h | 64ãã€ã |
6 | bInterval | 1 | 00h |
æšæºã®ãµããŒãã¯ã ããã¥ã¡ã³ãã«åŸã£ãŠå®è¡ãããŸã ã
ãŸãããããã¯ãŒã¯äžã«ã¯ãä»ã®ãã©ãããã©ãŒã çšã®å€ãã®RNDISãã©ã€ããŒïŒ 1ã2ã3 ïŒããããéçºãå€§å¹ ã«ç°¡çŽ åãããŠããŸãã
亀æã«é¢ããŠã¯ãéä¿¡ããããã±ããããªãŒããŒãããæ å ±ã§ã©ãããããããšãé€ããŠããã©ã€ããŒã¯CDCã¯ã©ã¹ã®ç¹æ§ãç¹°ãè¿ããŸãã ããã€ã¹ãæ§æããããã¹ããŒã¿ã¹ãååŸãããããããã«ãUSBãã¹ããããªã¯ãšã¹ããéä¿¡ããããã®ç¹å¥ãªã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã ãã©ã€ããŒã³ãŒãã¯ãusbd_rndis_core.cã¢ãžã¥ãŒã«ã§è©³çŽ°ã«èª¿ã¹ãããšãã§ããŸãã
åã蟌ã¿ã®ããã®æå°ãã©ã€ããŒèšå®ã¯ãusbd_rndis_core.hãã¡ã€ã«ã®å®çŸ©ãå€æŽããããšã§ãã
-ããã€ã¹ã®MACã¢ãã¬ã¹ïŒPERMANENT_HWADDRãSTATION_HWADDRïŒ
-ã¡ãŒã«ãŒIDïŒRNDIS_VENDORïŒ
-MTUå€ïŒETH_MTUïŒïŒ
#define ETH_MTU 1500 // MTU value #define ETH_LINK_SPEED 250000 // bits per sec #define RNDIS_VENDOR "fetisov" // NIC vendor name #define STATION_HWADDR 0x20,0x89,0x84,0x6A,0x96,0xAA // station MAC #define PERMANENT_HWADDR 0x20,0x89,0x84,0x6A,0x96,0xAA // permanent MAC
ãŸããusbd_desc.hãã¡ã€ã«ã§ã補åã®ååïŒUSBD_PRODUCT_STRINGïŒãšè£œé å ïŒUSBD_MANUFACTURER_STRINGïŒãå€æŽããå¿ èŠããããŸãã
Windowsã«ãã©ã€ããŒãã€ã³ã¹ããŒã«ããããã»ã¹ïŒ
1.ã¡ãã¥ãŒé ç®ããã©ã€ããŒã®æŽæ°ã;
2.ãã©ã€ããŒæ€çŽ¢ãå®è¡ããŸãã
3.ãªã¹ããããã©ã€ããŒãéžæããŸãã
4.ããã€ã¹ã¯ã©ã¹ã®ãªã¹ãã§ã[ãããã¯ãŒã¯ã¢ããã¿]ãéžæããŸãã
5.ã¡ãŒã«ãŒã®ãªã¹ãã§ãMicrosoft CorporationããéžæããŸãã
6.補åããªã¢ãŒãNDISããŒã¹ã®ã€ã³ã¿ãŒãããå ±æããã€ã¹ãã
ããã§ã¯ãæšæºã®RNDISããã€ã¹ã®ã€ã³ã¹ããŒã«ããã»ã¹ã«ã€ããŠè©³ãã説æããŸã ã
2. LwIPãåºå®ããŸã
RNDISãã©ã€ããŒã¯ã802.3ïŒã€ãŒãµãããïŒãã¬ãŒã ã®ãã©ã³ã¹ããŒãæ©èœã®ã¿ãæäŸããŸãã æããã«ãããããçš®é¡ã®ããã±ãŒãžãšæšæºã®ãµããŒãããããã¯ãŒã¯ã¹ã¿ãã¯äžã«çœ®ãå¿ èŠããããŸãã 圌ã®åœ¹å²ã§ã¯ãææ°ã®ïŒçŸåšã®ïŒããŒãžã§ã³1.4.1ã®çµã¿èŸŒã¿lwipã·ã¹ãã ã«äººæ°ã®ããã¹ã¿ãã¯ã䜿çšããããšã決å®ãããŸãã ã ã¹ã¿ãã¯ã®äœæè ã«æ¬æãè¡šããªããã°ãªããŸãããçµ±åãéåžžã«ç°¡åã§ããããšãããããŸããã ãã®ãã¹ãŠã®ããã«ãã¹ã¿ãã¯ã³ãŒãã«ã¯äŸ¿å©ãªã³ã¡ã³ããšæ瀺ãè±å¯ã«ãããŸãã
lwIPã¯ãåœåAdam Dunkelsã«ãã£ãŠéçºãããTCP / IPãããã³ã«ã¹ã€ãŒãã®å°ããªç¬ç«ããå®è£ ã§ãããçŸåšã¯ããã§ç¶ç¶ãããŠããŸãã
lwIP TCP / IPå®è£ ã®çŠç¹ã¯ããã«ã¹ã±ãŒã«TCPãç¶æããªãããªãœãŒã¹äœ¿çšéãåæžããããšã§ãã ããã«ãããlwIPã¯ãæ°åãããã€ãã®ç©ºãRAMãšçŽ40ãããã€ãã®ã³ãŒãROMã®ç©ºããããçµã¿èŸŒã¿ã·ã¹ãã ã§ã®äœ¿çšã«é©ããŠããŸãã
äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
-ãããã³ã«ïŒIPãICMPãUDPãTCPãIGMPãARPãPPPoSãPPPoE
-DHCPã¯ã©ã€ã¢ã³ããDNSã¯ã©ã€ã¢ã³ããAutoIP / APIPAïŒZeroconfïŒãSNMPãšãŒãžã§ã³ãïŒãã©ã€ããŒãMIBãµããŒãïŒ
-APIïŒããã©ãŒãã³ã¹ãåäžãããããã®å°çšAPIããªãã·ã§ã³ã®ããŒã¯ã¬ãŒé¡äŒŒãœã±ããAPI
-æ¡åŒµæ©èœïŒè€æ°ã®ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããIP転éãTCP茻茳å¶åŸ¡ãRTTæšå®ããã³é«éå埩/é«éåéä¿¡
-ã¢ããªã³ã¢ããªã±ãŒã·ã§ã³ïŒHTTPãµãŒããŒãSNTPã¯ã©ã€ã¢ã³ããSMTPã¯ã©ã€ã¢ã³ããpingãNetBIOSããŒã ãµãŒããŒ
stm32ã§ã®ã¹ã¿ãã¯ã®å®è¡ã¯ããã«ãããã»ã¹ã«ç¹å®ã®ãœãŒã¹ãã¡ã€ã«ã»ãããå«ããããšãšãlwipopts.hãã¡ã€ã«ã«å®çŸ©ãå ¥åããããšã«å¶éãããŠããŸããã
#define NO_SYS 1 #define LWIP_RAW 1 #define LWIP_NETCONN 0 #define LWIP_SOCKET 0 #define LWIP_DHCP 0 #define LWIP_ICMP 1 #define LWIP_UDP 1 #define LWIP_TCP 1 #define ETH_PAD_SIZE 0 #define LWIP_IP_ACCEPT_UDP_PORT(p) ((p) == PP_NTOHS(67)) #define MEM_SIZE 10000 #define TCP_MSS (1500 /*mtu*/ - 14 /*ethhdr*/ - 20 /*iphdr*/ - 20 /*tcphhr*/) #define ETHARP_SUPPORT_STATIC_ENTRIES 1
ã¹ã¿ãã¯ãSTM32F4ã«ç§»æ€ããäœæ¥ã¯ã 以åã«STMicroelectronicsïŒã¢ããªã±ãŒã·ã§ã³STSW-STM32070ïŒã«ãã£ãŠå®è¡ãããŠããããšã«æ³šæããŠãã ããã
DHCPãµãŒããŒãèµ·åããŸã
ã©ã€ãã©ãªãžã®DHCPãµãŒããŒã®è¿œå ã¯ããã¹ãåŽã§ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ãåæåããå¿ èŠæ§ãšé¢é£ããŠããŸãã ããã©ã«ãã§ã¯ãããã€ã¹ã®æ¥ç¶æã«äœæãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ãIPã¢ãã¬ã¹ãèªåçã«ååŸããããã«æ§æãããŸãã ã©ã€ãã©ãªã¯éçã¢ãã¬ã¹æå®ã§ãæ£åžžã«æ©èœããŸãããããã¯å®å šã«äŸ¿å©ãšããããã§ã¯ãããŸããã
æ®å¿µãªãããlwipãæäŸããããŒã«ã®äžã«ã¯DHCPãµãŒããŒããããŸããã
ãã ããããã¯é倧ãªåé¡ã§ã¯ãããŸããã æå°éã®å®è£ ã§ã¯ãDHCPãµãŒããŒã¯éåžžã«æå°éã§ãã
ãããã¯ãŒã¯ã«ã¯ããããããlwipã¹ã¿ãã¯ã§åäœãã DHCPãµãŒããŒã®å¯äžã®äŸãå«ãŸããŠããŸãã ãã®ãœãŒã¹ã¯ç 究ã«éåžžã«æçšã§ããããšãå€æããŸããããsocket-apiãèšå®ããã³äœ¿çšããæ©èœããªãããããçŸç¶ã®ãŸãŸãã®ååã«åŸã£ãŠåã蟌ãã«ã¯é©ããŠããŸããã
ãããã£ãŠãDHCPãµãŒããŒãäœæããããšã決å®ãããŸããã
ãããŠããã«åœŒã®æ§ãããªå¯èœæ§ããããŸã
-ä»»æã®æéã«ã¢ãã¬ã¹ãçºè¡ãã
-MACã¢ãã¬ã¹ã«ããã¢ãã¬ã¹ã®äºçŽ
-DNSãµãŒããŒã®æ§æ
ãã¹ããããžã§ã¯ãã§ãµãŒããŒãæ¥ç¶ããïŒ
#define NUM_DHCP_ENTRY 3 static dhcp_entry_t entries[NUM_DHCP_ENTRY] = { // mac ip address subnet mask lease time { {0}, {192, 168, 7, 2}, {255, 255, 255, 0}, 24 * 60 * 60 }, { {0}, {192, 168, 7, 3}, {255, 255, 255, 0}, 24 * 60 * 60 }, { {0}, {192, 168, 7, 4}, {255, 255, 255, 0}, 24 * 60 * 60 } }; static dhcp_config_t dhcp_config = { {192, 168, 7, 1}, 67, // server address, port {192, 168, 7, 1}, // dns server "stm", // dns suffix NUM_DHCP_ENTRY, // num entry entries // entries }; int main(void) { ... while (dhserv_init(&dhcp_config) != ERR_OK) ; ... }
DNSãµãŒããŒãèµ·åããŸã
ç§ãã¡ã®ä»äºã®æãŸããçµæã¯ããã©ãŠã¶ã«ç¹å®ã®ãªãœãŒã¹åãå ¥åãããšãã®WebããŒãžã®è¡šç€ºã§ãã ãã ããããã¯ããã¹ãããèªèãããDNSãµãŒããŒã§ã®ã¿å¯èœã§ãã ãã¡ãããã¢ãã¬ã¹ããŒã«IPã¢ãã¬ã¹192.168.7.1ãçŽæ¥å ¥åãããšããã®çµæãåŸãããŸãã ãã®ã¢ãã¬ã¹ã«ã¯ããã©ã«ãã§ããã€ã¹ããããŸãã ãã ããããçç·ŽããDNSãµãŒããŒãå®è¡ããŸãã
DHCPãšã¯ç°ãªããçŸåšã®DNSãµãŒããŒã®å®è£ ã¯ããã«èããªã£ãŠããŸãã çŸæç¹ã§ã¯ãã¬ã³ãŒãããšã«æšæºã®DNSã¯ãšãªã®ã¿ãåŠçã§ããŸãã
ãããžã§ã¯ãã§ãµãŒããŒãèµ·åããŸãã
bool dns_query_proc(const char *name, ip_addr_t *addr) { if (strcmp(name, "run.stm") == 0 || strcmp(name, "www.run.stm") == 0) { addr->addr = *(uint32_t *)ipaddr; return true; } return false; } int main(void) { ... while (dnserv_init(PADDR(ipaddr), 53, dns_query_proc) != ERR_OK) ; ... }
HTTPãµãŒããŒãèµ·åããŸã
é·ãéãç¡é§ã§ããããlwipããã±ãŒãžãcontrib-1.4.1ãããã®æåãªãµãŒããŒã®ç«ã¡äžãã«èŠåŽããªããã°ãªããŸããã§ããã ä»ãŸã§ãäžèŠå¹³ããªå°é¢ã«çŸããç¥ç§çãªHardFaultã¯ãç§ã«ã¯è¬ã®ãŸãŸã§ãã ãã¹ãŠã®èšå®ããã§ãã¯ãããã¢ãã¬ã¹ã®èªã¿åããšæžã蟌ã¿ãè¡ãããã¹ã¿ãã¯ã®æ·±ãã...æ®å¿µãªããã
ãã®åŸãäœæ¥çšã®httpãµãŒããŒã®äœæãéå§ããmem_mallocã«ãã£ãŠå²ãåœãŠãããã¡ã¢ãªé åã«ã¢ã¯ã»ã¹ãããšHardFaultãç¹°ãè¿ãããŸããã åæã«ãã¢ãã¬ã¹ã¯æå¹ã§ãããå éšRAMã«é¢é£ããŠããŸããã äžè¬çã«ã圌ã¯åãã§ãã€ãããã¯ã¢ãã±ãŒã·ã§ã³ã«å¥ããåãããµãŒããŒã§ã¹ã¿ãã£ãã¯ã䜿çšãå§ããŸããã ãã ããHardFaultã®çç±ã«é¢ãã質åã¯æªè§£æ±ºã®ãŸãŸã§ãããããçŸåšã®ããŒãžã§ã³ã®ã©ã€ãã©ãªã§lwip mem_ *é¢æ°ã䜿çšããã®ã¯å®å šã§ã¯ãªãããšã«çæããå¿ èŠããããŸãã
ã ãããçµæã¯ãŸã åŸãããã
HTTPãµãŒããŒæå¹åã³ãŒãïŒ
static const my_page_t my_pages[] = { { "/", 200, MIME_TEXT_HTML, page1_html, page1_html_size }, { "/page2.htm", 200, MIME_TEXT_HTML, page2_html, page2_html_size }, { "/page3.htm", 200, MIME_TEXT_HTML, page3_html, page3_html_size }, { "/check.gif", 200, MIME_IMAGE_GIF, check_png, check_png_size }, { NULL, 404, MIME_TEXT_HTML, page_not_found, page_not_found_size } }; bool on_http_req(const http_req_t *req, http_resp_t *resp, void **arg) { const my_page_t *page; for (page = my_pages; page->uri != NULL; page++) if (strcmp(page->uri, req->uri) == 0) break; resp->code = page->code; resp->cont_len = page->size; resp->mime = page->mime; resp->conn_type = CT_CLOSE; *arg = (void *)page; return true; } void http_write_data() { for (int i = 0; i < HTTP_SERVER_MAX_CON; i++) { int n; const htcon_t *con; my_page_t *page; con = htcon(i); if (con == NULL) continue; page = (my_page_t *)con->arg; if (con->state == CON_CLOSED) { htcon_free(i); continue; } if (con->state != CON_ACTIVE) continue; n = page->size - con->writed; htcon_write(i, (char *)page->data + con->writed, n); } } int main(void) { ... htserv_on_req = on_http_req; while (htserv_init(80) != ERR_OK) ; while (1) { stmr(); // call software timers usb_polling(); // usb device polling http_write_data(); // writes http response } }
æªè§£æ±ºã®åé¡
1.ä»ã®ãœãããŠã§ã¢ã«å«ããããã®ç¬èªã®æ¡ä»¶ããããããããªãlwipã¹ã¿ãã¯ã®åã©ã€ã»ã³ã¹ã®ãã¥ã¢ã³ã¹ã
2. Linuxã§ã®äœæ¥ã«é¢ããåé¡ã
3. POSTèŠæ±åŠçãè¿œå ããŸãã
4.ããã«ãã¯ãšãªããã±ãããåŠçããããã®DNSãµãŒããŒã®æçµåã
5. mem_mallocã®åé¡ã