问题描述:
本人在做电机驱动时遇到了引脚不足的情况,想去找到一个空闲引脚做为IO口控制电机,却因为RK3588的高度集成化导致原本就少的可怜的外露引脚都被复用了,所以需要通过修改设备树来屏蔽掉原本引脚复用的功能。这里我使用的是创龙的RK3588评估板。
解决步骤:
首先查看自己的目标引脚的GPIO口是什么,我们可以通过开发板的供应商提供的原理图和引脚复用资料来查看对应引脚的GPIO口。
这里我使用的引脚是GPIO4_A7_d,这个引脚的复用功能也在图表中写出。
在瑞芯微中,引脚编号的计算方法是(如GPIO4_A7):4×32+0×8+7=135。具体计算方法是Bank×32 + Group×8 + 组内编号。在Group中(A=0,B=1,C=2,D=3)。
如果此时我们直接在开发板上使用sysfs接口导出gpio引脚,如echo 135 > /sys/class/gpio/expor可能会出现Device or resource busy资源正在被占用且无法删除的情况,这也就是本文所遇到的问题。
此时我们进入开发板中,执行如下指令可查看此时的引脚复用状态。
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
会输出如图所示的状态,找到你的目标引脚,查看当前被什么复用。之后进入官方(你的开发板是那个商家的,找那个商家要设备树,一般会随着开发资料一起发给你)提供的设备树文件(一般都是dts文件,需要使用vim或nano编辑,不能使用图形化界面打开),找到正在占用的功能,将它的status改为disabled。 并在其中加入pinctrl使得引脚能够作为普通的IO使用。(至于加入的pinctrl可以交给deepseek根据你的实际需求来写)
这是我已经修改好的设备树文件,我将设备树中所有的dsi1 状态改为disabled(需要注意一点就是要确定你修改的引脚,所复用的功能是你用不到的,避免相互冲突)。
之后保存、退出设备树,编译设备树文件生成boot.img文件,之后再转为FIT格式,拷贝到开发板内,执行镜像替换指令,之后再强制写入数据,最后重启。如果修改成功的话开发板会正常重启,如果重启失败说明设备树修改失败,需要你把错误信息喂给AI分析,或者自己具备读英文日志的能力,能够自己分析出问题。
设备树编译方法:
之前我没有仔细的看过官方提供的编译方法,因此一直不懂怎么编译。这里我按照创龙那边的编译方法,把一些基本用不到但是依旧写在了编译文档中的内容省略掉。
在修改完设备树之后,回到Kernel文件下(注意是在虚拟机中的Kernel,不是开发板的),配置你的内核编译选项,如下图为创龙的步骤。
配置好之后,回到Kernel目录下(一定要回到Kernel,指令前名字确保为)执行编译指令。最后对生成的boot.img转换成FIT格式。转换代码如下:
#!/bin/bash -e
TARGET_IMG=boot.img
ITS=boot.its
KERNEL_IMG=arch/arm64/boot/Image
KERNEL_DTB=arch/arm64/boot/dts/rockchip/tl3588-evm.dtb
RESOURCE_IMG=resource.img
if [ ! -f "$TARGET_IMG" ]; then
echo "$TARGET_IMG not exists!"
exit 1
fi
if [ ! -f "$ITS" ]; then
echo "$ITS not exists!"
exit 1
fi
if [ ! -f "$KERNEL_IMG" ]; then
echo "$KERNEL_IMG not exists!"
exit 1
fi
if [ ! -f "$KERNEL_DTB" ]; then
echo "$KERNEL_DTB not exists!"
exit 1
fi
if [ ! -f "$RESOURCE_IMG" ]; then
echo "$RESOURCE_IMG not exists!"
exit 1
fi
sed -i -e "s~@KERNEL_DTB@~$(realpath -q "$KERNEL_DTB")~" \
-e "s~@KERNEL_IMG@~$(realpath -q "$KERNEL_IMG")~" \
-e "s~@RESOURCE_IMG@~$(realpath -q "$RESOURCE_IMG")~" "$ITS"
rkbin/tools/mkimage -f "$ITS" -E -p 0x800 "$TARGET_IMG"