====== Zadání ======
Navrhněte zařízení využivajíci vlastní ethernet modul (STM32F4 + LAN8720A), sloužíci k zasílaní tzv. Magic paketu. Cílová adresa pro Magic packet bude nastavitelná pomocí HTTP rozhraní.
====== Úvod ======
Cílem tohoto projektu je navrhnou vlastní ethernet modul pro STM32F4DISCOVERY desku. Tento ethernet modul musí být kompatibilní s oficiálním STM32F4-BB deskou. STM32F4 procesor pro stisk tlačitka USER a po přijetí události odešle nastavený počet Magic paketů na broadcast dané počitačové síté ( nebo globální bradcast).
Pro konfiguraci bude FW obsahovat primitivní HTTP server s jedinou stránkou. Parametry budou předány metodou GET.
====== Hardware =====
- Vývojový kit STM32F4DISCOVERY
- Vlastní LAN 8720A ethernet shield:
* Schematic [[http://www.urel.feec.vutbr.cz/MPOA/_media/2016/etherwol_stm32f4_ethernet.pdf ]]
* DPS F.Cu [[http://www.urel.feec.vutbr.cz/MPOA/_media/2016/etherwol_f.cu.pdf]]
* DPS B.Cu [[http://www.urel.feec.vutbr.cz/MPOA/_media/2016/etherwol_b.cu.pdf]]
{{:2016:etherwol_3dpcb.png?300|}}
Ethernet shield je zhotoven v domácích podnínkách na FR4 desku. QFN24 je zapájeno následujícím způsobem:
* Vyvrtána díra 2mm uprostřed Thermal padu
* QFN24 pomocí horkého vzduchu připájeno na desku a zkontrolováno pro mezi vývodové skraty
* Z druhé strany je ocínován Thermal pad a celá 2mm díra je postupně zalita cínem
Finální verze desky je {{ :2016:etherwol_gerber.7z |zde}}. Jde o vygenerované gerber data. Oproti předchozí verzi je ořezaná o nepotřebnou plochu.
======= Firmware ========
Základ projektu je vygenerován v prostředí STCubeMX. Zde jsou vybrány komponenty FreeRTOS a LwIP stack.
Následně je základ projektu skompilován a doplěn o blikání diodou pro ověření kompilačniho a programovacího flow.
Utility:
* STCubeMX
* gcc-arm-none-eabi toolkit
* gdb-arm-none-eabi a openocd pro programování a debugging
* gnu make
* vim
Jako API pro síťovou komunikaci byly zvoleny UNIX sockety. Práce se scokety se značně podobá práci se soubory a dokumentace je jednoduše dostupná. Není však možné ji použít bez kooperativního multitaskingu (volání jsou blokující).
=== Semihosting ===
Pro zprovoznění semihostingu je třeba mít OpenOCD verze alespň 0.10.0-dev-00419-gbcaf775.
=== HTTP server ===
Zařízení bude poslouchat na portu 80 a reagovat na následující dotazy:
GET / HTTP/1.1
(Ignore all nonempty lines)
GET /save?target=(MAC) HTTP/1.1
(Ignore all nonempty lines)
Příklad odpovědí:
HTTP/1.1 200 OK
(content...)
HTTP/1.1 404 Not found
(content...)
HTTP odpovědi stačí poslat bez hlaviček a následně ukončit spojení. Jedná se o odpověď dle staršího HTTP standardu ale prohlížeče ji dokáží pochopit.
=== Wake on lan ===
Magic packet typicky posílaný jako UDP na port 0,7 nebo 9. Struktura není pevně daná, paket musí obsahovat následující data (kdekoli v těle):
FF FF FF FF FF FF
(target MAC)*16
==== Debugging LwIP stacku ====
Pro potřeby ladění je vhodné zapnout debug výpisy z LwIP stacku. Pro jejich povolení je třeba:
* Nadefinovat symbol LWIP_DEBUG
* Změnit definici LWIP_PLATFORM_DEBUG v Middlewares/Third_Party/LwIP/system/arch/cc.h na "do{printf message;}while(0)" (ano bez zavorek za printf)
* V souboru Middlewares/Third_Party/LwIP/src/include/lwip/debug.h změnit LWIP_DEBUG_ON a LWIP_DEBUG_OFF na 0xF0
Pro první testování je vhodné zařízení připojit přímo k počítači bez switche v cestě. Switche typu store-forward zahodí poškozené pakety.
FreeRTOS: pokud aplikace padá na assertion v port.c:752 přidat následující řádek před spuštěním Sheduleru: HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
=== Zdrojové kódy===
Zdrojové kódy jsou k dispozici {{ :2016:ethernetwol.7z | zde}}.
=== Video ===
{{ youtube>c4wfqEg0cyQ?medium }}
=== Závěr ===
Návrh modulu byl poměrně přímočarý. Výroba prototypu nebyla problém i přez velmi malé pouzdor čipu LAN8720A. Oživení modulu bylo lehce komplikovanější, kvůli chybně zapájenému vývodu na desce. Chyba nebyla přímo viditelná kvůli použitému switchi store-and-forward. Při přímém propojení zařízení a PC byla tato chyba vyditelná v Wiresharku. Po prozkoumání dat byla oprava triviální.
Návrh na rozšíření:
* detekce MAC adresy na základě zadané IP
* vlastní HW bez nutnosti použití DISCOVERY kitu
* vyhledání zařízení na lokální síti