如果每个引脚的配置都要写成一个驱动文件,那么所有外设的驱动,以及不同板子的驱动,以及不同芯片的驱动,都放在通用Linux系统中,将会极其庞大。

因此把外设配置(驱动)共同的部分提取出来,写在Linux系统中,然后再用一个文件格式(设备树文件)存放这些配置信息,这样针对不同外设驱动,用户仅仅提供配置信息(设备树文件中以节点形式,添加节点即可,存放的是寄存器地址,想要配置的值)即可,剩下的交给Linux系统去配置即可。

基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯
所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别

为了进一步讲究驱动分离与分层,pinctrl gpio 子系统就是驱动分离与分层思想下的产物。

pinctrl 子系统重点是设置 PIN(有的 SOC 叫做 PAD)的复用
和电气属性,如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系
统了。gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO
为输入输出,读取 GPIO 的值等。gpio 子系统的主要目的就是方便驱动开发者使用 gpio,驱动
开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API
函数来操作 GPIO,Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程,极大的方便了驱动开
发者使用 GPIO。

驱动的分隔与分离

Linux设备树原理_开发者

Linux设备树原理_其他_02

图 54.1.1.2 改进后的设备驱动

Linux设备树原理_linux系统_03

设备树下的 platform 驱动编写

platform 驱动框架分为总线、设备和驱动,其中总线不需要我们这些驱动程序员去管理,这
个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。