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

 
 
 
Reply to this topicStart new topic
> Не удается передать строковые дескрипторы при нумерации, at91sam7s
Bulat
сообщение Jan 3 2011, 05:37
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Сами дескрипторы в usb.h
CODE

const char devDescriptor[] = {
0x12, // bLength // Device descriptor
0x01, // bDescriptorType
0x10, // bcdUSBL
0x01, //
0xFF, // bDeviceClass: CDC class code
0x00, // bDeviceSubclass: CDC class sub code
0x00, // bDeviceProtocol: CDC Device protocol
0x08, // bMaxPacketSize0
0xEB, // idVendorL
0x03, //
0x55, // idProductL
0x03, //
0x01, // bcdDeviceL
0x00, //
0x01, // iManufacturer // 0x01
0x02, // iProduct
0x03, // SerialNumber
0x01 // bNumConfigs
};
const char strDescriptor_IDL[]={
/* String_IDLanguages Descriptor */
0x04, // bLength
0x03, // bDescriptorType
0x09, // wLANGID[0]
0x04
};
const char strDescriptor_IMan[]={
/* String_IManufacturer Descriptor */
0x02+0x02*12, // bLength
0x03, // bDescriptorType
'O'<<8, 'r'<<8, 'g'<<8, 'a'<<8, 'n'<<8, 'i'<<8, 'z'<<8, 'a'<<8, 't'<<8, 'i'<<8, 'o'<<8, 'n'<<8 // bString
};
const char strDescriptor_IPro[]={
/* String_IProduct Descriptor */
0x02+0x02*9, // bLength
0x03, // bDescriptorType
'I'<<8, 'n'<<8, 't'<<8, 'e'<<8, 'r'<<8, 'f'<<8, 'a'<<8, 'c'<<8, 'e'<<8 //bString
};
const char strDescriptor_ISer[]={
/* String_ISerialNumber Descriptor */
0x02+0x02*11, // bLength
0x03, // bDescriptorType
'1'<<8,'2'<<8,'3'<<8,'-'<<8,'4'<<8,'5'<<8,'6'<<8,'-'<<8,'7'<<8,'8'<<8,'9'<<8 //bString
};
static char devDescriptor_ram[sizeof(devDescriptor)];
static char cfgDescriptor_ram[sizeof(cfgDescriptor)];
static char strDescriptor_IDL_ram[sizeof(strDescriptor_IDL)];
static char strDescriptor_IMan_ram[sizeof(strDescriptor_IMan)];
static char strDescriptor_IPro_ram[sizeof(strDescriptor_IPro)];
static char strDescriptor_ISer_ram[sizeof(strDescriptor_ISer)];

Обработка запроса GET_DESCRIPTOR в usb.c
CODE

...
if(!(pUDP->UDP_CSR[0] & AT91C_UDP_RXSETUP))return;

bmRequestType = pUDP->UDP_FDR[0];
bRequest = pUDP->UDP_FDR[0];
wValue = (pUDP->UDP_FDR[0] & 0xFF);
wValue |= (pUDP->UDP_FDR[0] << 8);
wIndex = (pUDP->UDP_FDR[0] & 0xFF);
wIndex |= (pUDP->UDP_FDR[0] << 8);
wLength = (pUDP->UDP_FDR[0] & 0xFF);
wLength |= (pUDP->UDP_FDR[0] << 8);

if(bmRequestType & 0x80)
{
while(!(pUDP->UDP_CSR[0] & AT91C_UDP_DIR))
pUDP->UDP_CSR[0] |= AT91C_UDP_DIR;
}
while((pUDP->UDP_CSR[0] & AT91C_UDP_RXSETUP))
pUDP->UDP_CSR[0] &= ~AT91C_UDP_RXSETUP;

