D1s RDC2022 纪念版 运行Linux
D1s RDC2022 纪念版 运行Linux
背景
2022年底线上参加了RT-Thread举办的开发者大会,非常幸运地抽中了一块开发板,非常开心,年前有事回老家比较早,年后工作很忙,只有在晚上下班和周末调试下,终于到了3月份,linux系统移植完了,外设也适配了,写这篇文章总结移植过程。
移植的目标是把uboot、内核集成到buildroot中,最终一键编译。
准备工作:
D1s RDC2022 纪念版
usb typec * 2
usb转串口模块
w5500 spi eth模块
lcd显示屏,40pin rgb 800*480 + 6pin gt911 电容触摸
PC系统:Ubuntu 18.04
安装编译kernel、rootfs必要的软件。
高版本的Ubuntu需要改代码,网上有相关的博客。
https://gitee.com/GloomyGhost/Buildroot-YuzukiSBC.git
https://gitee.com/weidongshan/neza-d1-buildroot.git
启动顺序
bootrom->boot0_sdcard.fex->boot_package.cfg->boot.img
boot0_sdcard.fex是全志tina-d1-h/lichee/brandy-2.0/spl编译出来的,主要是初始化ddr和加载uboot;
boot_package.cfg包含opensbi、uboot、dtb、env;
boot.img是内核镜像,uboot仅需加载这一个文件。
1、下载官方代码,访问全志开发者社区下载tina-d1-h源码,根据提示操作,下载完成后,开始编译。(主要目的是编译出boot0_sdcard.fex,后面会用到。)
yd@seehi-omv:~/rtt/tina-d1-h$ source build/envsetup.sh
Setup env done! Please run lunch next.
yd@seehi-omv:~/rtt/tina-d1-h$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. d1-h_nezha_min-tina
2. d1-h_nezha-tina
3. d1s_nezha-tina
Which would you like? [Default d1s_nezha]: 3
============================================
TINA_BUILD_TOP=/home/yd/rtt/tina-d1-h
TINA_TARGET_ARCH=riscv
TARGET_PRODUCT=d1s_nezha
TARGET_PLATFORM=d1s
TARGET_BOARD=d1s-nezha
TARGET_PLAN=nezha
TARGET_BUILD_VARIANT=tina
TARGET_BUILD_TYPE=release
TARGET_KERNEL_VERSION=5.4
TARGET_UBOOT=u-boot-2018
TARGET_CHIP=sun20iw1p1
============================================
no buildserver to clean
[1] 671413
yd@seehi-omv:~/rtt/tina-d1-h$make -j32 && pack
编译成功后,开始修改代码。
改动tina-d1-h/device/config/chips/d1s/configs/nezha/configs/nezha/sys_config.fex,修改调试串口以及启动介质
diff --git a/configs/nezha/sys_config.fex b/configs/nezha/sys_config.fex
index ffa2925..372650b 100755
--- a/configs/nezha/sys_config.fex
+++ b/configs/nezha/sys_config.fex
@@ -24,7 +24,7 @@ debug_mode = 8
;----------------------------------------------------------------------------------
[target]
boot_clock = 720
-storage_type = 5
+storage_type = 1
nand_use_ubi = 1
[spinor_para]
@@ -196,8 +196,8 @@ twi_sda = port:PG15<3><1><default><default>
;----------------------------------------------------------------------------------
[uart_para]
uart_debug_port = 3
-uart_debug_tx = port:PB6<7><1><default><default>
-uart_debug_rx = port:PB7<7><1><default><default>
+uart_debug_tx = port:PG8<5><1><default><default>
+uart_debug_rx = port:PG9<5><1><default><default>
;----------------------------------------------------------------------------------
;dram_region_mbytes :设置drm大小以bytes为单位
改动tina-d1-h/lichee/brandy-2.0/spl/include/spare_head.h,修改boot_package.cfg存放位置;此步骤可选,主要是原厂的boot0_sdcard.fex会到16400K的位置加载boot_package.cfg,接近10M的空间浪费了。
diff --git a/include/spare_head.h b/include/spare_head.h
index 90040bc..f7579e3 100644
--- a/include/spare_head.h
+++ b/include/spare_head.h
@@ -62,7 +62,10 @@
#define BOOT0_EMMC3_BACKUP_START_ADDR (512)
-#define UBOOT_START_SECTOR_IN_SDMMC (32800)
+// #define UBOOT_START_SECTOR_IN_SDMMC (32800)
+// #define UBOOT_BACKUP_START_SECTOR_IN_SDMMC (24576)
+
+#define UBOOT_START_SECTOR_IN_SDMMC (200)
#define UBOOT_BACKUP_START_SECTOR_IN_SDMMC (24576)
修改完后,手动删除/home/yd/rtt/tina-d1-h/lichee/brandy-2.0/spl/nboot/目录下boot0_sdcard.bin文件,之后执行make && pack
命令。
需要的目标文件在tina-d1-h/out/d1s-nezha/image/boot0_sdcard.fex。
编译文件系统
为什么不用tiny sdk?
个人不喜欢全志sdk的编译方式,修改完配置,重新编译可能不会生效,软件包受限制等等,反正不喜欢。
buildroot测试了百问网官方d1s的仓库和YuzukiSBC小哥的仓库,最终使用后者,韦东山老师的仓库编译出来有些许问题。
克隆仓库:https://gitee.com/GloomyGhost/Buildroot-YuzukiSBC.git
仓库使用的内核为全志在github维护的uboot、kenrel,
主要修改点:
uboot:
修改调试串口为uart3
关闭显示:这处有个坑,uboot设备树显示相关的节点如果和内核不一致,就会导致内核使用uboot传参的参数去初始化显示参数。
内核:
添加几项配置
修改设备树
环境变量:
波特率设置在1500000,进入系统后,部分信息会丢失,调小到115200就恢复了,可能是我的usb模块有问题。
具体细节不太想写了,只补充下问题和解决方法
如何烧录
使用xfel工具,xboot官方的不支持sd卡烧录,使用晕哥编出来就行,下载可以去rt-thread论坛或者挖坑网、全志开发者社区,新板子必须使用xfel烧写整个镜像。
更新内核
可以直接启动linux系统后,挂载fat分区替换,不会出问题。
更新设备树
使用xfel工具把boot_package.fex烧录到sd卡中,
使用我提供的boot0_sdcard.fex烧录到偏移0x19000的位置,使用官方的需要烧录到偏移0x1004000的位置
更新文件系统
默认文件系统放在板载128MB的sd nand中,更新需要重新烧写整个镜像。如果需要频繁更新,则可以把文件系统烧录到sd卡中,插入到板子的sd卡槽,修改uboot环境变量,指定root分区为mmc1即可。
最后把仓库集成到了个人维护的buildroot仓库,编译出来的镜像可以支持的设备如下:
key、led、w5500 spi wifi、i2c GT911、uart3(console)、40pin lcd、sd卡(1width)。
由于仓库包含不便公开的信息,所以把生成的patch文件放在这里,我使用的buildroot版本为:2022.02.9, released January 18th, 2023,
直接下载官方仓库,打上patch应该就可以使用了。
遇到的问题:
1、lvgl显示异常,画面被分为两部分,镜像的显示在屏幕左右两侧?
lvgl 显存分配较小,最小应该为分辨率:x * 。
2、烧录失败问题?
镜像总大小为80MB左右,使用xfel工具需要耗时6分钟左右,如果接上spi wifi,就有可能烧录完成后,启动不了系统。
做过测试,同一份镜像,接上外设、不接外设都有可能失败,也有可能成功,不接外设成功的几率很大。
3、显示闪烁?
查看官方显示的文档,重新配置设备树节点,注意clk不要配置最大值,稍微配置小点。
4、使用tiny sdk
一开始我使用的就是官方sdk,默认打印串口为uart0,修改了配置也能启动了,但是官方的镜像需要使用特定工具才能烧写,这个暂时有问题,所以转到了buildroot。
5、xfel烧录速率达不到200KB/s ?
拔掉uart0的连接,速率会变快。
0001-fix-uboot-uart-config.patch
0001-support-RDC2022-D1s-board.patch
0001-update-boot_package.fex.patch
压缩包:https://files.cnblogs.com/files/yddeboke/D1s-RDC2022-纪念版-运行Linux.tar?t=1678244239
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通