Перейти к содержанию
    

Не удается передать строковые дескрипторы при нумерации

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

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

...
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

const char strDescriptor_IMan[]=
...
const char strDescriptor_IPro[]=
...
const char strDescriptor_ISer[]=
...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Исправил, но тогда для отправки строквых дескрипторов надо использовать другую функцию 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,
...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там вроде как не совсем так

значения 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, соответственно. А ваш дескриптор как отправлять? по каждому запросу по частям?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

просто я брал готовый пример кейла

они там сделали так, что указатель от начала массива строковых дескрипторов смещается столько раз (на расстояние длины соответствующего дескриптора), каков индекс дескриптора в запросе

если интересно, поищите в usbcore.c, usbdesc.c

зачем так сделано? наверное для того, чтобы при необходимости добавить дескриптор нужно было исправить только в одном месте

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...