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

By Toradex胡珊逢

簡介

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

硬件介紹

Verdin AM62?所使用的 AM623/AM625 處理器的 GPIO 控制器如下圖所示。GPIO 控制器根據(jù)不同的處理器可能有多個模塊兜喻,AM623/AM625 擁有一個 MCU_GPIO0梦染,一個 GPIO0 和一個 GPIO1 共三個模塊。每個模塊有 9 個 bank朴皆,每個 bank 有 16 個引腳帕识,所以理論上最多有 3x9x46 = 432 個引腳。但 AM623/AM625 SoC 并不能使用所有引腳遂铡,SoC 實際可用的為 198 個引腳肮疗。Verdin AM62 模塊并沒有把 SoC 的引腳都引出,因而可用的引腳少于 198忧便。


Device Tree 配置

在寫本文章時族吻,Verdin AM62 使用?toradex_ti-linux-6.1.y分支內(nèi)核帽借。每個 GPIO 根據(jù)用途的不同,相應(yīng)的配置分布在多個 device tree 文件中超歌。如下圖砍艾,k3-am62-mcu.dtsi 和 k3-am62-main.dtsi 中定義了三個 GPIO 控制器模塊以及對應(yīng)的物理地址,k3-am62-verdin.dtsi 中包含每個引腳的具體配置巍举。三個 GPIO 控制器分為兩種脆荷,MCU_GPIO 和 GPIO0/1,它們可以使用各自專門的函數(shù)來配置所控制的引腳懊悯。&mcu_pmx0 和 &main_pmx0 分別使用 AM62X_MCU_IOPAD 和 AM62X_IOPAD 配置蜓谋。下面將介紹如何修改和使用 mcu_gpio0,main_gpio0 和 main_gpio1 模塊所控制的引腳炭分。


我們分別選擇來自如下三個不同 IO 控制器的引腳桃焕,分別是 SOIDMM 19、21捧毛、61观堂。 查看?Verdi AM62 Datatsheet?的 Table 12: Alternate functions 可以確定對應(yīng)引腳的 SoC Ball ID 和 SoC ball name。在 TI?AM623/AM625處理器的 Datasheet 中 Table 6-1. Pin Attributes 可以找到對應(yīng) SoC Ball ID 的 PADCONFIG Address呀忧。有了這些信息就能夠在 Device tree 中進行配置师痕。

SODIMMSoC Ball IDSoC ball namePADCONFIG AddressALT7

61A6MCU_UART0_CTSn0x0408401CMCU_GPIO0_7

21U24GPMC0_AD150x000F4078GPIO0_30

19A14SPI0_CLK0x000F41BCGPIO1_17


SODIMM 19

k3-am62-verdin.dtsi 中提供了默認引腳的配置。Toradex 在代碼中做了詳細的注釋而账,例如以 SODIMM 19 為關(guān)鍵字搜索胰坟,可以找到該引腳的默認配置,這里發(fā)現(xiàn)關(guān)于 SODIMM 19 的配置有兩個泞辐。SODIMM 19 屬于 GPIO1 控制器笔横,所以該配置是 main_pmx0 下面的子節(jié)點,并使用 AM62X_IOPAD 函數(shù)進行配置铛碑。A14(Ball ID)的 PADCONFIG 地址是 0x000F41BC狠裹,對應(yīng)的掩碼是 0x1fff,AM62X_IOPAD 使用 0x01bc汽烦。 PIN_OUTPUT/PIN_INPUT 表示把該引腳配置為輸出/輸入狀態(tài)涛菠。數(shù)字 2 表示該引腳使用第二個復(fù)用配置,即當(dāng)作 PWM1_A 使用撇吞。數(shù)字 7 表示該引腳使用第七個復(fù)用配置俗冻,即當(dāng)作 GPIO 使用。引腳所有可用的復(fù)用關(guān)系可在 Verdi AM62 Datatsheet Table 12: Alternate functions 查看牍颈。AM62 處理器的引腳最多可以有 10 個復(fù)用配置可選迄薄,在 Table 12 中由 ALT0 到 ALT9 表示。部分引腳可能少于 10 個復(fù)用配置煮岁。后面的注釋中讥蔽,A14 為 SoC Ball ID涣易,SPI0_CLK 是 SoC Ball Name,GPIO1_17 指當(dāng)前選擇第七個復(fù)用配置冶伞,作為 GPIO 對應(yīng)的編號 GPIO1_17新症。當(dāng)配置為 PWM 功能時就由 GPIO1_17 改為 EHRPWM1_A。在修改為其他復(fù)用配置后响禽,建議也對應(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 開始為每個引腳添加 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é)點并將 pinctrl_pwm3_dsi_gpio 添加到節(jié)點中弓颈。

