系统内核中有USB总线驱动程序,作用是识别设备,查找并安装设备驱动程序,提供读写函数
当一个USB设备插入时,会有以下操作:
1.某条线被拉低,硬件感知有设备接入
2.USB总线驱动程序为设备分配新地址,并告诉USB设备
3.获取描述符
4.根据获取的设备描述符中的信息在USB总线中添加device,此时如果总线中有同名的driver就会调用driver中的probe函数
usb描述符在usb.h中定义,有很多
struct usb_device {
struct usb_device_descriptor descriptor; //设备描述符
struct usb_host_config *config; //配置描述符
......
}
struct usb_interface {
struct usb_interface_assoc_descriptor *intf_assoc; //描述设备特有描述符属性
struct usb_host_interface *cur_altsetting; //存有设备特有的描述符
......
}
等......
设备驱动程序
1. 分配/设置usb_driver
2.注册usb_driver
在usb_driver的probe函数中我们可以做想做的事情,比如说注册一个字符设备驱动程序,,或者直接用输入子系统做一些事情。不同的地方在于,以前用输入子系统的时候是在中断函数中读寄存器,根据寄存器中的数据来上报事件。USB是没有的中断,也读不了寄存器,那怎么办???USB总线驱动程序中有读数的函数,会定时去读数据,读完会调用一个完成函数相当于中断函数。那么怎么使用USB总线驱动中那些现成的东西???
1. 分配usb_buffers
2. 分配urb
3. 设置urb
4. 提交urb