15.1linux设备树下的platform驱动编写(知识)_csdn

上一章我们详细的讲解了 Linux 下的驱动分离与分层,以及总线、设备和驱动这样的驱动框架。基于总线、设备和驱动这样的驱动框架, Linux 内核提出来 platform 这个虚拟总线,相应的也有 platform 设备和 platform 驱动。

上一章我们讲解了传统的、未采用设备树的 platform 设备和驱动编写方法。最新的 Linux 内核已经支持了设备树,因此在设备树下如何编写 platform驱动就显得尤为重要,本章我们就来学习一下如何在设备树下编写 platform 驱动。

1、设备树下的 platform 驱动简介

platform 驱动框架分为总线、设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。==在没有设备树的 Linux 内核下,我们需要分别编写并注册 platform_device 和 platform_driver,分别代表设备和驱动。==在使用设备树的时候,设备的描述被放到了设备树中,因此 platform_device 就不需要我们去编写了,我们只需要实现 platform_driver 即可。

1.1、修改 pinctrl-stm32.c 文件

在前面第 25 章的时候我们详细的讲解了 pinctrl,但是在后续的实验中却一直没有使用pinctrl。也就是之前讲的pinctrl子系统知识,按道理来讲,在我们使用某个引脚的时候需要先配置其电气属性,比如复用、输入还是输入、默认上下拉等!但是在前面的实验中均没有配置引脚的电气属性,也就是引脚的 pinctrl配置。这是因为 ST 针对 STM32MP1 提供的 Linux 系统中,其 pinctrl 配置的电气属性只能在platform 平台下被引用,前面的实验都没用到 platform,所以 pinctrl 配置是不起作用的!

Linux 系统启动运行过程中会自动解析设备树下的 pinctrl 配置,然后初始化引脚的电气属性,不需要 platform 驱动框架。所以 pinctrl 什么时候有效,不同的芯片厂商有不同的处理方法,一切以实际所使用的芯片为准!

对于 STM32MP1 来说,在使用 pinctrl 的时候需要修改一下 pinctrl-stm32.c 这个文件,否则当某个引脚用作 GPIO 的时候会提示此引脚无法申请到!



1.2、创建设备的 pinctrl 节点

上面已经说了,在 platform 驱动框架下必须使用 pinctrl 来配置引脚复用功能。我们以本章实验需要用到的 LED0 为例,编写 LED0 引脚的 pinctrl 配置。打开 stm32mp15-pinctrl.dtsi 文件, STM32MP1 的所有引脚 pinctrl 配置都是在这个文件里面完成的,在 pinctrl 节点下添加如下所示内容:


1.3、在设备树中创建设备节点

接下来要在设备树中创建设备节点来描述设备信息,重点是要设置好 compatible 属性的值,因为 platform 总线需要通过设备节点的 compatible 属性值来匹配驱动!这点要切记。

1.4、编写 platform 驱动的时候要注意兼容属性

上一章已经详细的讲解过了,在使用设备树的时候 platform 驱动会通过 of_match_table 来保存兼容性值,也就是表明此驱动兼容哪些设备。所以, of_match_table 将会尤为重要,比如本例程的 platform 驱动中 platform_driver 就可以按照如下所示设置:

最后就是编写驱动程序,基于设备树的 platform 驱动和上一章无设备树的 platform 驱动基本一样,都是当驱动和设备匹配成功以后先根据设备树里的 pinctrl 属性设置 PIN 的电气特性再去执行 probe 函数。我们需要在 probe 函数里面执行字符设备驱动那一套,当注销驱动模块的时候 remove 函数就会执行,都是大同小异的。

2、检查引脚复用配置

2.1、检查引脚 pinctrl 配置

正点原子 STM32MP1 开发板上将 PI0 连接到了 LED0 上,也就是将其用作普通的 GPIO,对应的 pinctrl 配置就是示例代码 35.1.2.1。但是 stm32mp15-pinctrl.dtsi 是 ST 根据自己官方 EVK开发板编写的,因此 PI0 就可能被 ST 官方用作其他功能,大家在 stm32mp15-pinctrl.dtsi 里面找到如下所示代码:

从图 35.2.1.1 可以看出, ST 官方默认将 PI0 复用为 LCD_G5,前面说了,一个 IO 只能复用为一个功能,因此我们需要将图 35.2.1.1 中的"<STM32_PINMUX('I', 0, AF14)>"屏蔽掉,因为我们现在要将 PI0 用作 GPIO。同样的,继续在 stm32mp15-pinctrl.dtsi 文件里面查找,会发现如图 35.2.1.2 所示的地方也将 PI0 复用为了 LCD_G5:

当然可能会有小伙伴会问,为什么之前实验不用屏蔽这些复用功能?

因为之前的实验并未用到pinctrl这个配置,也未用到platform。之前只是初步的讲了pinctrl子系统的知识!

2.2、检查 GPIO 占用

相关推荐
源远流长jerry4 分钟前
Linux内核页表缓存(TLB)与巨型页
linux
北海屿鹿1 小时前
Linux网络:数据链路层&以太网
linux·运维·网络
开发小菜Go1 小时前
小菜Go:Ubuntu下Go语言开发环境搭建
linux·运维·ubuntu·vim
多云的夏天1 小时前
麒麟-QT-ODBC-达梦
linux·数据库·麒麟
qq_543248522 小时前
Linux系统安全及应用
linux·运维·系统安全
曼岛_2 小时前
CentOS 7 全流程部署Magic-PDF数据清洗工具(附GPU加速方案)
linux·pdf·centos
JhonKI2 小时前
【Linux】线程池详解及基本实现
linux·运维·服务器
LoveLinuxShell2 小时前
推荐Linux命令行运维工具: WowKey--实现自动化批量化标准化Linux设备运维
linux·运维·shell·自动化批量化标准化
是个普通苗4 小时前
Centos 8 安装教程(新手版)
linux·运维·centos
钡铼技术物联网关4 小时前
ARM架构+CODESYS:解锁嵌入式边缘计算的实时控制新范式
大数据·linux·arm开发·人工智能·边缘计算