|
AT91USBFramework, динамическое изменение типа конечной точки |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 21)
|
May 10 2010, 06:01
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Опишу проблему подробнее. Есть драйвер, который работает с устройством, имеющем следующие дескрипторы конечных точек Код sizeof(S_usb_endpoint_descriptor), // Size of this descriptor in bytes USB_ENDPOINT_DESCRIPTOR, // ENDPOINT descriptor type 0x82, // IN endpoint, address = 0x01 ENDPOINT_TYPE_BULK, // Bulk endpoint 64, // Endpoint size is 64 bytes 0x00 // Must be 0x00 for full-speed bulk // endpoints sizeof(S_usb_endpoint_descriptor), // Size of this descriptor in bytes USB_ENDPOINT_DESCRIPTOR, // ENDPOINT descriptor type 0x02, // OUT endpoint, address = 0x02 ENDPOINT_TYPE_BULK, // Bulk endpoint 64, // Endpoint size is 64 bytes 0x00 // Must be 0x00 for full-speed bulk Получается одна и та же конечная точка работает и на чтение и на передачу. За основу я взял AT91USBFramework. Компьютером устройство определятся нормально, драйвер устанавливается. В устройстве я жду пакет от компа (не USB пакет, а пакет протокола) переключаю конечную точку. Для этого добавил такую функцию Код void STD_Reconfig_Endpoin( S_std_class *pClass ) { S_usb_endpoint_descriptor *pEpDesc; S_usb_endpoint *pEndpoint; uint32_t tmp_UDP_CSR[2]; if( SER_EPT_DATA_OUT == 0x02 ) { SER_EPT_DATA_OUT = 0x01; SER_EPT_DATA_IN = 0x02; pEpDesc = (S_usb_endpoint_descriptor*)(pClass->pDescriptors->pEndpoints[0]); pEpDesc->bEndpointAddress = 0x02; //USB_ConfigureEndpoint(pClass->pUsb, pEpDesc); pEpDesc = (S_usb_endpoint_descriptor*)(pClass->pDescriptors->pEndpoints[1]); pEpDesc->bEndpointAddress = 0x82; //USB_ConfigureEndpoint(pClass->pUsb, pEpDesc); }else{ SER_EPT_DATA_OUT = 0x02; SER_EPT_DATA_IN = 0x01; pEpDesc = (S_usb_endpoint_descriptor*)(pClass->pDescriptors->pEndpoints[0]); pEpDesc->bEndpointAddress = 0x82; // USB_ConfigureEndpoint(pClass->pUsb, pEpDesc); pEpDesc = (S_usb_endpoint_descriptor*)(pClass->pDescriptors->pEndpoints[1]); pEpDesc->bEndpointAddress = 0x02; // USB_ConfigureEndpoint(pClass->pUsb, pEpDesc); }; AT91C_BASE_UDP->UDP_CSR[SER_EPT_DATA_OUT] &= ~(AT91C_UDP_EPTYPE); AT91C_BASE_UDP->UDP_CSR[SER_EPT_DATA_OUT] |= AT91C_UDP_EPTYPE_BULK_OUT; AT91C_BASE_UDP->UDP_CSR[SER_EPT_DATA_IN] &= ~(AT91C_UDP_EPTYPE); AT91C_BASE_UDP->UDP_CSR[SER_EPT_DATA_IN] |= AT91C_UDP_EPTYPE_BULK_IN;
// Enter the Configured state USB_SetConfiguration(pClass->pUsb);
USB_ConfigureEndpoint(pClass->pUsb, pClass->pDescriptors->pEndpoints[0]); USB_ConfigureEndpoint(pClass->pUsb, pClass->pDescriptors->pEndpoints[1]); } Далее пытаюсь отправить пакет компьютеру. И ничего не отправляется. Даже в прерывание конечной точки не попадает, хотя они разрешены и настроены.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 10 2010, 07:41
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(sergeeff @ May 10 2010, 10:54)  Когда вы хотите поменять что-либо в своем usb устройстве, то об этом надо сообщить usb host device (PC, например). Для этого вы в своем устройстве должны сделать usb reset (есть у вас транзистор на DDP, наверное). Тогда PC распознает ваше usb устройство как новое, со всеми вытекающими. В том то и дело, что для хоста ничего не меняется. Посмотрите дескрипторы конечных точек, которые я привел выше. Меняется только внутри моего устройства, и хост об этом ничего знать не должен. Поэтому сброс всего USB устройства производить не требуется.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 11 2010, 04:36
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(aaarrr @ May 10 2010, 16:59)  Это две физически разные точки. А атмеловцы несколько урезали свою продукцию в плане гибкости назначения номеров точек. А чтобы Вы можете предложить для решения этой задачи? Изначально этот драйвер работал с USBN9603(4)
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 11 2010, 12:45
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(sergeeff @ May 11 2010, 09:55)  Вы все как-то вокруг да около. Что за проблема то? Посмотрели в докементацию на процессор какие точки поддерживают bulk протокол, одну определили на прием, другую - на передачу. Все! HOST шлет Data IN PID с номером конечной точки 2, а два у меня уже OUT. Вот в этом и проблема. А если я попытаюсь сделать контрольную точку 1 как IN, то данные из нее никогда не заберутся, т.к. HOST просит данные с конечной точки 2, а не 1.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 12 2010, 11:39
|
Местный
  
Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806

