E2000从eMMC或SD启动U-boot和系统

文摘   科技   2023-05-11 16:04   北京  

以往飞腾相关文章:

交流群:
==欢迎加入飞腾爱好者交流群==
硬件:
【视频版】基于飞腾芯片的设计与调试入门指导
飞腾X100 LPDDR颗粒线序配置辅助工具
固件:
飞腾CPU BIOS固件生成教程
飞腾uboot命令简单介绍
飞腾平台芯片测试固件(SFW)和开机启动log
飞腾CPU FT-2000/4 uboot下PHY调试记录
调试:
飞腾FT-2000/4开发板上移植Ubuntu18.04.5且更换飞腾内核4.19.8教程
飞腾平台SPI接口验证简介
[飞腾]Trace32使用概




真诚感谢MK分享此篇文档


本文讲解了,如何设置uboot环境变量和编译linux内核,实现将uboot和系统同时放置到SD卡或eMMC后,从SD或者eMMC启动uboot,引导系统启动的过程。

同时使用E2000Q-demo,演示了从SD卡启动和从eMMC启动的过程。

         

         

1、制作MMC(eMMC/SD卡)启动镜像文件

1.1、重新编译u-boot.bin,实现U-boot环境变量存储在MMC(eMMC/SD卡)

在交叉编译环境(Ubuntu20.04_X86虚拟机),进入Uboot源码目录,运行make menuconfig配置环境参数保存在MMC设备,偏移地址为0x300000(这里0x00000-0x300000地址空间预留存放BIOS固件fip-all.bin,偏移地址必须大于fip-all.bin),然后重新make得到u-boot.bin

进入E2000打包工具image-fix目录,更新bl33_new.bin指向重新make得到的u-boot.bin,然后执行脚本打包得到新的BIOS固件文件fip-all.bin。


          

1.2、重新编译linux内核,实现bootargs传递分区信息


E2000配置从MMC(eMMC/SD卡)启动的模式,上电启动需要从MMC设备(eMMC/SD卡)起始地址加载BIOS固件,BIOS固件会覆盖分区表信息,因此需要开启“u-boot通过bootargs重新传递分区表”的功能。

在交叉编译环境(Ubuntu20.04_X86虚拟机),进入linux kernel源码目录,运行make menuconfig开启command line partition support,然后重新make得到内核镜像Image.gz。

         

         


1.3、打包MMC(eMMC/SD卡)启动镜像

第1步:在交叉编译环境(Ubuntu20.04_X86虚拟机),使用命令 mkimage将当前目录下的内核Image.gz、设备树e2000q-demo-board.dtb进行打包,得到启动镜像文件uImage.itd。

