SEEWO SV21 RK3568 刷机折腾

SEEWO SV21 RK3568 刷机折腾
狂犬主子SEEWO SV21 RK3568 是希沃录播机的主板,带双网口(其中一个支持POE,另外两个网口为麦克风)、3个HDMI(1xIn,2xOut)、1个USB3.0端口、2个USB2.0端口、1个SATA接口(5V)等,采用12V DC5521 电源输入,2G RAM + 4G ROM,原厂预装系统为 4.19 内核的 Buildroot,目前开源DTS暂不完善。


一些资源
-
原厂固件TTL波特率:115200
-
其他RK系统TTL波特率:1500000
-
U-Boot:https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/seewo-sv21
-
Ophub Armbian 固件:https://github.com/ophub/amlogic-s9xxx-armbian
-
Ophub OpenWrt 固件:https://github.com/ophub/amlogic-s9xxx-openwrt
-
RK33XX/RK35XX系列设备启动流程、写入系统及编译流程:https://github.com/ophub/amlogic-s9xxx-armbian/discussions/1634
-
瑞芯微 RK 系列芯片启动流程简析:https://www.w568w.eu.org/rockchip-boot-process.html
-
SV21 All In Boom:https://www.bilibili.com/opus/961259216355459077
目前建议使用卖家提供的 Armian 固件,其他固件要么识别不了双网卡,要么识别不了SATA,要么连关机都管不掉,要么 CPU/GPU/NPU 无法频率有问题。
RockChip 启动流程:https://opensource.rock-chips.com/wiki_Boot_option
原厂分区表
1 | [root@SV21:/]# fdisk -l Found valid GPT with protective MBR; using GPT Disk /dev/mmcblk0: 7733248 sectors, 3776M Logical sector size: 512 Disk identifier (GUID): ac5b0000-0000-4f31-8000-2d0900006325 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 7733214 Number Start (sector) End (sector) Size Name 1 16384 24575 4096K uboot 2 24576 32767 4096K misc 3 32768 98303 32.0M boot 4 98304 163839 32.0M recovery 5 163840 229375 32.0M backup 6 229376 2326527 1024M rootfs 7 2326528 4423679 1024M oem 8 4423680 7733214 1615M userdata |
刷机教程
首先需要准备好一台好用的电脑和:
-
RK3568开发板
-
12V5521电源
-
双公头USB线
如果没有双公头USB线的话,可以找一个Type-C母转USB公的转换器,然后用手机数据线连接即可。或者自行找两个坏鼠标啥的,给USB线剪断然后自己DIY一根。
-
USB转TTL线(非必须)
下载系统镜像并解压,解压后的文件后缀名应为img
电脑安装瑞芯微的驱动:
DriverAssitant_v4.8.zipDriverAssitant_v5.1.1.zip
实际可能两个版本都要同时安装,否则进入MASKROM后会出现无法识别USB设备的错误。
驱动安装后,下载瑞芯微开发工具并解压,建议使用2.8.X版本刷机工具。
RKDevTool.7z
下面是刷机过程:
在刷机前,建议解压好固件为img格式,运行好RK开发工具,避免无法识别。
首先需要进入LOADER模式,如果您的刷机包非统一固件 update.img 类型的(如Armbian、OpenWrt),需要从LOADER模式进入MASKROM模式才能下载到EMMC。

打开刷机工具,界面应为

system 的地址是 0x00000000 意思是从开头覆盖 eMMC 中的数据
Loader 的地址 0xCCCCCCCC 是一个保留地址,用于指示工具发送loader文件

注:刷armbian和openwrt固件需用名为rk356x_spl_loader_ddr1056_v1.12.109_no_check_todly.bin的loader文件。


如按键后加电无法进入LOADER模式请使用硬件短接方式直接进入MASKROM模式后刷机。


