Первый пример , скачанный в интернете, по теме lwip , RNDIS и STM32.
Для понимания как происходит USB прерывание по приходу данных и передача данных для обработки данных в LWIP функции :
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &usbd_rndis_cb, &USR_cb); [app.c]
// это инициализация USBD периферии, делается один раз
USBD_Class_cb_TypeDef usbd_rndis_cb [usbd_rndis_core.c]
// это структура где описываются указатели на стандартные обязательные пользовательские функции
// для обработки поступающих данных (коллбеки)
usbd_rndis_data_out [usbd_rndis_core.c]
// коллбек для обработки данных , пришедших от хоста
handle_packet [usbd_rndis_core.c]
rndis_rxproc [app.c]
on_packet [app.c]
recvSize
ethernet_input
Таким образом файл usbd_rndis_core.c отвечает за прием данных от Хоста , первоначальную обработку , и потом только получается готовый пакет , который надо передать на обработку в lwip.
Вот теперь становится понятно, как работает проект.
Далее мы возьмем наш проект созданный на CubeMX для STM32F205VG. Сделаем в нем USBD CDC. И далее срастим два проекта плавно адаптируя код из LRNDIS в наш HAL проект.
В коде программы LRNDIS ставим трассировку и наблюдаем логику программы :
USBD_OTG_ISR_Handler [usb_dcd_int.c]
USBD_SetupStage [usbd_core.c]
usbd_rndis_setup [usbd_rndis_core.c]