博客專欄

EEPW首頁(yè) > 博客 > Verdin AM62 引腳復(fù)用配置

Verdin AM62 引腳復(fù)用配置

發(fā)布人:toradex 時(shí)間:2024-09-18 來源:工程師 發(fā)布文章

By Toradex 胡珊逢

簡(jiǎn)介
Verdin AM62 是 Toradex 基于 TI AM623/AM625 SoC 的 Arm 計(jì)算機(jī)模塊。它最多提供 4 個(gè) A53 和 1 個(gè) M4F 處理器。這是 TI 基于其 K3 平臺(tái)的處理器,雖然和 NXP 的 iMX8M Mini/Plus 都使用 A53 核心,但是由于架構(gòu)不同,在 Linux 系統(tǒng)中配置外設(shè)的方式也不同。文章將介紹如何配置 AM62 的引腳復(fù)用關(guān)系。

硬件介紹

Verdin AM62 所使用的 AM623/AM625 處理器的 GPIO 控制器如下圖所示。GPIO 控制器根據(jù)不同的處理器可能有多個(gè)模塊,AM623/AM625 擁有一個(gè) MCU_GPIO0,一個(gè) GPIO0 和一個(gè) GPIO1 共三個(gè)模塊。每個(gè)模塊有 9 個(gè) bank,每個(gè) bank 有 16 個(gè)引腳,所以理論上最多有 3x9x46 = 432 個(gè)引腳。但 AM623/AM625 SoC 并不能使用所有引腳,SoC 實(shí)際可用的為 198 個(gè)引腳。Verdin AM62 模塊并沒有把 SoC 的引腳都引出,因而可用的引腳少于 198。

Device Tree 配置
在寫本文章時(shí),Verdin AM62 使用 toradex_ti-linux-6.1.y分支內(nèi)核。每個(gè) GPIO 根據(jù)用途的不同,相應(yīng)的配置分布在多個(gè) device tree 文件中。如下圖,k3-am62-mcu.dtsi 和 k3-am62-main.dtsi 中定義了三個(gè) GPIO 控制器模塊以及對(duì)應(yīng)的物理地址,k3-am62-verdin.dtsi 中包含每個(gè)引腳的具體配置。三個(gè) GPIO 控制器分為兩種,MCU_GPIO 和 GPIO0/1,它們可以使用各自專門的函數(shù)來配置所控制的引腳。&mcu_pmx0 和 &main_pmx0 分別使用 AM62X_MCU_IOPAD 和 AM62X_IOPAD 配置。下面將介紹如何修改和使用 mcu_gpio0,main_gpio0 和 main_gpio1 模塊所控制的引腳。
我們分別選擇來自如下三個(gè)不同 IO 控制器的引腳,分別是 SOIDMM 19、21、61。 查看 Verdi AM62 Datatsheet 的 Table 12: Alternate functions 可以確定對(duì)應(yīng)引腳的 SoC Ball ID 和 SoC ball name。在 TI AM623/AM625處理器的 Datasheet 中 Table 6-1. Pin Attributes 可以找到對(duì)應(yīng) SoC Ball ID 的 PADCONFIG Address。有了這些信息就能夠在 Device tree 中進(jìn)行配置。
SODIMMSoC Ball IDSoC ball namePADCONFIG AddressALT7
61A6MCU_UART0_CTSn0x0408401CMCU_GPIO0_7
21U24GPMC0_AD150x000F4078GPIO0_30

19

A14SPI0_CLK0x000F41BCGPIO1_17


  • SODIMM 19

