5.4.1 Основы USB

Предыдущая  Содержание  Следующая V*D*V

Как уже говорилось ранее, USB является высокоскоростной последовательной шиной, способной работать с максимальной скоростью передачи 480 Мбит/с. Устройства подключаются к корневому узлу, называемому хостом. Хост-устройство представляет собой контроллер шины USB, подключённый к системной шине через PCI. Устройства классифицируются так, чтобы подпадать под различные стандартные классы устройств, такие как:

 

Класс устройств хранения (Storage Class): жёсткий диск, флеш-диски, и так далее

Класс устройств для взаимодействия с человеком (Human Interface Class): мышь, клавиатура, сенсорная панель, и так далее

Расширитель/Концентратор/Хаб (Extender / Hub): концентраторы (используемые для предоставления на шине дополнительных точек подключения)

Класс устройств коммуникации (Communication Class): модем, сетевые карты, и так далее

 

Типичная топология шины представлена на Рисунке 5.9.

 

Рисунок 5.9 Топология шины USB.

Рисунок 5.9 Топология шины USB.

 

Взаимодейтсвие с устройством USB происходит через однонаправленные трубы, называемые оконечными точками (endpoints). Каждое логическое устройство USB представляет собой набор оконечных точек. Каждому логическому устройству на шине хост присваивает уникальный номер, когда устройство подключается к шине. Каждая оконечная точка устройства связана с зависимым от устройства номером оконечной точки. Сочетание устройства и номера оконечной точки позволяет каждой оконечной точке быть идентифицированной однозначным образом.

USB определяет четыре типа передачи:

 

Передача сигналов управления (Control transfers): передача настроек/параметров конфигурации, обычно происходит через оконечную точку конфигурации. Каждое устройство должно иметь как минимум одну оконечную точку, необходимую для настройки устройства при обнаружении. Она называется оконечной точкой 0.

Передача прерываний (Interrupt transfers): используется для передачи низкочастотных данных о прерываниях драйвера. HID (Human Interface Device, Устройства для Взаимодействия с Человеком) устройства используют передачу прерываний.

Поточные передачи (Bulk transfers): используются для передачи больших блоков данных, которые не ограничены пропускной способностью. Поточные передачи используют принтеры и коммуникационные устройства.

Изохронные передачи (Isochronous transfers): используются для периодических, непрерывных передач данных. Изохронные передачи используют видео, аудио и другие потоковые устройства.

 

Оконечная точка обычно реализуется с помощью некоторых регистров в памяти или буферной зоны, экспортируемой оборудованием. Драйвер USB устройства записывает данные в эти регистры, чтобы запрограммировать оконечную точку. Высокоскоростные устройства передачи могут предоставить передачи с помощью DMA для своих оконечных точек. Чтобы сформировать интерфейс устройства, одна или несколько оконечных точек группируются вместе. Интерфейс представляет собой логическое устройство, например, мышь или клавиатуру. Каждое логическое устройство должно иметь соответствующий интерфейс USB драйвера, доступный на хосте. Рисунок 5.10 показывает устройство, объединяющее клавиатуру и мышь, и соответствующие ему драйверы на ведущем устройстве.

 

Рисунок 5.10 Стек драйверов USB.

Рисунок 5.10 Стек драйверов USB.

 

Интерфейсы сгруппированы для формирования конфигураций. Каждая конфигурация настраивает устройство в определённый режим. Например, модем может быть настроен для работы с двумя линиями по 64 Кбит/с или в другой конфигурации для одной линии 128 Кбит/с. Драйвер хоста обращается к хост-контроллеру для управления шиной, в то время как драйвер в устройстве делает устройство видимым для шины. Драйверная платформа периферийных USB устройств обеспечивает необходимые интерфейсы и структуры данных для реализации функции USB устройства или интерфейса. Структура состоит из двух уровней:

 

