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. php生成雪花图像(不美观请见谅)

    <?php /*  //新建图像 //雪花  @header("Content-Type:image/png"); $w = 500; $h = 500; //create ...

  2. Java设计模式总汇一

    PS:首先我们要带着问题读文章 什么是设计模式 为什么要用设计模式 使用设计模式有什么好处 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了重用代码.让 ...

  3. 从一个word文件中读取所有的表格和标题(1)

    首先讲需求: 从word文件中读表格里的数据,然后插入数据库中.word文件中的表格是带有标题的,把标题读出来,进行匹配数据库. 需求分析: word2007底层是以xml文件存储的,所以分析xml的 ...

  4. 《Create Your own PHP Framework》笔记

    前言 大力推荐该教程:<Create Your own PHP Framework> Symfony的学习蛮累的,官方文档虽然很丰富,但是组织方式像参考书而不是指南,一些不错的指导性文档常 ...

  5. Macaca环境配置及样例执行

    1.Macaca简介 macaca是由阿里巴巴公司开发的一套自动化解决方案,适用于PC端和移动端.Macaca基于Node.js开发,测试案例编写语言暂时也只支持Node.js. 2.Macaca与A ...

  6. a:hover标签已经定义了text-decoration:none,并且生效,但是还是有下划线

    a标签在F12计算出来的样式里 text-decoration:none; 确实有被应用到.但是链接的下划线并没有被去掉... 解决办法:p:commandLink <p:commandLink ...

  7. php 运行的四种模式

    1)cgi 通用网关接口(Common Gateway Interface)) CGI即通用网关接口(Common Gateway Interface),它是一段程序, 通俗的讲CGI就象是一座桥,把 ...

  8. C# winFrom窗体设计问题-部分文件打不开窗体设计器 变成类.cs

    https://zhidao.baidu.com/question/1513483178103163220.html C# winform程序设计的时候,出现了问题.默认主窗体form1(改名form ...

  9. java基础只关键字final

    final关键字简述 final关键字是在编写java程序中出现频率和很高的关键字,如果想要更好的编写java程序,那么掌握final关键字的运用是非常必要的.让我们先看一下final关键字可以修饰的 ...

  10. 【图文】如何在centos上安装tomcat

    先到tomcat官网下载安装包(随便下载你想要的版本) 假设你现在使用的是windows系统 那么就把你下载来的压缩包解压,放到一个目录中 在你本地的windows系统中安装个xshell和xftp ...