|
Цитата(VslavX @ May 12 2010, 16:07)  Такого не может быть, значит неправильно задали дескрипторы. Идеология USB именно предусматривает ..... А разработчик драйвера, являясь воинствующим атеистом, взял и ,пользуясь "визардом" DriverStudio, задал адреса EP так, как ему захотелось, даже не обращаясь к дескрипторам. Вот вам и " не может быть".
|
|
|
|
|
May 12 2010, 12:09
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(Седой @ May 12 2010, 14:39)  А разработчик драйвера, являясь воинствующим атеистом, взял и ,пользуясь "визардом" DriverStudio, задал адреса EP так, как ему захотелось, даже не обращаясь к дескрипторам. Вот вам и " не может быть". Умеючи-то что хошь можно сломать  Я так понял из ситуации что драйвер нормальный есть - в него топикстартер не лазил. Хотя... Я того AT91USBFramework "в глаза" не видел, возможно Вы правы - какой там драйвер я не знаю - очень может быть что кривой (привязаться к физическим номерам EP - это клиника) . Привык вот следовать рекомендациям MS, юзать штатные классовые драйвера и не писать, по возможности, своих.
|
|
|
|
|
May 12 2010, 12:25
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(VslavX @ May 12 2010, 16:09)  Умеючи-то что хошь можно сломать  Я так понял из ситуации что драйвер нормальный есть - в него топикстартер не лазил. Хотя... Я того AT91USBFramework "в глаза" не видел.... Драйвер для компьютера есть нормальный, входит в комплект AVR Studio. AT91USBFramework пример ATMEL для AT91SAM7xxxx. Входит в комплект IAR, живет в папочке example. Вот полный список дескрипторов, которые ATMEL приводит для того драйвера, который входит в комплект AVR Studio (AppNote AVR069) Код Device Descriptor bLength 0x12 bDescriptorType 0x01 bcdUSB 0x0110 bDeviceClass 0xFF bDeviceSubClass 0x00 bDeviceProtocol 0x00 bMaxPacketSize0 0x10 idVendor 0x03EB idProduct 0x2104 bcdDevice 0x0200 iManufacturer 0x01 iProduct 0x02 iSerialNumber 0x03 bNumConfigurations 0x01
Configuration descriptor
bLength 0x09 bDescriptorType 0x02 wTotalLength 0x0020 bNumInterface 0x01 bConfigurationValue 0x01 iConfiguration 0x00 bmAttributes. 0x00 bmAttributes. 0x00 bmAttributes. 0x01 bmAttributes. 0x01 bMaxPower 0x64
Interface descriptor
bLength 0x09 bDescriptorType 0x04 bInterfaceNumber 0x00 bAlternateSetting 0x00 bNumEndpoints 0x02 bInterfaceClass 0xFF bInterfaceSubClass 0x00 bInterfaceProtocol 0x00 iInterface 0x00 А дескрипторы конечных точек я уже приводил выше
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 13 2010, 06:11
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(VslavX @ May 12 2010, 17:00)  У Вас там точки назначены обе на 2-ой физический адрес - 0x02 (OUT EP2), и 0x82 (IN EP2). Это исходный вариант Цитата(VslavX @ May 12 2010, 17:00)  Поменяйте 0x82, например, на 0x83 и инициализируйте EP3 - хост должен с нее начать спрашивать данные (если таки драйвер корректный). Если не получится - выложите лог, полученный анализатором (в какой-нить удобной форме, если USBlyzer - то можно и бинарник - я смогу посмотреть) Когда я пытался на ходу переключать в контроллере конечные точки с OUT на IN в логах появлялись обращения к точке 0x82, но статус был "не выполнено", когда я заменил точку с 0x82 на 0x81 в логах обращений к 0x81 вообще не появляется. Я заказал STM32F103, там вроде физическим точкам можно присваивать любой логический номер. Поэтому откладываю этот вопрос до получения результатов работы с STM32F103. Всем спасибо за участие
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 13 2010, 11:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(dimka76 @ May 13 2010, 09:11)  Это исходный вариант Когда я пытался на ходу переключать в контроллере конечные точки с OUT на IN в логах появлялись обращения к точке 0x82, но статус был "не выполнено", когда я заменил точку с 0x82 на 0x81 в логах обращений к 0x81 вообще не появляется. Я заказал STM32F103, там вроде физическим точкам можно присваивать любой логический номер. Поэтому откладываю этот вопрос до получения результатов работы с STM32F103. Всем спасибо за участие  Ну так сделайте 0x02 --> 0x01, а 0x82 оставьте как есть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|