usb中文名的意思为“通用传输总线”。日常生活中,usb设备到处使用,usb接口方便且高效。usb设备遵循usb传输协议,这个协议庞大而且复杂,我对此也不是很了解,书写usb驱动,主要是参照内核代码drivers\hid\usbhid\usbmouse.c。
关于usb的一些知识:
1.usb设备遵循usb协议,在usb协议中主要分为4中传输方式:控制传输、中断传输、等时传输、批量传输。
2.每一个usb设备都支持控制传输,控制传输主要是用于在usb设备插入主机时,主机能获取到该设备的一些信息,如:设备描述符、设备状态等。
3.usb设备都有一个设备描述符,该描述符中包含了设备的版本号、厂家信息、设备类、设备子类等。
4.usb设备与主机之间通信:一端位于主机的缓冲区,一端对应usb设备的一个端点,中间用管道连接,一个接口可以对应多个端点,每个端点对应着一个端点描述符。
5.usb设备驱动是基于输入子系统构造的,但是在此基础上还加入了中断传输。
书写usb驱动的框架:
1.定义并设置一个usb_driver结构体,注册
2.在probe函数中完成输入子系统并加入中断传输:
a.分配一个input_dev结构体
b.设置可以产生哪一类事件,哪一些事件
c.注册
d.硬件的相关操作:
(1).获取当前设置:interface = intf->cur_altsetting;
(2).获取端点描述符:endpoint = &interface->endpoint[0].desc;
(3).构造、填充urb结构体
填充urb结构体时,需要构造一个完成函数,它是当完成一次数据传输后由主机控制器调用。一般在这个函数中进行数据处理,如:上报事件。
最后还要提交urb:
usb_submit_urb(struct urb *urb, gfp_t mem_flags)
如:
usb_submit_urb (myusb_urb, GFP_ATOMIC);
例子:
定义并设置一个usb_driver结构体,注册
重点函数:probe
disconnect函数和probe函数做“相反”的操作,此处略。
完成函数:
由于Linux中含有完成的USB驱动,所以在测试自己的驱动程序时,必须先配置内核,将Linux固定好的USB驱动程序去掉,再编译、烧写新内核,加载自己的驱动程序进行测试。
本文出自 “君峰俊宇” 博客,请务必保留此出处http://10274409.blog.51cto.com/10264409/1731830
原文:http://10274409.blog.51cto.com/10264409/1731830