嵌入式设备驱动的编写,基本上都要按照一定的驱动模型编写。不这么做的话,一旦设备发生了更新和改变,大部分的驱动代码都要推倒重来,代码的重用率低,不具备移植性。所以在新版linux2.6.22以后的内核版本中设计总线设备驱动模型,其实就是将单一的驱动拆成三部分:总线设备驱动、核心层驱动(纯软件)、设备层驱动。

这样总线驱动和核心层驱动为重复性工作,不需改动。所以工作量主要体现在设备层驱动上。

内核中有不同的总线类型,不同的总线有不同的匹配方式。platform_bus_type总线使用名字来匹配,而usb_bus_type使用id_table来匹配,但是各种总线的匹配流程大致是一样的。将设备和驱动通过总线连接起来需要用到match函数。

USB总线驱动程序的作用

  1. 识别USB设备

    1.1 分配地址

    1.2 并告诉USB设备(set address)

    1.3 发出命令获取描述符

  2. 查找并安装对应的设备驱动程序

  3. 提供USB读写函数

USB设备在插入嵌入式设备时会给CPU一个中断信号,驱使总线驱动控制的USB控制器来与USB设备发送握手信息,match函数将id_table与USB设备的设备信息一一核对。成功匹配后调用probe函数。

而probe函数主要实现的就是input输入子系统。这个输入子系统已经将各类输入事件,比如鼠标、键盘、手柄等常用的输入设备信号封装好了。输入子系统的框架如下:

  1.分配 input_dev结构体

  2.设置input_dev结构体

  3.注册input_dev结构体

  4.硬件相关的操作

怎么写USB设备驱动程序?

1. 分配/设置usb_driver结构体

.id_table

.probe       (最重要的函数)

.disconnect

2. 注册(usb_register)

最新文章

  1. YACC和BISON学习心得
  2. volcanol_Linux_ 问题汇总系列_4_Thinkpad_E40_0578MDC_在Fedora 13 Linux(FC13)中如何安装无线网卡驱动
  3. 理解CSS3 transform中的Matrix(矩阵)
  4. LINUX下软件包的安装与使用
  5. VS2013远程调试功能
  6. Android无法调用JS的问题解决
  7. html-----001
  8. Delphi自定义消息应用及delphi托盘实现
  9. poi读写Excel文件
  10. TCP在三次握手协议和四波(图)
  11. Python第一天——入门Python(1)数据定义
  12. hdu_5711_Ingress(TSP+贪心)
  13. Django_验证码
  14. angular-单页面应用程序
  15. oracle中的exists 和 in 用法详解
  16. POJ 2531-Network Saboteur(dfs)
  17. Dell Venue 8 Pro启动盘UEFI模式32位启动,备份系统
  18. 在WPF中的Canvas上实现控件的拖动、缩放
  19. js中setInterval和setTimeout区别和用法
  20. SPOJ.Visible Lattice Points(莫比乌斯反演)

热门文章

  1. Go gRPC进阶-超时设置(六)
  2. Js异步机制的实现
  3. Python操作rabbitmq系列(五):根据主题分配消息
  4. 亲测可以使用的Axmath和MathPix插入word公式
  5. Serval and Parenthesis Sequence CodeForces - 1153C
  6. Rescue BFS+优先队列 杭电1242
  7. 关于C++线程池的实现的思考
  8. windows下常用快捷指令记忆
  9. golang实现并发爬虫三(用队列调度器实现)
  10. python执行提示“ImportError: No module named OpenSSL.crypto”