k3-am62-verdin.dtsi 中提供了默認(rèn)引腳的配置。Toradex 在代碼中做了詳細(xì)的注釋,例如以 SODIMM 19 為關(guān)鍵字搜索,可以找到該引腳的默認(rèn)配置,這里發(fā)現(xiàn)關(guān)于 SODIMM 19 的配置有兩個(gè)。SODIMM 19 屬于 GPIO1 控制器,所以該配置是 main_pmx0 下面的子節(jié)點(diǎn),并使用 AM62X_IOPAD 函數(shù)進(jìn)行配置。A14(Ball ID)的 PADCONFIG 地址是 0x000F41BC,對(duì)應(yīng)的掩碼是 0x1fff,AM62X_IOPAD 使用 0x01bc。 PIN_OUTPUT/PIN_INPUT 表示把該引腳配置為輸出/輸入狀態(tài)。數(shù)字 2 表示該引腳使用第二個(gè)復(fù)用配置,即當(dāng)作 PWM1_A 使用。數(shù)字 7 表示該引腳使用第七個(gè)復(fù)用配置,即當(dāng)作 GPIO 使用。引腳所有可用的復(fù)用關(guān)系可在 Verdi AM62 Datatsheet Table 12: Alternate functions 查看。AM62 處理器的引腳最多可以有 10 個(gè)復(fù)用配置可選,在 Table 12 中由 ALT0 到 ALT9 表示。部分引腳可能少于 10 個(gè)復(fù)用配置。后面的注釋中,A14 為 SoC Ball ID,SPI0_CLK 是 SoC Ball Name,GPIO1_17 指當(dāng)前選擇第七個(gè)復(fù)用配置,作為 GPIO 對(duì)應(yīng)的編號(hào) GPIO1_17。當(dāng)配置為 PWM 功能時(shí)就由 GPIO1_17 改為 EHRPWM1_A。在修改為其他復(fù)用配置后,建議也對(duì)應(yīng)修改注釋,便于理解代碼。

/* Verdin PWM_3_DSI */
pinctrl_epwm1_a: main-epwm1a-pins-default {
  pinctrl-single,pins = <
      AM62X_IOPAD(0x01bc, PIN_OUTPUT, 2) 
      /* (A14) SPI0_CLK.EHRPWM1_A */ /* SODIMM 19 */
  >;
};

pinctrl_pwm3_dsi_gpio: main-gpio1-17-pins-default {
  pinctrl-single,pins = <
      AM62X_IOPAD(0x01bc, PIN_INPUT, 7) 
      /* (A14) SPI0_CLK.GPIO1_17 */ /* SODIMM 19 */
  >;
};

上面 AM62X_IOPAD 中配置的 PIN_OUTPUT/PIN_INPUT 將設(shè)置 PADCONFIG 的寄存器。PIN_OUTPUT/PIN_INPUT 在 k3-pinctrl.h 定義。

/* Only these macros are expected be used directly in device tree files */
#define PIN_OUTPUT        (INPUT_DISABLE | PULL_DISABLE)
#define PIN_OUTPUT_PULLUP    (INPUT_DISABLE | PULL_UP)
#define PIN_OUTPUT_PULLDOWN    (INPUT_DISABLE | PULL_DOWN)
#define PIN_INPUT        (INPUT_EN | PULL_DISABLE)
#define PIN_INPUT_PULLUP    (INPUT_EN | PULL_UP)
#define PIN_INPUT_PULLDOWN    (INPUT_EN | PULL_DOWN)

PIN_OUTPUT/PIN_INPUT 定義的值最終被寫入 Pad Configuration 寄存器,具體的說明可以參考 AM623/625 的 Technical Reference Manual中 Table 6-2045. Description Of The Pad Configuration Register Bits 相關(guān)說明。

根據(jù) pinctrl_epwm1_a 查找,發(fā)現(xiàn)該引腳被分配到 epwm1,為了將 SODIMM 19 作為 GPIO 使用,在device tree 需要確保 epwm1 處于 disabled 狀態(tài)。

/* Verdin PWM_3_DSI */
&epwm1 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_epwm1_a>;
  status = "disabled";
};


如果使用 k3-am625-verdin-nonwifi-dev.dtb,那么在 k3-am62-verdin-dev.dtsi 中需要將 epwm1 禁用。

/* Verdin PWM_3_DSI */
&epwm1 {
  status = "disabled";
};

