前言
吐槽,必须得吐槽,现在国内的商家怎么这么不专业,做块板子,如果需要其他人做某些事情,你的文档是不是得齐全点,你的技术支持是不是得勤快点。
最近在使用国内某商家的rk3399prod(为了避免不必要的纠纷,还是不提名字了,我不说他不改迟早也玩完)。需要用到gpio引脚驱动外部的按键,结果很不正常,接线重启后电平很异常,撤掉线又很正常,怀疑是驱动问题。
于是开始挖坑编译gpio驱动,对这块完全陌生。根据他们的说法,找到kernel的下载地址。然后有wiki教程,结果照着上面敲各种问题。为啥教程不写完整点呢?无语。
1 内核编译
我是在ubuntu18环境下编译的
中途出现以下问题:
1)./make.sh: line 34: genext2fs: command not found
安装工具sudo apt-get install genext2fs
2)gcc: error: unrecognized command line option ‘-mlittle-endian’
这个是使用了系统gcc,要用交叉编译工具 aarch64的gcc。由于执行的make.sh脚本,自然得去里面修改,结果:
JOB=`sed -n "N;/processor/p" /proc/cpuinfo|wc -l`
DTB=eaidk
function help()
{
echo "Usage: ./make.sh os"
echo
echo "Parameter:"
echo "1) os: should be android or linux"
echo
echo "e.g. ./make.sh android"
echo " ./make.sh linux"
}
if [ $# -lt 1 ];then
help
exit 1
fi
case $1 in
android)
make rockchip_defconfig
make ARCH=arm64 rk3228h-${DTB}-android.img -j${JOB}
;;
linux)
mkdir -p boot_linux/extlinux
make rockchip_linux_defconfig
make ARCH=arm64 rk3228h-${DTB}-linux.img -j${JOB}
cp -f arch/arm64/boot/dts/rockchip/rk3228h-${DTB}-linux.dtb boot_linux/extlinux/rk3228h.dtb
cp -f arch/arm64/boot/Image boot_linux/extlinux/
cp -f extlinux.conf boot_linux/extlinux/
genext2fs -b 32768 -B $((32 * 1024 * 1024 / 32768)) -d boot_linux -i 8192 -U boot_linux.img
rm -rf boot_linux
;;
factory)
mkdir -p boot_linux-ft/extlinux
make rockchip_linux_defconfig
make ARCH=arm64 rk3228h-${DTB}-linux.img -j${JOB}
cp -f arch/arm64/boot/dts/rockchip/rk3228h-${DTB}-linux.dtb boot_linux-ft/extlinux/rk3228h.dtb.orig
make ARCH=arm64 rk3228h-${DTB}-factory.img -j${JOB}
cp -f arch/arm64/boot/dts/rockchip/rk3228h-${DTB}-factory.dtb boot_linux-ft/extlinux/rk3228h.dtb
cp -f arch/arm64/boot/Image boot_linux-ft/extlinux/
cp -f extlinux.conf boot_linux-ft/extlinux/
genext2fs -b 32768 -B $((32 * 1024 * 1024 / 32768)) -d boot_linux-ft -i 8192 -U boot_linux-ft.img
rm -rf boot_linux-ft
;;
*)
help
exit 1
;;
esac
exit 0
这rk3228h什么鬼,眼睛一扫就感觉不对,这个文件完全是需要改的好伐?唉. 贴出我修改后的
JOB=4
DTB=toybrick-prod
TY=rk3399pro
TKCC=/xxx/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
linux)
mkdir -p boot_linux/extlinux
make rockchip_linux_defconfig
make ARCH=arm64 ${TY}-${DTB}-linux.img CROSS_COMPILE=${TKCC} -j${JOB}
cp -f arch/arm64/boot/dts/rockchip/${TY}-${DTB}-linux.dtb boot_linux/extlinux/${TY}.dtb
cp -f arch/arm64/boot/Image boot_linux/extlinux/
cp -f extlinux.conf boot_linux/extlinux/
genext2fs -b 32768 -B $((32 * 1024 * 1024 / 32768)) -d boot_linux -i 8192 -U boot_linux.img
rm -rf boot_linux
;;
看看我的改动有多大,试了n次才成功。
JOB用过的都知道,线程数量,通过cpuinfo查看cpu数量然后决定开多少线程编译,可以直接写数字的
DTB 需要进到kernel/arch/arm64/boot/dts/rockchip去看对应的版本
TY 是我自定义的代表板子的型号
TKCC则是需要的交叉编译工具,aarch64-linux-gnu-gcc如果存在,要写成aarch64-linux-gnu-才能成功
然后添加了CROSS_COMPILE
这些试出来,真的心累!