Перейти к содержанию
    

USB_STM32F4

Всем привет!!!

Плата: STM32F407G-DISC1

Цель: RNDIS.

Используя в качестве примера статью по RNDIS на STM32F407G-DISC1 c хабра, я решил сделать все тоже самое но на HAL библиотеках.

Проблема: Не вызывается функция usbd_rndis_data_out у VCP её полный аналог USBD_CDC_DataOut.

Привожу обе структуры для класса CDC:

Для VCP:

/* CDC interface class callbacks structure */
USBD_ClassTypeDef  USBD_CDC = 
{
  USBD_CDC_Init,
  USBD_CDC_DeInit,
  USBD_CDC_Setup,
  NULL,                 /* EP0_TxSent, */
  USBD_CDC_EP0_RxReady,
  USBD_CDC_DataIn, // device to host
  USBD_CDC_DataOut, // host to device 
  NULL,
  NULL,
  NULL,     
  USBD_CDC_GetHSCfgDesc,  
  USBD_CDC_GetFSCfgDesc,    
  USBD_CDC_GetOtherSpeedCfgDesc, 
  USBD_CDC_GetDeviceQualifierDescriptor,
};

 

для RNDIS:

USBD_ClassTypeDef usbd_rndis =
{
  usbd_rndis_init,
  usbd_rndis_deinit,
  usbd_rndis_setup,
  NULL,
  usbd_rndis_ep0_recv,
  usbd_rndis_data_in, // device to host
  usbd_rndis_data_out, // host to device
  usbd_rndis_sof,
  rndis_iso_in_incomplete,
  rndis_iso_out_incomplete,
  usbd_rndis_GetCfgDesc,
  usbd_rndis_GetCfgDesc, 
  usbd_rndis_GetCfgDesc,
  usbd_rndis_GetDeviceQualifierDesc,
};

 

И то что это RNDIS совсем не важно, так как протокол он находится выше уровнем.

Не получается понять почему не вызывается usbd_rndis_data_out. Т.е. данные host to device.

Оговорюсь, device to host, приходят корректно.

При этом точно уверен что host отправляет данные device. (проверял на рабочем проекте, который на SPL библиотеках).

Так же дескриптор проверил, правильный. 

Проект сконфигурирован от кварца.

  usbd_rndis_init,   usbd_rndis_deinit,   usbd_rndis_setup,   usbd_rndis_ep0_recv, usbd_rndis_GetCfgDesc  Работает.

Проверяю fpintом.

Помогите пожалуйста идеями где и что смотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бьюсь с LRNDIS на STM32F205VG под Atollic True Studio.

Исходный пример с гитхаба от Cергея Фетисова работает (без FreeRTOS) вполне нормально. На FreeRTOS пока не до конца понял как сделать.

Но по-поводу usbd_rndis_data_out : у вас по какому EP не срабатывает?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, Pablo сказал:

Бьюсь с LRNDIS на STM32F205VG под Atollic True Studio.

Исходный пример с гитхаба от Cергея Фетисова работает (без FreeRTOS) вполне нормально. На FreeRTOS пока не до конца понял как сделать...

 

Попробуйте найти и переопределить все "malloc" функции у используемых стеков на:

pvPortMalloc

Подсказка: ищите и заменяете в "define"-ах через задание части фразы "malloc" в поиске. Аналогично нужно и для др. операций с памятью сделать. Кроме того, для ОС нужно в некоторых местах использовать специализированные функции (например в прерываниях и т.п.) и это гораздо сложнее уже модификация  кода будет. Покамест 1-ую вещь, что я написал тут, попробуйте сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23.06.2020 в 06:46, AleksBak сказал:

Попробуйте найти и переопределить все "malloc" функции у используемых стеков на: pvPortMalloc

Абсолютно согласен. Также уже дошел , что надо FreeRTOs вариант static использовать.

Но на данный момент бьюсь с вопросом - как и когда посылать NAK в ответ хосту на команды (по протоколу RNDIS) и надо ли посылать...

Дело в том , что после инициализации RNDIS адаптера c ПК (win10) идет первая команда на EP3 (OUT) . Это чаще широковещательный запрос FF FF FF FF FF FF<- 00 00 00 00 00 00. Но далее не дожидаясь ответа от девайса хост продолжает слать другие команды.

Вот и думаю как использовать NAK в ответе на первую команду хоста , чтобы хост подождал. А то получается , что переданные команды накапливаются , но мне кажется это не правильно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, kkmspb сказал:

Но далее не дожидаясь ответа от девайса хост продолжает слать другие команды.

Когда ты принимаешь команды/данные из конечной точки, то ставишь статус RX_VALID. Тем самым говоришь хосту - я готов принимать ещё. Вот он и шлёт. Если задержишь выставление RX_VALID, то точка будет "на паузе".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алилуя! Разобрался с NAK . Все заработало как надо !

У меня особый вариант был : изначально был взят HAL Custom HID шаблон , и его постепенно превращали в RNDIS. Заодно и изучали USB потроха. И таки получилось. В принципе HAL не так уж плох, косяков в результате там не нашел (как ни странно). malloc понятно убрал.

Спасибо всем! Смысл оказался таким как только запускаешь прием команды по EP OUT (BULK) , контроллер (именно USB) сам выставляет NAK( 1) по прилету первого прерывания RXFLVL (не OEPINT).

Потом его (NAK) надо не забывать сбрасывать, что HAL и делает (в USB_EPStartXfer [по приему]). Если не сбрасывать получается нормально задержка , в результате которой можно спокойно обработать команду и все будет гут. в это время хосту будет отдаваться NAK по EP OUT.

То есть надо просто отложить вызов USBD_LL_PrepareReceive на нужное время и все. Что мне не нравится - чтобы понять эту простую казалось бы вещь надо все-таки въезжать в регистры. А это не один день мягко говоря... (но зато на всю жизнь - такое не забывается)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...