u-boot烧写emmc方式

U-boot支持EMMC设备的两种烧写方式:Fastboot命令与Sdfuse方法

http://blog.youkuaiyun.com/yunfly163/article/details/7495156

------------------------------------------------------------------------------------------------------------------------

U-boot 支持2种方式烧写 emmc设备:

Fastboot 命令:通过usb接口烧写。

步骤:

1.编写u-boot支持从sd卡启动,里面涉及到文件的修改,下面讲解。

2.按照上述方法,把u-boot烧录到sd上,使开发板从sd卡启动。

3.进入开发板命令终端 # :

4.首先格式emmc,目的是分配4个分区。分别为vfat 分区, system 分区, userdata 分区, Cache 分区.

  # : Fdisk   -c  0

  -c   : 表示格式当前设备

      0     表示初始化的emmc设备节点,mmc/sd设备加载顺序,分配的节点从0开始到3结束。不管你从哪个通道指定起始设备,多从0开始分配。如:emmc 占用通道0口,

分配的节点是 0sd卡占用通道口,分配的节点是 1.

如果不初始化emmc,只使用sd卡模式,在sd卡占用通道2口时,分配的节点是 0.这点请

了解源代码,后续会修改。

所以,如果想给板子上SD分区的话,使用如下命令(emmc也初始化成功的情况下)

#: fdisk   -c  1

查看设备分区情况:

#fdisk               -p    0  

5.格式化分区,vfat 分区为fat32格式。其它都为 ext3 文件系统格式.

格式vfat分区: #fatformat    mmc  0:1

0:同上意思,表示的已经加载的emmc设备节点。

1:表示第1个分区,注意。程序默认第一个分区必须为fat分区,

只能指定为 1 ,程序会比较是否为分区1,不是就不会格式化。

格式ext3分区:

#ext3format              mmc 0:2   //system

#ext3format              mmc 0:3  //userdata

#ext3format              mmc 0:4   //cache

6:烧写文件:

#fastboot

给开发板通过usb线跟pc连接。

下载工具:fastbootwindows下,把要烧录的文件 zImage system  userdata放到fastboot文件里面。

windows下开始 ----> 运行 :输入:cmd

在控制行下进入fastboot所在的路径如:

输入命令:  fastboot flash        bootloader  u-boot.bin

fastboot flash        kernel            zImage

fastboot flash        ramdisk          ramdisk-uboot.img

Fastboot flash        system            system..ext3

7.修改u-boot启动参数:

Set bootcmd " movi read kernel c0008000 ;movi rootfs  c0800000  180000;

Bootm     c0008000  c0800000"

Save

---------------------------------------------------------------------------

Sdfuse 烧写方式:

步骤:

1:编写u-boot支持从sd卡启动,里面涉及到文件的修改,下面讲解。

:2:按照上述方法,把u-boot烧录到sd上,使开发板从sd卡启动。

3:在sd里新建文件目录  sdfuse,然后把需要烧写的文件放入里面。

4:从SD卡模式启动开发板,进入开发板命令终端 # :

5:分区: fdisk      -c     0

确保已经对emmc分配了节点 0  sd卡分配的节点 1.

6:格式化同上。

7:烧写文件:

Sdfuse    flash     bootloader         u-boot.bin

Sdfuse    flash     kernel        zImage

Sdfuse    flash     ramdisk             ramdisk-uboot.img

Sdfuse    flash     system        system.ext3

    或者修改文件,支持全部自动烧写:

Sdfuse    flashall

8: 修改u-boot启动参数,同上。

