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暂不完善。

正面

反面

一些资源

目前建议使用卖家提供的 Armian 固件,其他固件要么识别不了双网卡,要么识别不了SATA,要么连关机都管不掉,要么 CPU/GPU/NPU 无法频率有问题。

RockChip 启动流程:https://opensource.rock-chips.com/wiki_Boot_option

原厂分区表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[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.zip
  • DriverAssitant_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个原因造成:

  1. 线刷包损坏。(云编译的固件可能存在此问题)
  2. 刷入损坏的线刷包导致的分区信息丢失。(解决方案:可以通过bin文件重建)
  3. 刷机工具因为某种奇怪的原因,无法刷入固件。(解决方案:重新解压一组刷机工具、更换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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 安装构建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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 更新软件包列表
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 卸载挂载的本机文件系统
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 设置时区
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
2
3
4
5
6
7
8
9
# 删除 oem 和 userdata 分区
cfdisk /dev/mmcblk0

# 扩容分区
df -h
losetup /dev/loop0 /dev/mmcblk0p6
resize2fs /dev/loop0
losetup -d /dev/loop0
reboot

已知问题

  1. enxbc6bff423336 这张网卡(非PoE的那个口)DHCP 开机会卡半天。

  2. 经过测试发现此内核缺少对 Docker 的支持。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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. 获取内核详细信息:

    1
    2
    3
    4
    5
    root@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
  2. 准备编译环境,这里在 Ubuntu 20.04 LTS x86_64 虚拟机下交叉编译。

  3. 安装构建工具:

    1
    2
    3
    sudo 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,说明安装成功。

  4. 获取内核源码,这里使用瑞芯微官方的内核源码,避免折腾 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
  5. 需要注意的是,这个内核的版本虽然都是4.19,但实际上只是差不多,并非完全相同,我们需要修改 Makefiles 将内核版本改为一致。

    1
    2
    3
    4
    5
    6
    7
    vim Makefile
    # 找到:
    VERSION = 4
    PATCHLEVEL = 19
    SUBLEVEL = 172 # 这里改成 172
    EXTRAVERSION = -ab92  # 必须加这个后缀!
    # 保存退出

    否则,会出现以下错误:

    1
    2
    3
    root@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'
  6. 配置内核,编译 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那里超级难选,下面给出具体截图:

  7. 编译完成后会在 drivers/usb/serial 目录下生成 ch341.ko 模块文件。

  8. 将其复制到 SV21 上的 /lib/modules/4.19.172-ab92/kernel/drivers/usb/serial/ 目录下,然后执行 depmod -a 更新模块依赖,最后使用 modprobe ch341 加载模块即可。

    1
    2
    3
    4
    mkdir -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

未完待续…