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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> как обработать установочный пакет usb
sergey sva
сообщение Feb 12 2009, 19:05
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



решил немного с готовыми примерами разобраться, а то сложновато сразу разобраться.
В сети нашел пример usb hid, смотрю код, огромное количество структур объединений,
и прочей.., некоторый код даже не совсем понимаю как работает, вот например
Код
/* USB Common Descriptor */
typedef  struct _USB_COMMON_DESCRIPTOR {
  BYTE  bLength;
  BYTE  bDescriptorType;
}__attribute__ ((packed)) USB_COMMON_DESCRIPTOR;
эта структура описана в h файле.

этот код встречается в функции
Код
USB_COMMON_DESCRIPTOR * pD;
         (BYTE *) pD  +=  ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;

при компиляции вылетает ошибка
Description Resource Path Location Type
lvalue required as left operand of assignment
И как этот оператор выполняется, что с чем складывается .?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 12 2009, 19:56
Сообщение #17


Гуру
******

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



Цитата(sergey sva @ Feb 12 2009, 22:05) *
И как этот оператор выполняется, что с чем складывается .?

Все вполне корректно: если pD содержит адрес USB_CONFIGURATION_DESCRIPTOR'а, то после этой операции он будет указывать на следующий после конфигурационной информации (всей, а не только дескриптора) байт. Зачем это надо - вопрос к автору.

А компилятор какой?
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 12 2009, 20:57
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
А компилятор какой?

yagarto(GCC)

эта строчка тоже вызывает такую же ошибу
lvalue required as left operand of assignment Требуется какой то левый оператор
(BYTE *)pD += pD->bLength;
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 14 2009, 11:11
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



в процессе отправки репорта(дескриптора) проверяется кратный он размеру конечной точки или нет ,
если кратный то нужно оправлять пустой пакет. Пустой пакет нужно заполнять нулями или просто установить
флаг AT91C_UDP_TXPKTRDY ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 14 2009, 14:51
Сообщение #20


Гуру
******

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



Цитата(sergey sva @ Feb 14 2009, 14:11) *
Пустой пакет нужно заполнять нулями или просто установить флаг AT91C_UDP_TXPKTRDY ?

Если пустой пакет заполнить нулями, то он автоматически перестанет быть пустым smile.gif Нужно просто взвести TXPKTRDY.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 14 2009, 15:08
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



smile.gif
Еще появился вопрос smile.gif по поводу дескриптора конфигурации, он состоит
из дескрипторов, интерфеса конечных точек по запросу get descriptor что отправлять хосту весь
дескриптор конфигурации или только дескриптор конфигурации, тогда когда отправлять дескриптор интерфейса?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 14 2009, 15:10
Сообщение #22


Гуру
******

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



Отправлять надо все - дескриптор конфигурации, интерфейсов, конечных точек и т.д.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 14 2009, 15:36
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Пытался отправит полностью весь дескриптор конфигурации, но хост принимает(установкой TXCOMP) только первые 8 байт после, завивает в ожидание, может заметите что то неправильное.
на этой строчке while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP));
CODE

void get_deskriptor(DWORD EP,BYTE zap[]){
LONG lendes,n;
WORD lensen;
BYTE* des,FLAG_PACK = 0;
/* */
lensen = zap[7] & 0xFF;
lensen = (lensen<<8) | (zap[6] & 0xFF);
/* */

switch(zap[3]){
case DEVICE :
{
lendes = sizeof(USB_DeviceDescriptor);
des = (BYTE*) &(USB_DeviceDescriptor[0]);
break;
}
case CONFIGURATION:
{
lendes = sizeof(USB_ConfigurationDeskriptor);
des = (BYTE*) &(USB_ConfigurationDeskriptor[0]);
break;
}
case STRINGDESCRIPTOR:{
lendes = (sizeof(USB_StringDescriptor) - zap[2]);
des = (BYTE*) &(USB_StringDescriptor[zap[2]]);
}
case HIDDESCRIPTOR:{
lendes = sizeof(USB_HidDescriptor);
des = (BYTE*) &(USB_HidDescriptor[0]);
}
case REPORTDESCRIPTOR:{
lendes = sizeof(HID_ReportDescriptor);
des = (BYTE*) &(HID_ReportDescriptor[0]);
}
default:
{
stall(EP);
return;
}
}//end switch
/* --------------------------------------------------------- */
if(lensen > lendes){
if((lendes % 8) == 0 ){FLAG_PACK = 1;}else{FLAG_PACK = 0;}
}else{ lendes = lensen; } //end else
AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_DIR; // dev-> host


while(lendes > 8){
while(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXPKTRDY){}

for(n = 0; n < 8; n++){
AT91C_BASE_UDP->UDP_FDR[EP] = *(des++);
}//end for
AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_TXPKTRDY;
while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP));
// вот здесь программа зависает, первый раз отправляет 8
// байт с получает подтверждение TXCOMP , во второй раз зависает
// в ожидании TXCOMP

AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_TXCOMP;
lendes=lendes-8;
}//end while

if(FLAG_PACK == 1){
while(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXPKTRDY){}
AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_TXPKTRDY;
while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP));
AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_TXCOMP;
}else{
while(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXPKTRDY){}

for(n = 0; n < lendes; n++){
AT91C_BASE_UDP->UDP_FDR[EP] = *(des++);
}//end for
AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_TXPKTRDY;
while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP));
AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_TXCOMP;

}//end else
AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_DIR; // host-> dev
}//end get_deskriptor
//-------------------------------------------------------------------------------

