Jump to content

    
Sign in to follow this  
dima_spb

USB_STM32F4

Recommended Posts

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

Плата: 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ом.

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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites
14 часов назад, Pablo сказал:

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

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

 

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

pvPortMalloc

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

Share this post


Link to post
Share on other sites
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 в ответе на первую команду хоста , чтобы хост подождал. А то получается , что переданные команды накапливаются , но мне кажется это не правильно.

 

Share this post


Link to post
Share on other sites
2 часа назад, kkmspb сказал:

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

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

Share this post


Link to post
Share on other sites

Алилуя! Разобрался с 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 на нужное время и все. Что мне не нравится - чтобы понять эту простую казалось бы вещь надо все-таки въезжать в регистры. А это не один день мягко говоря... (но зато на всю жизнь - такое не забывается)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this