RK3568 Debian调试记录
文章目录
- 1、环境介绍
- 2、前言
- 3、debian目录结构
- 3.1、脚本调用顺序
- 4、编译debian
- 4.1、构建debian编译所需的环境
- 4.2、编译debian
- 4.3、打包
- 5、系统启动
- 6、debian适配
- 6.1、新增板级配置单
- 6.2、USB
- 6.3、Wi-Fi / BT
- 6.4、屏幕旋转
- 6.5、触摸旋转
- 6.6、时钟
- 7、测试
- 8、总结
1、环境介绍
硬件:飞凌ok3568-c开发板
软件:原厂rk356x sdk
2、前言
rk不仅支持buildroot,还支持debian。所以本文将记录适配debian的过程。
3、debian目录结构
在sdk里,有一个debian目录,主要存放用于构建debian系统所需的文件:
cohen@ubuntu:~/platform/rk356x-sdk/debian$ tree -L 1
.
├── mk-base-debian.sh
├── mk-image.sh
├── mk-iso-debian.sh
├── mk-rootfs-bullseye.sh
├── mk-rootfs.sh
├── overlay
├── overlay-debug
├── overlay-firmware
├── packages
├── packages-patches
├── post-build.sh
├── readme.md
├── scripts
└── ubuntu-build-service
mk-base-debian.sh
:配置编译基础系统镜像,最后生成一个linaro-bullseye-alip-20250421-1.tar.gz。
mk-image.sh
:用于生成最终的系统镜像文件。
mk-iso-debian.sh
:用于生成 Debian 的 ISO 镜像文件。
mk-rootfs-bullseye.sh
:解压linaro-bullseye-alip-20250421-1.tar.gz,完善构建rootfs。
mk-rootfs.sh
:实际也是调用mk-rootfs-bullseye.sh。
overlay
:包含一些覆盖文件,用于在构建过程中覆盖或添加到目标文件系统中。
overlay-debug
:包含一些覆盖文件,用于在构建过程中覆盖或添加到目标文件系统中。
overlay-firmware
:包含一些覆盖文件,用于在构建过程中覆盖或添加到目标文件系统中。
packages
:包含预编译的 Debian 包,这些包在构建过程中会被安装到目标文件系统中。
packages-patches
:包含用于修补软件包的补丁文件。
post-build.sh
:在构建完成后执行的脚本,用于进行一些清理或额外的配置。
readme.md
:使用说明。
scripts
:包含一些辅助脚本,用于执行特定任务。
ubuntu-build-service
:包含用于构建 Ubuntu 系统的配置和服务文件。
3.1、脚本调用顺序
从<sdk>/common/build-hooks/30-rootfs.sh
脚本的build_debian()函数作为起始来看的话,脚本的调用顺序如下:
30-rootfs.sh check-debian.sh # 检查当前环境是否满足构建 Debian Live 镜像的依赖条件mk-base-debian.sh # 配置编译基础系统镜像,最后生成一个linaro-bullseye-alip-20250421-1.tar.gzmk-rootfs-bullseye.sh # 解压linaro-bullseye-alip-20250421-1.tar.gz,完善rootfsmk-image.sh # 生成最终的系统镜像文件./post-build.sh../device/rockchip/common/post-build.sh
4、编译debian
4.1、构建debian编译所需的环境
cohen@ubuntu:~/platform/rk356x-sdk/$ sudo dpkg -i debian/ubuntu-build-service/packages/*
cohen@ubuntu:~/platform/rk356x-sdk/$ sudo apt-get install -f
4.2、编译debian
cohen@ubuntu:~/platform/rk356x-sdk/$ ./build.sh debian
4.3、打包
编译成功后,执行如下命令打包成烧录镜像:
cohen@ubuntu:~/platform/rk356x-sdk/$ ./build.sh firmware
5、系统启动
将新的镜像烧录到板卡,可以看到系统正常启动:
6、debian适配
以下只是列出在适配过程中需要完善的项。对于片上外设来说,之前buildroot适配的大部分东西是可以直接用的。对于芯片自带的硬件,rk提供的debian也早已做好了适配。
6.1、新增板级配置单
RK SDK 提供了多种版本的 Debian 系统,适用于不同的硬件平台和需求。这些版本可以根据功能和架构分为以下几类:
功能版本:
- base:基础版本(也带桌面了)。
- gnome:桌面版本,使用 GNOME 桌面环境。
- xfce:桌面版本,使用 XFCE 桌面环境。
- lxde:桌面版本,使用 LXDE 桌面环境。
架构版本:
- arm64:适用于 64 位 ARM 架构的处理器,如 RK3568、RK3588 等。
- armhf:适用于 32 位 ARM 架构的处理器,支持硬件浮点运算。
所以这里为这四种不同功能版本的debian系统分别创建一个配置单,结果如下图:
其实也没做什么,这4个不同的配置单只是用来选择配置编译哪一个debian基础系统镜像,以forlinx_rk3568_c_debian_desktop_defconfig
和forlinx_rk3568_c_debian_base_defconfig
为例:
这几个宏变量来自sdk menuconfig,需自行在/common/configs/下定义。如:
然后根据自己的需求修改debian相关的构建脚本即可。这里列出我的修改:
mk-rootfs:
mk-base-debian.sh:
mk-rootfs-bullseye.sh:
6.2、USB
鼠标键盘正常。
插入U盘后,可以正常识别,但没有自动挂载。这里添加一个udev规则文件来实现自动挂载和卸载u盘。这里折腾了两个晚上,udev规则文件调用的挂载脚本中的挂载命令要使用systemd-mount,不能使用mount。
最终的udev规则文件/etc/udev/rules.d/99-usb-mount.rules如下:
ACTION=="add",KERNEL=="sd*",SUBSYSTEM=="block",ENV{ID_FS_TYPE}!="",ENV{label_uuid_name}="%k", RUN+="/usr/local/bin/auto-mount.sh add /dev/%k %E{label_uuid_name}"
ACTION=="remove",KERNEL=="sd*",SUBSYSTEM=="block",ENV{ID_FS_TYPE}!="",ENV{label_uuid_name}="%k", RUN+="/usr/local/bin/auto-mount.sh remove /dev/%k %E{label_uuid_name}
挂载卸载脚本/usr/local/bin/auto-mount.sh如下:
#!/bin/sh
{
echo "=======$(date)======="
echo "Action: $1 | Device: $2 | MINOR: $3"if [ $# -ne 3 ]; thenexit 1
fiexport XDG_RUNTIME_DIR=/run/user/0MAJOR_PATH=/media
MINOR_PATH=$3if [[ ! -b "$2" && "$1" == "add" ]]; thenecho "ERROR: Device $2 not found after checks!"exit 2
fi
if [ "$1" = "add" ]; thenmkdir -p $MAJOR_PATH/$MINOR_PATH/usr/bin/systemd-mount -o relatime,sync --no-block --collect $2 $MAJOR_PATH/$MINOR_PATH 2>&1if [ $? -ne 0 ]; thenrmdir $MAJOR_PATH/$MINOR_PATHfi
# udisksctl mount -b "$2" --no-user-interaction 2>&1
elif [ "$1" = "remove" ]; thenif [ -d $MAJOR_PATH/$MINOR_PATH ]; then/usr/bin/systemd-mount --umount $MAJOR_PATH/$MINOR_PATHrmdir $MAJOR_PATH/$MINOR_PATHfi
# udisksctl unmount -b "$2" 2>&1
fi
echo "Exit Code: $?"
} >> /tmp/mount.log 2>&1
参考文章:https://blog.csdn.net/m0_69014205/article/details/147076378?spm=1001.2014.3001.5502
6.3、Wi-Fi / BT
无线wifi/bt模块用的海华awcm358sm。实测debian系统启动后没有自动加载驱动。这里需要把内核模块安装到debian rootfs,然后设置开启自动加载驱动。
- 将内核模块安装到debian rootfs:
run_command $KMAKE modules_install INSTALL_MOD_PATH=$RK_SDK_DIR/debian/overlay/usr
- 在debian系统中,
/etc/modules-load.d/
是一个用于配置内核模块在启动时自动加载的目录。在该目录下创建一个modules.conf,并填写开机启动时要加载的驱动。:
/lib/systemd/systemd-modules-load.service
服务在系统启动时会读取modules-load.d下的所有配置文件,并根据文件中的列表加载指定的内核模块。
这里可以稍微介绍一下,是如何找到moal.ko的。实际就像平时执行modprobe xx.ko命令时,会先在/lib/modules/$(uname -r)/
目录下找到modules.alias.bin和module.dep.bin。里面记录驱动的依赖关系和存储位置。如下是module.dep的内容(module.dep.bin是module.dep的二进制文件):
6.4、屏幕旋转
目前适配所使用debian的桌面环境为xfce,使用的是X11显示架构。对于屏幕旋转,修改/etc/X11/xorg.conf.d/20-modesetting.conf
:
可选值:normal、left、right、inverted
6.5、触摸旋转
屏幕旋转后,鼠标是可以正常使用的。但触摸的旋转还需要修改:
sudo cp /usr/share/X11/xorg.conf.d/40-libinput.conf /etc/X11/xorg.conf.d/
sudo vi /etc/X11/xorg.conf.d/40-libinput.conf
Option "CalibrationMatrix" "-1 0 1 0 -1 1 0 0 1" # 180度旋转
6.6、时钟
现在的时间比北京时间少8小时。需要设置时区。直接修改配置脚本:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
关于适配先到此为止,后续有其它内容再补充。
7、测试
进入系统时的桌面:
网络:
小破站播放视频:
蓝牙:
目前使用笔记本电脑配对测试不成功。到时候使用安卓手机再试试。
8、总结
嵌入式Linux学习交流群:424571391
本人也是第一次接触发行版linux。可能对于一些测试指标有所忽略,欢迎指点。另一方面是rk对debian的支持已经很完善了,规避了很多问题。后面会继续移植ubuntu,更全面的体验发行版linux的移植过程。