一、USB协议介绍
1、USB2.0有三个标准的速率:低速1.5Mb/s,全速12Mb/s,高速480Mb/s.
2、USB也是主从结构的总线,整个拓扑结构成金字塔: USB主机:Host:发起USB传输,还有一个roothub; USB设备:分为hub和function。hub是集线器,用于总线扩展。function是USB功能设备;
3、USB2.0规定,除主机外,下面连接的设备最多层数最多为6层,每个USB设备都有唯一的地址,USB设备地址为7位地址,0~127,0地址是一个特殊地址,当一个新的USB设备接入时,使用0地址与主机通信,主机随后给分配一个设备地址。
4、USB传输类型分为4种:
①控制传输:用于请求响应通信。主要用于命令和状态的操作,USB协议定义了很多标准的协议的命令请求和响应都是通过控制传输。
②等时传输:或叫同步传输,用于主机和设备之前周期性、连续通信,比如音频数据传输;
③中断传输:周期性主机与设备通信一次,比如键盘鼠标等设备;
④块传输:也叫批量传输,比如磁盘。
二、Linux USB驱动
1、注册USB设备驱动driver
usb_register(driver)
2、注销USB设备驱动
void usb_derigister(struct usb_driver *);
3、通过接口intf返回包含的USB设备结构struct usb_device对象指针
struct usb_device *interface_to_usbdev(struct usb_interface *intf)
4、保存data到接口intf
void usb_set_intfdata(struct usb_intface *intf,void *data)
5、从接口intf获取数据
void *usb_get_intfdata(struct usb_intface *intf)
Linux通过struct urb和USB设备的端点通信
1、提交一个urb,发起USB传输,
int usb_submit_urb(struct urb* urb,gtp_t mem_flags)
2、撤销一个提交的urb,并不等待urb被终止后才返回,用于不能休眠的上下文。
int usb_unlink_urb(struct urb *urb)
3、撤销一个提交的urb,等待urb被终止后才返回
void usb_kill_urb(struct urb *urb)
4、usb_fill_control_urb:填充一个用于控制传输的urb,pipe是用于通信的管道,setup_packet是协议建立包地址,complete_fnz指向urb传输完成后的回调函数,context指向可被USB驱动程序设置的数据块,
void usb_fill_control_urb(struct urb *urb,struct usb_device *dev,unsigned int pipe,unsigned char *setpacket,void *transfer_buff,unsigned int buff_length,usb_complete_t complete_fn,void *context)
5、usb_fill_bulk_urb和usb_fill_int_urb分别用于填充块传输urb和中断传输urb,其中interval参数用于指定中断传输的时间间隔。
USB传输通常使用下面的步骤:
1、使用usb_alloc_urb分配一个urb
2、根据传输类型填充一个urb,等时传输没有相应的函数,需要手动来实现
3、使用usb_submit_urb来提交一个urb发起传输
4、用完成量或等待队列来等待urb的完成
5、urb传输完成后,完成回调函数,在这里唤醒等待的线程
6、线程被唤醒后检查urb的执行结果,包括状态信息和实际完成传输的字节数。
7、如果中途撤销,则使用usb_unlink_urb和usb_kil_urb
8、释放申请的urb资源
使用urb完成usb传输可以做到精细的控制,但是使用比较复杂,Linux内核封装一些方便使用的函数
1、
`int usb_control_msg(struct usb_device *dev,unsigned int pipe,__u8 requst,__u8 requesttype,__u16 value,__u16 index,__u16 index,void *data,__u16 size,int timeout)`
用于发起控制传输,request 是协议中请求的请求字段,requesttype 是请求的类型,timeout,value和index也是协议中相应的字段
2、
int usb_interrrupt_msg(struct usb_device *usb_dev,unsigned int pipe,void *data,int len,int *actual_length,int timeout);
int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,void *data,int len,int *actual_length,int timeout)
usb_interrput合usb_bullk_msg分别用于发起中断传输和块传输。
actual_length是实际完成的传输字节数