Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 118

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 112 113 114 115 116 117 < 118 > 119 120 121 122 123 124 .. 166 >> Следующая

Для решения этой проблемы нам надо добавить обработку запросов строковых дескрипторов или, другими словами, выполнить следующие действия:
1. В описании дескриптора устройства usb_device_descriptor поля индексов дескрипторов строк изготовителя (поле !Manufacturer), продукта
(ПОЛЄ iProduct) И серИЙНОГО номера (ПОЛЄ iSerialNumber) НЭДО заменить
на уникальные (в пределах устройства) номера дескрипторов строк (листинг 13.28).
2. Добавить описание структур самих дескрипторов и дескриптора идентификатора языка (листинг 13.29).
3. В функцию usb_get_descriptor добавить обработку запроса типа дескриптора STRING (ЛИСТИНГ 13.30).
і Листинг 13.28. Дескриптор устройства со строками идентификации
#define LANG-ID OxOO
!define MAN-INDEX 0x01
!define PRD-INDEX 0x02
!define SRN-INDEX 0x03
code struct usb_st_device_jdescriptor usb_device_descriptor =
PRODUCT-ID,
RELEASE_NUMBER,
MAN-INDEX,
PRD-INDEX,
SRN-INDEX,
1
/* версия устройства */
/* дескр. строки изготовителя */
/* дескр. строки продукта */
/* дескр. строки серийного ном. */
/* число конфигураций */
>;
370
Часть IV. Создание USB-устройств
.(Листинг 13.29. Описание дескрипторов строк и языка
/+ Макрос для создания дескриптора строки */ #define structSTRING_DESCRIPTOR(NAME, LEN) struct NAME \
t \
byte bLength; \
byte bDescriptorType; \
uintl6 wstring[LEN]; \
>
/* Дескриптор строки производителя */
fdefine USBjMANUFACTURERJNAME {'P'«8, 'V«8, ^'«8, \
•S'«8, 'o'«8, 'f'«8, ^'«8}
tdefine USB_MN_LENGTH 7
code structSTRING_DESCRIPTOR(usb_st_manufacturer, USB_MN_LENGTH) usb_manufacturer = { sizeof(usbjnanufacturer), STRING, USBJMANUFACTURERJNAME };
/* Дескриптор Строки продукта */
tdefine USB_PRODUCT_NAME {'P'«8, 1V«8, 'A'«8, \
'$'«8, ¦^'«8, ^'«8, 't'«8, \ ' '«8, \
't'«8, 'e'<<8, 's'«8, 't'«8, \ ' '«8, \
'^«8, 'o'«8, 'а'«8, ^'«8, ^'«8} tdefine USB_PN_LENGTH 18
code structSTRING_DESCRIPTOR(usb_st_product, USB_PN_LENGTH) usbjproduct -{ sizeof(usb_product), STRING, USB_PRODUCT_NAME };
/* Дескриптор строки серийного номера */
tdefine USB_SERIAL_NUMBER П*«8, '. '«8, '0'«8, '.'«8, '0'«8} tdefine USB_SN_LENGTH 5
code structSTRING_DESCRIPTOR(usb_st_serial_number, USB_SN_LENGTH). usb_serial_number = { sizeof(usb_serial_number), STRING, USB_SERIAL_NOMBER };
/* Дескриптор строки идентификатора языка */ tdefine LANGUAGE ID 0x0904
Глава 13. HID-устройство на основе Atmel АТ89С5131
371
code BtructSTRINGDESCRIPTOR(usb_st_language_deseriptor, 1) usb_language =
{ sizeof(usb_language), STRING. LANGDAGE_ID };
void usb_get_descriptor()(
/* тип строкового дескриптора */ string_type - Usb_read_byte(); /* тип дескриптора */
descriptor_type - Usb_read_byte();
switch (descriptor_type) (
case GET STATUS:
case STRING: (
" switch (string_type) (
case LANG-ID: /* дескриптор языка */ <
data_to_transfer « sizeof (usb_language); pbuffer - fi(usb_language.bLength); break;
)
case MAN_INDEX: /* дескриптор изготовителя */ <
data_to_transfer - sizeof (usbjnanufacturer); pbuffer - fi(usbjnanufacturer.bLength); break:
)
case PRD_INDEX: /* дескриптор продукта */ {
data_to_transfer - sizeof (usb_product); pbuffer - fi(usb_product.bLength);
372
Часть IV. Создание USB-устройств
break;
)
case SRN-INDEX: /* дескриптор серийного номера */ {
data_to_transfer = sizeof (usb_serial_number); pbuffer = S(usb_serial_number.bLength); break;
)
default:- /* неподдерживаемый дескриптор */ <
STALL (); return;
)
}
break;
)
default:
)
Загрузив новую программу можно увидеть, что Windows выдает значительно более богатую информацию о новом устройстве (рис. 13.15, 13.16).
J1S Found New
PVASoft test boar
(^^понедельник
Рис. 13.15. Windows показывает имя обнаруженного устройства
следует отметить, что при поиске INF-файла эти имена не используются, а поиск подходящего драйвера производится по идентификаторам продукта (Product ID) и производителя (Vendor ID).
В заключение раздела еще одно замечание. При описании строковых дескрипторов мы использовали немного странную запись
tdefine USB_PRODUCT_NAME {'Р'«8, ^'«8, 'А'«8, 'S'«8f...
Hardware [Xj
Глава 13 HID-устройство на основе Atmel АТ89С5131
373
Found New Hardware Wizard
Welcome to the Found New Hardware Wizard
TNs wizard helps you install software for PVASoIt test board
(') If your hardware came wrth an installation CD 44(9 or floppy disk, insert it now
What do you want the wizard to do7
<* |nstall the software automatically (Recommended} f4 Install from a list oi specific location (Advanced)
Click Next to continue
¦¦,Вьф, I ЫЫ> I Cancel
Рис. 13.16. Использование имени устройства при установке драйверов
Необходимость в сдвиге каждого символа строки на 8 битов влево связана с форматом дескриптора — строка дескриптора должна состоять из символов UNICODE, т. е. двухбайтовых символов. С помощью UNICODE-строк можно передавать не только английские, но и русские строки. Проще всего сделать это, набрав нужный текст в редакторе Word и сохранив его в файл типа Кодированный текст. Затем символы этого файла можно просмотреть в любом шестнадцатеричном редакторе (например, в Far по клавише <F4> в режиме просмотра) и записать в обратном порядке следования байт.
Предыдущая << 1 .. 112 113 114 115 116 117 < 118 > 119 120 121 122 123 124 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100