uboot将内核写入mmc分区

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 服务器正在运行并将映像托管为文件 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

希望这可以帮助。

相关内容