在 k3-am62-verdin.dtsi 的 main_gpio1 可以為 GPIO1 控制器的引腳添加 line-name,這樣在 Linux 中 libgpiod 就能夠使用更直觀 line-name 直接訪問引腳。gpio-line-names 從 gpio1_0 開始為每個(gè)引腳添加 line-name,gpio1_17 則設(shè)置為 SODIMM_19。
&main_gpio1 {
  gpio-line-names =
      "", /* 0 */
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "", /* 10 */
      "",
      "",
      "",
      "",
      "SODIMM_15",
      "SODIMM_16",
      "SODIMM_19",

由于 SOIDMM 19 屬于 GPIO1 控制器,在 k3-am62-verdin-dev.dtsi 中需要添加 main_gpio1 節(jié)點(diǎn)并將 pinctrl_pwm3_dsi_gpio 添加到節(jié)點(diǎn)中。
&main_gpio1 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_pwm3_dsi_gpio>;
};


  • SODIMM 21


SODIMM 21 也是類似的方法。在 Verdi AM62 Datatsheet Table 12: Alternate functions 中看到 SOIDMM 21 對(duì)應(yīng)的 SoC Ball ID 為 U24,第七復(fù)用配置 ALT7 可以作為 GPIO 功能,編號(hào) GPIO0_30,這屬于 GPIO0 控制器。TI AM623/AM625處理器的 Datasheet 中 Table 6-1. Pin Attributes 中找到 U24 對(duì)應(yīng)的 PADCONFIG Address 是 0x000F4078。因此,在 AM62X_IOPAD 使用 0x0078。
/* Verdin DSI_1_BKL_EN */
pinctrl_dsi1_bkl_en: main-gpio0-30-pins-default {
pinctrl-single,pins = <
 AM62X_IOPAD(0x0078, PIN_INPUT, 7)
 /* (U24) GPMC0_AD15.GPIO0_30 */ /* SODIMM 21 */
>;
};


在 main_gpio0 中,GPIO0_30 的 line-name 已經(jīng)被定義為 SODIMM_21。
&main_gpio0 {
gpio-line-names =

"",
"SODIMM_76",
"SODIMM_21", /* 30 */


SODIMM 21 屬于 GPIO0 控制器,在 k3-am62-verdin-dev.dtsi 中,將 pinctrl_dsi1_bkl_en 添加到 main_gpio0 節(jié)點(diǎn)中。
&main_gpio0 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_ctrl_sleep_moci>,
          <&pinctrl_gpio_5>,
          <&pinctrl_gpio_6>,
          <&pinctrl_gpio_7>,
          <&pinctrl_gpio_8>,
          <&pinctrl_dsi1_bkl_en>;
};


  • SODIMM 61


