以目前为止的逻辑,无论是获取设备属性信息,还是实现驱动逻辑,都是放在一个驱动模块中。在没有设备树的情况下,如果我们只需要修改设备信息(如寄存器地址),那么我们就需要重新编译整个驱动模块。
很显然,设备信息的变化不应该影响到驱动逻辑的正常运行,这就需要引入驱动分层的概念。
一、整体架构
驱动分层总体可以分为三层
- 设备层:负责管理设备属性信息,包含了一些外设硬件信息,如寄存器地址、引脚配置信息等
- 驱动层:负责驱使设备的正常运作,驱动程序借由总线传递控制信号、数据,进而来控制设备
- 总线:驱动和设备信息的月老,负责设备和驱动程序之间的通信和数据交换
驱动程序要想驱使设备,需要先让驱动与设备匹配,匹配工作由总线负责。只有当左侧的设备与右侧的驱动程序建立联系以后,驱动程序才可以驱使设备。
(1) 当我们向系统注册一个驱动,总线会在左侧查找是否存在与之匹配的设备;
(2) 当我们向系统注册一个设备,总线会在右侧查找是否存在与之匹配的驱动;
=============== 不使用设备树 ===============
不使用设备树时需要手动注册 platform 设备和 platform 驱动,手动注册 platform 设备其实就是在向内核添加硬件外设信息。