USB驱动模型

1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序

2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动

3.USB client driver:为USB外部设备提供驱动程序

USB设备模型

device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次。一个usb driver(驱动)对应的是一个interface(接口)。一个接口对应一个基本功能。

在Linux内核中,使用struct usb_driver结构描述一个usb驱动。

struct usb_driver{

const char *name;   //驱动设备名

int (*)probe(struct usb_interface *intf, const struct usb_device_id *id);   //当USB核心发现了该驱动能够处理USB接口时,调用该函数

void (*disconnect)(struct usb_interface *intf);   //当相应的USB接口被移除时,调用该函数

const struct usb_device_id *id_table;   //USB驱动能够处理的设备列表

};

URB通讯模式

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

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

URB使用方法

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

2.USB core提交该urb到USB主控制器驱动程序。

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

4.当设备访问结束后,USB主控制器驱动程序按原来返回,通过usb core来通知USB设备驱动程序。

1.创建URB

struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags)

参数:

iso_packets:urb所包含的等时数据包个数

mem_flags:内存分配标识(如GFP_KERNEL),参考kmalloc

2.初始化URB

对于中断urb,使用usb_fill_int_urb函数来初始化

对于批量urb,使用usb_fill_bulk_urb函数来初始化

对于控制urb,使用usb_fill_control_urb函数来初始化

对于等时urb,只能手动初始化urb

static inline void usb_fill_int_urb(

struct urb *urb,   //待初始化的urb

struct usb_device *dev,   //urb所要访问的设备

unsigned int pipe,   //要访问的端点所对应的管道

void *transfer_buffer,   //保存传输数据的buffer

int buffer_length,   //buffer长度

usb_complete_t complete_fn,   //urb完成时调用的函数

void *context,   //赋值到urb->context的数据

int interval   //urb被调度的时间间隔

)

3.提交URB

在完成urb的创建和初始化后,USB驱动需要将urb提交给USB核心。

int usb_submit_urb(struct urb *urb, gfp_t mem_flags)

参数:

urb:要提交的urb指针

mem_flags:内存分配标识(如GFP_KERNERL),参考kmalloc

URB被提交到USB核心后,USB核心指定usb主控制器驱动程序来处理该urb。处理完成之后,urb完成函数将被调用。

HID协议

HID(Human Interface Device)是属于人机交互的设备。如USB鼠标,USB键盘,USB游戏操纵杆等。这类设备必须遵循HID设计规范。

HID设备如何把数据报给主机

设备通过4个字符的报告描述符把数据回传给主机

[国嵌攻略][164][USB驱动程序设计]的更多相关文章

  1. [国嵌攻略][117][LED驱动程序设计]

    LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko ... ...

  2. [国嵌攻略][160][SPI驱动程序设计]

    SPI Flash驱动 1.打开/drivers/mtd/devices/m25p80.c驱动文件.找到初始化m25p80_init函数,其中通过spi_register_driver来注册spi设备 ...

  3. [国嵌攻略][151][nandflash驱动程序设计]

    初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函 ...

  4. [国嵌攻略][065][DM9000驱动程序设计]

    移植代码:通过已有的可用的代码修改到新环境下运行. 代码编写: 初始化网卡 1.选中网卡 nLAN_CS BWSCON(0x48000000) DW4:01 16bit BANKCON4(0x4800 ...

  5. [国嵌攻略][165][usb下载线驱动设计]

    查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...

  6. [国嵌攻略][119][Linux中断处理程序设计]

    裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...

  7. [国嵌攻略][162][USB协议分析]

    USB设备逻辑结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点. USB设备描述符 当我们把USB设备( ...

  8. [国嵌攻略][161][USB总线介绍]

    USB发展史 USB(universal serial bus),通用串行总线,是一种外部总线标准.用于规范电脑与外部设备的连接和通讯.USB是在1994年底由英特尔.康柏.IBM.Microsoft ...

  9. [国嵌攻略][061][2440LCD驱动设计]

    LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...

随机推荐

  1. bzoj 4813: [Cqoi2017]小Q的棋盘

    Description 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能 在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2-,V- ...

  2. ubuntu设置静态ip

    设置固定ip地址 >>>>>>>>>> ifconfig -a,  (注:p1p1为网卡名称) 配置静态ip vim /etc/networ ...

  3. centos7 yum 安装 redis

    //从中国科学技术大学开源镜像站 wget http://mirrors.ustc.edu.cn/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.r ...

  4. FPGA浮点数定点化

    因为在普通的fpga芯片里面,寄存器只可以表示无符号型,不可以表示小数,所以在计算比较精确的数值时,就需要做一些处理,不过在altera在Arria 10 中增加了硬核浮点DSP模块,这样更加适合硬件 ...

  5. 由于DG Broker的配置导致RAC某实例无法mount

    今天碰到一个我自己实验室发生的故障,起初看起来很简单,但实际上还很有趣,而且不细心的话还容易被忽视掉.相信在生产环境也会有客户会实际遇到. 环境:Oracle 11.2.0.4 RAC (2 node ...

  6. Linux下Tomcat重新启动,及kill命令的使用

    Linux下Tomcat重新启动,及kill命令的使用 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查 ...

  7. VS2010 Extension实践(3)——实现自定义配置

    在之前的两篇曾提到通过VSSDK(MSDN也叫VSX)来拓宽思路,实现一些MEF Extension所不能做到的功能,比如获取IVsUIShell服务来执行Command等等,这里我给各位看官展示如何 ...

  8. Mongodb集群【三】

    Mongodb常用三种集群 1 主从(Master/Slave) 不推荐,但是mongodb依然保留有.一主多从,不支持链式结构.简单主从,没有裁仲者不能自动恢复. 2 副本集(Relica Set) ...

  9. angular4.0中form表单双向数据绑定正确姿势

    issue:用[(ngModel)]="property"指令双向数据绑定,报错. reason1:使用ngModel绑定数据需要注入FormsModule模块,在app.modu ...

  10. 常用base.css

    ul { list-style: none;}a { text-decoration: none;} body,h1,h2,h3,h4,h5,h6,p,ul,ol,form { margin: 0; ...