[国嵌攻略][164][USB驱动程序设计]
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驱动程序设计]的更多相关文章
- [国嵌攻略][117][LED驱动程序设计]
LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko ... ...
- [国嵌攻略][160][SPI驱动程序设计]
SPI Flash驱动 1.打开/drivers/mtd/devices/m25p80.c驱动文件.找到初始化m25p80_init函数,其中通过spi_register_driver来注册spi设备 ...
- [国嵌攻略][151][nandflash驱动程序设计]
初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函 ...
- [国嵌攻略][065][DM9000驱动程序设计]
移植代码:通过已有的可用的代码修改到新环境下运行. 代码编写: 初始化网卡 1.选中网卡 nLAN_CS BWSCON(0x48000000) DW4:01 16bit BANKCON4(0x4800 ...
- [国嵌攻略][165][usb下载线驱动设计]
查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...
- [国嵌攻略][119][Linux中断处理程序设计]
裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...
- [国嵌攻略][162][USB协议分析]
USB设备逻辑结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点. USB设备描述符 当我们把USB设备( ...
- [国嵌攻略][161][USB总线介绍]
USB发展史 USB(universal serial bus),通用串行总线,是一种外部总线标准.用于规范电脑与外部设备的连接和通讯.USB是在1994年底由英特尔.康柏.IBM.Microsoft ...
- [国嵌攻略][061][2440LCD驱动设计]
LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...
随机推荐
- MST系列
1.POJ2485 Highways 蛮水的 数组一开始开小了卡了一会儿 我可能是个傻逼 #include<iostream> #include<cstdio> #includ ...
- 51nod 1203 jzplcm
长度为N的正整数序列S,有Q次询问,每次询问一段区间内所有数的lcm(即最小公倍数).由于答案可能很大,输出答案Mod 10^9 + 7. 例如:2 3 4 5,询问[1,3]区间的最小公倍数为2 ...
- 01.阿里云SDK调用,获取ESC主机详细信息
一:通过python SDK获取云主机的详细信息 1.创建Accessky码(不做展示) 2.通过pip安装SDK模块,这个阿里云帮助里面有,也不做详细展示. 3.详细使用方法看代码 我下面展示的返回 ...
- 高仿二次元网易GACHA
高仿二次元网易GACHA,所有接口均通过Charles抓取而来,图片资源通过 https://github.com/yuedong56/Assets.carTool 工具提取. 详情见github地址 ...
- jamup与gb2i组合
软件一定要开嗓单效果器,最好不要关闭中断软件/声音,每次有重新检测电流必须会有嗓音,最好用ipad ,不然会烦死人.默认delay太长,在DLY面板修改 gb2i 效果还行,他的价值重在使用,让新人使 ...
- SVN添加用户权限
点击properties
- crontabs linux定时任务功能安装
crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行.通常 ...
- java多线程(二)-Runnable和Thread
Java在顺序性语言的基础上提供了多线程的支持.Java的线程机制是抢占式的.这表示调度机制会周期的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片.(与抢占式多线程对应的是 协作式多线 ...
- promise 和 async 的用法
promise // 先构造一个 promise 函数 // resolve 和 reject 都是一个函数 // resolve 在成功时调用 // reject 在失败时调用 function p ...
- 申请的服务器安装tomcat后不能访问的问题
新申请的阿里云服务器,操作系统是CentOS6.5,安装jdk1.8版本,用java -version命令可以查看jdk版本,安装正确会有版本显示.然后安装tomcat,tomcat安装后默认端口是8 ...