linux USB 编程

Linux USB架构

 

842584-20160308195307413-689879976.jpg

 

 

可以看出一个USB体系需要4个驱动:USB设备驱动(主要编写这部分),USB主控制器驱动,Gadget驱动,UDC驱动

 

USB主要有4个功能:

MassStorage:大容量存储,如硬盘,U盘。

USB-HID:人体接口设备,鼠标,键盘。

RNDIS:网卡。

CDC-ACMu转串口。

 

USB描述符:

842584-20160308195309038-1686021834.jpg

 

USB驱动程序位于不同的内核子系统和USB主控制器之间,USB核心为USB驱动提供了用于访问和控制USB硬件的软件接口,使得USB设备驱动程序不必考虑USB硬件控制器。

 

842584-20160308195310569-1683110182.jpg

 

从上图看,一个USB驱动是对应一个接口的,所以一个设备可能有多个驱动。

USB总线驱动与设备

驱动结构体

一个USB驱动使用struct usb_driver来描述(每种总线都有driver这种结构):

842584-20160308195313147-1446922440.jpg

 

 

而上图中设备列表中的usb_device_id如下:

842584-20160308195315647-718544543.jpg

 

 

填充上面的ip_table需要定义通过USB_DEVICE来定义一种USB设备的USB_DEVICE(vend,prod)

842584-20160308195317538-1342838087.jpg

 

上面是定义一种,下面的宏是定义一类

842584-20160308195320913-1030254902.jpg

 

注册驱动:

842584-20160308195322085-367712500.jpg

 

设备结构体

842584-20160308195324257-63656427.jpg

 

 

配置描述符:

配置结构体:

Linux内核使用Struct usb_host_config来描述一个USB配置

842584-20160308195325085-313606457.jpg

 

配置描述符结构体:

842584-20160308195325819-881804233.jpg

 

 

接口描述符:

接口结构体:

Linux kernel使用struct usb_interface来描述usb接口:

842584-20160308195328241-2033663677.jpg

 

接口设置结构体

设置和配置是有区别的:

一个配置包含一个或多个接口

一个接口包含一个或多个设置

下面是一个例子:

842584-20160308195329975-420312638.jpg

 

 

Linux kernel使用struct usb_host_interface来描述USB接口设置:

842584-20160308195331397-1761015600.jpg

 

接口描述符结构体

842584-20160308195333507-1463008603.jpg

 

端点描述符:

端点结构体

Linux kernel使用struct usb_host_endpoint来描述USB端点:

842584-20160308195334850-606451368.jpg

 

端点描述符结构体

Linux内核使用struct usb_endpoint_decriptor来对USB描述符中的端点描述符进行描述

842584-20160308195336132-1812469432.jpg

 

 

URB

USB请求块是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体,是USB主机与设备通信的“电波”。

URB处理的流程如下:

1. USB设备驱动程序创建并且初始化一个访问特定USB设备特定端点的urb,并提交给USB core

2. USB core提交该urbUSB主控制器驱动程序;

3. USB主控制器驱动程序根据该urb描述的信息,来访问USB设备。

4. 当设备访问结束后,USB主控制器驱动程序通知USB设备驱动程序。

流程一

创建urb

842584-20160308195337069-247218938.jpg

 

初始化URB

842584-20160308195338522-382905005.jpg

842584-20160308195341225-814268181.jpg

 842584-20160308195342913-612989900.jpg

 

流程二

842584-20160308195344804-1410480502.jpg

 

流程三,流程四:

 842584-20160308195346975-368731251.jpg





转载于:https://www.cnblogs.com/dchipnau/p/5255353.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值