• Pinctrl子系统_03_Pinctrl子系统使用示例


    本节以IMX6ULL为例,演示如何使用Pinctrl子系统配置I2C通信所使用的引脚。

    如下图所示,在芯片内部,有许多功能模块,其中就包括I2C模块。

    怎么配置I2C模块?

    答:

    1. 首先,要知道I2C模块会使用哪些引脚,这可以通过看原理图确定。
    2. 确定使用哪些引脚之后(假设使用pinA,pinB), 就可以配置IOMUX,选择引脚的功能了。
    3. 最后,就是配置(config)引脚了。

    其中,第二步、第三步的配置,会作为一个类似下图的节点保存在设备树中。

    然后,就可以通过类似下图所示的节点,来选择使用上图所示的节点,而不需要写额外的代码。

    如下图所示,右边的节点由于格式是统一的,所以很容易构造,难点在于左边的节点,它没有统一的格式,往往不同平台之间的格式就大不相同。

    如何构造Pinctrl节点?

    那么,如何构造左边的节点呢?

    答:可以通过以下三种方法:

    1. 工具(tool),对于一些芯片厂商,有提供对应的工具,用于生成这些引脚;
    2. 文档,或设备树示例;
    3. 源码(较困难);

    对于imx6ull,他有提供一个工具(i.MX Pins Tool v6),可以生成对应的引脚配置信息

    使用方法也很简单,选中想要配置的引脚,然后选择要配置成哪种功能,然后点击完成,就会生成对应的配置信息。

    对应的配置信息:

    开始配置I2C模块

    看原理图获取引脚

    首先,根据底板原理图获取使用到的引脚信息。

    使用的是64,65号引脚。

    然后,找到对应的管脚号是G16,G17。

    选择引脚功能

    然后,可以在工具上选择引脚的功能。

    生成的设备树配置信息如下:

    配置引脚

    引脚功能选择完毕后,还可以配置引脚。

    配置引脚后,可以看到节点配置信息也产生了变化,并且变化的部分是右边的数值部分。

    可以推测,前面的宏是选择引脚的功能,后面的数值则是引脚的配置值。

    配置Client节点

    此时,我们生成了Pinctrl节点,但是要怎么选择使用它呢?

    1. &iomuxc {
    2. pinctrl-names = "default";
    3. pinctrl-0 = <&BOARD_InitPins>;
    4. imx6ull-board {
    5. i2c1_pins: i2c1_pins { /*!< Function assigned for the core: Cortex-A7[ca7] */
    6. fsl,pins = <
    7. MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x000018B0
    8. MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x000018B0
    9. >;
    10. };
    11. };
    12. };

    参考内核设备树文件,内核的配置和使用如下:

    所以,可以这样使用pinctrl:

    1. &i2c1 {
    2. clock-frequency = <100000>;
    3. pinctrl-names = "default";
    4. pinctrl-0 = <&i2c1_pins>;
    5. status = "okay";
    6. };

    这样,i2c1节点就会转换成一个平台设备,通过i2c1节点的compatible属性,与对应的平台驱动进行匹配,匹配成功后会调用default状态的pinctrl,对引脚进行配置。

    以上就是本节全部内容。

  • 相关阅读:
    CentOS源码更新Linux最新内核
    深入理解Kotlin协程
    租用独立服务器有哪些常见的误区?
    深入了解归并排序:原理、性能分析与 Java 实现
    Java-IO流(常用类)
    SpringBoot+若依+图片导出
    ES8(Java API Client)查询详解
    【Spring之底层核心架构概念解析】
    vue3使用windicss
    Prompt Playground 7月开发记录(2): Avalonia 应用开发
  • 原文地址:https://blog.csdn.net/qq_33141353/article/details/133589580