驱动演进

原始架构v2.4平台总线v2.6设备树v3.x 设备节点mknod自动生成节点 分离—实际上是一种模块化设计思路 分层Linux中应用很普遍,屏蔽底层细节,增加了易用性

原始架构

  • 设备节点—设备文件/dev/xxx,上层应用与底层驱动的桥梁
  • Linux:设备即文件read,write
  • 主设备号,次设备号,mknod()
  • 结构体file_operations函数指针
  • register_chadev()系统注册
  • 用户态read()sys_read()vfs_read()驱动read()
  • 原始架构依旧很重要,被后续版本封装和继承

平台总线

  • v2.6封装了原始架构,更加抽象
  • 引入设备驱动模型sysfs,使得热插拔/电源管理得以加强
  • 实现了BSP与驱动分离

设备树

  • 设备资源独立出来arch/arm/mach-xxx/board-xxx.c,从c文件发展为DTS设备树脚本文件arch/arm/boot/dts/xxx.dts
  • 更换硬件设备时,不需要编译Linux操作系统,只要换个设备树文件就好
  • BootLoarder参与传递设备资源(启动时把设备树文件传给内核)

相关概念

系统移植linux驱动移植

  • 同一个操作系统,不同的硬件

驱动分类

驱动针对的对象是存储器外设(包括CPU内部集成的存储器和外设,而不是针对CPU内核。Linux将存储器和外设分为3个基础大类:字符设备驱动,块设备驱动,网络设备驱动。

  • 字符设备和块设备的驱动设计有出很大的差异,但是对于用户而言,它们都要使用文件系统的操作接口open()close()read()write()等进行访问。
  • 内核与网络设备的通信与内核和字符设备、网络设备的通信方式完全不同,网络设备主要还是使用Socket接口。

字符设备驱动

字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。

块设备驱动

块设备可以按任意顺序进行访问,以块为单位进行操作,如硬盘、eMMC等。

网络设备驱动

网络设备面向数据包的接收和发送而设计,它并不倾向于对应于文件系统的节点。