linux – uboot将内核写入mmc分区
作者:互联网
我想将一个带有U-Boot的Linux内核编写到i.MX6板上的eMMC存储的mmc hwpartition中:
TX6UL U-Boot > mmc info
Device: FSL_SDHC
Manufacturer ID: 11
OEM: 100
Name: 004G6
Tran Speed: 52000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 8 MiB
Bus Width: 4-bit
Erase Group Size: 4 MiB
HC WP Group Size: 4 MiB
User Capacity: 8 MiB WRREL
Boot Capacity: 2 MiB ENH
RPMB Capacity: 512 KiB ENH
GP1 Capacity: 8 MiB WRREL
GP2 Capacity: 1.8 GiB ENH WRREL
通用hwpartition GP1旨在用于内核.通常使用以下命令来编写映像(假设tftp-server正在运行并将映像托管为文件uImage_txul):
TX6UL U-Boot > tftp ${loadaddr} uImage_txul
TX6UL U-Boot > mmc write ${loadaddr} 0xXXXX 0xYYYY
如何找到所需的地址0xXXXX 0xYYYY将图像写入hwpartition GP1?
解决方法:
将u-boot烧录到mmc的简短答案可能就是
tftp ${loadaddr} u-boot.bin
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 1
mmc write ${fileaddr} 0 800
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0
但这取决于你如何设置mmc.此命令将从${fileaddr}写入1048576(0x800 * 512)个字节到从地址0开始的mmc.
有关编写mmc的更长更完整的答案.假设您将按制造商建议的方式设置mmc.
| u-boot[0] | DT[0x680] | Kernel[0x800] | FS[0x8000] |
假设您已经拥有了所需的文件,如果没有,您可以使用Yocto构建这些文件.如果你愿意,我可以提供相关细节.
u-boot.bin, imx6ul-txul-0011.dtb, uImage, rootfs.tar.bz2, modules.tgz
让我们假设你已经至少侧载了u-boot,看起来你已经以某种方式运行了它.
首先你需要对mmc进行分区.您无法通过u-boot执行此操作,因此您需要设置网络启动.看来你已经有了一个包含文件的tftp服务器,你还需要设置一个nfs服务器并将rootfs提取到那里.假设您在/ nfsroot设置了nfs服务器文件系统.设置以下变量以启用net boot.
env default -a
env set bootdelay 3
env set serverip 192.168.1.99
env set nfs_server 192.168.1.99
env set ipaddr 192.168.1.90
env set netmask 255.255.255.0
env set bootfile uImage
env set nfsroot /nfsroot
env set boot_mode net
env set default_bootargs setenv bootargs init=/bin/sh console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}
save
启动到Linux提示符并从那里运行
fdisk /dev/mmcblk0
和设置分区如下
Partition Start Cyl End Cyl Start Sector End Sector Type
1 33 512 2048 32767 0x0c
2 513 - 32768 - 0x83
切换回u-boot,您现在应该能够看到您的分区
> mmc part
Partition Map for MMC device 0 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 2048 30720 00ee66ee-01 0c
2 32768 7700480 00ee66ee-02 83
注意,分区1从扇区2048开始,即0x800.分区2从32768开始,即0x8000.您现在应该看到这些数字的来源.
我们使用上面的命令更新了u-boot.bin,但请注意它也会覆盖设备表(DT).所以要更新DT,请使用
tftp ${fdtaddr} imx6ul-txul-0011.dtb
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 1
mmc write ${fdtaddr} 0x680 80
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0
也可以使用这些命令设置环境变量${fdtsave},如果是这样,您可以使用
run fdtsave
要更新分区,您需要在Linux机器上创建磁盘映像,然后将它们tftp到TX6UL并使用mmc write命令进行刻录.要为第一个分区创建映像,可以在linux框中使用这些命令.
dd if=/dev/zero of=part1.image bs=15728640 count=0 seek=1
/sbin/mkfs -t vfat part1.image
sudo mkdir /mnt/mkpart
sudo mount -o loop part1.image /mnt/mkpart
cp uImage /mnt/mkpart/uImage
sudo umount /mnt/mkpart
然后在u-boot中
tftp ${loadaddr} part1.image
mmc write ${fileaddr} 800 7800
您可以使用u-boot查看分区的内容
> fatls mmc 0:1
3676512 uimage
1 file(s), 0 dir(s)
同样对于第二个分区,从你的linux框中使用类似的东西
dd if=/dev/zero of=part2.image bs=64M count=0 seek=1
/sbin/mkfs -t ext3 part2.image
sudo mkdir /mnt/mkpart
sudo mount -o loop part2.image /mnt/mkpart
sudo tar -C /mnt/mkpart -xjf rootfs.tar.bz2
sudo tar -C /mnt/mkpart -xzf modules.tgz
ln -s sbin/init /mnt/mkpart/linuxrc
sudo umount /mnt/mkpart
然后从u-boot
tftp ${loadaddr} part2.image
setexpr fs ${filesize} + 1ff
setexpr fs ${fs} / 200
mmc write ${fileaddr} 8000 ${fs}
如果要从u-boot中查看第二个分区的内容
> ext2ls mmc 0:2
要从新分区引导,请在引导参数中将init设置为normal
env set default_bootargs setenv bootargs init=/linuxrc console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}
save
并且不要忘记更改分区ID或env变量以指向新文件系统.在这种情况下
env set rootpart_uuid 00ee66ee-02
save
希望这可以帮助.
标签:u-boot,linux,embedded 来源: https://codeday.me/bug/20190816/1668757.html