Bulat 0 3 января, 2011 Опубликовано 3 января, 2011 (изменено) · Жалоба Сами дескрипторы в 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; ... Индексы в дескрипторе устройства прописал, все запросы строковых дескрипторов обрабатываю, но при этом ни один из строковых дескрипторов не приходит. Не подскажите, в чем тут может быть проблема. Заранее благодарен. Изменено 3 января, 2011 пользователем Bulat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 3 января, 2011 Опубликовано 3 января, 2011 · Жалоба const char strDescriptor_IMan[]= ... const char strDescriptor_IPro[]= ... const char strDescriptor_ISer[]= ... Может все-таки wchar_t а не char ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bulat 0 4 января, 2011 Опубликовано 4 января, 2011 · Жалоба 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 4 января, 2011 Опубликовано 4 января, 2011 · Жалоба Исправил, но тогда для отправки строквых дескрипторов надо использовать другую функцию 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, ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bulat 0 6 января, 2011 Опубликовано 6 января, 2011 · Жалоба там вроде как не совсем так значения 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, соответственно. А ваш дескриптор как отправлять? по каждому запросу по частям? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 6 января, 2011 Опубликовано 6 января, 2011 · Жалоба Так ведь индексы каждого из 3-х строковых дескрипторов (iManufacturer, iProduct, SerialNumber) прописываются в дескрипторе устройства и затем запрашиваются при нумерации отдельными запросами: wValue = 301, 302, 303, соответственно. А ваш дескриптор как отправлять? по каждому запросу по частям? просто я брал готовый пример кейла они там сделали так, что указатель от начала массива строковых дескрипторов смещается столько раз (на расстояние длины соответствующего дескриптора), каков индекс дескриптора в запросе если интересно, поищите в usbcore.c, usbdesc.c зачем так сделано? наверное для того, чтобы при необходимости добавить дескриптор нужно было исправить только в одном месте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться