Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как установить драйвер на USB Device AT91RM9200?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
junkl
Не могу установить драйвер на 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.

Подскажите, пожалуйста, в чем может быть проблема?
cebotor
Цитата(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 , вашего дескриптора с теми , которые лежат в инф файле , либо есть кардинальное несоответствие интерфейсов указываемых ваши дескриптором с двайверами . у Вас какой вариант ?
junkl
Цитата(cebotor @ Apr 20 2007, 15:41) *
если Винда не дает выбрать инф файл для устройства , говоря о том , что в нем подходящих данных нет , то это означтать может только два варианта - либо не совпадают VID и PID , вашего дескриптора с теми , которые лежат в инф файле , либо есть кардинальное несоответствие интерфейсов указываемых ваши дескриптором с двайверами . у Вас какой вариант ?

Видимо, у меня второй вариант. smile.gif Спасибо, буду разбираться.
cebotor
Цитата(junkl @ Apr 20 2007, 17:00) *
Видимо, у меня второй вариант. smile.gif Спасибо, буду разбираться.

если хотите увидеть то , что в самом деле фидит винда получая Ваши дескрипторы - то можно воспользоваться утилитой библиотеки libusb
junkl
Цитата(cebotor @ Apr 20 2007, 18:47) *
если хотите увидеть то , что в самом деле фидит винда получая Ваши дескрипторы - то можно воспользоваться утилитой библиотеки libusb

А где ее взять?
amw
Цитата(junkl @ Apr 20 2007, 21:12) *
А где ее взять?

http://libusb.sourceforge.net/
junkl
Пытаюсь установить libusb, делаю все, как написано в INSTALL.libusb
(
% gzip -cd libusb-0.1.12.tar.gz | tar xvf - # unpack the sources
% cd libusb-0.1.12 # change to the toplevel directory
% ./configure # run the `configure' script
% make # build libusb
[ Become root if necessary ]
% make install
)

Распаковать-то я, конечно, распаковала и в папочку libusb-0.1.12 зашла.
Но у меня не получается запустить скрипт 'configure'

В ответ на './configure' я получаю:
"." не является внутренней или внешней командой, испольн-ой программой или пакетным файлом.

В ответ на 'make' получаю:
MAKE Version 5.2 Copiright <c> 1987, 2000 Borland

В ответ на 'make install' получаю:
MAKE Version 5.2 Copiright <c> 1987, 2000 Borland
Fatal: 'install' does not exist - don't know how to make it
-----------------------------------------------------------
Чего-то не хватает? Может надо что-нибудь предварительно установить?
Спасибо.
PrSt
Цитата(junkl @ Apr 23 2007, 08:56) *
Пытаюсь установить libusb, делаю все, как написано в INSTALL.libusb
(
% gzip -cd libusb-0.1.12.tar.gz | tar xvf - # unpack the sources
% cd libusb-0.1.12 # change to the toplevel directory
% ./configure # run the `configure' script
% make # build libusb
[ Become root if necessary ]
% make install
)

Распаковать-то я, конечно, распаковала и в папочку libusb-0.1.12 зашла.
Но у меня не получается запустить скрипт 'configure'

В ответ на './configure' я получаю:
"." не является внутренней или внешней командой, испольн-ой программой или пакетным файлом.

В ответ на 'make' получаю:
MAKE Version 5.2 Copiright <c> 1987, 2000 Borland

В ответ на 'make install' получаю:
MAKE Version 5.2 Copiright <c> 1987, 2000 Borland
Fatal: 'install' does not exist - don't know how to make it
-----------------------------------------------------------
Чего-то не хватает? Может надо что-нибудь предварительно установить?
Спасибо.

Стоп.... Погодите ка....
может я что-то не догоняю(не решал еще эту задачу), однако хочу хотя-бы для себя понять...
причем тут Borland?
Вы что это делаете в виндовс?
Вам привели ссылочку, и.... там ведь черным по белому написано

Operating System support
Linux
FreeBSD
NetBSD
OpenBSD
Darwin
MacOS X

от куда вы решили что Borland сможет собрать это хозяйство?
не удевительно Вы получаете вот это
Код
В ответ на 'make install' получаю:
MAKE Version 5.2 Copiright <c> 1987, 2000 Borland
Fatal: 'install' does not exist - don't know how to make it


поправьте пожалуйста меня если Borland уже умеет работать с утилитой make...
Если я все верно понял - то, Вам наверно это надо запускать со стороны "USB Device AT91RM9200" c Linux...
cebotor
Цитата(junkl @ Apr 23 2007, 09:56) *
Пытаюсь установить libusb, делаю все, как написано в INSTALL.libusb

libusb есть и виндовый и линуксовый , если Вам нужен виндовый , то ссылку могу дать , там ничего вобще собирать не надо. то что Вы скачали , можно собрать под виндой , но работать будет под линуксом.
виндовый лежит тут

http://libusb-win32.sourceforge.net

так подо что Вам ?
junkl
Цитата(cebotor @ Apr 23 2007, 10:31) *
libusb есть и виндовый и линуксовый , если Вам нужен виндовый , то ссылку могу дать , там ничего вобще собирать не надо. то что Вы скачали , можно собрать под виндой , но работать будет под линуксом.
виндовый лежит тут

http://libusb-win32.sourceforge.net

так подо что Вам ?


Мне под Windows надо. Спасибо.
amw
Цитата
поправьте пожалуйста меня если Borland уже умеет работать с утилитой make...

Borland-овские инструменты (компиляторы, IDE ...) имею свой make.
Цитата
Если я все верно понял - то, Вам наверно это надо запускать со стороны "USB Device AT91RM9200" c Linux...

Нет, на хосте. Но использовать Windows версию.
Хотя и на RM9200 под Linux тоже можно, я думаю. Тогда использовать Linux версию, если там Linux.
junkl
Цитата(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?

Спасибо.
amw
Цитата(junkl @ Apr 24 2007, 16:04) *
Теперь я поняла, что у меня как раз первый вариант:
мое Неизвестное устройство отображается в Диспетчере устройств с PID и VID = 0.
Смотрю в отладчике передачу дескриптора устройства по запросу от хоста.

Но только вот я не понимаю, как с помощью этой функции можно передать 18-байтный дескриптор, если реально передается только 8?

Спасибо.

Размер конечной точки ноль равен восьми байтам? Я не знаю, как у RM9200 с этим размером. Если да, то нужно слать дескриптор устройства (который 18 байт длиной) порциями по восемь или меньше для последней порции байт. А точнее тремя порциями 8, 8, 2 байт.
Проверте сам дескриптор. Если там VID и PID равны нулю (что очень вероятно для примера) то укажите там правильные значения, которые прописаны в inf файле.
VID и PID равные нулю быть не могут. Смотрите спецификацию USB.
cebotor
Цитата(junkl @ Apr 24 2007, 17:04) *
void AT91F_SVC_USBCTL_DataIn(
AT91PS_SVC_USBCTL pSvcUdp, // \arg Pointer to an USBCTL service
AT91PS_UDP pUdp) // \arg Pointer to UDP registers
{

Но только вот я не понимаю, как с помощью этой функции можно передать 18-байтный дескриптор, если реально передается только 8?

Спасибо.

Вы не можете показать , где указанная функция применяется к дескриптору для передачи ? (хотелось бы в вашем исходном примере)
у меня вообще есть подозрение , что она вызывается где то циклически поэтому и отрабатывает только в пределах восьми байт .
Если не секрет , откуда пример ?
junkl
Цитата(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, чтобы удостовериться, что данные получены хостом?

Хотя я пробовала другой пример, и там этот флаг у меня не устанавливается.
И почему тогда в примере нет анализа этого флага?

Как проверить, что хост вообще получает мои данные?
amw
Цитата
Может быть перед передачей каждого куска надо еще ждать установки флага TX_COMP, чтобы удостовериться, что данные получены хостом?

Да.
Следующую часть пакета нужно посылать при установке флага TX_COMP после передачи первой части.
junkl
Цитата(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).
Пример могу прислать. Нужно? smile.gif

Спасибо.
amw
Цитата(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).
Пример могу прислать. Нужно? smile.gif

Спасибо.

Вот это:
Код
pUSBCTL->Write(pUSBCTL, deviceDescriptor, MIN(sizeof(deviceDescriptor), wLength),
    (AT91PF_SVC_USBCTL_RWComplete) 0)

отсылает начало пакета (дескриптора). А остальные части отсылаются по TX_COMP?
junkl
Цитата(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);


А как надо?
amw
Цитата(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 у них похожие, но не идентичные.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.