NXP MCU 技术论坛
直播中

王越建

7年用户 1455经验值
私信 关注
[问答]

如何在SD卡上编写引导加载程序、内核、dtb和rootfs?

我想在我的 SD 卡上编写引导加载程序、内核、dtb 和 rootfs(稍后我想对 QSPI-Flash 做同样的事情)。作为 rootfs 映像,我想使用我使用 yocto 创建的自定义映像,它继承自 core-image-minimal 并添加了一些额外的包(我附上了自定义映像配方)。引导时,我想将我的 rootfs 创建为 tmpfs,以便我的系统易变并完全在 RAM 中。我不知道如何归档这个以及我需要哪种格式的自定义图像(cpio、cpio.gz、tar.gz ...)。或者是否有必要/有益地将我的内核、dts 和 rootfs 组合到一个 fitimage 中?
setenv bootargs "root=/dev/ram0 earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200"  

我想这是一种已弃用的 ramdisk 方法,使用 tmpfs 更现代、更高效?但我不是这里的专家,也许我在这里误解了一些东西。如果我错了,请纠正我,如果我可以使用它实现它以拥有一个完全基于 RAM 的系统,我也对这种 root=/dev/ram0 方法感到满意,但我也不知道如何修改我当前的工作流程实现这种方法。
我当前的工作流程将 rootfs 作为非易失性 SD 卡分区:
目前我正在像这样对我的 SD 卡进行编程:
1.将bootloader文件写入SD卡


cd tmp/deploy/images/ls1046ardb
bl2_sd_file="atf/bl2_sd.pbl"
fip_uboot_file="atf/fip_uboot.bin"
fman_ucode_file="fsl_fman_ucode_ls1046_r1.0_106_4_18.bin"

image="custom-image-ls1046ardb.tar.gz"
kernel="Image"
dtb="fsl-ls1046a-rdb-sdk.dtb"

# write the bootloader files to the SD card
sudo dd if={bl2_sd_file} of=/dev/sdb bs=512 seek=8
sudo dd if={fip_uboot_file} of=/dev/sdb bs=512 seek=2048
sudo dd if={fman_ucode_file} of=/dev/sdb bs=512 seek=18432

2. 使用 fdisk 和 mkfs.ext2 在引导加载程序文件后面创建 ext2 分区


sudo fdisk /dev/sdb
    n # new partiton
    p # primary partition
    1 #partition number 1
    <18432 + number_of_blocks(fsl_fman_ucode_ls1046_r1.0_106_4_18.bin)> # start address
    +200M # partition size
    w
sudo mkfs.ext2 /dev/sdb1

3.解压custom-image.tar.gz到ext2分区,复制Image+dtb到/boot目录


sudo mount /dev/sdb1 /mnt/sdcard
sudo tar -xzf custom-image-ls1046ardb.tar.gz -C /mnt/sdcard
sudo cp Image /mnt/sdcard/boot
sudo cp fsl-ls1046a-rdb-sdk.dtb /mnt/sdcard/boot

4.将SD卡放入板子,打开板子开关(拨码开关设置为SD卡启动),进入uboot提示符


setenv bootcmd 'setenv bootargs root=/dev/mmcblk0p1 rw rootdelay=5 console=ttyS0,115200;mmcinfo;ext2load mmc 0:1 0xa0000000 boot/Image;ext2load mmc 0:1 0xb0000000 /boot/fsl-ls1046a-rdb-sdk.dtb;booti 0xa0000000 - 0xb0000000'
boot

概括
我当前的工作流程有效,但正如已经描述的那样,我只想将我的 rootfs 放在 RAM 中,我不知道实现此目的的最佳方法是什么(不仅是 initramfs,但如果它在 init 过程中没有重新安装到位于 SD 卡上的 rootfs)。例如,我尝试使用压缩的 cpio 存档将其加载到 RAM 并将其作为 initrd 参数传递给 booti 命令,但它不起作用并且我收到错误“错误的 Ramdisk 图像格式 Ramdisk 图像已损坏或无效”



setenv bootcmd 'setenv bootargs rootfstype=tmpfs rw size=1024M rootdelay=5 console=ttyS0,115200;mmcinfo;ext2load mmc 0:1 0xa0000000 Image;ext2load mmc 0:1 0xb0000000 fsl-ls1046a-rdb-sdk.dtb;ext2load mmc 0:1 0xc0000000 custom-image-initramfs.cpio.gz;booti 0xa0000000 0xc0000000 0xb0000000'
boot

更多回帖

发帖
×
20
完善资料,
赚取积分