rk3568主线Linux内核(linux-6.4.2)移植

rk3568的主线Linux内核,cpu厂商已经完成了大部分工作,我们这种周边玩家其实就是根据自己板卡的硬件,把设备树文件(dts)添加上,适配自己的板卡,当然也会遇到一些问题。
板卡使用鲁班猫LubanCat2N

1. 下载和配置交叉编译工具链

arm官网下载交叉编译工具链
https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
下载版本arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
解压

sudo tar -xf arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt

配置环境变量

export PATH=/opt/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH

2. 下载和编译Linux内核源码

https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/
版本linux-6.4.2.tar.xz
解压

tar -xf linux-6.4.2.tar.xz
cd linux-6.4.2

添加自己修改的rk3568-lubancat-2n.dts文件到arch/arm64/boot/dts/rockchip/目录下,
并修改arch/arm64/boot/dts/rockchip/Makefile文件,添加
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-lubancat-2n.dtb
使内核编译的时候可以编译到该板卡的dts。

其实主线内核已经支持rk3568-lubancat-2.dts,这个板卡与lubancat-2n只是有些少同,如pcie使用的接口,
我只是在rk3568-lubancat-2.dts的基础上修改pcie的配置,来得到rk3568-lubancat-2n.dts。

交叉编译:

make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- distclean
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc)

编译成功后生成的内核镜像文件Image在/home/ufo/arm/rk3568/linux-6.4.2/arch/arm64/boot/目录下
rk3568-lubancat-2n.dtb设备树文件在/home/ufo/arm/rk3568/linux-6.4.2/arch/arm64/boot/dts/rockchip/目录下
这两个文件是uboot加载启动内核时需要的。

3. uboot加载和启动内核

使用uboot的tftpboot命令加载内核进行测试
上电启动开发板,ctrl + c 进入uboot命令行,配置uboot网络,使uboot可以ping通主机

setenv serverip 192.168.1.2;setenv ipaddr 192.168.1.20;ping 192.168.1.2

配置uboot环境变量,传递内核参数:

setenv bootargs console=ttyS2,1500000 earlycon=uart8250,mmio32,0xfe660000 root=/dev/sda1 rootfstype=ext4 rw rootwait

这里使用U盘作为根文件系统存储介质,ext4分区格式,根文件系统存放在U盘只是方便平时自己调试。
加载并启动内核。
加载并启动内核:

tftpboot 0x0027f800 Image;tftpboot 0x08300000 rk3568-lubancat-2n.dtb;booti 0x0027f800 - 0x08300000

成功后进入到根文件系统的命令行。

4. RTL8125BG网卡加载方法

鲁班猫LubanCat2N板载两块pcie接口的RTL8125BG网卡,
驱动要编译成模块,并安装到根文件系统,系统启动后加载。因为经过测试,把RTL8125BG驱动直接编译进内核会导致其中一个网卡识别失败,可能原因是固件加载时机不对,或者是驱动时机加载不对导致,因为内核有些模块驱动是相互依赖的。
Linux内核模块编译安装方法:

make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc) modules
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- modules_install INSTALL_MOD_PATH=xxx_rootfs

xxx_rootfs就是板卡根文件系统的路径,根据自己实际情况修改。
板卡启动进入根文件系统命令行后执行RTL8125BG网卡模块加载:

  modprobe r8169
  cat /proc/net/dev

可以查看驱动是否加载成功,加载成功会生成新的设备节点,然后通过ifconfig配置网络,并执行ping判断网卡是否可用。

5. HDIM显示问题。

调试过程发现HDIM没有输出,且内核打印的错误信息:

vop2_isr: 776977 callbacks suppressed rockchip-drm display-subsystem:
[drm] ERROR POST_BUF_EMPTY irq err at vp0

经过分析dts文件的rk3568的hdmi配置又没有问题,内核rk3568的hdmi驱动视乎也没问题…漫长的分析问题原因…
后来发现,启动时先不插上hdmi线,即先不连接显示器,等板卡进入到根文件系统,然后再接上hdmi,这时显示器居然有显示了,内核也没有打印错误了,但是总不能每次启动都先把hdmi显示器断开连接,等进入系统后再插上,不现实。
根据这些现象分析,估计是hdmi的驱动加载时机不对导致,还有通过i2c接口读取显示器的edid可能也是原因。大概原因找到了那就尝试解决,看看修改Linux内核rk3568 hdmi的驱动加载时机是否能解决问题。
查看rockchip的gpu/drm驱动源码,修改文件drivers/gpu/drm/rockchip/rockchip_drm_drv.c

module_init(rockchip_drm_init);
修改为
late_initcall_sync(rockchip_drm_init);
编译内核,重新启动板卡加载修改后的内核…可以放松下了,问题居然解决了,hdmi接口的显示器有显示了。
具体原因就没有进一步细究了,有些内核模块驱动是相互依赖的,驱动加载时机导致的。
经过对比测试rockchip官方提供的sdk里的内核源码(版本linux-4.19.232)就没有这个问题,具体官方修改了驱动的什么地方也还没空去细究。

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值