在 Verdi AM62 Datatsheet 的 Table 12 發(fā)現(xiàn) SODIMM 61 對(duì)應(yīng) ALT7 為 MCU_GPIO0_7,SoC Ball ID 為 A6,SoC ball name 為 MCU_UART0_CTSn。在 TI AM623/AM625 處理器的 Datasheet 中 Table 6-1 中對(duì)應(yīng)的 PADCONFIG Address 是 0x0408401C。使用 0x010c 作為關(guān)鍵字在 k3-am62-verdin.dtsi 檢索只發(fā)現(xiàn)下面配置,但該子節(jié)點(diǎn)屬于 main_pmx0 而非為 mcu_pmx0。所以在 k3-am625-verdin-nonwifi-dev.dtb 并未配置 SODIMM 61。那么就需要在 k3-am62-verdin.dtsi 添加相關(guān)配置。
  pinctrl_sdhci2: main-mmc2-pins-default {
      pinctrl-single,pins = <
          AM62X_IOPAD(0x120, PIN_INPUT, 0) 
          /* (C24) MMC2_CMD   */ /* WiFi_SDIO_CMD   */
          AM62X_IOPAD(0x118, PIN_INPUT, 0) 
          /* (D25) MMC2_CLK   */ /* WiFi_SDIO_CLK   */
          AM62X_IOPAD(0x114, PIN_INPUT, 0) 
          /* (B24) MMC2_DAT0  */ /* WiFi_SDIO_DATA0 */
          AM62X_IOPAD(0x110, PIN_INPUT, 0) 
          /* (C25) MMC2_DAT1  */ /* WiFi_SDIO_DATA1 */
          AM62X_IOPAD(0x10c, PIN_INPUT, 0) 
          /* (E23) MMC2_DAT2  */ /* WiFi_SDIO_DATA2 */


在 mcu_pmx0 中把 SODIMM 61 配置作為子節(jié)點(diǎn)添加進(jìn)去。注意,由于 SODIMM 61 屬于 MCU_GPIO 控制器,所以這里使用 AM62X_MCU_IOPAD 來配置。
&mcu_pmx0 {
  /* Verdin GPIO_9 */
  pinctrl_gpio_9: mcu-gpio0-7-pins-default {
      pinctrl-single,pins = <
          AM62X_MCU_IOPAD(0x001c, PIN_INPUT, 7) 
          /* (A6) MCU_UART0_CTSn.MCU_GPIO0_7 */ /* SODIMM 61 */
      >;
  };


在 &mcu_gpio0 中第八個(gè)位置添加 MCU_GPIO0_7 對(duì)應(yīng)的 line-name 為 SODIMM_61。其中第一行 SODIMM_244 對(duì)應(yīng)的是 MCU_GPIO0_0,第二行 SODIMM_206 對(duì)應(yīng)的是 MCU_GPIO0_1。
&mcu_gpio0 {
  gpio-line-names =
      "SODIMM_244",
      "SODIMM_206",
      "SODIMM_208",
      "SODIMM_210",
      "SODIMM_212",
      "",
      "",
      "SODIMM_61",


在 k3-am62-verdin-dev.dtsi 中的 mcu_gpio0 節(jié)點(diǎn)中添加前面配置的 pinctrl_gpio_9。
&mcu_gpio0 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_gpio_1>,
          <&pinctrl_gpio_2>,
          <&pinctrl_gpio_3>,
          <&pinctrl_gpio_4>,
          <&pinctrl_pcie_1_reset>,
          <&pinctrl_gpio_9>;
};


引腳測(cè)試

上面配置完成后,重新編譯 device tree,并部署到的開發(fā)板上。

make ti/k3-am625-verdin-nonwifi-dev.dtb


重啟后使用 gpioinfo 命令找到上面配置三個(gè)引腳在 Linux 系統(tǒng)中對(duì)應(yīng)的 bank 和 line 編號(hào)。

gpiochip1 - 24 lines:
line   7:  "SODIMM_61"       unused   input  active-high


gpiochip2 - 92 lines:
line  30:  "SODIMM_21"       unused   input  active-high


gpiochip3 - 52 lines:
line  17:  "SODIMM_19"       unused   input  active-high


下面三個(gè)命令分別可以把對(duì)應(yīng)的引腳拉高或拉低。

root@verdin-am62:~# gpioset 3 17=1
root@verdin-am62:~# gpioset 2 30=1
root@verdin-am62:~# gpioset 1 7=1

root@verdin-am62:~# gpioset 3 17=0
root@verdin-am62:~# gpioset 2 30=0
root@verdin-am62:~# gpioset 1 7=0

除了像上面直接在 user space 控制 GPIO 的狀態(tài),驅(qū)動(dòng)中也可以控制相關(guān)引腳。例如在 k3-am62-verdin-dev.dtsi 的根節(jié)點(diǎn)下添加一個(gè) LED 子節(jié)點(diǎn)并使用 SOIDMM 61 來控制。首先,需要把 pinctrl_gpio_9 從原來 &mcu_gpio0 刪除,因?yàn)檫@里該引腳不再作為普通的 GPIO 使用,而是用于 LED 驅(qū)動(dòng)。在 gpios 參數(shù)中使用 &mcu_gpio0 7 來引用 SODIMM 61。如果是 main_gpio0 控制器下的 SODIMM 21,則對(duì)應(yīng)需要使用 &main_gpio0 30 來引用。
  gpio-leds {
      compatible = "gpio-leds";
      pinctrl-names = "default";
      pinctrl-0 = <&pinctrl_gpio_9>;
      
      led-yellow {
          gpios = <&mcu_gpio0 7 GPIO_ACTIVE_HIGH>;
          default-state = "on";
          label = "status";
      };
      
  };
總結(jié)
文章就 AM623/625 SoC 介紹了如何在 Device tree 中配置和使用 GPIO,需要注意區(qū)分 GPIO 來自哪個(gè)控制器,并使用對(duì)應(yīng)的函數(shù)和引用符號(hào)。


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: ARM Linux Pinmux TI AM62 Toradex Verdin

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