@aiminick 在 基于社区最新开源仓库(Opensbi、Linux)构建nezha - d1开发环境 中说:
分开也有分开的优势,这种复合型的可定制化程度没有单独的方便。
没有理解你的意思,可以描述的再详细一点吗?
@aiminick 在 基于社区最新开源仓库(Opensbi、Linux)构建nezha - d1开发环境 中说:
分开也有分开的优势,这种复合型的可定制化程度没有单独的方便。
没有理解你的意思,可以描述的再详细一点吗?
一、 本文目的
介绍如何基于NEZHA-D1平台搭建社区最新的opensbi和Linux最小系统。
启动分为两大阶段:
第一阶段brom->boot0->uboot,该阶段固件烧写在nand flash。
第二阶段:opensbi->kernel->rootfs,该阶段固件存储在TF卡上。TF卡实现2个分区,分区1为FAT文件系统,方便开发者拷贝linux、dtb、opensbi等固件,分区2为EXT4的rootfs。
二、实验准备
硬件:nezha开发板+电源线+串口线+TF卡
软件:github仓库:https://github.com/chinchilla222/nezha-d1.git
nezha-d1仓库简要说明:
├── build.sh -> scripts/build.sh -- 编译脚本
├── HOW-TO-CN.txt -- 说明文档
├── README.md
├── resource -- 代码资源
│ ├── linux -- 存放最小系统必要的patch
│ │ ├── 0001-riscv-pgtable.h-Fixup-_PAGE_CHG_MASK-usage.patch
│ │ ├── 0002-riscv-Add-DMA_COHERENT-for-custom-PTE-attributes.patch
│ │ ├── 0003-riscv-Add-SYNC_DMA_FOR_CPU-DEVICE-for-DMA_COHERENT.patch
│ │ ├── 0004-dt-bindings-clk-sunxi-ccu-add-compatible-string-for-.patch
│ │ ├── 0005-clk-sunxi-ng-add-support-for-the-Allwinner-D1-CCU.patch
│ │ ├── 0006-dt-bindings-pinctrl-sunxi-Add-D1-pinctrl-bindings.patch
│ │ ├── 0007-pinctrl-sunxi-add-support-for-the-Allwinner-D1-pin-c.patch
│ │ ├── 0008-rv64-allwinner-d1-add-the-basical-d1-dtsi-file.patch
│ │ ├── 0009-rv64-allwinner-D1-add-support-for-Allwinner-nezha-bo.patch
│ │ ├── 0010-mmc-sunxi-mmc-add-mmc0-support-on-d1-and-fix-clk-set.patch
│ │ ├── 0011-riscv-d1-nezha-default-config.patch
│ │ ├── 0012-rv64-allwinner-d1-support-card-boot-ext4-file-system.patch
│ │ └── useless-patch -- 暂时无用
│ │ ├── 0001-dump_reg-support-interface-to-Read-Write-IO.patch
│ │ ├── 0001-riscv-pgtable.h-Fixup-_PAGE_CHG_MASK-usage.patch
│ │ ├── 0002-gmac-support-temporary-driver.patch
│ │ ├── 0002-riscv-Add-DMA_COHERENT-for-custom-PTE-attributes.patch
│ │ ├── 0003-riscv-Add-SYNC_DMA_FOR_CPU-DEVICE-for-DMA_COHERENT.patch
│ │ └── 0004-drivers-ccu-pinctrl-uart-gmac-mmc-driver-support.patch
│ ├── opensbi -- 社区最新opensbi源码
│ │ └── opensbi-master.zip
│ ├── rootfs -- 编译好根文件系统
│ │ └── rootfs.tar.gz
│ └── tools -- 存放开发需要的工具
│ ├── make_ext4fs
│ ├── mkbootimg
│ └── toolchain -- 存放PTG工具链
│ ├── riscv64-glibc-gcc-thead_20200702.tar.xz.00
│ ├── riscv64-glibc-gcc-thead_20200702.tar.xz.01
│ └── riscv64-glibc-gcc-thead_20200702.tar.xz.02
├── scripts
│ ├── build.sh
│ └── gdbinit
└── tina-d1-open -- 存放基于tina-d1-open仓库编译好的固件(更改了启动顺序)
├── 0001-d1-add-new-board-nezha_debug.patch
├── 0001-uboot-nezha-suport-boot0-uboot-opensbi-kernel-startu.patch
└── tina_d1-nezha_debug_uart0.img
三、 搭建环境
1、下载nezha-d1仓库
git clone https://github.com/chinchilla222/nezha-d1.git 由于仓库中包含交叉编译工具,下载速度会受影响,请大家耐心等待。
2、烧写固件:nezha-d1/tina-d1-open/tina_d1-nezha_debug_uart0.img
tina_d1-nezha_debug_uart0.img固件同tina-d1-open源码仓库编译打包的原生固件区别在于修改了启动顺序,并且在uboot阶段修改直接引导TF卡中opensbi、kernel的功能。(原流程:brom->boot0->opensbi->uboot->kernel,改后:brom->boot0->uboot->opensbi->kernel)
3、编译opensbi/kernel/dtb
3.1、自动编译
执行scripts/build.sh脚本,生成的目标文件输出至build/debug目录。
3.2、手动编译 - 下文中提到的命令为示意性命令,请大家根据实际的目录结构使用。已经执行了build.sh脚本的同学忽略3.2,以及第4/5节的操作
(1)创建临时目录:mkdir build
(2)准备工具链:tar xvf resource/tools/riscv64-glibc-gcc-thead_20200702.tar.xz -C build/
(3)编译linux
解压:tar xzvf resource/linux/linux-5.13-rc3.tar.gz -C build/
打补丁:cd nezha-d1/build/linux-5.13-rc3;git init; git add ./; git commit -s -m "init version";git am *.patch
编译:
make ARCH=riscv CROSS_COMPILE=../riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu- d1_nezha_defconfig
make ARCH=riscv CROSS_COMPILE=../riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu- all -j32
生成boot.img:./mkbootimg --kernel Image --board sun20i_riscv --base 0x40200000 --kernel_offset 0 -o boot.img
4、编译opensbi
(1)解压:unzip resource/opensbi/opensbi-master.zip -d build/
(2)编译:make PLATFORM=generic CROSS_COMPILE=../riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-
5、制作EXT4根文件系统*
(1)tar -xzvf resource/rootfs/rootfs.tar.gz -C build/
(2)make_ext4fs -l 256M roofs.ext4 rootfs/
6、 制作启动卡
(1)制作GPT分区,工具:parted,举例:分区1 - 1G到12G 区间,分区2 - 12G至25G区间
(2)格式化分区1,工具:mkfs.fat,举例:mkfs.fat /dev/sdb1。将boot.img,d1.dtb,d1.dtb拷贝到TF卡的分区1中。
(3)烧写分区2,工具:dd,举例:dd if=./build/rootfs.ext4 of=/dev/sdb2
7.将TF卡插入开发板,上电启动,大功告成。
@allwinnertech 在 如何将单独编译的opensbi u-boot kernel rootfs 烧录制作成可以启动的sdcard.img镜像? 中说:
本以及单独执行pack打包命令验证,发现最开始的三个分区,对应的文件分别
TF卡中没有boot0和boot-package的分区信息,uboot阶段不能分区烧写这两个二级制文件。boot-package是按照一定的格式打包了uboot、dtb、opensbi三个文件的二进制文件。通过phoenixcard烧写tina_d1-nezha_min_uart0.img时将boot-package烧写到了TF卡指定的offset区域,phoenixcard同boot0约定将boot-package烧写在TF卡offset 32800扇区处,每个扇区512Byte。可通过dd命令单独烧写boot-package文件烧写到指定位置(offset:32800扇区)。
@marleo repo工具配置有问题。请按照官网说明下载,如下
××××××××××××××××××××××××××××××××××××××××××××××××××××
****请客户使用AW提供的引导脚本和repo仓库,如已安装了google官方引导脚本,请将官方引导脚本替换成AW提供的引导脚本。
1.从全志服务器下载安装repo引导脚本,将username替换成客户下载账号的用户名
$ git clone ssh://username@sdk.allwinnertech.com/git_repo/repo.git
2.修改repo/repo文件中下面一行,将username替换成客户下载账号的用户名
REPO_URL='ssh://username@sdk.allwinnertech.com/git_repo/repo.git'
3.把repo引导脚本添加到自己计算机环境变量中
$ cp repo/repo /usr/bin/repo $ chmod 777 /usr/bin/repo****
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
@allwinnertech 您好。0702版本比0528版本优化了部分特性,两版本之间无本质区别。下版本release 的sdk会发布统一工具。
@allwinnertech tina-d1-open发布的opensbi的部分模块实现有扩展指令,tina-d1-open中发布的工具链默认是打开该编译选项--with-arch=rv64gcxthead,但是opensbi中重新指定了-march,
编译的时候默认是PLATFORM_RISCV_ISA = rv64imafdc,编译的时候重新指定参数 -march=rv64gcxthead,可以参考tina-d1-open中发布的opensbi原码根目录下的编译脚本
D1开发板支持JTAG调试方式
代码修改
调试工具:CKLINK