
清空记录
历史记录
取消
清空记录
历史记录

本文基于触觉智能RK3576开发板Purple Pi OH2的linux SDK讲解,承接上篇的设备树排查(对上篇感兴趣的朋友们可点此跳转),我们继续往下讲解。
引脚没反应、电平不对、中断不触发?遇到这类问题,先别怀疑硬件。GPIO 出问题,本质是"这个引脚到底被配成了什么"说不清。pinctrl 把引脚管成三件事:复用(mux)、电气配置(pull/drive)、GPIO/中断。本文先从 pinctrl 的 debugfs 逐级对照讲起,再深入时钟树与 IO-Domain 核查外设"像睡着了一样"的硬件原因,最后讲透 dynamic_debug/ftrace/perf 三件套的正确打开方式。
引脚没反应、电平不对、中断不触发?
GPIO出问题,本质是"这个引脚到底被配成了什么"说不清。pinctrl 把引脚管成三件事:复用(mux)、电气配置(pull/drive)、GPIO/中断。用 debugfs 逐级对照,一查一个准。引脚问题三层定位:
①复用——这个 pin 当前 mux 成哪个功能(GPIO 还是 UART/SPI/...);
②配置——上下拉/驱动强度/电平对不对;
③GPIO/中断——请求成功没、方向/电平/中断触发正常没。/sys/kernel/debug/pinctrl/ 和 /sys/kernel/debug/gpio 是现场证据。
RK3576 的引脚复用在 rk3576-pinctrl.dtsi 里用 rockchip,pins =
uart2 { /omit-if-no-ref/ uart2m0_xfer: uart2m0-xfer { rockchip,pins = /* uart2_rx_m0 */ <1 RK_PC7 9 &pcfg_pull_up>, /* bank1, PC7, 功能9(uart2), 上拉 */ /* uart2_tx_m0 */ <1 RK_PC6 9 &pcfg_pull_up>; }; /omit-if-no-ref/ uart2m1_xfer: uart2m1-xfer { rockchip,pins = <4 RK_PB4 10 &pcfg_pull_up>, /* 换一组引脚:bank4, PB4, 功能10 */ <4 RK_PB5 10 &pcfg_pull_up>; };};bank
控制器名以实际 ls /sys/kernel/debug/pinctrl/ 为准(瑞芯微Rockchip平台通常是pinctrl-rockchip-pinctrl之类)。
| 复用冲突: | ||
| 配置: | ||
# 0. 挂 debugfs(一般已挂)mount -t debugfs none /sys/kernel/debug# 1. pinctrl 三张表逐级看ls /sys/kernel/debug/pinctrl/cat /sys/kernel/debug/pinctrl/*/pinmux-pins | grep -E "GPIO1_C7|uart2"cat /sys/kernel/debug/pinctrl/*/pinconf-pins | grep GPIO1_C7cat /sys/kernel/debug/pinctrl/*/pins | grep GPIO1_C7 # 看 owner# 2. GPIO 状态与中断cat /sys/kernel/debug/gpio | grep -A2 "gpiochip" | headcat /proc/interrupts | grep -i gpio
用户态操作GPIO推荐libgpiod工具(gpiodetect/gpioinfo/gpioget/ gpioset),比旧 sysfs /sys/class/gpio 更规范(本内核也开了 CONFIG_GPIO_SYSFS=y兼容旧脚本)。
引脚问题按复用→配置→GPIO/中断三层查:pinmux-pins看mux到哪、pinconf-pins看上下拉、debugfs/gpio看请求与方向。复用冲突、mux错、pcfg 错,在debugfs里都有"最终真相"可对。
外设像睡着了一样?先查时钟和电压域
外设不响应,多数不是外设坏了,而是"没供电时钟"或"IO电压域没配对"。按「时钟树→使能→IO-Domain」的顺序查,/sys/kernel/debug/clk是时钟的真相,io-domain驱动会直接告诉你电压错在哪。
① 时钟——/sys/kernel/debug/clk/clk_summary 里看它 rate 对不对、enable_cnt/prepare_cnt 有没有(没人开时钟 = 外设休眠);
② IO-Domain——外设所挂的 IO 电压域(1.8V/3.3V)有没有正确供上,io-domain 驱动会在电压异常时直接打印 Voltage too high。
RK3576的时钟控制器(CRU)驱动是 kernel-6.1/drivers/clk/rockchip/clk-rk3576.c。外设节点通过 dts 的 clocks = <&cru SCLK_XXX>, <&cru PCLK_XXX> 引用时钟,驱动里 clk_prepare_enable() 后才真正上电工作。
# 看整棵时钟树(rate / enable_cnt / prepare_cnt)cat /sys/kernel/debug/clk/clk_summary | grep -iE "uart|sai|gmac|sdhci|sdmmc|clk_" | head# 只看某个时钟cat /sys/kernel/debug/clk/clk_summary | grep -E "^.*uart2"# 想手动开/关时钟做验证echo 1 > /sys/kernel/debug/clk//clk_prepare_enable_clk # 视内核版本
瑞芯微RK SoC 的 GPIO/外设 IO 分多个电压域(1.8V / 3.3V)。
kernel-6.1/drivers/soc/rockchip/io-domain.c 负责:监控每个域的 regulator 电压,当电压变化时写 GRF 让 IO 域切换档位(源码定义 MAX_VOLTAGE_1_8=1980000、MAX_VOLTAGE_3_3=3600000:电压高于 1.98V 即判为3.3V档(is_3v3=1),高于3.6V触发Voltage too high报错)。
# 1. 时钟cat /sys/kernel/debug/clk/clk_summary | grep <外设时钟名>dmesg | grep -iE "clk|clock" | tail# 2. IO-Domain 报错与 regulatordmesg | grep -iE "io-domain|voltage too high|regulator" | tailcat /sys/kernel/debug/regulator/regulator_summary 2>/dev/null | head -30 # 看各域电压
① clk_summary 确认 rate 与使能;
② 看 io-domain 是否报 Voltage too high/regulator 电压异常,核对 xxx-supply。两者都正常才回到外设自身排查。
内核"不爱说话"?dynamic_debug / ftrace / perf 先把开关用对
想给内核上"动态日志、函数跟踪、性能采样",前提是内核编译时开了对应的调试开关。而本 SDK 的默认内核只开了 perf,dynamic_debug 和 ftrace function 都是关的——很多人第一步就卡在这。
三层内核调试手段——dynamic_debug(运行时按文件/函数开日志)、ftrace(函数调用跟踪)、perf(性能采样)——都需要内核 config 支持。
本 SDK 默认配置(kernel-6.1/.config)实测:只有 CONFIG_PERF_EVENTS=y开;CONFIG_DYNAMIC_DEBUG、CONFIG_FUNCTION_TRACER、CONFIG_KPROBES都是关的。所以第一步不是学命令,而是打开开关、重编内核、烧boot.img。
# 1. 改 defconfig(推荐,可入库)vim kernel-6.1/arch/arm64/configs/rockchip_linux_rk3576_defconfig# 加入:# CONFIG_DYNAMIC_DEBUG=y# CONFIG_FUNCTION_TRACER=y# CONFIG_FUNCTION_GRAPH_TRACER=y# CONFIG_KPROBES=y# CONFIG_DEBUG_INFO=y# 2. 重新编译内核并烧录./build.sh kernel # 或 ./build.sh./rkflash.sh boot # 重烧 boot.img(见 01.02)
mount -t debugfs none /sys/kernel/debugecho "file drivers/i2c/busses/i2c-rk3x.c +p" > /sys/kernel/debug/dynamic_debug/control# 关掉:echo "file ... -p" > .../control# 查当前:cat /sys/kernel/debug/dynamic_debug/control | grep i2c-rk3x
cd /sys/kernel/debug/tracingecho 0 > tracing_onecho function_graph > current_tracerecho 'rk_*' > set_ftrace_filter # 只跟踪 rk_ 开头的函数echo 1 > tracing_oncat trace | head -50echo nop > current_tracer
perf top # 实时热点perf stat -e cycles,instructions sleep 1perf record -g -a -- ./app && perf report # 采样+调用链
内核调试三件套先用对开关:
本SDK默认只开perf,dynamic_debug/ftrace function/kprobes 需在 rockchip_linux_rk3576_defconfig里补上对应CONFIG再重编内核、烧 boot.img。
开关到位后:日志细节用dynamic_debug、调用流程用ftrace、性能用 perf。
docs/cn/Linux/Profile/Rockchip_User_Guide_Linux_Software_Test_CN.pdf(软件测试与日志);内核崩溃格式为内核通用行为(内核文档)。
kernel-6.1/Makefile(6.1.99)、kernel-6.1/arch/arm64/configs/rockchip_linux_rk3576_defconfig(KALLSYMS_ALL / PRINTK_CALLER / DEBUG_INFO_DWARF4 / MAGIC_SYSRQ / DEBUG_FS / PANIC_TIMEOUT=5)。
触觉智能Purple Pi OH2开发板,基于触觉智能RK3576核心板SOM7609系列+底板架构,搭载4核A72+4 核A53+M0多核异构处理器,主频2.2GHz,集成 6Tops NPU,轻松应对 AI 推理、边缘计算与轻量级深度学习。配套完善 SDK、丰富资料与Demo,适用于嵌入式工程师项目选型/预研、开发评估。
触觉智能SOM7609系列核心板仅40.5×40.5mm 超小尺寸,专为空间受限场景打造。基于 RK3576/RK3576J SoC,集成高性能GPU与VPU,支持4K视频编解码与多屏异显;提供PCIe、USB3.2、双路千兆以太网、MIPI-DSI/CSI、eDP、CAN、SPI、I2C 等丰富接口,灵活扩展。支持Linux、Android、开源鸿蒙OpenHarmony等丰富系统,配套硬件设计指南、驱动源码与技术支持,助力产品快速落地。
