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

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

科技背景_副本 公众号_副本.png

真诚感谢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源码目录,运行makemenuconfig配置环境参数保存在MMC设备,偏移地址为0x300000(这里0x00000-0x300000地址空间预留存放BIOS固件fip-all.bin,偏移地址必须大于fip-all.bin),然后重新make得到u-boot.bin

正面.png

640.png


进入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虚拟机),进入linuxkernel源码目录,运行makemenuconfig开启commandlinepartitionsupport,然后重新make得到内核镜像Image.gz。

       

正面.png

640.png

正面.png


       


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=4
sync
mv -f fip-all.bin mmc-boot.bin
sync

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根目录存放分区,下图为分区过程。

       

正面.png

第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/sdb
sync

到这里,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);'
saveenv
boot

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

…….
Hit any key to stop autoboot:  0
switch to partitions #0, OK
mmc1 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 ... OK
run in ft_board_setup
fdt_addr 00000000f9c2f000
N: Phytium System Service Call: 0xc2000005
mb_count = 0x2
mb_blocks[0].mb_size = 0x7c000000
mb_blocks[1].mb_size = 0x180000000
fdt : can not find /memory@01  node
fdt : add node memory@01
fdt : dram size 0x200000000 update successfully
Starting kernel ...                 
/ {
       compatible = "phytium,e2000q";
…….

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

正面.png                      

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根目录存放分区,下图为分区过程。

640.png      

第2步:使用mkfs.ext4格式化分区 (例:mkfs.ext4 /dev/mmcblk0),并使用mount 命令挂载文件系统。        

第3步:将Linux根文件系统解压到eMMC分区根目录,解压完毕后,sync命令同步文件,然后使用 umount 卸载eMMC的挂载。

sudo mount /dev/mmcblk0p1 /mntsudo tar zxvf core-image-xfce-e2000.tar.gz -C /mnt……syncsudo 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);'
saveenv
boot

 eMMC加载系统成功:

…….
Hit any key to stop autoboot:  0
Card 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: root
root@e2000:~#
相关文章
|
7月前
|
安全 Linux Android开发
【ATF】bootloader与安全相关启动分析
【ATF】bootloader与安全相关启动分析
139 0
|
4月前
|
存储 缓存 监控
【嵌入式SD NAND】基于FATFS/Littlefs文件系统的日志框架实现
综上所述,构建一个基于FATFS/Littlefs文件系统的日志框架需要对文件系统的操作有深入理解,并以此为基础设计一套完整的日志处理机制。这样的框架不仅能够确保日志数据的完整性和系统的鲁棒性,同时还能够满足嵌入式系统对于性能和资源使用的严格要求。
167 4
|
3月前
|
Linux
用QEMU模拟运行uboot从SD卡启动Linux
用QEMU模拟运行uboot从SD卡启动Linux
|
7月前
NUC980修改内核支持spi-nand
NUC980修改内核支持spi-nand
91 2
|
7月前
|
Linux
Imx6ull 开发板通过Uboot使用网络启动系统
Imx6ull 开发板通过Uboot使用网络启动系统
192 0
|
程序员 Shell Linux
制作SD启动卡,从SD卡启动系统
制作SD启动卡,从SD卡启动系统
376 0
制作SD启动卡,从SD卡启动系统
制作U盘启动时【usb-hdd和usb-zip的区别】
制作U盘启动时【usb-hdd和usb-zip的区别】
782 0
制作U盘启动时【usb-hdd和usb-zip的区别】
|
Linux 存储控制器 芯片
ZYNQ-ZedBoard设置Quad-SPI启动和SD驱动
ZYNQ-ZedBoard设置Quad-SPI启动和SD驱动
490 0
ZYNQ-ZedBoard设置Quad-SPI启动和SD驱动
|
Linux 调度 C语言
嵌入式 uboot引导kernel,kernel引导fs【转】
转自:http://www.cnblogs.com/lidabo/p/5383934.html#3639633 1、uboot引导kernel: u-boot中有个bootm命令,它可以引导内存中的应用程序映像(Kernel),bootm命令对应 common/cmd_bootm.
1080 0