最近在设置AM4378 GPIO的时候产生了困惑

  • 如何设置GPIO为output_pullup, output_pulldown, input_pullup, input_pulldown, high-impedency, output_disable, input_disable
  • 在dts中0x020 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* (B10) gpmc_ad8.gpio0[22] */是什么意思,和数据手册怎么对应

首先在官方的TI PinMux Tool只有outpu/input的三种pull_up, pull_down, no_pull,也就是在dts中input和output只对应三种配置方式,NOPULL, PULLUP, PULLDOWN,并没有像飞思卡尔imx6那么多可配的属性, 这三个和MUX_MODE7定义在:

include/dt-bindings/pinctrl/am43xx.h

 中可以看出, 在kernel里面关于上下拉确实没有高阻等配置方式,

  • PIN_OUTPUT即为PULL_DISABLE (1<<16)
  • PIN_OUTPUT_PULLUP为PULL_UP (1<<17)
  • PIN_OUTPUT_PULLDOWN为0
  • PIN_INPUT为INPUT_EN和PULL_DISABLE (1<<18 | 1<<16)
  • PIN_INPUT_PULLUP为INPUT_EN和INPUT_UP (1<<18 | 1<<17)
  • PIN_INPUT_PULLDOWN为INPUT_EN (1<<18)

接下来,0x020 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)这个是在设置哪个寄存器呢,0x020是什么意思呢?

查看手册AM437x TRM的Chapter2.Memory Map, CONTROL_MODULE 0x44E1_0000 0x44E1_FFFF和Chapter7.Control Module (800h CTRL_CONF_GPMC_AD0),这其中,0x44E1_0000+0x800之和就是GPIO配置的基地址,上面的0x020就是基于当前基地址的偏移,在Register地址映射能看出820h CTRL_CONF_GPMC_AD8,这个和之前dts中(B10) gpmc_ad8.gpio[0[22]可以对应起来

也就能推断出来0x020 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) 这个脚本是在设置Control Module的寄存器,而非GPIO章节的寄存器,那么我们来看下这个寄存器的内容

[dts]AM4378的dts中配置和数据手册映射关系-LMLPHP

[dts]AM4378的dts中配置和数据手册映射关系-LMLPHP

从上述可以看出来,0-3bit为Mux Mode,16bit为pullup/pulldown使能/失能,17bit为pullup/pulldown选择,18bit为Input使能

这样从数据手册到kernel源码再到device tree整套就齐整了。

另外上述提到的MODE0和MODE7到底代表什么属性?

在Processor文档中,有如下pin说明

[dts]AM4378的dts中配置和数据手册映射关系-LMLPHP

为什么N4是mode0因为该引脚只有ddr_wen功能,A24引脚有8个功能,而Reset之后是Mode7,也就是表中的gpio2_25,普通gpio功能

05-11 10:53