USB设备驱动模型

嵌入式设备驱动的编写,基本上都要按照一定的驱动模型编写。不这么做的话,一旦设备发生了更新和改变,大部分的驱动代码都要推倒重来,代码的重用率低,不具备移植性。所以在新版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)

原文地址:https://www.cnblogs.com/gezhuangzhuang/p/11447253.html