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

 
 
> 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 21)
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
Седой
сообщение May 12 2010, 11:39
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



Цитата(VslavX @ May 12 2010, 16:07) *
Такого не может быть, значит неправильно задали дескрипторы. Идеология USB именно предусматривает .....


А разработчик драйвера, являясь воинствующим атеистом, взял и ,пользуясь "визардом" DriverStudio, задал адреса EP так, как ему захотелось, даже не обращаясь к дескрипторам. Вот вам и " не может быть".
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 12 2010, 12:09
Сообщение #17


embarrassed systems engineer
*****

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



Цитата(Седой @ May 12 2010, 14:39) *
А разработчик драйвера, являясь воинствующим атеистом, взял и ,пользуясь "визардом" DriverStudio, задал адреса EP так, как ему захотелось, даже не обращаясь к дескрипторам. Вот вам и " не может быть".

Умеючи-то что хошь можно сломать smile.gif
Я так понял из ситуации что драйвер нормальный есть - в него топикстартер не лазил. Хотя... Я того AT91USBFramework "в глаза" не видел, возможно Вы правы - какой там драйвер я не знаю - очень может быть что кривой (привязаться к физическим номерам EP - это клиника) . Привык вот следовать рекомендациям MS, юзать штатные классовые драйвера и не писать, по возможности, своих.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 12 2010, 12:25
Сообщение #18


developer
****

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



Цитата(VslavX @ May 12 2010, 16:09) *
Умеючи-то что хошь можно сломать smile.gif
Я так понял из ситуации что драйвер нормальный есть - в него топикстартер не лазил. Хотя... Я того 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


А дескрипторы конечных точек я уже приводил выше


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


embarrassed systems engineer
*****

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



Цитата(dimka76 @ May 12 2010, 15:25) *
А дескрипторы конечных точек я уже приводил выше

У Вас там точки назначены обе на 2-ой физический адрес - 0x02 (OUT EP2), и 0x82 (IN EP2). Поменяйте 0x82, например, на 0x83 и инициализируйте EP3 - хост должен с нее начать спрашивать данные (если таки драйвер корректный). Если не получится - выложите лог, полученный анализатором (в какой-нить удобной форме, если USBlyzer - то можно и бинарник - я смогу посмотреть)
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 13 2010, 06:11
Сообщение #20


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.

Всем спасибо за участие beer.gif


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


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

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



Цитата(dimka76 @ May 13 2010, 09:11) *
Это исходный вариант



Когда я пытался на ходу переключать в контроллере конечные точки с OUT на IN в логах появлялись обращения к точке 0x82, но статус был "не выполнено", когда я заменил точку с 0x82 на 0x81 в логах обращений к 0x81 вообще не появляется.

Я заказал STM32F103, там вроде физическим точкам можно присваивать любой логический номер. Поэтому откладываю этот вопрос до получения результатов работы с STM32F103.

Всем спасибо за участие beer.gif


Ну так сделайте 0x02 --> 0x01, а 0x82 оставьте как есть.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Aug 4 2010, 06:21
Сообщение #22


developer
****

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



Как и предполагалось, с STM32F103 все заработало. Правда я не писал все с нуля, а взял пример из STM32_USB-FS-Device_Lib_V3.1.1. Там нашелся пример CostumHID, где как раз используется одна физическая конечная точка на два направления (адреса 0х81 и 0х01). Подправил этот пример под свои нужды и все заработало.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post

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

 


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


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