查看文章 |
通用串行总线(USB)是主机和外围设备之间的一种连接。 最新的USB规范修订增加了理论上高达480Mbps的高速连接。 从拓扑上来看,一个USB子系统是一棵由几个点对点的连接构建而成的树。 USB主控制器(host controller)负责询问每一个USB设备是否有数据需要发送。 USB总线是一个单主方式的实现,即主机轮询各种不同的外围设备。 USB总线的特性: USB协议规范定义了一套任何特定类型的设备都可以遵循的标准。 这些不同的特定类型称为类(class), 对于不符合这些类的其他类型的设备,需要针对特定的设备编写一个特定的驱动程序。 Linux内核支持两种类型的USB驱动程序: 宿主系统的USB驱动程序控制插入其中的USB设备, 用 户 USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口, ---------------------------------- 本章描述驱动程序和USB核心之间的接口。
USB通信最基本的形式是通过一个名为端点(endpoint)的东西, 端点可以看作单向的管道。 USB端点有4种不同的类型,其传送数据的方式不同: 内核中使用struct usb_host_endpoint结构体来描述USB端点。 后一个结构体包含了所有的USB特定的数据, bEndpointAddress bmAttributes wMaxPacketSize bInterval -------- USB端点被捆绑为接口。 USB接口只处理一种USB逻辑连接。 一些USB设备具有多个接口,例如 一个USB接口代表了一个基本功能,每个USB驱动程序控制一个接口。 以扬声器为例,Linux需要两个不同的驱动程序来处理一个硬件设备。 内核使用struct usb_interface结构体来描述USB接口。 USB核心把该结构体传递给USB驱动程序, 该结构体的重要字段有: struct usb_host_interface *altsetting unsigned num_altsetting struct usb_host_interface *cur_altsetting int minor ------------ USB接口本身被捆绑为配置。 一个USB设备可以有多个配置,而且可以在配置之间切换以改变设备的状态。
USB设备的逻辑单元之间的关系描述如下: ------------------- USB sysfs设备命名方案为: 根集线器-集线器端口号:配置.接口 如果有更多的USB集线器的使用,则设备名类似于: 根集线器-集线器端口号-集线器端口号:配置.接口 -------------------- USB请求块 通过urb来和所有的USB设备通信。 这个请求块使用struct urb结构体来描述 <linux/usb.h> 设备中的每个端点都可以处理一个urb队列。 一个urb的典型生命周期:
struct urb结构体中USB设备驱动程序关心的字段: struct usb_device *dev unsigned int pipe unsingned int transfer_flags void *transfer_buffer dma_addr_t transfer_dma int transfer_buffer_length unsigned char *setup_packet dma_addr_t setup_dma usb_complete_t complete void *context ... ----------------- struct urb *usb_alloc_urb(int iso_packets,int mem_flags); ---------------- 批量urb 控制urb 等时urb ---------------- 一旦urb被USB驱动程序正确地创建和初始化之后, 这是通过调用usb_submit_urb函数来完成的。 int usb_submit_urb(struct urb *urb,int mem_flags); ---------------- ---------------- int usb_kill_urb(struct urb *urb);
------------------------------------
|
联系客服