|
Непонятки с UDP у SAM7S64 |
|
|
|
May 24 2007, 07:35
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Зашел в тупик, бьюсь не первый день. Может, что подскажете?
Делаю HID-устройство на SAM7S64. Обслуживаю прерывание от EP0 стандартно: получаю запрос, разгребаю его и отправляю в ответ дескриптор или репорт. Для справки: размер EP0 равен 8 байтам, а дескрипторы и репорты могут быть больше.
Суть проблемы: Если перед загрузкой в FIFO очередной порции данных флаг TXCOMP опрашиваю поллингом в цикле (так сделано в примере HID mouse от Atmel) - все работает как надо, вопросов нет. Но крутиться в прерывании как-то некрасиво. Если же я начинаю делать "подкачку" данных в прерывании по TXCOMP, то, почему-то, не отправляется уже вторая порция данных.
Например, обрабатывается запрос хоста GET_DESCRIPTOR_DEVICE: 1) по прерыванию от EP0 выгребаю запрос из FIFO 2) формирую дескриптор устройства 3) первые 8 байт дескриптора загружаю в FIFO и поднимаю TXPKTRDY 4) жду прерывания от TXCOMP - и оно приходит 5) сбрасываю TXCOMP 6) очередную порцию дескриптора загружаю в FIFO и поднимаю TXPKTRDY и ничего не передается, хост ждет некоторое время и обрывает транзакцию IN.
Про необходимость правильной реакции на обрыв транзакции знаю. Где могут быть грабли? Любые соображения приму с багодарностью.
PS. Обратите внимание, что в случае поллинга флага TXCOMP все работает как часы, поэтому обсуждать правильность реализации протокола, видимо, не имеет смысла.
|
|
|
|
|
 |
Ответов
|
Mar 30 2016, 18:03
|
Знающий
   
Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454

|
Цитата(Serg_Sm @ Mar 28 2016, 15:58)  1) по ENDBUSRESET сброс EP и т.п.; 2) Получаю запрос на дескриптор устройства; 3) Первые 8 байт дескриптора загружаю в FIFO и поднимаю TXPKTRDY, сбрасываю TXCOMP; 4) Жду TXCOMP, посылаю следующие 8 байт (поднимая TXPKTRDY), сбрасываю TXCOMP. И вот здесь наблюдается затык... Это классические грабли. Windows псоле получения первых 8 байт дескриптора устройства - поизводит BUS_RESET. Потом опять шлет запрос дескриптора и получает его целиком. Нужно по ENDBUSRESET обязательно отменять передачу дескриптора, да и любые передачи.
|
|
|
|
|
Apr 1 2016, 06:31
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
Цитата(misyachniy @ Mar 30 2016, 21:03)  Это классические грабли. Windows псоле получения первых 8 байт дескриптора устройства - поизводит BUS_RESET. Потом опять шлет запрос дескриптора и получает его целиком.
Нужно по ENDBUSRESET обязательно отменять передачу дескриптора, да и любые передачи. 8-ка и 10-ка не производит BUS_RESET (после получения 8 байт дескриптора - скорость так подняли). В общем решил так - после BUS_RESET передаю только 8 байт дескриптора. Нашел про это в стандарте (п.5.5.3 USB2.0) - коряво написано: Цитата In order to determine the maximum packet size for the Default Control Pipe, the USB System Software reads the device descriptor. The host will read the first eight bytes of the device descriptor. The device always responds with at least these initial bytes in a single packet. After the host reads the initial part of the device descriptor, it is guaranteed to have read this default pipe’s wMaxPacketSize field (byte 7 of the device descriptor). Но вроде так можно.
|
|
|
|
Сообщений в этой теме
sgrig Непонятки с UDP у SAM7S64 May 24 2007, 07:35 KAlex Цитата(sgrig @ May 24 2007, 11:35) 5) сбр... May 24 2007, 08:24 sgrig Цитата(KAlex @ May 24 2007, 15:24) Попроб... May 24 2007, 08:35  KAlex Вот кусок рабочего кода. Никаких прерываний. AT91F... May 24 2007, 09:32   sgrig Цитата(KAlex @ May 24 2007, 16:32) Вот ку... May 24 2007, 12:45 KAlex Цитата(sgrig @ May 24 2007, 11:35) Наприм... May 24 2007, 13:17 sgrig Цитата(KAlex @ May 24 2007, 20:17) О... May 24 2007, 14:40  KAlex Цитата(sgrig @ May 24 2007, 18:40) Ведь T... May 25 2007, 07:41   sgrig Попробовал и это. Не помогло. Пойду напьюсь, может... May 25 2007, 09:52    KAlex Цитата(sgrig @ May 25 2007, 13:52) Попроб... May 25 2007, 10:15     sgrig Цитата(KAlex @ May 25 2007, 17:15)
Тоже... May 25 2007, 10:28      Calculator Цитата(sgrig @ May 25 2007, 16:28) Наприм... May 28 2007, 05:26       sgrig Цитата(Calculator @ May 28 2007, 12:26) Н... May 28 2007, 09:10 YKonstantin Цитата(sgrig @ May 24 2007, 10:35) 3) пер... May 28 2007, 17:38 sgrig Цитата(YKonstantin @ May 29 2007, 00:38) ... May 29 2007, 03:36  YKonstantin А вот еще вариант : может слишком долго в прерыван... May 29 2007, 05:26   sgrig Цитата(YKonstantin @ May 29 2007, 12:26) ... May 29 2007, 07:47    YKonstantin Цитата(sgrig @ May 29 2007, 10:47) Как я ... May 29 2007, 07:57     sgrig Цитата(YKonstantin @ May 29 2007, 14:57) ... May 29 2007, 08:35      YKonstantin Цитата(sgrig @ May 29 2007, 11:35) При от... May 29 2007, 09:02       sgrig Цитата(YKonstantin @ May 29 2007, 16:02) ... May 29 2007, 11:37        YKonstantin Цитата(sgrig @ May 29 2007, 14:37) То ест... May 29 2007, 11:51         sgrig Цитата(YKonstantin @ May 29 2007, 18:51) ... May 29 2007, 12:08 aaarrr Нет, так нельзя. В приведенной цитате сказано, что... Apr 1 2016, 12:20 Serg_Sm Цитата(aaarrr @ Apr 1 2016, 15:20) Нет, т... Apr 1 2016, 12:33  aaarrr Цитата(Serg_Sm @ Apr 1 2016, 15:33) Указа... Apr 1 2016, 12:55   Serg_Sm Цитата(aaarrr @ Apr 1 2016, 15:55) Это зн... Apr 1 2016, 12:55 Serg_Sm Так все-таки, подскажите - запрос GetDeviceDescrip... Apr 15 2016, 10:29 misyachniy Цитата(Serg_Sm @ Apr 15 2016, 13:29) Так ... Apr 15 2016, 15:38  Serg_Sm Цитата(misyachniy @ Apr 15 2016, 19:38) П... Apr 15 2016, 19:43   misyachniy Цитата(Serg_Sm @ Apr 15 2016, 22:43) RESE... Apr 16 2016, 12:29 Serg_Sm Цитата(misyachniy @ Apr 16 2016, 16:29) В... Apr 18 2016, 06:22 misyachniy Цитата(Serg_Sm @ Apr 18 2016, 09:22) RESE... Apr 18 2016, 17:20  Serg_Sm Цитата(misyachniy @ Apr 18 2016, 20:20) Н... Apr 19 2016, 06:54 Serg_Sm Всё, вроде разобрался)) Теперь работает везде где ... Apr 21 2016, 14:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|