реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AT91USBFramework, динамическое изменение типа конечной точки
dimka76
сообщение May 7 2010, 13:09
Сообщение #1


developer
****

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



Если кто разобрался с вышеуказанной framework, подскажите как на лету можно поменять тип контрольной точки с bulk-in на bulk-out и наоборот.

Как говориться, я уже весь мозг сломал, три дня воюю с этой проблемой.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 7 2010, 17:47
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(dimka76 @ May 7 2010, 16:09) *
Если кто разобрался с вышеуказанной framework, подскажите как на лету можно поменять тип контрольной точки с bulk-in на bulk-out и наоборот.

Как говориться, я уже весь мозг сломал, три дня воюю с этой проблемой.

Если хочется на лету что-то поменять, надо все подправить в дескрипторах и сделать аппаратный reset USB.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 10 2010, 06:01
Сообщение #3


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]);
    
    
}


Далее пытаюсь отправить пакет компьютеру. И ничего не отправляется. Даже в прерывание конечной точки не попадает, хотя они разрешены и настроены.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 10 2010, 06:54
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Когда вы хотите поменять что-либо в своем usb устройстве, то об этом надо сообщить usb host device (PC, например). Для этого вы в своем устройстве должны сделать usb reset (есть у вас транзистор на DDP, наверное). Тогда PC распознает ваше usb устройство как новое, со всеми вытекающими.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 10 2010, 07:41
Сообщение #5


developer
****

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



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


В том то и дело, что для хоста ничего не меняется. Посмотрите дескрипторы конечных точек, которые я привел выше.
Меняется только внутри моего устройства, и хост об этом ничего знать не должен. Поэтому сброс всего USB устройства производить не требуется.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 10 2010, 08:58
Сообщение #6


embarrassed systems engineer
*****

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



Мне представляется что динамически менять тип точки между BulkIN и BulkOUT на AT91 может быть очень проблемно - оно by design так не предусматривалось. Например, там внутри есть счетчик пакетов data0/data1 - он единственный на аппартную точку контроллера USB-device в AT91. А у Вас напрвления два и счетчика должно быть два. Поэтому - вряд ли задуманное Вами получится. Возьмите еще одну EP, например, с номером 3, и соответственно поправьте дескриптор - одна физическая EP будет BulkIN, другая EP - BulkOUT.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 10 2010, 09:27
Сообщение #7


developer
****

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



Цитата(VslavX @ May 10 2010, 12:58) *
Мне представляется что динамически менять тип точки между BulkIN и BulkOUT на AT91 может быть очень проблемно - оно by design так не предусматривалось. Например, там внутри есть счетчик пакетов data0/data1 - он единственный на аппартную точку контроллера USB-device в AT91. А у Вас напрвления два и счетчика должно быть два. Поэтому - вряд ли задуманное Вами получится. Возьмите еще одну EP, например, с номером 3, и соответственно поправьте дескриптор - одна физическая EP будет BulkIN, другая EP - BulkOUT.



А драйвером это как воспримется?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 10 2010, 11:21
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Нормально воспримется
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 10 2010, 12:59
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(dimka76 @ May 10 2010, 10:01) *
Получается одна и та же конечная точка работает и на чтение и на передачу.

Это две физически разные точки. А атмеловцы несколько урезали свою продукцию в плане гибкости назначения номеров точек.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 11 2010, 04:36
Сообщение #10


developer
****

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



Цитата(aaarrr @ May 10 2010, 16:59) *
Это две физически разные точки. А атмеловцы несколько урезали свою продукцию в плане гибкости назначения номеров точек.


А чтобы Вы можете предложить для решения этой задачи?
Изначально этот драйвер работал с USBN9603(4)


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 11 2010, 05:55
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы все как-то вокруг да около. Что за проблема то? Посмотрели в докементацию на процессор какие точки поддерживают bulk протокол, одну определили на прием, другую - на передачу. Все!
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 11 2010, 12:45
Сообщение #12


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.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 11 2010, 13:00
Сообщение #13


embarrassed systems engineer
*****

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



Цитата(dimka76 @ May 11 2010, 15:45) *
HOST шлет Data IN PID с номером конечной точки 2, а два у меня уже OUT. Вот в этом и проблема. А если я попытаюсь сделать контрольную точку 1 как IN, то данные из нее никогда не заберутся, т.к. HOST просит данные с конечной точки 2, а не 1.

Если правильно напишете в дескрипторе номер точки (впишете 0x01 и бит напрвления) - то хост будет спрашивать именно с EP1.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 12 2010, 04:07
Сообщение #14


developer
****

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



Цитата(VslavX @ May 11 2010, 17:00) *
Если правильно напишете в дескрипторе номер точки (впишете 0x01 и бит напрвления) - то хост будет спрашивать именно с EP1.


Я так уже пробовал. Но судя по логам USBTrace, хост все равно спрашивает с конечной точки 2.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 12 2010, 10:07
Сообщение #15


embarrassed systems engineer
*****

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



Цитата(dimka76 @ May 12 2010, 07:07) *
Я так уже пробовал. Но судя по логам USBTrace, хост все равно спрашивает с конечной точки 2.

Такого не может быть, значит неправильно задали дескрипторы. Идеология USB именно предусматривает что подключается устройство определенного класса с определенным набором EP, а вот куда и как эти EP отмаплены физически значения _НИКАКОГО_ не имеет. К каким именно физическим EP обращаться хост может узнать только из прочитанных дескрипторов. Если обращается ко 2-ой - значит в дескрипторах хост прочитал лажу.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 06:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01571 секунд с 7
ELECTRONIX ©2004-2016