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

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

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

Usb_clear_stall_request();
Usb_clear_stalled();
Usb_clear_DIR();
}
Самый сложный обработчик - обработчик запроса get descriptor. Для
обработки этого запроса следует выполнить следующие действия:
1. Прочитать запрос, согласно структуре, описанной в разд. 4.1.1,
определить тип запрашиваемого дескриптора (descriptor_type).
2. В зависимости от типа запрашиваемого дескриптора получить указатель на
нужную структуру (pbuffer) и размер передаваемого блока данных
(data_to_transfer).
3. Разделить передаваемые данные на блоки размером максимального пакета
(константа ep_control_length).
4. Произвести поблочную передачу данных хосту.
Код функции, производящей обработку запроса get descriptor, приведен в
листинге 13.19.
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. НЮ-устройство на основе 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); pbuffer =
&(usb_configuration.cfg.bLength); break;
}
default: /* отклонение запросов других дескрипторов */ {
STALL(); return;
}
}
/* поле windex, не используется */
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) == 0) { zip = TRUE; }
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())));
Usb_clear_tx_complete();
if ((Usb_rx_complete())) /* если передача прервана хостом */
(
Usb_clear_tx_ready(); /* завершить передачу */
Usb_clear_rx{); return;
>
}
/* посылаем остаточный пакет данных */
/* если такой пакет неполный, то он является */
Глава 13. НЮ-устройство на основе Atmel АТ89С5131
359
/* пакетом завершения передачи */
pbuffer = usb_send_epO_packet(pbuffer, data_to_transfer);
data_to_transfer = 0;
while ((!(Usb_rx_complete())) && (!(Usb_tx_complete())));
Usb_clear_tx_complete();
if ((Usb_rx_complete())) /* если передача прервана хостом */
{
Usb_clear_tx_ready();
Usb_clear_rx () ; return;
}
/* при необходимости (если все пакеты полные) */
/* формируем пакет завершения специально - посылкой */
/* пакета нулевой длины */
if (zip == TRUE)
{
usb_send_epO_packet(pbuffer, 0);
while ((!(Usb_rx_complete())) && (!(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(); /* переключение направления 0 точки */
Usb_clear_rx();
}
)
Собственно сама функция передачи пакета (листинг 13.20) выглядит
достаточно очевидно, и, наверно, дополнительно комментирования не
требует. Структуры дескрипторов мы разберем чуть позже.
: Листинг 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; i++)
{
b = * tbuf;
Usb_write_byte(b); /* передача байта */ tbuf++; /* следующий байт */
}
Usb_set_tx_ready(); return tbuf;
}
Функции обработки остальных запросов выглядят значительно проще.
Обработка запроса get_configuration сводится к передаче номера текущей
конфигурации (листинг 13.21), сохраненного в переменной
usb_configuration_nb. Этот номер сохраняется при обработке запроса set
configuration (листинг 13.22).
Листинг 13.21. Обработка запроса get_configuration
Предыдущая << 1 .. 110 111 112 113 114 115 < 116 > 117 118 119 120 121 122 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.