&main_gpio1 {

pinctrl-names = "default";

pinctrl-0 = <&pinctrl_pwm3_dsi_gpio>;

};

SODIMM 21

SODIMM 21 也是類似的方法。在 Verdi AM62 Datatsheet Table 12: Alternate functions 中看到 SOIDMM 21 對應(yīng)的 SoC Ball ID 為 U24删掀,第七復(fù)用配置 ALT7 可以作為 GPIO 功能翔冀,編號 GPIO0_30,這屬于 GPIO0 控制器披泪。TI?AM623/AM625處理器的 Datasheet 中 Table 6-1. Pin Attributes 中找到 U24 對應(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é)點中。

&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 對應(yīng) ALT7 為 MCU_GPIO0_7幔妨,SoC Ball ID 為 A6鹦赎,SoC ball name 為 MCU_UART0_CTSn。在 TI AM623/AM625 處理器的 Datasheet 中 Table 6-1 中對應(yīng)的 PADCONFIG Address 是 0x0408401C误堡。使用 0x010c 作為關(guān)鍵字在 k3-am62-verdin.dtsi 檢索只發(fā)現(xiàn)下面配置钙姊,但該子節(jié)點屬于 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é)點添加進去。注意沾谜,由于 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 中第八個位置添加 MCU_GPIO0_7 對應(yīng)的 line-name 為 SODIMM_61基跑。其中第一行 SODIMM_244 對應(yīng)的是 MCU_GPIO0_0婚温,第二行 SODIMM_206 對應(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é)點中添加前面配置的 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>;

};

引腳測試

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

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

重啟后使用?gpioinfo?命令找到上面配置三個引腳在 Linux 系統(tǒng)中對應(yīng)的 bank 和 line 編號力图。

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

下面三個命令分別可以把對應(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ū)動中也可以控制相關(guān)引腳吃媒。例如在 k3-am62-verdin-dev.dtsi 的根節(jié)點下添加一個 LED 子節(jié)點并使用 SOIDMM 61 來控制。首先吕喘,需要把 pinctrl_gpio_9 從原來 &mcu_gpio0 刪除赘那,因為這里該引腳不再作為普通的 GPIO 使用,而是用于 LED 驅(qū)動氯质。在 gpios 參數(shù)中使用 &mcu_gpio0 7 來引用 SODIMM 61募舟。如果是 main_gpio0 控制器下的 SODIMM 21,則對應(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 來自哪個控制器,并使用對應(yīng)的函數(shù)和引用符號蜓陌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末觅彰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钮热,更是在濱河造成了極大的恐慌填抬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隧期,死亡現(xiàn)場離奇詭異飒责,居然都是意外死亡赘娄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門宏蛉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遣臼,“玉大人,你說我怎么就攤上這事拾并∽嵫撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵嗅义,是天一觀的道長屏歹。 經(jīng)常有香客問我,道長之碗,這世上最難降的妖魔是什么蝙眶? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮褪那,結(jié)果婚禮上幽纷,老公的妹妹穿的比我還像新娘。我一直安慰自己博敬,他們只是感情好友浸,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冶忱,像睡著了一般尾菇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上囚枪,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音劳淆,去河邊找鬼链沼。 笑死,一個胖子當(dāng)著我的面吹牛沛鸵,可吹牛的內(nèi)容都是我干的括勺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼曲掰,長吁一口氣:“原來是場噩夢啊……” “哼疾捍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栏妖,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤乱豆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吊趾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宛裕,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瑟啃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揩尸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛹屿。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岩榆,靈堂內(nèi)的尸體忽然破棺而出错负,到底是詐尸還是另有隱情,我是刑警寧澤勇边,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布犹撒,位于F島的核電站,受9級特大地震影響粥诫,放射性物質(zhì)發(fā)生泄漏油航。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一怀浆、第九天 我趴在偏房一處隱蔽的房頂上張望谊囚。 院中可真熱鬧,春花似錦执赡、人聲如沸镰踏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奠伪。三九已至,卻和暖如春首懈,著一層夾襖步出監(jiān)牢的瞬間绊率,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工究履, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滤否,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓最仑,卻偏偏與公主長得像藐俺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泥彤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容