博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USB驱动
阅读量:6992 次
发布时间:2019-06-27

本文共 2129 字,大约阅读时间需要 7 分钟。

  从主机侧的立场来看,在Linux驱动中,USB驱动处于最底层的是USB主机控制器硬件,在其之上运行的是USB主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动,前者控制插入其中的USB设备,后者控制USB设备如何与主机通信。Linux内核USB核心负责USB驱动管理和协议处理的主要工作。主机控制器驱动和设备驱动之间的USB核心非常重要,其功能包括:通过定义一些数据结构、宏和功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息;完成设备热插拔控制、总线数据传输控制等。

设备通常有一个或多个配置;

配置通常有一个或多个接口;
接口通常有一个或多个设置;
接口有零或多个端点。

  一般的通用的Linux设备(如U盘、USB鼠标、USB键盘等)都不需要工程师再编写驱动,需要编写的是特定厂商、特定芯片的驱动,而且往往也可以参考内核中已提供的驱动的模板。

 

 

USB设备驱动程序编写步骤

1、分配/设置usb_driver结构体

1 static struct usb_driver xxx_usb_driver = 2 {3     .name         = "xxx_name",4     .probe         = xxx_usb_probe,5     .disconnect = xxx_usb_disconnect,6     .id_table     = xxx_usb_id_table,        7 };

2、注册usb_driver结构体,一般发生在模块加载函数中,如:

1 static int __init xxx_init(void)2 {3     usb_register(&xxx_usb_driver);4     ...5     6     return 0;7 }

同样,模块卸载函数中也要将其卸载

1 static void __exit xxx_exit(void)2 {3     usb_deregister(&xxx_usb_driver);4     ...5 }

3、初始化设备驱动所支持的USB设备的列表数组xxx_usb_id_table[]

  usb_device_id结构体用于包含USB设备的制造商ID、产品ID、产品版本、设备类、接口类等信息及其要匹配标志成员match_flags(标明要与哪些成员匹配,包含DEV_LO、DEV_HI、DEV_CLASS、DEV_SUBCLASS、DEV_PROTOCOL、INT_CLASS、INT_SUBCLASS、INT_PROTOCOL)。

1 static struct usb_device_id xxx_usb_id_table[] =  2 { 3     {  4         //该宏用于创建一个匹配接口指定类型的usb_device_id结构体实例 5         USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT, USB_INTERFACE_PROTOCOL_MOUSE)  6     }, 7     /* 8     {  9         //该宏根据制造商ID 和产品ID 生成一个usb_device_id 结构体的实例,在数组中增加该元素将意味着该驱动可支持匹配制造商ID、产品ID的设备。10         USB_DEVICE(vendor, product) 11     },12     { 13         //该宏根据制造商ID、产品ID、产品版本的最小值和最大值生成一个usb_device_id结构体的实例,14         //在数组中增加该元素将意味着该驱动可支持匹配制造商ID、产品ID和lo~hi范围内版本的设备。15         USB_DEVICE_VER(vendor, product, lo, hi) 16     },17     { 18         //该宏用于创建一个匹配设备指定类型的usb_device_id结构体实例。19         USB_DEVICE_INFO(class, subclass, protocol)20     },21     */22     { }    /* Terminating entry */23 };

4、实现探测函数xxx_usb_probe

1 static int xxx_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)2 {3     ...4 }

 

 

转载于:https://www.cnblogs.com/cmembd/p/3436204.html

你可能感兴趣的文章
使用maven创建javaweb项目
查看>>
dubbo 2.5.4 在JDK8下启动错误
查看>>
eclipse中Build Path-Add to Build Path对应到androidstud
查看>>
页面加载条实现思路
查看>>
WEB高性能
查看>>
cisco路由器的寄存器值(忘记密码时要进机器时候用的)
查看>>
我也来拆个无线路由器,斐讯的FIR302M
查看>>
同一个微信 不同的识别码 微信多开
查看>>
服务器中误删除虚拟机数据恢复过程
查看>>
iis 不能解析aspx
查看>>
使用wireshark观察SSL/TLS握手过程--双向认证/单向认证
查看>>
序列化框架性能对比(kryo、hessian、java、protostuff)
查看>>
8.31 17.1-17.5
查看>>
DevOps和容器:本地or云端,如何选择?
查看>>
人生中第一篇TOP期刊
查看>>
Haproxy+Keepalived主主高可用
查看>>
用java从hadoop中读数据
查看>>
实现首页分类栏按样式循环显示
查看>>
ActiveMQ 初试
查看>>
log4j xml 配置 自定义使用版
查看>>