字符设备驱动三种开发方式对比

一、字符设备驱动程序的三种

1

驱动程序编写有3种方法:传统方法、使用总线设备驱动模型、使用设备树

这3种方法也核心都是一样的: 分配、设置、注册 file_operations结构体
这个结构体中有.open, .read, .write, .ioctl等成员
驱动程序要实现这些成员,在这些成员函数中操作硬件
这3种方法的差别在于:如何指定硬件资源,比如如何指定LED引脚是哪个 
1 传统方法:

  在驱动程序代码中写死硬件资源, 代码简单/不易扩展
2 总线设备驱动模型:

  把驱动程序分为两部分(platform_driver, platform_device)
  在platform_device中指定硬件资源,
  在platform_driver中分配/设置/注册 file_operations结构体, 并从platform_device获得硬件资源
特点
  易于扩展,但是有很多冗余代码(每种配置都对应一个platform_device结构体), 
  硬件有变动时需要重新编译内核或驱动程序。

3 使用设备树指定硬件资源:

  驱动程序也分为两部分(platform_driver, 设备树*.dts)
  在设备树*.dts中指定硬件资源, dts被编译为dtb文件, 在启动单板时会将dtb文件传给内核,
  内核根据dtb文件分配/设置/注册多个platform_device
  platform_driver的编写方法跟"总线设备驱动模型"一样。
特点:
  易于扩展,没有冗余代码
  硬件有变动时不需要重新编译内核或驱动程序,只需要提供不一样的dtb文件
  注:

  dts - device tree source // 设备树源文件
  dtb - device tree blob // 设备树二进制文件, 由dts编译得来
  blob - binary large object

二、总线设备驱动模型

1

驱动程序分为platform_device和platform_driver两部分

  platform_device : 指定硬件资源
  platform_driver : 根据与之匹配的platform_device获得硬件资源, 并分配/设置/注册file_operations
如何确定platform_device和platform_driver是否匹配?
  1 platform_device含有name
  2 platform_driver.id_table"可能"指向一个数组, 每个数组项都有name, 表示该platform_driver所能支持的platform_device
  3 platform_driver.driver含有name, 表示该platform_driver所能支持的platform_device
  4 优先比较b.1, b.2两者的name, 若相同则表示互相匹配
  5 如果platform_driver.id_table为NULL, 则比较b.1, b.3两者的name, 若相同则表示互相匹配

  总线设备驱动模型只是一个编程技巧, 它把驱动程序分为"硬件相关的部分"、"变化不大的驱动程序本身", 
  这个技巧并不是驱动程序的核心, 
  核心仍然是"分配/设置/注册file_operations"

三、使用设备树时对应的驱动编程

 使用"总线设备驱动模型"编写的驱动程序分为platform_device和platform_driver两部分
  platform_device : 指定硬件资源, 来自.c文件
  platform_driver : 根据与之匹配的platform_device获得硬件资源, 并分配/设置/注册file_operations
 实际上platform_device也可以来自设备树文件.dts
  dts文件被编译为dtb文件, 
  dtb文件会传给内核, 
  内核会解析dtb文件, 构造出一系列的device_node结构体,
  device_node结构体会转换为platform_device结构体

  所以: 我们可以在dts文件中指定资源, 不再需要在.c文件中设置platform_device结构体

 "来自dts的platform_device结构体" 与 "我们写的platform_driver" 的匹配过程:
  "来自dts的platform_device结构体"里面有成员".dev.of_node", 它里面含有各种属性, 比如 compatible, reg, pin
  "我们写的platform_driver"里面有成员".driver.of_match_table", 它表示能支持哪些来自于dts的platform_device
  如果"of_node中的compatible" 跟 "of_match_table中的compatible" 一致, 就表示匹配成功, 则调用 platform_driver中的probe函数;
  在probe函数中, 可以继续从of_node中获得各种属性来确定硬件资源

猜你喜欢

转载自blog.csdn.net/wenyue043/article/details/103734847
今日推荐