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

 

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

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

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

і Листинг 13.20. Передача пакета на нулевую конечную точку
byte * usb_send_epO_packet(byte* tbuf, byte data_length) {
data int i; data byte b;
Usb_select_ep(0) ;
/* цикл передачи пакета заданной длины */
for (i=0; i<data_length; і++)
{
b = *tbuf;
Usb_write_byte(b); /* передача байта */ tbuf++; /* следующий байт */
}
Usb_set_tx_ready(); return tbuf;
Функции обработки остальных запросов выглядят значительно проще. Обработка запроса get_configuration сводится к передаче номера текущей конфигурации (листинг 13.21), сохраненного в переменной usb_configuration_nb.
Этот номер сохраняется при обработке запроса setconfiguration (листинг 13.22).
: Листинг 13.21. Обработка запроса get_configuration
void usb_get_configuration()( Usb_clear_rx_setup(); Usb_set_DIR();
Глава 13. НЮ-устройство на основе Atmel АТ89С5131
361
Usb_write_byte(usb_configuration_nb)л end_ok();
}
Кроме сохранения номера текущей конфигурации в обработчике set_con FiGURAT і on должна производиться инициализация других конечных точек, если они существуют (листинг 13.22).
||Пистинг 13.22. Обработка запроса set_configjration
void usb_set_configuration(){ data byte configuration_number;
/* читать номер конфигурации */
configuration_number = Usb_read_byte();
Usb_clear_DIR();
Usb_clear_rx_setup();
/* если выбрана доступная конфигурация */
if (configuration_number <= C0NF_NB)
{
/* сохранить номер конфигурации */
usb_configuration_nb = configuration_number;
}
else
{
/* ошибочный запрос — отклоняем */
stall ();
return;
}
Usb_set_tx_ready();
while (!Usb_tx_complete());
Usb_clear_tx_complete();
/* Конфигурирование других конечных точек */ /* если они существуют +/
usb_ep_init();
362
Часть IV. Создание USB-устройств
Запрос get_status позволяет определить состояние устройства, интерфейса или конечной точки (см. разд. 4.1.2). Состояние, возвращаемое по запросу get_status, представляет собой два байта, один из которых возвращает нужную информацию, а второй зарезервирован и равен нулю. Состояние устройства определяет его реакцию на сигнал побудки и тип питания, состояние интерфейса зарезервировано и всегда равно 0, а состояние конечной точки пока игнорируется. Код обработчиков запроса getstatus показан в листинге 13.23.
исоднгИ3.23. Обработка запроса get SIAtOS • * \ -?.?*
Il Обработка GET_STATUS_DEVICE void usb_get_status_device(){
Usb_clear_rx_setup();
Usb_set_DIR();
/*
[1]= 0: устройство игнорирует сигнал побудки [0]= 0: устройство получает питание от шины USB
*/
Usb_write_byte(0x00);
/* зарезервирован, всегда 0 */
Usb_write_byte(0x00);
END_OK();
}
Il Обработка GET_STATUS_INTERF void usb_get_status_interfасе (){
Usb_clear_rx_setup();
Usb_set_DIR();
/* зарезервировано, всегда 0 */ Usb_write_byte(0x00); usb_write_byte(0x00);
END_OK();
}
Глава 13. HID-устройство на основе Atmel АТ89С5131
363
11 Обработка get_STATUS_endpnt void usb_get_status_endpoint()(
st ALL (); // нет конечных точек, игнорируем
}
С помощью запроса setaddress хост передает устройству его адрес на шине USB. Начиная с момента получения этого запроса, устройство может отвечать хосту, только если хост обращается по этому адресу. На получение своего адреса устройство должно ответить установкой флага "устройство адресовано", как показано в листинге 13.24.
Листинг 13.24.. Обработка запроса set_address
void usb_set_address ()( data byte add;
/* прочитать и сохранить адрес */ add = Usb_read_byte(); Usb_clear_rx_setup(); Usb_set_tx_ready();
/* выставить флаг "устройство адресовано" */ Usb_set_FADDEN(); while (!(Usb_tx_complete())); Usb_clear_tx_complete();
/* установить полученный адрес */ Usb_configure_address(add);
}
Еще одна функция, которую мы использовали для завершения передачи данных хосту, показана в листинге 13.25.
ГЇЇ1.................................................... ..............
!.Листинг 13.25. Завершение передачи данных хосту
void end_ok()(
Usb_set_tx_ready();
while ((!(Usb_tx_complete())) || (Usb_setup_received())); Usb_clear_tx_complete();
while ((!(Usb_rx_complete())) || (Usb_setup_received()));
364
Часть IV. Создание USB-устройств
Usb_clear_rx(); Usb_clear_DIR();
}
Теперь снова вернемся к листингу 13.19 и рассмотрим вопрос формирования дескрипторов. Листинг 13.26 показывает структуры, используемые для формирования дескриптора устройства (структура usb_st_device_descriptor), дескриптора конфигурации (структура usb_st_configuration_descriptor) и дескриптора интерфейса (структура usb_st_interface_descriptor). Назначение полей полностью соответствует структурам, описанным в разд. 4.1.3.
Щ*ф*нт 13 26 Структуры дескрипторов для языка С АТ89С5131
// Структура дескриптора устройства struct usb_st_device_descriptor (
byte bLength;
byte bDescriptorType;
uintl6 bscUSB;
byte bDeviceClass;
byte bDeviceSubClass;
byte bDeviceProtocol;
byte bMaxPacketSizeO;
uintl6 idVendor;
uintie idProduct;
uintl6 bcdDevice;
byte !Manufacturer;
byte iProduct;
byte iSerialNumber;
Предыдущая << 1 .. 110 111 112 113 114 115 < 116 > 117 118 119 120 121 122 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100