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

 

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

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

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

case GET_STATUS_ENDPNT: usb_get_status_endpoint() ; break;
case SET-ADDRESS: usb_set_address(); break;
case GET_DESCRIPTOR_DEVICE: case GET_DESCRIPTOR_INTERF: case GET_DESCRIPTOR_ENDPNT:
usb_get._descriptor () ;
break;
case GET_CONFIGORATION: usb_get_configuration(); break;
case SET_CONFIGURATION: usb_set_configuration(); break;
default: STALL (); break;
}
}
356
Часть IV. Создание USB-устройств
Важно отметить, что если запрос не поддерживается устройством, то для него обязательно должна быть выполнена процедура отклонения stall (), как, например, в ветке default. Код этой процедуры приведен в листинге 13.18.
|}|Це1инг 13.18. Процедура о^Р^и^Вроса - *¦ . :\ -ч.І
void STALL (){
Usb_clear_rx_setup (); Usb_set_stall_request(); while (!Usb_stall_sent()) , Usb_clear_stall_request() , Usb_clear_stalled(); Usb_clear_DIR();
}
Самый сложный обработчик — обработчик запроса getdescriptor. Для обработки этого запроса следует выполнить следующие действия:
1. Прочитать запрос, согласно структуре, описанной в разд. 4.1.1, определить тип запрашиваемого дескриптора (descriptor_type).
2. В зависимости от типа запрашиваемого дескриптора получить указатель на нужную структуру (pbuffer) и размер передаваемого блока данных
(data_to_transfer).
3. Разделить передаваемые данные на блоки размером максимального пакета (константа ep_control_length).
4. Произвести поблочную передачу данных хосту.
Код функции, производящей обработку запроса getdescriptor, приведен в листинге 13.19.
стинг 13П9. Обработка запроса getjjescriptop
void usb_get_descriptor(){ data byte data_to_transfer; data uintl6 wLength; data byte descriptor_type; data byte string_type; bit zip;
data byte *pbuffer;
zip = false;
Глава 13. HID-устройство на основе Atmel АТ89С5131
357
string_type = Usb_read_byte(); /* wValue */ descriptor_type = Usb_read_byte(); /* wValue */
/* анализ типа запрашиваемого дескриптора */ switch (descriptor_type) {
case DEVICE: /* дескриптор устройства */ {
data_to_transfer = sizeof(usb_device_descriptor); pbuffer = &(usb_device_descriptor.bLength); break;
}
case CONFIGURATION: /* дескриптор конфигурации */ {
data_to_transfer = sizeof(usb_configuration); pbaffer = &(usb_configuration.cfg.bLength); break;
}
default: /* отклонение запросов других дескрипторов */ {
STALL (); return;
}
}
/* поле wlndex, не используется */ ACC = Usb_read_byte(); ACC = Usb_read_byte();
/* Чтение требуемого числа байт */ /* (поле wLenght) */
((byte*)&wLength)[1] = Usb_read_byte ();
((byte*)&wLength)[0] = Usb_read_byte();
/* Требуется больше чем есть? */ if (wLength > data_to__transfer) (
/* Если число байт пакета кратно размеру пакета, */
358
Часть IV. Создание USB-устройств
/* то пакет завершения формируем специально if ((data_to_transfer % EP_CONTROL_LENGTH) else { zip = FALSE; )
)
else
{
/* посылаем только требуемое число байт */ /* иногда это меньше, чем есть реально */ /* деление на блоки не требуется */
data_to_transfer = (byte)wLength;
}
/* сброс флага приема данных */ Usb_clear_rx_setup() ;
/* переключение направления нулевой точки */ usb_set_DIR();
/* шлем, пока хватает данных на формирование полного пакета */ /* остаток пакета досылаем потом (если надо) */
while (data_to_transfer > EP_CONTROL_LENGTH) {
/* передача буфера максимальной длины*/
pbuffer = usb_send_epO_packet(pbuffer, EP_CONTROL_LENGTH); /* сдвигаем указатель */ data_to_transfer -= EP_CONTROL_LENGTH;
/* ждем завершения передачи */
while ( (! (usb_rx_complete ())) && (! (Usb_tx_complete ()))) ; VJsb_clear_tx_complete () ;
if ((Usb_rx_complete())) /* если передача прервана хостом */ (
Usb_clear_tx_ready(); /* завершить передачу */
Usb_clear_rx{);
return;
>
}
/* посылаем остаточный пакет данных */
/* если такой пакет неполный, то он является */
*/
== 0) { zip = TRUE; }
Глава 13. HID-устройство на основе Atmel АТ89С5131
359
/* пакетом завершения передачи */
pbuffer = usb_send_epO_packet(pbuffer, data_to_transfer);
data_to_transfer = 0;
while ((!(Usb_rx_complete())) SS (!(Usb_tx_complete()))); Usb_clear_tx_complete();
if ((Usb_rx_completeO)) /* если передача прервана хостом */ {
Usb_clear_tx_ready(); Usb_clear_rx(); return;
/* при необходимости (если все пакеты полные) */
/* формируем пакет завершения специально - посылкой */ /* пакета нулевой длины */
if (zip == TRUE) {
usb_send_epO_packet(pbuffer, 0);
while ((!(Usb_rx_complete())) SS (!(Usb_tx_complete()))); Usb_clear_tx_complete();
if ((Usb_rx_complete())) /* если передача прервана хостом */ {
Usb_clear_tx_ready(); Usb_clear_rx(); return;
}
}
/* дождаться завершения передачи */
while ((!(Usb_rx_complete())) SS (!(Usb_setup_received())));
if (Usb_setup_received()) {
return;
}
if (Usb_rx_complete()) {
360
Часть IV. Создание USB-устройств
Usb_clear_DIR(); /* переключение направления О точки */ Usb_clear_rx();
}
)
Собственно сама функция передачи пакета (листинг 13.20) выглядит достаточно очевидно, и, наверно, дополнительно комментирования не требует. Структуры дескрипторов мы разберем чуть позже.
Предыдущая << 1 .. 109 110 111 112 113 114 < 115 > 116 117 118 119 120 121 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100