USB驱动程序设计(4)—Linux USB驱动程序设计

1.USB驱动模型

  • USB设备包括配置(configuration)、接口(interface)和端点(endpoint)一个USB设备驱动程序对应一个USB接口,而非整个USB设备。比如说一个MP4的播放设备,他可以播放视频、也可以播放声音,这2个功能称为一个接口,而每一个驱动只能驱动一个接口,所以如果需要同时播放视频和音频则需要2个驱动程序。
  •  在Linux内核中,使用struct usb_driver结构描述一个USB驱动:
struct usb_driver {
const char *name; /*驱动程序名*/
 
/* 当USB核心发现了该驱动能够处理的USB接口时,调用该函数 */
int (*probe) (struct usb_interface *intf, const struct usb_device_id *id);
 
/* 当相应的USB接口被移除时,调用该函数 */
void (*disconnect) (struct usb_interface *intf);
 
/* USB驱动能够处理的设备列表 */
const struct usb_device_id *id_table;
}
  • id_table里面记录了这个驱动支持的设备列表,一个设备ID有vendIDdeviceID来标记。如果USB驱动在加载的时候,在Linux中发现了它支持的设备将会调用probe函数。

 2.URB通讯模型

  • USB主机和USB设备之间的通信是通过主机请求的方式来完成的,我们先看下面这一幅图

  • 主机向设备发出请求,然后设备响应请求。发起请求的源是usb client driver,然后提供给usb core,接着传给usb host controller driver,最后通过主控制器发给usb设备。主控器收到响应后按原路返回,交给usb client driver。usb请求是通过内核中的URB来描述的。

 2.1 URB请求块

  • USB请求块(USB request block-URB)是USB设备驱动中用来与USB设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体,是USB主机与设备通信的“电波”
  • USB的通信模型如下:
    • 1. USB设备驱动程序创建初始化一个访问特定端点的urb,并提交给USB core;
    • 2. USB core提交该urb到USB主控制器驱动程序;
    • 3. USB主控制器驱动程序根据该urb描述的信息,来访问USB设备;
    • 4. 当设备访问结束后,USB主控制器驱动程序按原来返回,通过usb core来通知USB设备驱动程序。

 2.2 创建URB

struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值