STM32 в качестве ethernet адаптера.
Некоторое время назад обнаружил на aliexpress дешевые платы на STM32F103C8T6.
Например:
STM32-Minimum-System-Development-Board-Module
В качестве игрушки то, что надо: спалить не жалко, писать под stm32 не сложнее, чем под Arduino (CubeMX + uVision + HAL), отлаживаться гораздо проще и удобнее, а производительность и возможности даже сравнивать нельзя.
Для удобства обмена данными давно хотелось видеть контроллер как ip устройство, которое могло бы подключать к хосту с Windows (хотя бы Win10, лучше к Win7-10).
Естественно, сразу возник вопрос, какую модель реализовывать: RNDIS,
CDC-EEM
, CDC-ECM, CDC-NCM ?
RNDIS уже делали (например,
https://habrahabr.ru/post/274663/
) - неинтересно;
ECM, NCM - для винды нет драйверов;
Кстати, для NCM (линуксовый хост <> stm32) есть проект
https://www.keil.com/pack/doc/mw/USB/html/dev_cdc_ncm.html, но с использованием Keil RTX.
EEM делали, но никакой конкретики (по сути реклама) не описано:
https://habrahabr.ru/company/metrotek/blog/264293/.
EEM в исходниках для контроллеров есть, но не для cortex и не на C (xmos).
Можно подсмотреть как устроены дескрипторы устройства:
https://github.com/xcore/sc_usb/blob/master/app_example_usb_eem/src/endpoint0.xc (hiSpdConfDesc).
Что касается хоста, в Win10 обнаружился драйвер usbnet.sys, который, вроде бы, служит для связи с EEM устройством, судя по .inf файлу. У Microsoft никакой конкретики не нашел.
Но, как выяснилось, хотя на дескриптор (class 02/subclass 0c/protocol 07) он устанавливается, получаем статус - "требуется дальнейшая установка устройства" (или что-то подобное).
Сторонние производители драйвера делают, но хотят денег и работают только с конторами-производителями железа. Тоже неинтересно.
Например:
http://www.mcci.com/mcci-v5/hostside/eem_drivers.html
http://www.belcarra.com/2012/01/belcarra-eem-configuration-extension.html
http://www.thesycon.de/eng/prod_usbdevicedriver.shtml
На некоторое время идея была зарошена,
пока на сайте HID global случайно не обнаружился среди их дистрибутивов драйвер eem:
https://www.hidglobal.com/file/hidglobalusbcdceemdriverv25100zip
.
Как оказалось, это драйвер от Thesycon Software Solutions (ссылка выше) с кастомизированным VID/PID.
Так как драйвер для винды нашелся - появился смысл сделать eem-device.
Использовалось:
плата с STM32F103C8T6
драйвера EEM для win7-10
сниффер - USBlizer и Wireshark c USBpcap
в качестве "рыбы" в CubeMX был сгенерирован пример для CDC-ACM под Keil uVision.
На текущий момент реализовано arp и icmp echo request/reply (т.е. устройство отвечает на ping).
Исходники
https://github.com/rawaaw/cdc-eem-f103
Там же драйвера, извлеченные из msi.
При подключении устройство опознается как ethernet адаптер.
Вручную
адаптеру нужно присвоить адрес 10.11.12.1/24.
Контроллер - устройство
с адресом 10.11.12.2/24 и mac-адресом 11.12.13.13.14.15.
Устройство видно в arp таблице, и оно отвечает на ping.