一、RK3588設(shè)備樹結(jié)構(gòu)
firefly的官方說明文檔RK3588gpio系統(tǒng)說明
function {
group {
rockchip,pin = <bank gpio func &ref>;
};
};
其中,bank是所屬的組,Core-3588J 有 5 組 GPIO bank:GPIO0-GPIO4,每組又以 A0-A7, B0-B7, C0-C7, D0-D7 作為編號區(qū)分。
首先,對于firefly的rk3588j的開發(fā)板,其設(shè)備樹有幾個比較重要的文件,
分別是/kernel/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi
;/kernel/arch/arm64/boot/dts/rockchip/rk3588s.dtsi
;kernel/arch/arm64/boot/dts/rockchip/rk3588-firefly-itx-3588j.dtsi
;/kernel/arch/arm64/boot/dts/rockchip/rk3588.dtsi
;
Tips:如果有些外設(shè)描述沒有找到,可以先編譯一下,會生成一個總的dts在當(dāng)前目錄下,例如3588的臨時文件名字是:.rk3588-firefly-itx-3588j.dtb.dts.tmp
,這是一個隱藏文件,里面包含了所有的將會進(jìn)行編譯的設(shè)備樹信息。
這個幾個文件將其外圍設(shè)備基本描述完全了,另外還有一些可能位于/kernel/arch/arm64/boot/dts/rockchip/rk3588-diff.dtsi
內(nèi),
第一個文件rk3588s-pinctrl.dtsi,該文件枚舉了3588所有的iomux實例(3588s和3588是firefly的兩款開發(fā)板,頻腳基本一致,所有有些3588會引用3588s的設(shè)備樹文件);例如rk3588s-pinctrl.dtsi文件中關(guān)于uart6的設(shè)備樹描述:
上圖是串口6的一個設(shè)備樹,
rockchip,pins =
/* uart6_rx_m1 */
<1 RK_PA0 10 &pcfg_pull_up>,
該描述就是說明使用的引腳是GPIO1_A0;
可以看到4個引腳rx/tx/rtsn/ctsn。另外多了一個rx/tx是串口6的復(fù)用,這里是將串口6的所有可以的復(fù)用全部羅列出來,其他的外設(shè)也是類似,最終實際用的哪一路復(fù)用在文件rk3588-firefly-itx-3588j.dtsi中確定,還是串口6,在該文件中的描述為:
二、RK3588 GPIO口上拉下拉失敗
在調(diào)試中發(fā)現(xiàn)有些gpio口無法正確的實現(xiàn)上下拉,其原因在于該io口被其他外設(shè)復(fù)用使能。解決方法就是將該外設(shè)disabled。
使用如下指令查看引腳的復(fù)用情況:
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
上下拉設(shè)置方法:
:/ # ls /sys/class/gpio/
export gpiochip128 gpiochip32 gpiochip64 unexport
gpiochip0 gpiochip200 gpiochip509 gpiochip96
:/ # echo 56 > /sys/class/gpio/export
:/ # ls /sys/class/gpio/
export gpiochip0 gpiochip200 gpiochip509 gpiochip96
gpio56 gpiochip128 gpiochip32 gpiochip64 unexport
:/ # ls /sys/class/gpio/gpio56
active_low device direction edge power subsystem uevent value
:/ # cat /sys/class/gpio/gpio56/direction
in
:/ # cat /sys/class/gpio/gpio56/value
0
以GPIO3_D4為例,該IO口在原開發(fā)板上被用作了HDMI1的rx引腳,其設(shè)備樹描述位于rk3588-firefly-itx-3588j.dtsi
文件中,如下:
hdmim1_rx是一個設(shè)備使用gpio引腳的描述,在文件rk3588.dtsi
中被引用,如下:
但是我們發(fā)現(xiàn)其實,該外設(shè)在此文件中的狀態(tài)是disabled,其實,一般而言,每個廠家的芯片可能對應(yīng)很多開發(fā)板,有些開發(fā)板沒有這個功能,有些開發(fā)板有這個功能,因此,在公共文件中一般都會把該芯片支持的共有外設(shè)都失能,然后在開發(fā)板對應(yīng)的文件中再使能,這里就是如此。
打開文件rk3588-firefly-itx-3588j.dtsi
找到hdmirx_ctrler,可以看到
我們只需要將okay改成disabled即可。
還有一些gpio,通過指令:
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
可以看到本身就是用作gpio的,但是在linux通用的gpio管理中,并不能被導(dǎo)出.例如下面的提示:
root@firefly:/sys/class/gpio# echo 119 > export
-bash: echo: write error: Device or resource busy
這是因為被其他外設(shè)復(fù)用成gpio了,不再歸屬到linux通用gpio管理器。
例如,rk3588的usbdp_phy0節(jié)點。設(shè)備樹如下:
&usbdp_phy0 {
orientation-switch;
svid = <0xff01>;
sbu1-dc-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
sbu2-dc-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
port {
#address-cells = <1>;
#size-cells = <0>;
usbdp_phy0_orientation_switch: endpoint@0 {
reg = <0>;
remote-endpoint = <&usbc0_orien_sw>;
};
usbdp_phy0_dp_altmode_mux: endpoint@1 {
reg = <1>;
remote-endpoint = <&dp_altmode_mux>;
};
};
};
其中的:
sbu1-dc-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
sbu2-dc-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
就是將GPIO4_A6和GPIO4_A7作為sbu1和sbu2。
那么此時查看復(fù)用的話,其實就會顯示用作了gpio,但是卻不能導(dǎo)出到通用的gpio管理器里面。如果需要使用類似的io口就需要將使用的設(shè)備禁用掉。
三、RK3588頻腳計算方式
與一般的計算方式?jīng)]有區(qū)別:
GPIO pin腳計算公式:pin = bank * 32 + number
GPIO 小組編號計算公式:number = group * 8 + X
以下,摘自官網(wǎng):
下面演示GPIO1_D0 pin腳計算方法:
bank = 1; //GPIO1_D0 => 1, bank ∈ [0,4]
group = 3; //GPIO1_D0 => 3, group ∈ {(A=0), (B=1), (C=2), (D=3)}
X = 0; //GPIO1_D0 => 0, X ∈ [0,7]
number = group * 8 + X = 3 * 8 + 0 = 24
pin = bank*32 + number= 1 * 32 + 24 = 56;
GPIO1_D0 對應(yīng)的設(shè)備樹屬性描述為:<&gpio1 24 GPIO_ACTIVE_HIGH>,由kernel-5.10/include/dt-bindings/pinctrl/rockchip.h的宏定義可知,也可以將GPIO1_D0描述為<&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>。
另外提供個簡單的計算小程序源碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
while(1){
char gpio_group;
int bank;
int X;
int group;
printf("++++++++++++++++++++++++++++++++++++++++++++\n");
printf("bank number eg.GPIO1_D2,bank is 1\n");
printf("group number eg.GPIO1_D2,group is 'D'\n");
printf("code number eg.GPIO1_D2,code is 2\n");
printf("++++++++++++++++++++++++++++++++++++++++++++\n");
printf("Input Example:1,d,2\n");
scanf("%d,%c,%d", &bank,&gpio_group,&X);
switch (gpio_group)
{
case 'a':
case 'A'/* constant-expression */:
/* code */
group = 0;
break;
case 'b':
case 'B':
group = 1;
break;
case 'c':
case 'C':
group = 2;
break;
case 'd':
case 'D':
group = 3;
break;
default:
printf("group number error!\n");
return 1;
break;
};
int number = group * 8 + X ;
int pin = bank*32 + number;
printf("GPIO pin is %d\n", pin);
system("pause");}
return 0;
}
只需要輸入bank,code和序號即可,例如計算GPIO1_D0 ,輸入1,D,0
回車:
引腳為56號。文章來源:http://www.zghlxwxcb.cn/news/detail-737621.html
最后:雖然由于每家芯片的驅(qū)動不同,設(shè)備樹的書寫格式可能有所不同,但是基本的設(shè)備樹格式都是一樣的。大道至簡,殊途同歸。文章來源地址http://www.zghlxwxcb.cn/news/detail-737621.html
到了這里,關(guān)于RK3588 設(shè)備樹pinctrl gpio子系統(tǒng)解析,解決GPIO無法正確拉高拉低的問題,RK3588設(shè)備樹詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!