usb驱动的基本知识

USB基本知识:
(1):公共总线协议
(2):两种接口:4个引脚(1,Vcc,2,DATA,3,DATA,4,Ground)
差分线:

USB主机软件架构
(1):客户软件-负责和USB设备的功能单元进行通信,以实现其特定功能。
(2):USB系统软件-负责和USB逻辑设备进行配置通信,并管理客户软件启动的数据传输。
(3):于给USB系统提供一个或多个连接点(端口)。
(注释:USB总线接口的代码一般由内核给我们写好了,我们写驱动一般是写的客户软件)

USB设备
(1)设备(设备描述符)
   设备代表一个USB设备,它由一个或多个配置组成。设备描述符用于说明设备的总体信息,并指明其所含的配置的个数。一个USB设备只能有一个设备描述符。
(2)配置(配置描述符)
    配置描述符用于说明USB设备中各个配置的特性,如配置所含接口的个数等。USB设备的每一个配置都必须有一个配置描述符
(3) 接口(接口描述符)
   接口是端点的集合。
       接口描述符用于说明USB设备中各个接口的特性,如接口所属的设备类及其子类等。USB设备的每个接口都必须有一个接口描述符

(4)端点(端点描述符)
 端点是USB设备中的实际物理单元,USB数据传输就是在主机和USB设备各个端点之间进行的。
     USB设备中的每一个端点都有唯一的端点号,每个端点所支持的数据传输方向一般而言也是确定的:或是输入(IN)或是输出(OUT)


(5)管道
  管道是对主机和USB设备间通信流的抽象,它表示主机的数据缓冲区和USB设备的端点之间存在着逻辑数据传输,而实际的数据传输是由USB总线接口层来完成的。
  管道的创建函数:usb_rcvctrlpipe(dev,endpoint);(向主机发数据,endpoint 即为端点号)
        usb_sndctrlpipe(dev,endpoint);(从主机向外发数据))
  管道和USB设备中的端点一一对应。
(注释:接口是端点的集合,所谓的配置:例如,我们在插入手机usb时,有储存模式,充电模式等,这就是一个配置,一个配置可能有很多的接口)

(7)USB通信最基本的形式为端点(endpoint)。
USB端点只能往一个方向传送数据,从主机到设备(称为输出端点)或者从设备到主机(称为输入端点)。
端点可以看作是单向的管道。
USB 端点有四种不同的类型,分别具有不同的传送数据的方式。
控制
中断
批量
等时

(8):数据传送
主机(缓冲区)—————(管道)————接口(端点,逻辑设备)。
(发送数据的函数: int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
                      __u8 requesttype, __u16 value, __u16 index, void *data,
                      __u16 size, int timeout)

(9)主机控制器:HCI
USB 的HCI 有3 种格式(一般是在我们编译内核时设置):
OHCI(Open Host Controller Interface)
UHCI(Universal Host Controller Interface)
EHCI(Enhanced Host Controller)
(10)设备地址:
地址是一个数字,1-127;
◇ 设备加电时由主机分配;
◇ 分配后存放在设备上;
◇ 每个设备都有唯一的地址;
◇ 地址是主机寻找设备的唯一标识。
(11)设备地址的分配:
一个 USB HOST 最多可以同时支持128 个地址
地址0 作为默认地址,只在设备枚举期间临时使用,而不能被分配给任何一个设备
在实际的USB 体系中可支持的USB 功能设备的数量将小于127

(11)usb 应用程序--usb设备驱动程序--usb核心--usb控制器驱动程序---usb控制器

(12)在Linux 操作系统中, 有一个叫做“usb core”的子系统, 它的作用是提供支持usb设备驱动程序的API(应用编程接口) 和usb的主机(HOST) 控制器驱动程序。
它提供了许多数据结构,宏定义和功能函数来对硬件或设备进行支持。
在Linux下编写usb 设备的驱动程序从严格意义上讲, 就是使用这些usb core 的子系统定义的数据结构、宏和函数来编写数据的处理功能。


(13)USB驱动注册函数:
注册:usb_register()

注销:usb_deregister()

参数:skel_driver
为 struct  usb_driver类型(详细的见内核)



你可能感兴趣的:(usb驱动的基本知识)