Драйвер контроллера: этот уровень обеспечивает аппаратную абстракцию для USB устройства и реализует интерфейсы периферийного устройства. Драйвер реализует аппаратно-зависимую часть и предоставляет аппаратно-независимый уровень интерфейса периферийного устройства, используемый более высокоуровневыми драйверами.

Драйвер периферийного устройства: этот уровень представляет собой фактическую реализацию устройства с функцией USB устройства с помощью интерфейса периферийного устройства. Каждая функция USB устройства требует написания отдельного драйвера периферийного устройства. Поддерживаемые функции USB устройства зависят от возможностей низкоуровневого оборудования.

 

Драйвер контроллера обрабатывает только ограниченный набор стандартных управляющих запросов USB, относящихся к устройству и состоянию оконечной точки. Все остальные запросы управления, в том числе относящиеся к конфигурации устройства, обрабатываются драйвером периферийного устройства. Драйвер контроллера также управляет очередью ввода/вывода оконечной точки и передачей данных между оборудованием и буферами драйвера периферийного устройства с использованием DMA, где это возможно.

Как обсуждалось ранее, драйвер периферийного устройства реализует определённую функцию устройства. Например, драйвер сетевого периферийного устройства реализует такие функции, как передача и приём сетевых пакетов. Для этого драйвер периферийного устройства должен связать себя с ядром Linux и врезаться в соответствующий стек драйверов. Драйвер вызывает функции более высокого уровня, подобные netif_rx и netdev_register, а для выполнения необходимых аппаратно-зависимых действий он вызывает с более низкого уровня драйвер контроллера через уровень интерфейса периферийного устройства. Уровни драйверов периферийных устройств USB и то, как они взаимодействуют с остальной частью системы Linux, показывает Рисунок 5.11.

 

Рисунок 5.11 Архитектура драйвера периферийного USB устройства.

Рисунок 5.11 Архитектура драйвера периферийного USB устройства.

 

Как правило, контроллер подключает себя к ядру как обычное устройство PCI с помощью метода pci_driver.probe. Для регистрации устройства драйвер контроллера предоставляет интерфейс usb_gadget_register_driver. Логическими этапами,  выполняемыми с функции зондирования контроллера, являются:

 

1.Регистрация и выделение памяти ресурсам PCI с помощью pci_enable_device() и request_mem_region().

2.Инициализация оконечных точек оборудования USB контроллера, такая как установка оконечных точек и структур данных оконечных точек в начальное состояние.

3.Регистрация обработки прерываний контроллера с помощью request_irq().

4.Инициализация регистров контроллера для DMA и выделение памяти для DMA.

5.Регистрация контроллера устройства в ядре с помощью device_register().

 

Наиболее важной структурой данных является usb_gadget_driver, которая связывает периферийное устройство с контроллером. Ещё одним важным аспектом драйвера контроллера является то, что он заботится о взаимодействии различных оконечных точек. Для реализации этого уровень периферийного устройства предоставляет структуру struct usb_ep_ops. Обе структуры данных показаны в Распечатке 5.8.

Большинство указателей на функции в usb_ep_ops являются обёртками вызовов интерфейса периферийных устройств, которые используются драйверами периферийных устройств. Например, интерфейс драйвера периферийного устройства usb_ep_enable разрешает начать работу с оконечной точкой.

 

static inline int

usb_ep_enable (struct usb_ep *ep,

               const struct usb_endpoint_descriptor *desc)

{

  return ep->ops->enable (ep, desc);

}

 

Чтобы передавать любые USB данные устройству, драйвер периферийного устройства аналогичным образом использует функцию usb_ep_queue.

 

static inline int

usb_ep_queue (struct usb_ep *ep, struct usb_request *req,

              int gfp_flags)

{

  return ep->ops->queue (ep, req, gfp_flags);

}

 

ops->queue это зависимая от контроллера функция очереди. Полный список интерфейсов периферийного устройства находится в файле include/linux/usb_gadget.h.

 

Предыдущая  Содержание  Следующая