嵌入式ARM芯片设备树开发及GPIO子系统分析

615 阅读2分钟

1 IMX6ULL芯片

1.1 第一步:设置pinctrl子系统

  • 在 iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“pinctrl_beep”的子节点, 将 SNVS_TAMPER1 这 个 PIN 复 用 为 GPIO5_IO01 , 宏MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 定义在arch/arm/boot/dts/imx6ull-pinfunc-snvs.h文件中。
  • 在 iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“pinctrl_key”的子节点,将 GPIO_IO18 这个 PIN 复用为 GPIO1_IO18。 image.png
  • UART1_RTS_B 做为 SD 卡的检测引脚,UART1_RTS_B 复用为 GPIO1_IO19,通过读取这个 GPIO 的高低电平就可以知道 SD 卡有没有插入。首先肯定是将 UART1_RTS_B 这个 PIN 复用为 GPIO1_IO19,并且设置电气属性,因此设置pinctrl节点如下: image.png
  • usdhc1节点就是 SD 卡设备节点 image.png

1.2 第二步:设置gpio子系统

  • gpio1 节点信息描述了 GPIO1 控制器的所有信息,重点就是 GPIO1 外设寄存器基地址以及兼容属性,设置 gpio1 节点的 compatible 属性有两个,分别为“fsl,imx6ul-gpio”和“fsl,imx35-gpio”,在 Linux 内核中搜索这两个字符串就可以找到 I.MX6UL 的 GPIO 驱动程序 image.png

1.3 gpio子系统设置

  • gpio子系统设置:在根节点“/”下创建 BEEP 节点,节点名为“beep”,pinctrl-0 属性设置蜂鸣器所使用的 PIN 对应的 pinctrl 节点,beep-gpio 属性指定了蜂鸣器所使用的 GPIO。

  • gpio子系统设置:在根节点“/”下创建 KEY 节点,节点名为“key”,pinctrl-0 属性设置 KEY 所使用的 PIN 对应的 pinctrl 节点,key-gpio 属性指定了 KEY 所使用的 GPIO。 image.png

  • gpio子系统设置:SD 卡驱动程序使用 GPIO1_IO19 来检测 SD 卡的 CD 信号,属性cd-gpios描述了 SD 卡的 CD 引脚使用的哪个 IO。属性值一共有三个,&gpio1表示 CD 引脚所使用的 IO 属于 GPIO1 组,19表示 GPIO1 组的第 19 号 IO,通过这两个值 SD 卡驱动程序就知道 CD 引脚使用了 GPIO1_IO19这个GPIO。GPIO_ACTIVE_LOW表示低电平有效,如果改为GPIO_ACTIVE_HIGH就表示高电平有效。 image.png

1.4 gpio子系统OF函数

image.png image.png image.png image.png image.png

2 STM32 157芯片

2.1 第一步:设置pinctrl子系统

  • STM32_PINMUX 这宏来配置引脚和引脚的复用功能,此宏定义在include/dt-bindings/pinctrl/stm32-pinfunc.h 文件里面。
  • STM32_PINMUX 宏有三个参数,这三个参数含义如下所示:port:表示用那一组 GPIO(例:H 表示为 GPIO 第 H 组,也就是 GPIOH)。line:表示这组 GPIO 的第几个引脚(例:13 表示为 GPIOH_13,也就是 PH13)。mode :表示当前引脚要做那种复用功能(例:AF9 表示为用第 9 个复用功能), image.png image.png image.png

2.2 第二步:设置gpio子系统

  • #gpio-cells”属性和“#address-cells”类似,#gpio-cells 应该为 2,表示一共有两个 cell,第一个 cell 为 GPIO 编号,比如“&gpioi 0”就表示 PI0。第二个 cell 表示 GPIO 极性,如果为 0(GPIO_ACTIVE_HIGH)的话表示高电平有效,如果为 1(GPIO_ACTIVE_LOW)的话表示低电平有效。 image.png

image.png