【无标题】

一、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是实际完成的传输字节数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值