• arm-linux pinctrl 和 gpio 子系统


    pinctrl

    pinctrl 是为了解决传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置

    方式比较繁琐、而且容易出问题
    pinctrl 子系统主要工作内容如下:
    ①、获取设备树中 pin 信息。
    ②、根据获取到的 pin 信息来设置 pin 的复用功能
    ③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上 / 下拉、速度、驱动能力等。
    对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始
    化工作均由 pinctrl 子系统来完成, pinctrl 子系统源码目录为 drivers/pinctrl
    找到一个叫做 iomuxc 的节点
    iomuxc : iomuxc@020e0000 { compatible = "fsl,imx6ul-iomuxc" ; reg = < 0x020e0000 0x4000 >;};
    & iomuxc向 iomuxc 节点追加数据
    1. &iomuxc {
    2. pinctrl-names = "default";
    3. pinctrl-0 = <&pinctrl_hog_1>;
    4. imx6ul-evk {
    5. pinctrl_hog_1: hoggrp-1 {
    6. fsl,pins = <
    7. MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
    8. MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
    9. MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
    10. MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
    11. >;
    12. };
    13. ..
    14. pinctrl_flexcan1: flexcan1grp{
    15. fsl,pins = <
    16. MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020
    17. MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020
    18. >;
    19. };
    20. ..
    21. pinctrl_wdog: wdoggrp {
    22. fsl,pins = <
    23. MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
    24. >;
    25. };
    26. };
    27. };
    pinctrl_hog_1 子节点就是和热插拔有关的 PIN 集合
    pinctrl_flexcan1 子节点是 flexcan1 这个外设所使用的 PIN
    pinctrl_wdog 子节点是 wdog 外设所 使用的 PIN
    结合起来就是
    1. 示例代码 45.1.2.3 完整的 iomuxc 节点
    2. iomuxc: iomuxc@020e0000 {
    3. compatible = "fsl,imx6ul-iomuxc";
    4. reg = <0x020e0000 0x4000>;
    5. pinctrl-names = "default";
    6. pinctrl-0 = <&pinctrl_hog_1>;
    7. imx6ul-evk {
    8. pinctrl_hog_1: hoggrp-1 {
    9. fsl,pins = <
    10. MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
    11. MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
    12. MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
    13. MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
    14. >;
    15. ..
    16. };
    17. };
    18. ;
    首先来看一下 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 ,这是一个宏定义,定义在文件
    arch/arm/boot/dts/imx6ul-pinfunc.h 中, imx6ull.dtsi 会引用 imx6ull-pinfunc.h 这个头文件
    gpio 子系统
    子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO
    为输入输出,读取 GPIO 的值等。 gpio 子系统的主要目的就是方便驱动开发者使用 gpio ,驱动
    开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API
    函数来操作 GPIO Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程,极大的方便了驱动开
    发者使用 GPIO
    1 pinctrl_led : ledgrp {
    2 fsl , pins = <
    3 MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10B0 /* LED0 */
    4 >;
    5 };
    1 gpioled {
    2 #address - cells = < 1 >;
    3 #size - cells = < 1 >;
    4 compatible = "atkalpha-gpioled" ;
    5 pinctrl - names = "default" ;
    6 pinctrl - 0 = <& pinctrl_led >;
    7 led - gpio = <& gpio1 3 GPIO_ACTIVE_LOW >;
    8 status = "okay" ;
    9 } ;
    6 行, pinctrl-0 属性设置 LED 灯所使用的 PIN 对应的 pinctrl 节点。
    7 行, led-gpio 属性指定了 LED 灯所使用的 GPIO ,在这里就是 GPIO1 IO03 ,低电平
    有效。稍后编写驱动程序的时候会获取 led-gpio 属性的内容来得到 GPIO 编号,因为 gpio 子系
    统的 API 操作函数需要 GPIO 编号。
  • 相关阅读:
    并发编程系列-CAS
    Android Studio实现记单词App,背完四六级一次过~
    python正则化表达式
    【Vue五分钟】 Vue Cli脚手架安装配置
    解读随机生成密钥存文件的python代码
    2024 年如何复用 ChatGPT 从头开始​​快速学习 Python
    Linux 安装 kubemini
    【gzoj】鸡蛋的硬度【基础概率DP】
    Linux:进程的本质和fork初识
    状压dp。
  • 原文地址:https://blog.csdn.net/L1153413073/article/details/125511373