<think> 我们之前已经将eMMC的数据导出到了一个二进制文件(如emmc_dump.bin),现在需要将这个文件重新eMMC。 根据引用[3]中提到的,在U-Boot中可以使用`mmc write`命令将内存中的数据写入eMMC。因此,我们需要先将导出的文件通过TFTP或其他方式加载到内存,然后再使用`mmc write`命令写入eMMC。 步骤: 1. 将导出的emmc_dump.bin文件通过TFTP加载到内存的指定地址(例如0x10000000)。 2. 使用`mmc write`命令将内存中的数据写入eMMC的起始块(块0),并写入eMMC容量相同的块数。 具体操作: 第一步:通过TFTP将文件加载到内存 在U-Boot中,使用tftp命令将文件加载到内存地址0x10000000(确保该地址有足够空间): => tftp 0x10000000 emmc_dump.bin 第二步:计算要写入的块数 我们需要知道导出的二进制文件的大小,然后根据eMMC的块大小(通常为512字节)计算出块数。 假设我们之前导出的总块数为15267840(通过`mmcinfo`得到),那么写入的块数就是15267840。 第三步:写入eMMC 首先切换到eMMC设备(假设设备号为0): => mmc dev 0 然后使用`mmc write`命令写入: => mmc write 0x10000000 0x0 15267840 注意:这里的0x0表示起始块号,15267840是要写入的块数。 但是,如果内存不足以一次性加载整个镜像,或者TFTP传输大文件不稳定,我们可以分块写入。例如,每次写入10000个块(约5MB),然后循环直到完。 分块写入示例(假设总块数为total_blocks,每次写入chunk_blocks个块): setenv total_blocks 15267840 setenv chunk_blocks 10000 setenv offset 0 然后循环: while [ $offset -lt $total_blocks ] do # 计算本次写入的块数(如果剩余块数不足chunk_blocks,则写入剩余块数) setenv write_blocks $chunk_blocks if test $offset -le $total_blocks -a $chunk_blocks -gt $total_blocks - $offset then setenv write_blocks ${total_blocks} - $offset fi # 将文件的一部分通过TFTP加载到内存(需要主机端将大文件分割成小文件,并按顺序传输) # 假设文件名按part_$offset命名 tftp 0x10000000 part_${offset}.bin # 写入当前块 mmc write 0x10000000 $offset $write_blocks # 更新offset setenv offset $offset + $write_blocks done 但是,这种方法需要将大文件分割,并在主机上准备好多个小文件,操作复杂。 因此,推荐在内存足够的情况下,一次性写入。 另外,引用[3]中还提到了使用`mmc read`读取eMMC到内存,而`mmc write`则是写入,这是对称的操作。 注意事项: 1. 写入操作会覆盖整个eMMC,请确保备份了重要数据。 2. 确保内存地址0x10000000开始有足够的连续空间存放整个镜像。 3. 写入过程中不要断电。 验证写入写入完成后,可以使用`mmc read`将写入的数据再读出来,然后与原始文件比较(在U-Boot中比较困难,通常需要在主机上再次导出并比较)。 根据引用[1]中提到的,我们还可以使用类似imxdownload的工具,但该工具是在主机上运行,用于SD卡,不适用于在U-Boot中操作。 因此,在U-Boot中重新eMMC的主要步骤就是上述两步:tftp加载镜像到内存,然后mmc write写入。 引用[4]中的bootm命令是用于启动内核,与写入eMMC无关。 引用[2]中提到了U-Boot的环境变量操作,但这里我们不需要修改环境变量。 综上所述,操作命令如下(假设镜像大小与eMMC容量一致,且已通过TFTP加载到内存): => mmc dev 0 # 选择eMMC设备 => mmc write 0x10000000 0x0 15267840 如果镜像文件大小不是块大小的整数倍,则需要向上取整(但通常整盘镜像都是整数块)。 如果镜像文件大小小于eMMC容量,那么只需要写入镜像文件所占的块数(注意:块数=文件大小/块大小,向上取整)。但是,整盘镜像通常与eMMC容量相等。 因此,在整盘镜像时,我们使用eMMC的总块数。 如果镜像只是eMMC的一部分(例如某个分区),那么需要根据分区的位置和大小来确定起始块和块数。 但用户之前是导出整个eMMC,所以这里我们整个eMMC。 注意:块大小通常为512字节,但有些eMMC可能使用1024或4096字节的块。请确保使用`mmcinfo`确认块大小,并确保镜像文件大小等于块大小乘以块数。 如果块大小不是512字节,那么计算块数时,需要根据实际块大小调整。 例如,如果块大小是4096字节,那么块数 = 文件大小 / 4096(向上取整)。但整盘镜像的块数就是eMMC的总块数。 因此,在写入前,我们需要通过`mmcinfo`确认块大小和总块数。 总结步骤: 1. 通过TFTP将镜像文件加载到内存(地址0x10000000)。 2. 使用`mmcinfo`获取eMMC的块大小和总块数(确保镜像文件大小等于块大小乘以总块数)。 3. 使用`mmc write`写入。 如果镜像文件大小和eMMC容量不一致,则不能直接这样写入。但整盘镜像应该一致。 如果只是某个分区,则写入的起始块和块数需要根据分区调整。但用户需求是“重新eMMC”,即之前导出的整个eMMC数据,所以按整盘写入。 因此,完整命令示例: => tftp 0x10000000 emmc_dump.bin => mmc dev 0 => mmcinfo # 再次确认总块数,假设得到总块数N => mmc write 0x10000000 0x0 N 注意:在写入之前,最好先擦除eMMC(但是`mmc write`会覆盖,所以通常不需要单独擦除)。 但是,如果eMMC中有坏块,直接写入可能会失败。不过,在U-Boot中,`mmc write`命令不会处理坏块,所以需要确保eMMC是完好的。 另外,如果镜像中包含分区表,那么写入后,分区信息也会被恢复。 以上就是在U-Boot中把导出的数据重新eMMC的方法。 </think> ### 在 U-Boot 中将数据重新eMMC 的方法 根据引用[3]中关于 `mmc write` 命令的使用原理,结合 eMMC 操作规范,完整流程如下: #### 🔧 步骤 1:准备数据到内存 1. 通过 TFTP 将导出文件加载到内存地址 `0x10000000`(需确保地址空间足够): ```bash tftp 0x10000000 emmc_dump.bin ``` > 文件大小需与原始 eMMC 容量完全一致(通过 `mmcinfo` 获取的块数 × 块大小) #### ⚙ 步骤 2:计算写入参数 1. 获取 eMMC 信息: ```bash mmc dev 0 # 选择 eMMC 设备 mmcinfo # 查看块大小和总块数 ``` 输出示例: ``` Sector Size: 512 bytes # 块大小 Total Size: 7.3 GiB # 对应块数 15267840 ``` 2. 计算写入块数: $$块数 = \frac{文件大小}{块大小}$$ 例如 7.3GiB 镜像:$15267840 = \frac{7,817,748,480}{512}$ #### 🔥 步骤 3:执行命令 ```bash mmc write 0x10000000 0x0 15267840 ``` - `0x10000000`:内存源数据地址 - `0x0`:eMMC 起始块号(从0开始全盘写入- `15267840`:写入块数[^3] #### ⏱ 步骤 4:验证写入(可选) ```bash mmc read 0x11000000 0x0 100 # 读取前100块 cmp.b 0x10000000 0x11000000 51200 # 比较前100块数据 ``` - 返回 `Total of 100 word(s) were the same` 表示校验通过 #### ⚠️ 关键注意事项 1. **地址安全**:确保内存地址 `0x10000000` 未被占用 2. **块对齐**:文件大小必须是块大小(通常512字节)的整数倍 3. **保护**:前检查 eMMC 是否处于保护状态: ```bash mmc wp check 0 ``` 4. **分块写入**(内存不足时): ```bash mmc write 0x10000000 0x0 10000 # 前10000块 mmc write 0x10000000 0x2710 10000 # 下一块(0x2710=10000) ``` > 引用[3]显示:`mmc write` 与 `mmc read` 参数结构完全对称,但方向相反,这保证了数据可完整回[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值