|
|
 |
Ответов
|
Apr 20 2007, 14:41
|

Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809

|
Цитата(junkl @ Apr 20 2007, 14:58)  Не могу установить драйвер на USB Device AT91RM9200. При подключении устройства к компу Windows обнаруживает Неизвестное устройство. Любые попытки переустановить драйвер (указать путь к atm6124.inf или atm6124ser.inf) бесполезны. В отладчике вижу, что мой девайс получает запрос GET_DEVICE_DESCRIPTOR и отсылает хосту этот дескриптор. Но ничего не происходит. Неизвестное устройство остается неизвестным. В папочке Windows/system32 у меня лежат usbser.sys и atm6124.sys, а в папочке Windows/inf и atm6124.inf, и atm6124ser.inf, и atm6119.inf.
Подскажите, пожалуйста, в чем может быть проблема? если Винда не дает выбрать инф файл для устройства , говоря о том , что в нем подходящих данных нет , то это означтать может только два варианта - либо не совпадают VID и PID , вашего дескриптора с теми , которые лежат в инф файле , либо есть кардинальное несоответствие интерфейсов указываемых ваши дескриптором с двайверами . у Вас какой вариант ?
--------------------
если еррата пуста - это не хорошо а плохо
|
|
|
|
|
Apr 24 2007, 16:04
|
Участник

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

