|
Как установить драйвер на USB Device AT91RM9200? |
|
|
|
Apr 25 2007, 15:04
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата Может быть перед передачей каждого куска надо еще ждать установки флага TX_COMP, чтобы удостовериться, что данные получены хостом? Да. Следующую часть пакета нужно посылать при установке флага TX_COMP после передачи первой части.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 25 2007, 15:24
|
Участник

Группа: Новичок
Сообщений: 69
Регистрация: 12-10-05
Из: Калуга
Пользователь №: 9 539

|
Цитата(cebotor @ Apr 25 2007, 13:27)  Вы не можете показать , где указанная функция применяется к дескриптору для передачи ? (хотелось бы в вашем исходном примере) у меня вообще есть подозрение , что она вызывается где то циклически поэтому и отрабатывает только в пределах восьми байт . Если не секрет , откуда пример ? Я тоже думала, может функция вызывается несколько раз, пока не передан полностью весь дескриптор? Но не смогла найти этому подтверждение. Смотрела по DBGU, что он передает. Только 8 первых байт дескриптора. Порядок вызова этой функции: Прерывание по Ep0 => usbEp0.Handler => AT91F_SVC_USBCTL_Handler => распознавание пакета SETUP, pSvcUdp->DisptachSetup(pSvcUdp) => AT91F_USB_DispatchRequest => распознавание STD_GET_DESCRIPTOR, AT91F_USB_GetDescriptorDevice(pUSBCTL) => pUSBCTL->Write(pUSBCTL, deviceDescriptor, MIN(sizeof(deviceDescriptor), wLength), (AT91PF_SVC_USBCTL_RWComplete) 0) => AT91F_SVC_USBCTL_DataIn(pSvcUdp, pSvcUdp->pUdp) Исходный код - с atmel.com для среды ADS AT91RM9200-BasicUSB. (Переделан под IAR). Пример могу прислать. Нужно? Спасибо.
|
|
|
|
|
Apr 25 2007, 15:50
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(junkl @ Apr 25 2007, 15:24)  Я тоже думала, может функция вызывается несколько раз, пока не передан полностью весь дескриптор? Но не смогла найти этому подтверждение. Смотрела по DBGU, что он передает. Только 8 первых байт дескриптора. Порядок вызова этой функции: Прерывание по Ep0 => usbEp0.Handler => AT91F_SVC_USBCTL_Handler => распознавание пакета SETUP, pSvcUdp->DisptachSetup(pSvcUdp) => AT91F_USB_DispatchRequest => распознавание STD_GET_DESCRIPTOR, AT91F_USB_GetDescriptorDevice(pUSBCTL) => pUSBCTL->Write(pUSBCTL, deviceDescriptor, MIN(sizeof(deviceDescriptor), wLength), (AT91PF_SVC_USBCTL_RWComplete) 0) => AT91F_SVC_USBCTL_DataIn(pSvcUdp, pSvcUdp->pUdp) Исходный код - с atmel.com для среды ADS AT91RM9200-BasicUSB. (Переделан под IAR). Пример могу прислать. Нужно? Спасибо. Вот это: Код pUSBCTL->Write(pUSBCTL, deviceDescriptor, MIN(sizeof(deviceDescriptor), wLength), (AT91PF_SVC_USBCTL_RWComplete) 0) отсылает начало пакета (дескриптора). А остальные части отсылаются по TX_COMP?
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 26 2007, 08:19
|
Участник

Группа: Новичок
Сообщений: 69
Регистрация: 12-10-05
Из: Калуга
Пользователь №: 9 539

|
Цитата(amw @ Apr 25 2007, 16:50)  Вот это: Код pUSBCTL->Write(pUSBCTL, deviceDescriptor, MIN(sizeof(deviceDescriptor), wLength), (AT91PF_SVC_USBCTL_RWComplete) 0) отсылает начало пакета (дескриптора). А остальные части отсылаются по TX_COMP? В исходном примере анализа TXCOMP я не видела. Просто в функции AT91F_SVC_USBCTL_DataIn я сделала цикл do ... while - пока не передан весь дескриптор Код do { if (pSvcUdp->bufferSize >= 8) { // bank 0 = 8 byte ? AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); pSvcUdp->bufferSize -= 8; } else { for (i=0;i<pSvcUdp->bufferSize;i++) AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); pSvcUdp->bufferSize = 0; } pSvcUdp->pBuffer = pBuffer; AT91F_UDP_EpEndOfWr(pUdp, 0); } while (pSvcUdp->bufferSize); А как надо?
Сообщение отредактировал junkl - Apr 26 2007, 08:21
|
|
|
|
|
Apr 27 2007, 13:04
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(junkl @ Apr 26 2007, 08:19)  В исходном примере анализа TXCOMP я не видела. Просто в функции AT91F_SVC_USBCTL_DataIn я сделала цикл do ... while - пока не передан весь дескриптор
А как надо? В общем случае надо: 1. Собрать полный пакет для отправки (любой длины). 2. Записать в буфер часть пакета, размером равным размеру конечной точки (или меньше). Если меньше, то значит пакет закончился. 3. Установить TXREADY. 4. Ждать TXCOMP. 5. Повторить пп 2-5. Убедитесь, что функции примера выпоняют это. PS По риведенному примеру ничего сказать не могу, так как у меня нет ни RM9200 ни примера ни Windows. Я работаю с SAM7, контроллеры USB у них похожие, но не идентичные.
Сообщение отредактировал amw - Apr 27 2007, 13:05
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|