注:MASKROM短接点在散热片下方的板子背面,很小的两个铜触点(根据方便文件表示判断)
短接进入MASKROM刷机模式方法:用镊子或其他金属导体短接后不送手,然后加电,2秒后松开短接点即可进入MASKROM模式(一般听到电脑发现硬件提示音就可以松开短接)
此时,点击下方的执行按钮,就会开始强刷流程。如果遇到读取boot失败错误,请强制重启设备并重新执行上述流程。
线刷不成功可能是由于3个原因造成:
- 线刷包损坏。(云编译的固件可能存在此问题)
- 刷入损坏的线刷包导致的分区信息丢失。(解决方案:可以通过bin文件重建)
- 刷机工具因为某种奇怪的原因,无法刷入固件。(解决方案:重新解压一组刷机工具、更换USB接口或直接更换较老的电脑)
Android刷机方法
安卓需要8G ROM,本人的为 4G ROM,暂不支持刷安卓
刷原厂固件需要使用此方法,建议在刷之前点击 擦除Flash。
由于网盘提供的是Android11升级包形式兼容固件,所以刷机特别简单。
首先打开刷机工具,进入loader模式(MASKROM模式也可以)然后按下图即可完成刷机。
刷机过程所有固件均要是解压后的img后缀镜像文件
刷机过程所有固件均要是解压后的img后缀镜像文件
刷机过程所有固件均要是解压后的img后缀镜像文件



安装 Ubuntu Base
如果您需要使用到 GPU / NPU 等硬件功能,由于目前DTS不完善,不想使用开源内核,可以在原厂固件的基础上替换掉 Buildroot rootfs,无需重新编译内核,功能包好。不过 Rockchip 内核对 Docker 支持不完善,这种方法仅供嵌入式开发生产环境使用。
制作镜像
首先需要准备一个 Linux 构建环境,这里使用 Ubuntu / Debian 都可以,务必使用相近的版本,不然后面无法扩容。这里使用 x86 架构的处理器,需要通过转译的方式 chroot 运行 arm64 的 apt。
下载 Ubuntu Base 的 arm64 镜像,建议不要用新版本,因为原厂固件 4.19 内核较老,避免运行软件出现问题。这边使用 20.04 LTS 版本。
1 | # 安装构建rootfs所需的工具 sudo apt install qemu-user-static wget wget https://mirror.nju.edu.cn/ubuntu-cdimage/ubuntu-base/focal/daily/current/focal-base-arm64.tar.gz # 解压Ubuntu Base mkdir -p ubuntu_rootfs sudo tar xzvf focal-base-arm64.tar.gz -C ubuntu_rootfs/ # 由于是x86环境,需要通过转译才能运行arm64的应用 sudo cp /usr/bin/qemu-aarch64-static ubuntu_rootfs/usr/bin/ # 必须设置DNS,不然chroot无法联网 echo -e "nameserver 223.5.5.5\nnameserver 119.29.29.29" | sudo tee ubuntu_rootfs/etc/resolv.conf # echo -e "[Resolve]\nDNS=223.5.5.5 119.29.29.29" | sudo tee ubuntu_rootfs/etc/systemd/resolved.conf # 更换国内源 sudo sed -i 's/\(archive\|security\|ports\)\.ubuntu\.com/mirrors.aliyun.com/g' ubuntu_rootfs/etc/apt/sources.list sudo sed -i 's/\(archive\|security\|ports\)\.ubuntu\.com/mirrors.aliyun.com/g' ubuntu_rootfs/etc/apt/sources.list.d/* # 拷入SSH公钥,以便免密登录(请替换成自己的公钥) sudo mkdir -p ubuntu_rootfs/root/.ssh sudo chmod 700 ubuntu_rootfs/root/.ssh echo "ssh-rsa AAAAAAABBBBBBBCCCCCCCC" | sudo tee -a ubuntu_rootfs/root/.ssh/authorized_keys sudo chmod 600 ubuntu_rootfs/root/.ssh/authorized_keys # 挂载本机文件系统 sudo mount -t proc /proc ubuntu_rootfs/proc sudo mount -t sysfs /sys ubuntu_rootfs/sys sudo mount -o bind /dev ubuntu_rootfs/dev # 进入rootfs sudo chroot ubuntu_rootfs/ /bin/bash |
此时我们需要对系统进行一些定制,可以根据个人喜好自行调整。
1 | # 更新软件包列表 apt update # 更新系统 apt dist-upgrade -y # 安装必要的软件包 apt install nano openssh-server iputils-ping sudo iproute2 ifupdown init dbus udev kmod --no-install-recommends -y # 安装常用工具 apt install curl wget tzdata bash-completion ethtool net-tools usbutils vim ca-certificates --no-install-recommends -y # 清理缓存 apt clean rm -rf /var/lib/apt/lists/* # 更改默认root密码,以便 TTL 登录 passwd # 退出chroot history -c && exit |
接下来我们打包、清理一下镜像。
1 | # 卸载挂载的本机文件系统 sudo umount ubuntu_rootfs/proc sudo umount ubuntu_rootfs/sys sudo umount ubuntu_rootfs/dev # 制作img刷机镜像 dd if=/dev/zero of=ubuntu_rootfs.img bs=1M count=2048 oflag=direct status=progress sudo mkfs.ext4 ubuntu_rootfs.img mkdir -p ubuntu_base_rootfs sudo chmod 777 ubuntu_base_rootfs sudo mount ubuntu_rootfs.img ubuntu_base_rootfs sudo cp -rfp ubuntu_rootfs/* ubuntu_base_rootfs/ sudo umount ubuntu_base_rootfs/ sudo e2fsck -p -f ubuntu_rootfs.img sudo resize2fs -M ubuntu_rootfs.img # 清理制作缓存 sudo rm -rf ubuntu_base_rootfs/ sudo rm -rf ubuntu_rootfs/ |
此时我们就可以将 ubuntu_rootfs.img 烧录到 EMMC 的 rootfs 分区了。
烧录镜像
进入 Loader / MaskROM 模式,电脑上打开开发工具,选择下载镜像,点击查看设备分区表,将 ubuntu_rootfs.img 刷入到对应 rootfs 的地址(0x00038000)。刷机完成后会自动重启,建议提前连接好 TTL。