switch ((bRequest << 8) | bmRequestType) // Handle supported standard device request Cf Table 9-3 in USB specification Rev 1.1
{
case STD_GET_DESCRIPTOR:

switch (wValue)
{
case 0x100: AT91F_USB_SendData(pUDP, devDescriptor_ram, MIN(sizeof(devDescriptor_ram), wLength)); break;
case 0x200: AT91F_USB_SendData(pUDP, cfgDescriptor_ram, MIN(sizeof(cfgDescriptor_ram), wLength)); break;

case 0x300: AT91F_USB_SendData(pUDP, strDescriptor_IDL_ram, MIN(sizeof(strDescriptor_IDL_ram), wLength)); break;
case 0x301: AT91F_USB_SendData(pUDP, strDescriptor_IMan_ram, MIN(sizeof(strDescriptor_IMan_ram), wLength)); break;
case 0x302: AT91F_USB_SendData(pUDP, strDescriptor_IPro_ram, MIN(sizeof(strDescriptor_IPro_ram), wLength)); break;
case 0x303: AT91F_USB_SendData(pUDP, strDescriptor_ISer_ram, MIN(sizeof(strDescriptor_ISer_ram), wLength)); break;

default: AT91F_USB_SendStall(pUDP); break;
}
break;
...

Индексы в дескрипторе устройства прописал, все запросы строковых дескрипторов обрабатываю, но при этом ни один из строковых
дескрипторов не приходит. Не подскажите, в чем тут может быть проблема.
Заранее благодарен.

Сообщение отредактировал Bulat - Jan 3 2011, 05:40
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 3 2011, 08:27
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Код
const char strDescriptor_IMan[]=
...
const char strDescriptor_IPro[]=
...
const char strDescriptor_ISer[]=
...

Может все-таки wchar_t а не char ?
Go to the top of the page
 
+Quote Post
Bulat
сообщение Jan 4 2011, 08:12
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(_Pasha @ Jan 3 2011, 16:27) *
Код
const char strDescriptor_IMan[]=
...
const char strDescriptor_IPro[]=
...
const char strDescriptor_ISer[]=
...

Может все-таки wchar_t а не char ?

Исправил, но тогда для отправки строквых дескрипторов надо использовать другую функцию SendData, которая отправляет данные типа wchar_t
Код
static void AT91F_USB_SendData_w(AT91PS_UDP pUdp, wchar_t *pData, uint txlen)
{
uint cpt = 0;
AT91_REG csr;

do    {
    cpt = MIN(txlen, 8);
    txlen -= cpt;
    while(cpt--) pUdp->UDP_FDR[0] = *pData++;
    if(pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) Udp_ep_clr_flag(pUdp, 0, AT91C_UDP_TXCOMP);
    pUdp->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY;
    do
               {
        csr = pUdp->UDP_CSR[0];                        // Data IN stage has been stopped by a status OUT
        if(csr & AT91C_UDP_RX_DATA_BK0)
            {            
            pUdp->UDP_CSR[0] &= ~(AT91C_UDP_RX_DATA_BK0);
            return;
            }
        } while(!(csr & AT91C_UDP_TXCOMP));
    }while(txlen);
if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) Udp_ep_clr_flag(pUdp, 0, AT91C_UDP_TXCOMP);
}//AT91F_USB_SendData_w

но строковые дескрипторы всеравно не приходят и теперь нумерация идет гораздо дольше - несколько секунд. Как правильно отправлять структуры типа wchar_t?

Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 4 2011, 09:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Bulat @ Jan 4 2011, 14:12) *
Исправил, но тогда для отправки строквых дескрипторов надо использовать другую функцию SendData, которая отправляет данные типа wchar_t

там вроде как не совсем так
значения length, USB_STRING_DESCRIPTOR_TYPE и т.д. есть char, а вот сама строка - wchar_t, то есть, например,

Код
const U8 USB_StringDescriptor[] = {
/* Index 0x00: LANGID Codes */
  0x04,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  WBVAL(0x0000),     /* wLANGID */
/* Index 0x04: Manufacturer */
  0x10,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  't',0,
  'e',0,
  's',0,
  't',0,
  ' ',0,
  'd',0,
  'e',0,
  'v',0,
/* Index 0x16: Product */
  0x3A,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  'd',0,
  'e',0,
  'v',0,
  'i',0,
  'c',0,
  'e',0,
...
Go to the top of the page
 
+Quote Post
Bulat
сообщение Jan 6 2011, 05:28
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(toweroff @ Jan 4 2011, 17:43) *
там вроде как не совсем так
значения length, USB_STRING_DESCRIPTOR_TYPE и т.д. есть char, а вот сама строка - wchar_t, то есть, например,

Код
const U8 USB_StringDescriptor[] = {
/* Index 0x00: LANGID Codes */
  0x04,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  WBVAL(0x0000),     /* wLANGID */
/* Index 0x04: Manufacturer */
  0x10,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  't',0,
  'e',0,
  's',0,
  't',0,
  ' ',0,
  'd',0,
  'e',0,
  'v',0,
/* Index 0x16: Product */
  0x3A,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  'd',0,
  'e',0,
  'v',0,
  'i',0,
  'c',0,
  'e',0,
...


Так ведь индексы каждого из 3-х строковых дескрипторов (iManufacturer, iProduct, SerialNumber) прописываются в дескрипторе устройства и затем запрашиваются при нумерации отдельными запросами: wValue = 301, 302, 303, соответственно. А ваш дескриптор как отправлять? по каждому запросу по частям?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 6 2011, 07:03
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Bulat @ Jan 6 2011, 11:28) *
Так ведь индексы каждого из 3-х строковых дескрипторов (iManufacturer, iProduct, SerialNumber) прописываются в дескрипторе устройства и затем запрашиваются при нумерации отдельными запросами: wValue = 301, 302, 303, соответственно. А ваш дескриптор как отправлять? по каждому запросу по частям?

просто я брал готовый пример кейла
они там сделали так, что указатель от начала массива строковых дескрипторов смещается столько раз (на расстояние длины соответствующего дескриптора), каков индекс дескриптора в запросе
если интересно, поищите в usbcore.c, usbdesc.c
зачем так сделано? наверное для того, чтобы при необходимости добавить дескриптор нужно было исправить только в одном месте
Go to the top of the page
 
+Quote Post

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

 


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


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