我想将带有 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 服务器正在运行并将映像托管为文件 uImage_txul):
TX6UL U-Boot > tftp ${loadaddr} uImage_txul
TX6UL U-Boot > mmc write ${loadaddr} 0xXXXX 0xYYYY
如何找到将映像写入 hwpartition GP1 所需的地址 0xXXXX 0xYYYY?
答案1
将 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 提取到那里。假设您将 nfs 服务器文件系统设置在 /nfsroot。设置以下变量以启用网络启动。
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 设置回正常状态
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
希望这可以帮助。