Tinker Board 2S 折腾

 · 4 分钟
Last updated: 2022-11-08
Table of contents

WIP

TinkerBoard2

这是出于某种原因从网友手上收来的一块板子,很漂亮,看着也很强悍。但是吧,官方支持的内核、RootFS什么的都挺老的(opinioned),实在满足不了我折腾的需求。

相关文档与代码资料

除了使用说明 1,还可以看一下 Schematics 2。Armbian 3 最近(2022-11-08)也有开发者在投入资源适配。

这个板子的调试串口藏得真好……我直接忽略了 (藏在USB之间) 。

研究路径

  • rk3399 启动流程 (官方wiki其它地方也能看看)
    • http://opensource.rock-chips.com/wiki_Boot_option
    • 不能指望 Asus 能做什么, 除了他们那个系统 (TinkerOS) , 不过我是不用的
  • 一个不错的研究笔记

原版 TinkerOS 说明

U-Boot

Arm64 启动时涉及到 ATF (Arm Trusted Firmware), 这里先提一嘴, 也就是要注意下启动流程

Tinker Board 2S 的 U-Boot 改自 Rockchip 维护的版本, 默认调试接口的波特率是 115200

RK3399 优先从 eMMC 启动, 因此为了更方便地测试 uboot, 必须把 eMMC 上的 uboot 破 坏掉

所以我在 uboot 里执行了下面的指令, 然后我就能愉快地从 SD 卡启动了。

# 0x40 是 SPL/TPL(idbloader.img)的起址
mmc erase 0x40 2

Kernel

版本 4.4 没得说, 毕竟 BSP 给的就是 4.4, 晚点给它干上去我做不到

自行构建 u-boot、kernel、rootfs

ATF(TF-A)

一个初始化设备和EL2的程序(大概吧,不太懂)。

git clone https://github.com/ARM-software/arm-trusted-firmware.git
cd arm-trusted-firmware
make realclean
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3399

U-Boot

需要适配(写设备树、调整驱动)。看了下 Armbian 最近(2022-11-08)的commit,适配工作正在有序进行(而我只是勉强能明白他们的补丁想干嘛)。 u-boot版本为2022.07。

目前(2022-11-08)看来,HDMI、USB都有点问题。通过修改配置,可以轻松地使用 SPI NOR Flash 存放 u-Boot,这样就不依赖 外置存储器了。

如何配置暂时不记录。编译成功后生成适用于 flashrom 的脚本如下:

import subprocess
# gen spi image
subprocess.run(["tools/mkimage", "-n", "rk3399", '-T', 'rkspi', '-d', 'tpl/u-boot-tpl.bin:spl/u-boot-spl.bin', 'idbloader-spi.img'])
# LOAD
## load spi tpl/spl
with open('idbloader-spi.img', 'rb') as f:
    tplspl = f.read()
## load itb
with open('u-boot.itb', 'rb') as f:
    uboot = f.read()
## CONCATENATE
### offset in KB
FIT_OFFSET = 512  # 这里请根据设备树配置项目 `u-boot,spl-payload-offset' 和 `CONFIG_SYS_SPI_FLASH_U_BOOT_OFFS' 等配置进行修改
FLASH_SIZE = 8192  # Flash 大小,只提供rom数据的情况下,flashrom要求rom数据和rom大小一致。
FIT_OFFSET_BYTES = FIT_OFFSET * 1024
FLASH_SIZE_BYTES = FLASH_SIZE * 1024
data = tplspl + bytes([0xff for i in range(FIT_OFFSET_BYTES - len(tplspl))])
data = data + uboot + bytes([0xff for i in range(FLASH_SIZE_BYTES - len(data) - len(uboot))])
## WRITE
with open("spi-nor.bin", 'wb') as f:
    f.write(data)
## FLASH, check your permission
# subprocess.run(['flashrom', '-p', 'ch341a_spi', '-c', "MX25L6406E/MX25L6408E" '-w', 'spi-nor.bin'])

rootfs

没啥难度,对于Debian/Ubuntu 有 debootstrap,对于 ArchLinux 有 ArchLinuxARM,不同发行版的RootFS有很多对应制作工具。略。

kernel

没搞定,旧的能用继续用旧的,略。


  1. https://tinker-board.asus.com/images/doc/download/E17169_Tinker_Board_2_2S_UM_WEB.pdf 

  2. https://tinker-board.asus.com/images/doc/download/Tinker_Board_2_Schematics_20201214.pdf 

  3. https://github.com/armbian/build