SiRider-S1: 启动芯引擎
龍鹰一号基础软硬件架构
SiRider S1 是 Radxa 联合 Arm China 基于 SiEngine 龍鹰一号处理器打造的工业单板计算机。它带有以太网、USB、HDMI、PCIe、Typec-C 等丰富的外设接口。
该单板机搭载的主控是基于芯擎科技龍鹰一号的 7 nm 处理器 SE1000-I:
从框图上可以看到,SE1000 的芯片架构设计和我们平时看到的 Arm SOC 有很大的不同:它的 8 核 CPU 分为两个 Cluster(簇),
4 个 A76 + 2 A55 为 Cluster0,另外两个 A55 为 Cluster1,它的 GPU,NPU 这些比较大型的 IP 模块,也都采用了双 IP 设计。这是因为龍鹰一号主要是面向智能汽车座舱这一应用场景设计的高性能处理器。在车载上,对安全性有着十分苛刻的要求,不同应用场景的软件需要相关隔离,互不影响,比如我们看到现在智能汽车上各种绚丽大屏终端,它们背后一般是 Android 系统驱动的,可以允许各种丰富的应用软件,给用户带来丰富的娱乐交互体验,但是车载仪表盘等、它们背后是另外一套更加安全可靠的系统,这套系统要能保证很高的可靠性和实时性,基本不允许出现死机或者黑屏故障,这个系统业内一般使用 QNX ,或者高度裁剪定制的 Linux 系统。
基于这个应用背景,我们就很好理解龍鹰一号处理器为什么采用了这样的芯片设计架构,它正式为了满足车载座舱的需求,在实际应用中,Cluster0(芯擎的 SDK 里面称为 AP0)上运行 Android 或者 Ubuntu 等大型操作系统,同时它会驱动 10 核心的 Mali G76 GPU,用以渲染丰富的 UI 界面,提供丰富多彩的人机交互体验。Cluster1 (芯擎 SDK 里面称为 AP1)上运行基于 Buildroot 裁剪的过的精简 Linux 小系统,它会驱动 4 核心的 Mali G76 GPU,提供了基于 QT 的 UI 环境。
在 AIOT 产品上,芯擎提供的 SDK,AP0 上运行的是 Ubuntu 20.04, AP1 上运行的是 Linux buildroot。
SiRider S1 SBC 开机
开发板谍照如上,典型的瑞莎绿。
这块开发板搭载了 16 GB DDR 和 128 GB UFS,比世面上大部分 SBC 的配置都要高很多。
标号 1 是开关机按键,默认情况下插入 Type-C 就会自动开机,在开机状态下,长按 1s 即会关机,然后短按开机。
标号 13 是 Type-C 供电接口,按照官方推荐,最好使用 8~12 V,不低于 30 W 的电源适配器,我最开始使用一个普通的小米充电器板子会不停的重启,应该是带不动,后面换了一个 小米快充的适配器才正常启动。
标号 11 是 HDMI 输出接口,这块开发板的 HDMI 是主控的 MIPI DSI 接口通过龙讯的 LT9611 桥接芯片转换出来的,大概率只能支持到 1080P60 的输出,接上 HDMI 线,系统启动后会在显示器上看到 Ubuntu 桌面。
标号 10 是四个 USB 3.0 接口,可以接 U 盘,USB 鼠标,键盘。
标号 14 也是一个 Typec-C 口,它提供 USB Debug 口输出,和固件下载功能。这个 USB Debug 口的输出方案设计的很巧妙,这里指的重点说一下:
从前面的介绍可以知道,这款芯片上同时有三个系统在独立运行:FreeRTOS、Linux Buildroot、Ubuntu。如果作为一个开发工程师,我们可能需要三个串口输出来监控、调试这三个系统的运行状态,如果一个板子上需要接 3 条串口线是非常麻烦的。但是 SiRider 开发板采用了一颗 FT4232 芯片,可以同时把 4 路 UART 输出转换成 一路 USB 输出,这样板子上只需要一根 USB 线就可以接受 3 个系统的调试日志,同时还兼顾了固件升级功能。
Debug 口如果通过 USB 线连接我们的 Linux 主机,我们可以看到主机上会认到 4 个 UART 设备:
[Sun Sep 8 18:02:51 2024] hub 1-10:1.0: USB hub found
[Sun Sep 8 18:02:51 2024] hub 1-10:1.0: 4 ports detected
[Sun Sep 8 18:02:52 2024] usb 1-10.2: new high-speed USB device number 52 using xhci_hcd
[Sun Sep 8 18:02:52 2024] usb 1-10.2: New USB device found, idVendor=0403, idProduct=6011, bcdDevice= 8.00
[Sun Sep 8 18:02:52 2024] usb 1-10.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[Sun Sep 8 18:02:52 2024] usb 1-10.2: Product: Quad RS232-HS
[Sun Sep 8 18:02:52 2024] usb 1-10.2: Manufacturer: FTDI
[Sun Sep 8 18:02:52 2024] ftdi_sio 1-10.2:1.0: FTDI USB Serial Device converter detected
[Sun Sep 8 18:02:52 2024] usb 1-10.2: Detected FT4232H
[Sun Sep 8 18:02:52 2024] usb 1-10.2: FTDI USB Serial Device converter now attached to ttyUSB0
[Sun Sep 8 18:02:52 2024] ftdi_sio 1-10.2:1.1: FTDI USB Serial Device converter detected
[Sun Sep 8 18:02:52 2024] usb 1-10.2: Detected FT4232H
[Sun Sep 8 18:02:52 2024] usb 1-10.2: FTDI USB Serial Device converter now attached to ttyUSB1
[Sun Sep 8 18:02:52 2024] ftdi_sio 1-10.2:1.2: FTDI USB Serial Device converter detected
[Sun Sep 8 18:02:52 2024] usb 1-10.2: Detected FT4232H
[Sun Sep 8 18:02:52 2024] usb 1-10.2: FTDI USB Serial Device converter now attached to ttyUSB2
[Sun Sep 8 18:02:52 2024] ftdi_sio 1-10.2:1.3: FTDI USB Serial Device converter detected
[Sun Sep 8 18:02:52 2024] usb 1-10.2: Detected FT4232H
[Sun Sep 8 18:02:52 2024] usb 1-10.2: FTDI USB Serial Device converter now attached to ttyUSB3
其中 ttyUSB1 对应 FreeRTOS 调试口、ttyUSB2 对应 AP1 调试口,ttyUSB3 对应 AP0 调试口,波特率都为 115200.
开启 ssh 登录
AP0 和 AP1 上的 Linux 系统登录用户名和密码都是 root。
可以通过以太网口或者 PCIE 网卡(连接标号 27)连接网络。
但是系统默认没有开启 ssh 远程登录功能,作为一个开发者,这个功能还是使用的,第一次登录可以通过如下命令开启 ssh 远程登录功能。
useradd -r -d /var/empty/sshd -s /sbin/nologin -c "sshd privilege separation user" sshd
mkdir /run/sshd
systemctl restart sshd
SDK 编译
源码可以参考 SiEngine Ubuntu SDK 下载。
其中 ATF、U-Boot、Linux kernel 甚至连 Safetyisland 的代码都有开放,还是很有诚意的。
├── src
│ ├── arm-trusted-firmware
│ ├── buildroot
│ ├── kernel
│ ├── kernel_modules
│ ├── m4firmware
│ ├── mbedtls
│ ├── safetyisland
│ ├── u-boot
│ └── ubuntu
完整编译
为了省事,可以先一次编译整个 SDK:
source env.sh
sebuilder all
编译完后生成的固件在 deploy/build/ 目录下:
deploy/build/
├── images
│ ├── firmware
│ │ ├── bl21_fip.bin
│ │ ├── bl22_fip.bin
│ │ ├── bl31c_fip.bin
│ │ ├── bl31_fip.bin
│ │ ├── bl33c_fip.bin
│ │ ├── bl33_fip.bin
│ │ ├── config_ddr.bin
│ │ ├── fw_ddr_fip.bin
│ │ ├── m4_fip.bin
│ │ ├── r52_fip.bin
│ │ ├── seq_ddr_fip.bin
│ │ └── trained_ddr.bin
│ ├── linux
│ │ ├── linux_dtb_fip.bin
│ │ ├── linux_kernel_fip.bin
│ │ ├── linux_rootfs_fip.bin
│ │ ├── linux_usrdata.img
│ │ └── modules
│ └── ubuntu
│ ├── modules
│ │ ├── mlan.ko
│ │ ├── moal.ko
│ │ ├── pcieuart9098_combo_v1.bin
│ │ └── wifi_mod_para.conf
│ ├── ubuntu.dtb
│ ├── ubuntu_kernel.img
│ ├── ubuntu_rootfs.img
│ └── ubuntu_usrdata.img
├── lun0_fip.bin
├── lun1_fip.bin
├── lun2_fip.bin
├── lun3_fip.bin
├── lun5_fip.bin
├── prm_gpt_lun0.img
├── prm_gpt_lun2.img
├── prm_gpt_lun3.img
├── prm_gpt_lun5.img
├── SiPartitionFile_lun0
├── SiPartitionFile_lun2
├── SiPartitionFile_lun3
├── SiPartitionFile_lun5
└── ufs-device-configuration.xml -> ../../scripts/tools/partition/ufs-device-configuration.xml
编译 U-Boot
后面如果想单独修改某个模块,可以对这个模块单独编译,比如编译 U-Boot,通过分析 U-Boot 应该是在 lun2 这个存储区域,所以我直接一次性编译整个 lun2,应该还有更简单的编译方式,加 -c 参数是清除上一次编译的痕迹。
sebuilder -c lun2
sebuilder lun2
编译完成后, AP0 上的 Linux 内核镜像为 Ubuntu_kernel.img, dtb 为 ubuntu.dtb, 这两个文件只是对 Linux 内核编译后的 Image 和 se1000_aibay.dtb 做了重命名,没有做任何打包和处理。
U-Boot 对应的镜像为 bl33_fip.bin ,整个镜像是对编译后的 u-boot.bin 进行了打包处理后的文件,具体的处理细节还得研究下。
编译 Ubuntu Linux kernel
sebuilder ubuntu kernel
了解了这些,对我们后续基础的底层系统定制开发是很有帮助的。
固件下载
系统开机的时候,保持 Debug Type-C 线处于连接状态,并按着标号 16 小按键,开发板即进入升级模式,然后可以更新开发板上的固件。芯擎同时提供了基于 Windows 和 Linux 系统的固件升级工具,这里主要简单介绍下如何在 Linux 环境下进行固件下载升级。
芯擎有提供一个 siengine_downloadtool_linux 工具包,里面的 siengine_downloadtool 即为 Linux 下的升级工具,可以通过 help 命令以及 《UG_SE1000_Download_Tool_User_Guide》了解它的使用方法,这里做下简单介绍:
系统开机的时候按住升级按键板子即会进入升级模式,这时候通过 Debug UART3 大概会看到如下 log 信息:
INFO: BL1: 0x60000 - 0x75000 [size = 86016]
NOTICE: Booting SiEngine Trusted Firmware
NOTICE: BL1: v2.1(debug):se1000_rom_v1.2
NOTICE: BL1: Built : 00:46:58, Apr 25 2021
INFO: BL1: RAM 0x60000 - 0x75000
INFO: BL1: cortex_a76: CPU workaround for cve_2018_3639 was applied
INFO: Using crypto library 'mbed TLS'
NOTICE: Reset reason:1.
NOTICE: Init USB2 OTG for downloading
INFO: Using Normal DMA.
NOTICE: Enter USB downloading mode.
INFO: Setup phase done.
INFO: USB_REQ_GET_DESCRIPTOR: 0x1
INFO: Get device descriptor.
INFO: Setup phase done.
INFO: USB_REQ_SET_ADDRESS.
INFO: Setup phase done.
INFO: USB_REQ_GET_DESCRIPTOR: 0x1
INFO: Get device descriptor.
INFO: Setup phase done.
INFO: USB_REQ_GET_DESCRIPTOR: 0x2
INFO: Get config descriptor.
INFO: Setup phase done.
INFO: USB_REQ_GET_DESCRIPTOR: 0x2
INFO: Get config descriptor.
INFO: Setup phase done.
INFO: USB_REQ_GET_DESCRIPTOR: 0x3
INFO: Setup phase done.
INFO: USB_REQ_GET_DESCRIPTOR: 0x3
INFO: Setup phase done.
INFO: USB_REQ_GET_DESCRIPTOR: 0x3
INFO: Setup phase done.
INFO: USB_REQ_GET_DESCRIPTOR: 0x3
INFO: Setup phase done.
NOTICE: USB: online (highspeed)
NOTICE: Please run fastboot commands on host.
INFO: ep1 rx, len = 0x200, buf = 0x0x22000.
INFO: Set config descriptor.
这说明这款芯片的升级模式还是在 ATF 阶段实现的,这和其他芯片方案还不大一样。
可以通过如下命令查看是否有可升级的设备连接到电脑:
./siengine_downloadtool devices
无论下载什么模块,都要先执行如下命令:
./siengine_downloadtool download ../siengine_downloadtool_linux/downloader_fip_ufs.bin
./siengine_downloadtool flash ../siengine_downloadtool_linux/downloader_fip_ufs.bin
./siengine_downloadtool oem "ufsinit 0"
./siengine_downloadtool oem "startdownload"
因为我们的板子上搭载的是 UFS,所以选择的是 ufs 对应的 bin 文件,如果板子搭载的是 emmc,那则要选择 emmc 对应的 bin 文件。
另外需要确保执行下载命令的目录下必须有前面编译生成的 SiPartitionFile_lun0
SiPartitionFile_lun2
SiPartitionFile_lun3
SiPartitionFile_lun4
SiPartitionFile_lun5
这些分区文件,否则可能会报错,提示 no such partttion
。
执行完上述两个命令后,可以通过 Debug 串口 log 确认板子正式进入到 USB 下载模式:
Hello SVI @C2
FAST MMU
TEXT 0000030000 - 0000053000 (140KB)
DATA 0000053000 - 0000059000 (24KB)
bss 0000053f00 - 0000059000 (20KB)
HEAP 0000059000 - 000007a000 (132KB)
PGTABLE 0000059000 - 0000059000 (0KB)
STACK 000007a000 - 0000080000 (24KB)
GICv3 w/ max_irq 991
SVI> chipnum = 14007190
chipnum = 532c0033
USB2 clock regs init...
AXICLK register:10101
PHYCLK register:10000
strings_dev[2].s = 14007190532c0033
USB dwc2 udc probe
-------gser_bind-------
se1000 dwc2 g_serial function register ok
gs_open
0 0
gs_open: usb not ready
ret = -105usb not ready, please insert usb cable
get config: c 53618, speed 3, type: 2
get config: c 53618, speed 3, type: 2
dwc2_ep_enable: 0000000000053278
dwc2_ep_enable: enabled ep1in-bulk, stopped = 0, maxpacket = 512
usb ep enable: ret 0
dwc2_ep_enable: 0000000000053308
dwc2_ep_enable: enabled ep2out-bulk, stopped = 0, maxpacket = 512
usb ep enable: ret 0
gserial_connect
gserial_connect: start ttyGS0
usb serial port:0 is ready,
升级 Linux kernel:
./siengine_downloadtool erasegpt ubuntu_kernel
./siengine_downloadtool parsegpt ubuntu_kernel
./siengine_downloadtool download images/ubuntu/ubuntu_kernel.img
升级 U-Boot :
./siengine_downloadtool erasegpt bl33
./siengine_downloadtool parsegpt bl33
./siengine_downloadtool download images/firmware/bl33_fip.bin