初始化系统
由于 u-boot 设置启动参数不通过显示器输出tty,需要通过 TTL 登录系统,执行以下命令初始化用户环境:
1 | # 设置时区 timedatectl set-timezone Asia/Shanghai # 设置主机名 hostnamectl set-hostname sv21 # 设置网卡 tee /etc/network/interfaces <<'EOF' auto lo iface lo inet loopback auto eth1 iface eth1 inet dhcp #auto enxbc6bff423336 #iface enxbc6bff423336 inet dhcp EOF systemctl restart networking |
备注:默认DNS由systemd-resolved管理。
默认 rootfs 分区为 2G 或 1G,如果不够用,可以使用 cfdisk 删除 oem 和 userdata 分区,然后给 rootfs 分区扩容(resize)。
1 | # 删除 oem 和 userdata 分区 cfdisk /dev/mmcblk0 # 扩容分区 df -h losetup /dev/loop0 /dev/mmcblk0p6 resize2fs /dev/loop0 losetup -d /dev/loop0 reboot |
已知问题
-
enxbc6bff423336这张网卡(非PoE的那个口)DHCP 开机会卡半天。 -
经过测试发现此内核缺少对 Docker 的支持。
1 | root@localhost:~# bash check-config.sh info: reading kernel config from /proc/config.gz ... Generally Necessary: - cgroup hierarchy: properly mounted [/sys/fs/cgroup] - CONFIG_NAMESPACES: enabled - CONFIG_NET_NS: enabled - CONFIG_PID_NS: enabled - CONFIG_IPC_NS: enabled - CONFIG_UTS_NS: enabled - CONFIG_CGROUPS: enabled - CONFIG_CGROUP_CPUACCT: enabled - CONFIG_CGROUP_DEVICE: enabled - CONFIG_CGROUP_FREEZER: enabled - CONFIG_CGROUP_SCHED: enabled - CONFIG_CPUSETS: enabled - CONFIG_MEMCG: missing - CONFIG_KEYS: enabled - CONFIG_VETH: missing - CONFIG_BRIDGE: missing - CONFIG_BRIDGE_NETFILTER: missing - CONFIG_IP_NF_FILTER: missing - CONFIG_IP_NF_MANGLE: enabled - CONFIG_IP_NF_TARGET_MASQUERADE: missing - CONFIG_NETFILTER_XT_MATCH_ADDRTYPE: missing - CONFIG_NETFILTER_XT_MATCH_CONNTRACK: missing - CONFIG_NETFILTER_XT_MATCH_IPVS: missing - CONFIG_NETFILTER_XT_MARK: missing - CONFIG_IP_NF_NAT: missing - CONFIG_NF_NAT: missing - CONFIG_POSIX_MQUEUE: missing - CONFIG_NF_NAT_IPV4: missing - CONFIG_NF_NAT_NEEDED: missing - CONFIG_CGROUP_BPF: missing Optional Features: - CONFIG_USER_NS: enabled - CONFIG_SECCOMP: enabled - CONFIG_SECCOMP_FILTER: enabled - CONFIG_CGROUP_PIDS: missing - CONFIG_MEMCG_SWAP: missing - CONFIG_MEMCG_SWAP_ENABLED: missing - CONFIG_IOSCHED_CFQ: enabled - CONFIG_CFQ_GROUP_IOSCHED: missing - CONFIG_BLK_CGROUP: missing - CONFIG_BLK_DEV_THROTTLING: missing - CONFIG_CGROUP_PERF: missing - CONFIG_CGROUP_HUGETLB: missing - CONFIG_NET_CLS_CGROUP: missing - CONFIG_CGROUP_NET_PRIO: missing - CONFIG_CFS_BANDWIDTH: enabled - CONFIG_FAIR_GROUP_SCHED: enabled - CONFIG_IP_NF_TARGET_REDIRECT: missing - CONFIG_IP_VS: missing - CONFIG_IP_VS_NFCT: missing - CONFIG_IP_VS_PROTO_TCP: missing - CONFIG_IP_VS_PROTO_UDP: missing - CONFIG_IP_VS_RR: missing - CONFIG_SECURITY_SELINUX: missing - CONFIG_SECURITY_APPARMOR: missing - CONFIG_EXT4_FS: enabled - CONFIG_EXT4_FS_POSIX_ACL: enabled - CONFIG_EXT4_FS_SECURITY: enabled - Network Drivers: - "overlay": - CONFIG_VXLAN: missing - CONFIG_BRIDGE_VLAN_FILTERING: missing Optional (for encrypted networks): - CONFIG_CRYPTO: enabled - CONFIG_CRYPTO_AEAD: enabled - CONFIG_CRYPTO_GCM: enabled - CONFIG_CRYPTO_SEQIV: enabled - CONFIG_CRYPTO_GHASH: enabled - CONFIG_XFRM: enabled - CONFIG_XFRM_USER: enabled - CONFIG_XFRM_ALGO: enabled - CONFIG_INET_ESP: missing - CONFIG_NETFILTER_XT_MATCH_BPF: missing - CONFIG_INET_XFRM_MODE_TRANSPORT: missing - "ipvlan": - CONFIG_IPVLAN: missing - "macvlan": - CONFIG_MACVLAN: missing - CONFIG_DUMMY: missing - "ftp,tftp client in container": - CONFIG_NF_NAT_FTP: missing - CONFIG_NF_CONNTRACK_FTP: missing - CONFIG_NF_NAT_TFTP: missing - CONFIG_NF_CONNTRACK_TFTP: missing - Storage Drivers: - "btrfs": - CONFIG_BTRFS_FS: missing - CONFIG_BTRFS_FS_POSIX_ACL: missing - "overlay": - CONFIG_OVERLAY_FS: missing - "zfs": - /dev/zfs: missing - zfs command: missing - zpool command: missing Limits: - /proc/sys/kernel/keys/root_maxkeys: 1000000 |
编译 kmod 驱动
由于本人有使用 ch340 USB转TTL线的需求,直接连接模块发现无法识别,经过排查发现是因为 Buildroot 内核缺少 ch340 驱动导致的。幸好可以使用 kmod 的方式加载模块。
参考:https://blog.yaria.top/posts/dad8e69b
-
获取内核详细信息:
1
2
3
4
5root@sv21:~# uname -a Linux sv21 4.19.172-ab92 #1 SMP Fri Feb 24 16:05:46 CST 2023 aarch64 aarch64 aarch64 GNU/Linux root@sv21:~# cat ^C root@sv21:~# cat /proc/version Linux version 4.19.172-ab92 (slave@lubo-server) V1.1.18.863330_b427e0cbd2ef_VBBoard (gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05), GNU ld (Linaro_Binutils-2017.05) 2.27.0.20161019) #1 SMP Fri Feb 24 16:05:46 CST 2023
-
准备编译环境,这里在 Ubuntu 20.04 LTS x86_64 虚拟机下交叉编译。
-
安装构建工具:
1
2
3sudo apt update sudo apt install build-essential git python2 bison flex libncurses-dev libssl-dev sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
测试交叉编译器是否安装成功:
1
aarch64-linux-gnu-gcc --version执行后如果输出类似
aarch64-linux-gnu-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0,说明安装成功。 -
获取内核源码,这里使用瑞芯微官方的内核源码,避免折腾 kernel.org 主线内核。
1
2
3# 下载对应内核源码 git clone https://gh.xrgzs.top/https://github.com/rockchip-linux/kernel.git -b develop-4.19 --depth 1 cd kernel
-
需要注意的是,这个内核的版本虽然都是4.19,但实际上只是差不多,并非完全相同,我们需要修改
Makefiles将内核版本改为一致。1
2
3
4
5
6
7vim Makefile # 找到: VERSION = 4 PATCHLEVEL = 19 SUBLEVEL = 172 # 这里改成 172 EXTRAVERSION = -ab92 # 必须加这个后缀! # 保存退出
否则,会出现以下错误:
1
2
3root@sv21:~# insmod ch341.ko [ 3305.113286] ch341: version magic '4.19.232 SMP mod_unload aarcinsmod: ERROR: could not insert module ch341.ko: Invalid module format root@sv21:~# h64' should be '4.19.172-ab92 SMP mod_unload aarch64'
-
配置内核,编译
ch341.ko。1
2
3
4
5
6
7
8# 配置RK3568默认配置 make ARCH=arm64 rockchip_linux_defconfig # 开启CH341模块编译 make ARCH=arm64 menuconfig # 勾选 Device Drivers→USB→USB Serial→CH341 (M模式) # 准备模块编译环境 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_prepare # 单独编译ch341.ko make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- M=drivers/usb/serial ch341.ko
menuconfig那里超级难选,下面给出具体截图:


-
编译完成后会在
drivers/usb/serial目录下生成ch341.ko模块文件。
-
将其复制到 SV21 上的
/lib/modules/4.19.172-ab92/kernel/drivers/usb/serial/目录下,然后执行depmod -a更新模块依赖,最后使用modprobe ch341加载模块即可。1
2
3
4mkdir -p /lib/modules/4.19.172-ab92/kernel/drivers/usb/serial wget http://10.0.1.111:8080/ch341.ko -O /lib/modules/4.19.172-ab92/kernel/drivers/usb/serial/ch341.ko depmod -a modprobe ch341
未完待续…