Go to the top of the page
 
+Quote Post
Sergey Reva
сообщение Feb 14 2009, 15:52
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 22-04-07
Из: Poltava/Kharkov
Пользователь №: 27 243



Цитата(sergey sva @ Feb 14 2009, 17:36) *
..
Код
AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_TXPKTRDY;
      while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP));
      AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_TXCOMP;

..

Хочу обратить внимание, что при доступе к регистру UDP_CSR Atmel рекомендует использовать следующие макросы, хотя в своих же примерах их не использует smile.gif

doc6175.pdf (35.6.10 UDP Endpoint Control and Status Register)
Цитата
WARNING: Due to synchronization between MCK and UDPCK, the software application must wait for the end of the write
operation before executing another write by polling the bits which must be set/cleared.
//! Clear flags of UDP UDP_CSR register and waits for synchronization
#define Udp_ep_clr_flag(pInterface, endpoint, flags) { \
pInterface->UDP_CSR[endpoint] &= ~(flags); \
while ( (pInterface->UDP_CSR[endpoint] & (flags)) == (flags) ); \
}
//! Set flags of UDP UDP_CSR register and waits for synchronization
#define Udp_ep_set_flag(pInterface, endpoint, flags) { \
pInterface->UDP_CSR[endpoint] |= (flags); \
while ( (pInterface->UDP_CSR[endpoint] & (flags)) != (flags) ); \
}
Note: In a preemptive environment, set or clear the flag and wait for a time of 1 UDPCK clock cycle and 1peripheral clock cycle. However,
RX_DATA_BLK0, TXPKTRDY, RX_DATA_BK1 require wait times of 3 UDPCK clock cycles and 3 peripheral clock cycles
before accessin DPR.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 14 2009, 16:06
Сообщение #25


Гуру
******

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



И еще один момент: флаг RXSETUP должен быть сброшен после установки DIR. Не понятно, где это происходит у Вас.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 16 2009, 19:03
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Еще во время передачи дескриптора,
устанавливается бит DTGLE, так понял что этот бит устанавливается, когда хост прерывает передачу?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 16 2009, 21:38
Сообщение #27


Гуру
******

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



Цитата(sergey sva @ Feb 16 2009, 22:03) *
так понял что этот бит устанавливается, когда хост прерывает передачу?

Нет, он меняется после каждой успешной транзакции.
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Feb 17 2009, 08:13
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Цитата(sergey sva @ Feb 14 2009, 18:36) *
Пытался отправит полностью весь дескриптор конфигурации, но хост принимает(установкой TXCOMP) только первые 8 байт после, завивает в ожидание, может заметите что то неправильное.


Это уже винда, она сначала считывает первые 8 байт дескриптора с размерами, потом у себя в кишках готовит буфер а на устройство выдает END_BUS_RES, после этого вычитывает дескриптор полностью. Ну и естественно все виснет по тому что не тот флаг ожидается. Сам долго с этим бился пока доку не прочитал :-)

Сообщение отредактировал Sagittarius - Feb 17 2009, 08:15
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 18 2009, 10:19
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Про END_BUS_RES не знал, добавил но ситуация такая же.
1 получаю установочный пакет, разбираю его, хост просит девайс дескриптор.
2 проверяю бит AT91C_UDP_TXPKTRDY и AT91C_UDP_RXSUSP
Код
while(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXPKTRDY){if( AT91C_BASE_UDP->UDP_ISR & AT91C_UDP_RXSUSP ) return;}

3 заполняю буфер , проверяю бит AT91C_UDP_TXCOMP , сбрасываю если надо.
Код
if (AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP) {
AT91C_BASE_UDP->UDP_CSR[EP] &= ~(AT91C_UDP_TXCOMP);
while (AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP);
}//end if

4 устанавливаю AT91C_UDP_TXPKTRDY
Код
AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_TXPKTRDY;

5 жду подтверждения получения хостом данных, или сброс, если сброс то вызываю функцию сброса.
Код
  while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP)){
            if (AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_RX_DATA_BK0) {
                AT91C_BASE_UDP->UDP_CSR[EP] &= ~(AT91C_UDP_RX_DATA_BK0);
                return;
            }//end if
            if (AT91C_BASE_UDP->UDP_ISR & AT91C_UDP_ENDBUSRES){
                 reset_status = 1;
                 return;
            }//end bus reset
      }//end while

Ситуации в итоге такая: размер дескриптора конфигурации 18 байт, первые 8 он забирает с подтверждением,
следующие 8 байт не берет (подтверждения на них нет AT91C_UDP_TXCOMP) иногда присылает _ENDBUSRES,
но после сброса ситуация не меняется, берет первые 8 байт а вторую посылку нет подтверждения.
Работа с usb, что то вроде кота в мешке, что там происходит, установил монитор но он позволяет наблюдать
только после успешной конфигурации, может есть программы которые позволяет просмотреть что там происходит?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 18 2009, 10:58
Сообщение #30


Гуру
******

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



Цитата(sergey sva @ Feb 18 2009, 13:19) *
...берет первые 8 байт а вторую посылку нет подтверждения.

На поле wLength запроса на забили? Первый раз хост и просит 8 байт.
Go to the top of the page
 
+Quote Post

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

 


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


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