вторник, 11 апреля 2017 г.

stm32, windows, cdc-eem

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.


Комментариев нет:

Отправить комментарий