hhtttt
1
固件类型:官方提供的固件
固件文件名称:ITX-3568Q_Ubuntu20.04-r21156_v1.2.4a_220519
固件下载地址:x
Log日志:新建文本文档.zip
-
官方设备树kernel/arch/arm64/boot/dts/rockchip/rk3568j-firefly-itxq.dtsi中关于led的引脚配置:
led_user: led-user {
rockchip,pins = <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>;
};
…
user_led: user {
label = “firefly:yellow:user”;
linux,default-trigger = “ir-user-click”;
default-state = “off”;
gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>;
pinctrl-names = “default”;
pinctrl-0 = <&led_user>;
};
-
加载固件之后查看实际的pin脚配置,发现该pin脚是下拉的,对比TRM应该是默认状态未进行配置,使用io命令查看了对应寄存器确认了该情况。
$ cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinconf-pins
…
pin 148 (gpio4-20): input bias pull down, output drive strength (12 mA), input schmitt enabled, pin output (1 level), slew rate (1)
…
-
在kernel/drivers/pinctrl/pinctrl-rockchip.c中加入DEBUG宏查看dmesg也未发现对该pin脚的配置。
-
该问题是我在自己配置了一些pin脚但不生效之后发现的,为了排除我配置错误的情况,采用了官方的设备树进行实验,发现也有这个情况。
-
请求大佬答疑解惑!谢谢!
tchip_askquestions
新建文本文档.zip (744 Bytes)
zyk
2
你好,使用的是套板还是单单核心板,套板的灯是否可以手动控制
hhtttt
3
zyk 发表于 2022-8-10 11:55
你好,使用的是套板还是单单核心板,套板的灯是否可以手动控制
你好,感谢回复,使用的是套板 itx_rk3568,灯可用手动控制。
hhtttt
8
zyk 发表于 2022-8-18 17:18
IO指令读出的具体寄存器值是多少
root@firefly:~# io -4 -r 0xFDC600B8
fdc600b8: 00001600
根据TRM,读取GRF_GPIO4C_P寄存器的值地址是0xFDC600B8,第[9:8]位代表上下拉情况,此时[9:8]为b’10,代表下拉,与配置的不符合,使用的是默认值,也就是设备树的配置未生效;
luwy
10
本帖最后由 luwy 于 2022-8-26 10:18 编辑
经排查是pinctrl dts配置存在问题,导致pinctrl未生效,打上下面的补丁,可以修复:
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-itx-3568q.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-itx-3568q.dtsi
index 078f111..971dc4a 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-itx-3568q.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-itx-3568q.dtsi
@@ -44,14 +44,14 @@
firefly_leds: leds {
status = "okay";
compatible = "gpio-leds";
+ pinctrl-names = "default";
+ pinctrl-0 =<&leds_gpio>;
power_led: power {
label = "firefly:blue:power";
linux,default-trigger = "ir-power-click";
default-state = "on";
gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
- pinctrl-names = "default";
- pinctrl-0 = <&led_power>;
};
user_led: user {
@@ -59,8 +59,6 @@
linux,default-trigger = "ir-user-click";
default-state = "off";
gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>;
- pinctrl-names = "default";
- pinctrl-0 = <&led_user>;
};
fan_ctl: fan-ctl {
@@ -330,12 +327,12 @@
&pinctrl {
leds {
- led_power: led-power {
- rockchip,pins = <0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
- };
-
- led_user: led-user {
- rockchip,pins = <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>;
+ leds_gpio: leds-gpio {
+ rockchip,pins =
+ /* led_power */
+ <0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>,
+ /* led_user */
+ <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
hhtttt
11
luwy 发表于 2022-8-26 10:16
经排查是pinctrl dts配置存在问题,导致pinctrl未生效,打上下面的补丁,可以修复:
经测试已经生效,非常感谢!但还是存在一些疑惑,pinctrl的配置为什么不能写在power和user_led节点下,是底层源码只支持写在一级节点下么?劳烦解惑,感谢。
luwy
12
本帖最后由 luwy 于 2022-9-5 17:23 编辑
底层的源码只在一级节点下找pinctrl-*的属性,源码:kernel/drivers/pinctrl/devicetree.c的pinctrl_dt_to_map函数,
详细了解pinctrl子系统可以参考:https://blog.csdn.net/kenny_wju/article/details/125078953