|
Цитата(cebotor @ Apr 20 2007, 15:41)  если Винда не дает выбрать инф файл для устройства , говоря о том , что в нем подходящих данных нет , то это означтать может только два варианта - либо не совпадают VID и PID , вашего дескриптора с теми , которые лежат в инф файле , либо есть кардинальное несоответствие интерфейсов указываемых ваши дескриптором с двайверами . у Вас какой вариант ? Теперь я поняла, что у меня как раз первый вариант: мое Неизвестное устройство отображается в Диспетчере устройств с PID и VID = 0. Смотрю в отладчике передачу дескриптора устройства по запросу от хоста. Может быть код моей функции неверен? Код void AT91F_SVC_USBCTL_DataIn( AT91PS_SVC_USBCTL pSvcUdp, // \arg Pointer to an USBCTL service AT91PS_UDP pUdp) // \arg Pointer to UDP registers { char *pBuffer; unsigned int i; // If bufferSize == 0 Send a Zero length packet if (pSvcUdp->bufferSize == 0) AT91F_UDP_EpEndOfWr(pUdp, 0); // pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; - data in FIFI is ready to be sent // else initialize DPR else { printf ("-I- In %d \r", pSvcUdp->bufferSize ); pBuffer = pSvcUdp->pBuffer;
do{// while (pSvcUdp->bufferSize){ 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); // pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; - data in FIFI is ready to be sent } while (pSvcUdp->bufferSize); }
pSvcUdp->eot = !(pSvcUdp->bufferSize); } В исходном примере код был такой: Код ... // If bufferSize == 0 Send a Zero length packet if (pSvcUdp->bufferSize == 0) AT91F_UDP_EpEndOfWr(pUdp, 0);
// else initialize DPR else { pBuffer = pSvcUdp->pBuffer; if (pSvcUdp->bufferSize >= 8) { 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 while (pSvcUdp->bufferSize--) AT91F_UDP_EpWrite(pUdp, 0, *pBuffer++); pSvcUdp->pBuffer = pBuffer; AT91F_UDP_EpEndOfWr(pUdp, 0); } pSvcUdp->eot = !(pSvcUdp->bufferSize); ... Но только вот я не понимаю, как с помощью этой функции можно передать 18-байтный дескриптор, если реально передается только 8? Спасибо.
|
|
|
|
|
Apr 25 2007, 11:05
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(junkl @ Apr 24 2007, 16:04)  Теперь я поняла, что у меня как раз первый вариант: мое Неизвестное устройство отображается в Диспетчере устройств с PID и VID = 0. Смотрю в отладчике передачу дескриптора устройства по запросу от хоста.
Но только вот я не понимаю, как с помощью этой функции можно передать 18-байтный дескриптор, если реально передается только 8?
Спасибо. Размер конечной точки ноль равен восьми байтам? Я не знаю, как у RM9200 с этим размером. Если да, то нужно слать дескриптор устройства (который 18 байт длиной) порциями по восемь или меньше для последней порции байт. А точнее тремя порциями 8, 8, 2 байт. Проверте сам дескриптор. Если там VID и PID равны нулю (что очень вероятно для примера) то укажите там правильные значения, которые прописаны в inf файле. VID и PID равные нулю быть не могут. Смотрите спецификацию USB.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 25 2007, 14:58
|
Участник

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

|
Цитата(amw @ Apr 25 2007, 12:05)  Размер конечной точки ноль равен восьми байтам? Я не знаю, как у RM9200 с этим размером. Если да, то нужно слать дескриптор устройства (который 18 байт длиной) порциями по восемь или меньше для последней порции байт. А точнее тремя порциями 8, 8, 2 байт. Проверте сам дескриптор. Если там VID и PID равны нулю (что очень вероятно для примера) то укажите там правильные значения, которые прописаны в inf файле. VID и PID равные нулю быть не могут. Смотрите спецификацию USB. Да, размер Ep0 = 8. VID и PID ненулевые, совпадают со значениями в файле inf. В своей функции я и передаю по 8 и меньше байт (8, 8, 2). Но устройство не распознается. Я вот думаю, может я некорректно заканчиваю передачу каждых 8 байт? Я вызываю функцию после передачи каждых 8, 8 и 2 байт: AT91F_UDP_EpEndOfWr(pUdp, 0); // pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; - data in FIFI is ready to be sent, чтобы показать, что данные готовы к передаче. Может быть перед передачей каждого куска надо еще ждать установки флага TX_COMP, чтобы удостовериться, что данные получены хостом? Хотя я пробовала другой пример, и там этот флаг у меня не устанавливается. И почему тогда в примере нет анализа этого флага? Как проверить, что хост вообще получает мои данные?
|
|
|
|
Сообщений в этой теме
junkl Как установить драйвер на USB Device AT91RM9200? Apr 20 2007, 13:58 junkl Цитата(cebotor @ Apr 20 2007, 15:41) если... Apr 20 2007, 16:00  cebotor Цитата(junkl @ Apr 20 2007, 17:00) Видимо... Apr 20 2007, 17:47   junkl Цитата(cebotor @ Apr 20 2007, 18:47) если... Apr 20 2007, 21:12    amw Цитата(junkl @ Apr 20 2007, 21:12) А где ... Apr 21 2007, 11:52     junkl Пытаюсь установить libusb, делаю все, как написано... Apr 23 2007, 08:56      PrSt Цитата(junkl @ Apr 23 2007, 08:56) Пытаюс... Apr 23 2007, 09:26      cebotor Цитата(junkl @ Apr 23 2007, 09:56) Пытаюс... Apr 23 2007, 09:31       junkl Цитата(cebotor @ Apr 23 2007, 10:31) libu... Apr 23 2007, 10:26  cebotor Цитата(junkl @ Apr 24 2007, 17:04) void A... Apr 25 2007, 12:27   junkl Цитата(cebotor @ Apr 25 2007, 13:27) Вы н... Apr 25 2007, 15:24    amw Цитата(junkl @ Apr 25 2007, 15:24) Я тоже... Apr 25 2007, 15:50     junkl Цитата(amw @ Apr 25 2007, 16:50) Вот это:... Apr 26 2007, 08:19      amw Цитата(junkl @ Apr 26 2007, 08:19) В исхо... Apr 27 2007, 13:04 amw Цитатапоправьте пожалуйста меня если Borland уже у... Apr 23 2007, 14:29 amw ЦитатаМожет быть перед передачей каждого куска над... Apr 25 2007, 15:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|