dima_spb 0 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба Всем привет!!! Плата: 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ом. Помогите пожалуйста идеями где и что смотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kkmspb 0 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Бьюсь с LRNDIS на STM32F205VG под Atollic True Studio. Исходный пример с гитхаба от Cергея Фетисова работает (без FreeRTOS) вполне нормально. На FreeRTOS пока не до конца понял как сделать. Но по-поводу usbd_rndis_data_out : у вас по какому EP не срабатывает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 14 часов назад, Pablo сказал: Бьюсь с LRNDIS на STM32F205VG под Atollic True Studio. Исходный пример с гитхаба от Cергея Фетисова работает (без FreeRTOS) вполне нормально. На FreeRTOS пока не до конца понял как сделать... Попробуйте найти и переопределить все "malloc" функции у используемых стеков на: pvPortMalloc Подсказка: ищите и заменяете в "define"-ах через задание части фразы "malloc" в поиске. Аналогично нужно и для др. операций с памятью сделать. Кроме того, для ОС нужно в некоторых местах использовать специализированные функции (например в прерываниях и т.п.) и это гораздо сложнее уже модификация кода будет. Покамест 1-ую вещь, что я написал тут, попробуйте сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kkmspb 0 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба 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 в ответе на первую команду хоста , чтобы хост подождал. А то получается , что переданные команды накапливаются , но мне кажется это не правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба 2 часа назад, kkmspb сказал: Но далее не дожидаясь ответа от девайса хост продолжает слать другие команды. Когда ты принимаешь команды/данные из конечной точки, то ставишь статус RX_VALID. Тем самым говоришь хосту - я готов принимать ещё. Вот он и шлёт. Если задержишь выставление RX_VALID, то точка будет "на паузе". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kkmspb 0 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Алилуя! Разобрался с 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 на нужное время и все. Что мне не нравится - чтобы понять эту простую казалось бы вещь надо все-таки въезжать в регистры. А это не один день мягко говоря... (но зато на всю жизнь - такое не забывается) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться