|
AT91USBFramework, динамическое изменение типа конечной точки |
|
|
|
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.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|