ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – uboot将内核写入mmc分区

2019-08-16 15:53:06  阅读:1067  来源: 互联网

标签:u-boot linux embedded


我想将一个带有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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有