嵌入式I.MX6ULL设备树开发及pinctrl子系统分析

449 阅读3分钟

1 pinctrl子系统

  • 大多数 SOC 的 pin 都是支持复用的,比如 I.MX6ULL 的 GPIO1_IO03 既可以作为普通的GPIO 使用,也可以作为 I2C1 的 SDA 等等。此外我们还需要配置 pin 的电气特性,比如上/下拉、速度、驱动能力等等。传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。

  • pinctrl 子系统就是为了解决这个问题而引入的,pinctrl 子系统主要工作内容如下:

    • ①、获取设备树中 pin 信息。
    • ②、根据获取到的 pin 信息来设置 pin 的复用功能
    • ③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。
  • 对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成,pinctrl 子系统源码目录为 drivers/pinctrl

2 设备树

2.1 芯片厂商官方支持imx6ull.dtsi

  • imx6ull.dtsi 这个文件是芯片厂商官方将芯片的通用的部分单独提出来的一些设备树配置。 image.png image.png image.png image.png
  • 要使用 pinctrl 子系统,我们需要在设备树里面设置 PIN 的配置信息,毕竟 pinctrl 子系统要根据你提供的信息来配置 PIN 功能,一般会在设备树里面创建一个节点来描述 PIN 的配置信息。打开 imx6ull.dtsi 文件,找到一个叫做 iomuxc 的节点。 image.png
  • 在iomuxc节点中汇总了所需引脚的配置信息

2.2 自定义设备树开发

image.png image.png image.png

4 pinctrl子系统开发规范

  • pinctrl子系统开发规范,pinctrl_是固定的格式,后面的内容是自定义的,通过这个标签引用这个节点。在添加完 pinctrl 子节点后,系统会根据我们添加的配置信息将引脚初始化为 GPIO 功能。 image.png

3 imx6ul-pinfunc.h多功能复用

image.png

2 自定义设备树开发

  • “pinctrl-names”标识,指定 PIN 的状态列表,默认设置为“default”。“pinctrl-0= <&pinctrl_hog_1>”的意思的在默认设置下,将使用 pinctrl_hog_1 这个设备节点来设置我们的 GPIO 端口状态,pinctrl_hog_1 内容是支持热插拔相关。
  • 如下示例代码就是向 iomuxc 节点追加数据,不同的外设使用的 PIN 不同、其配置也不同,因此一个萝卜一个坑,将某个外设所使用的所有 PIN 都组织在一个子节点里面。
  • 示例代码中 pinctrl_hog_1 子节点就是和热插拔有关的 PIN 集合,比如 USB OTG 的 ID 引脚pinctrl_flexcan1 子节点是 flexcan1 这个外设所使用的 PIN,pinctrl_wdog 子节点是 wdog 外设所使用的 PIN。如果需要在 iomuxc 中添加我们自定义外设的 PIN,那么需要新建一个子节点,然后将这个自定义外设的所有 PIN 配置信息都放到这个子节点中。 image.png
  • pinctrl-names:定义引脚状态。pinctrl-0:定义第 0 种状态需要使用到的引脚配置,可引用其他节点标识。pinctrl-1:定义第 1 种状态需要使用到的引脚配置。pinctrl-2:定义第 2 种状态需要使用到的引脚配置。 image.png

4 串口设备树开发

  • pinctrl_uart3定义在&iomuxc中 image.png image.png