分类: LINUX
2011-01-05 09:06:14
USB是大家常见的,设备总线。
这个USB分为两个部分:主机,设备。
他是一个树形的关系:
主机
设备 设备 设备
主机里装的是,主机控制器,设备中装的是设备控制器
Host Controller 和 UDC
从主机侧看 | 从设备侧看 |
USB设备驱动 | Gadget驱动 |
USB核心 | Gadget API |
USB主机控制器驱动 | UDC驱动 |
USB控制器 | USB控制器 |
在主机侧要实现的驱动有两部分,USB设备驱动和USB主机控制器驱动。现阶段我们先关注,下面的。主机控制器驱动。
在设备侧分为3个层次,UDC驱动、Gadget API、Gadget 驱动。其中的USB控制器,与主机侧等同。
Linux中,USB设备用usb_device结构趋描述,而USB设备描述符定义为usb_device_descriptor结构体.
usb配置在内核中使用usb_host_config结构体, USB配置描述符用usb_config_descriptor结构体,
usb接口:usb_interface结构体描述,usb接口描述符定义为结构体usb_interface_descriptor结构体,
usb端点:端点在内核中用usb_host_endpoint结构体描述,而端点描述符则定义为usb_endpoint_descriptor结构体,
这样我们就可以把一个USB设备抽象成一个由四个基本元素组成的,对象。其中还有一个事字符串结构体,usb_string_descriptor结构体。
20.1 Linux USB驱动层次
20.1.1 主机侧与设备侧USB驱动
主机侧和设备侧的USB控制器分别称为主机控制器和USB设备控制器,每条总线上只有一个主机控制器,负责协调主机和设备间的通信,而设备不能主动向主机发送任何消息。
20.1.2 设备、配置、接口、端点
在USB协议中,接口由多个端点组成,代表一个基本的功能,是USB设备驱动程序控制的对象,一个功能复杂的USB设备可以具有多个接口。
端点是USB通信的最基本形式,每一个USB设备接口在主机看来就是一个端点的集合。
20.2 USB主机驱动
20.2.1 USB主机驱动的整体结构
USB主机控制器有3种规格:OHCI、UHCI和EHCI。
20.2.2 实例:S3C2410 USB主机驱动
S3C2410内部集成了一个USB主机控制器,完全兼容OCHI 1.0、USB 1.1标准,支持低速和全速USB设备。
20.3 USB设备驱动
20.3.1 USB设备驱动的整体结构
一般通用的Linux设备都不需要工程师再编写驱动,需要编写的是特定厂家、特定芯片的驱动,而且往往也可以参考内核中已提供的驱动的模板。
20.3.2 USB请求块(URB)
URB是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构。
20.3.3 探测和断开函数
对探测函数的调用发生在USB设备被安装且USB核心认为该驱动程序与安装的USB设备对应时,而对断开函数的调用则发生在驱动因为种种原因不再控制该设备的时候。
20.3.4 USB骨架程序
Linux内核源代码中的driver/usb/usb-skeleton.c文件为我们提供了一个最基础的USB驱动程序,即USB骨架程序,可以被看做一个最简单的USB设备驱动实例。
20.4 USB设备驱动实例
20.4.1 USB串口驱动
在Linux内核中,串口属于tty设备,对于一个USB串口设备而言,其驱动主要由两部分组成:usb_driver的成员函数和tty设备的tty_operation结构体成员函数。
20.4.2 USB键盘驱动
在Linux系统中,键盘被认定为标准输入设备,对于一个USB键盘而言,其驱动主要由两部分组成:usb_driver的成员函数和输入设备的打开、关闭、中断处理等函数。