mkimage -f ./ demo.its ./uImage.itd
demo.its文件:
/dts-v1/;
/ { description = "Image with single Linux kernel and compressed FDT blobs"; #address-cells = <1>;
images { kernel { description = "Linux kernel"; data = /incbin/("./Image.gz"); type = "kernel"; arch = "arm64"; os = "linux"; compression = "gzip"; load = <0x80080000>; entry = <0x80080000>; hash-1 { algo = "crc32"; }; hash-2 { algo = "sha1"; }; }; fdt@ demo{ description = "e2000q demo board"; data = /incbin/("./e2000q-demo-board.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; hash-1 { algo = "crc32"; }; hash-2 { algo = "sha1"; }; }; };
configurations { default = "e2k@demo"; e2k@demo{ description = "Boot Linux kernel with FDT demo"; kernel = "kernel"; fdt = "fdt@demo"; }; };};

2步:然后,使用dd 命令将fip-all.bin、uImage.itd封装在一起(偏移地址0x400000,可根据情况修改),封装合并后文件为BIOS固件fip-all.bin,这里把fip-all.bin重命名为mmc-boot.bin,支持eMMC/SD卡的MMC启动镜像文件就制作完成了。

dd if=./uImage.itd of=./fip-all.bin bs=1M seek=4syncmv -f fip-all.bin mmc-boot.binsync

         

          

2、E20000Q-DEMO SD卡启动BIOS和系统
2.1、制作SD启动系统盘

第1步:在交叉编译环境(Ubuntu20.04_X86虚拟机)连接SD卡设备,使用fdisk 对SD卡进行分区,第一个分区起始地址要避开前64MB地址(First sector (2048-62333951,default 2048): 131072),空间0~64MB将用来存放fip-all.bin、kernel和设备树,64MB及之后空间是Linux根目录存放分区,下图为分区过程。

         

第2步:使用mkfs.ext4 格式化分区 (例:mkfs.ext4 /dev/sdb1),并使用mount 命令挂载文件系统。
第3步:将Linux根文件系统解压到SD卡分区根目录,解压完毕后,sync命令同步文件,然后使用 umount 卸载SD卡的挂载。
第4步:使用dd 命令烧录mmc-boot.bin到目标设备 /dev/sdb(目标设备可根据情况修改)。
sudo dd if=mmc-boot.bin of=/dev/sdbsync

到这里,SD系统盘就安装制作完成了。

         

2.2、在E20000Q-DEMO参考板上加载SD系统盘

1步:将SD卡插入E2000Q-DEMO板的SD插座,配置SE_CFG[4:0]为SD启动模式,上电。
2步:在命令行设置如下Uboot环境变量后boot启动,这里bootargs重新传递分区表(前64MB为分区1,后面为第分区2,Linux根目录放在分区2)。
setenv bootcmd "mmc dev 1;mmc read 0x90000000 0x2000 0x10000;bootm 0x90000000#e2k@demo"setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x2800d000 root=/dev/mmcblk1p2 rootfstype=ext4 rootwait rw cma=128m blkdevparts=mmcblk1:64M(boot),-(userdata);'saveenvboot

         

系统加载过程,SD启动log如下:

…….Hit any key to stop autoboot:  0switch to partitions #0, OKmmc1 is current device         MMC read: dev # 1, block # 8192, count 65536 ... 65536 blocks read: OK## Loading kernel from FIT Image at 90000000 ...   Using 'e2k@demo' configuration   Trying 'kernel' kernel subimage     Description:  Linux kernel     Type:         Kernel Image     Compression:  gzip compressed     Data Start:   0x900000e4     Data Size:    7363002 Bytes = 7 MiB     Architecture: AArch64     OS:           Linux     Load Address: 0x80080000     Entry Point:  0x80080000     Hash algo:    crc32     Hash value:   aad68492     Hash algo:    sha1     Hash value:   3a0551d751553ecf011b3ca4ff585ba5e6e37cb8   Verifying Hash Integrity ... crc32+ sha1+ OK## Loading fdt from FIT Image at 90000000 ...   Using 'e2k@demo' configuration   Trying 'fdt@demo' fdt subimage     Description:  e2000q demo borad     Type:         Flat Device Tree     Compression:  uncompressed     Data Start:   0x90705bc8     Data Size:    23372 Bytes = 22.8 KiB     Architecture: AArch64     Hash algo:    crc32     Hash value:   9a360ce7     Hash algo:    sha1     Hash value:   7bf7a0fea3ecfe809ddddfe9863bb36340e1d9d5   Verifying Hash Integrity ... crc32+ sha1+ OK   Booting using the fdt blob at 0x90705bc8   Uncompressing Kernel Image   Loading Device Tree to 00000000f9c2f000, end 00000000f9c37b4b ... OKrun in ft_board_setupfdt_addr 00000000f9c2f000N: Phytium System Service Call: 0xc2000005mb_count = 0x2mb_blocks[0].mb_size = 0x7c000000mb_blocks[1].mb_size = 0x180000000fdt : can not find /memory@01  nodefdt : add node memory@01fdt : dram size 0x200000000 update successfully               Starting kernel ...                 / {       compatible = "phytium,e2000q";…….

         

进入Linux系统后,查看分区:cat /proc/partitions

                         

3、E20000Q-DEMO eMMC启动BIOS和系统
1步:在E2000Q-DEMO参考板,从SD、USB或者NVMe SSD加载进入Linux系统,对板载eMMC进行分区,第一个分区起始地址要避开前64MB地址(First sector (2048-62333951,default 2048): 131072),空间0~64MB将用来存放fip-all.bin、kernel和设备树,64MB及之后空间是Linux根目录存放分区,下图为分区过程。

      

第2步:使用mkfs.ext4 格式化分区 (例:mkfs.ext4 /dev/mmcblk0),并使用mount 命令挂载文件系统。
         
第3步:将Linux根文件系统解压到eMMC分区根目录,解压完毕后,sync命令同步文件,然后使用 umount 卸载eMMC的挂载。
sudo mount /dev/mmcblk0p1 /mnt
sudo tar zxvf core-image-xfce-e2000.tar.gz -C /mnt
……
sync
sudo umount /dev/mmcblk0p1

         

第4步:使用dd 命令烧录mmc-boot.bin到目标设备 /dev/mmcblk0(目标设备可根据情况修改)。

dd if=mmc-boot.bin of=/dev/mmcblk0

sync

         

5步:参考板配置SE_CFG[4:0]为eMMC启动模式,重新上电。
         
6步:在命令行设置如下Uboot环境变量后boot启动,这里bootargs重新传递分区表(前64MB为分区1,后面为第分区2,Linux根目录放在分区2)。
setenv bootcmd "mmc dev 1;mmc read 0x90000000 0x2000 0x10000;bootm 0x90000000#e2k@demo"setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x2800d000 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw cma=128m blkdevparts=mmcblk0:64M(boot),-(userdata);'saveenvboot

 

  eMMC加载系统成功:
…….Hit any key to stop autoboot:  0Card did not respond to voltage select! : -110                MMC read: dev # 0, block # 8192, count 65536 ... 65536 blocks read: OK## Loading kernel from FIT Image at 90000000 ...   Using 'e2k@demo' configuration   Trying 'kernel' kernel subimage     Description:  Linux kernel     Type:         Kernel Image     Compression:  gzip compressed     Data Start:   0x900000e4     Data Size:    7363002 Bytes = 7 MiB     Architecture: AArch64     OS:           Linux     Load Address: 0x80080000     Entry Point:  0x80080000     Hash algo:    crc32     Hash value:   aad68492     Hash algo:    sha1     Hash value:   3a0551d751553ecf011b3ca4ff585ba5e6e37cb8   Verifying Hash Integrity ... crc32+ sha1+ OK## Loading fdt from FIT Image at 90000000 ...   Using 'e2k@demo' configuration   Trying 'fdt@demo' fdt subimage     Description:  e2000q demo borad     Type:         Flat Device Tree     Compression:  uncompressed     Data Start:   0x90705bc8     Data Size:    23372 Bytes = 22.8 KiB     Architecture: AArch64     Hash algo:    crc32     Hash value:   9a360ce7     Hash algo:    sha1     Hash value:   7bf7a0fea3ecfe809ddddfe9863bb36340e1d9d5   Verifying Hash Integrity ... crc32+ sha1+ OK…….The Phytium Distribution e2000 ttyAMA1                                                                            Phytium SDK (Phy Reference Distro) 3.3.2 - Kernel \r                e2000 login: rootroot@e2000:~#

        


    

分享,让技术更伟大!欢迎转发! 
欢迎飞腾爱好者加入微信交流群。
群内大家可以畅所欲言。
在群内不需要表露自己的公司和身份,可以群内交流遇到的问题,分享自己的调试心得。
希望大家共建飞腾友谊!

  

乌拉大喵喵
建立了飞腾爱好者技术交流群,公众号文章扫码进群,或私信加vx进群。
 最新文章