emmc boot1 boot2 partition
使用mfg tool烧写android5.1的镜像之后,再使用旧版的mfg tool烧写linux或者android镜像,都不能正常启动,而且运行的uboot还是android5.1版本的uboot。
参考链接
http://www.itdadao.com/articles/c15a39492p0.html
http://www.cnblogs.com/heiyue/p/5199851.html#undefined
http://www.cnblogs.com/heiyue/p/5830505.html
https://linux.codingbelief.com/zh/storage/flash_memory/emmc/emmc_partitions.html
https://community.nxp.com/thread/331306
https://freescale.jiveon.com/thread/429311
http://blog.5ibc.net/p/80599.html
emmc boot分区
在同事的帮助下才知道emmc有boot1,boot2以及RPMB(Replay Protected Memory Block),GPAP(General Purpose Area Partitions,最多可以有4个),UDA(User Data Area)分区。而我们一般只知道UDA分区。
我们通常对emmc进行分区,也只是对UDA分区。boot1,boot2,RPMB分区是固定的,我们并不能控制器大小和分区格式。如下图所示(图片摘自网络):

这次的android5.1镜像将uboot烧写到了boot1分区,并且将boot1分区使能。那么emmc每次启动之后就从boot1分区启动,运行android5.1的uboot,而android5.1的uboot又找不到其对应的kernel等镜像(因为UDA的区域的镜像已经烧写成别的版本),所以就一直卡在启动的页面。
并且写到emmc寄存器中的值是一直保留的,不会因为开机就恢复为默认值。
而原来的工具是将uboot放在UDA分区。
android5.1的mfg tool中,ucl2.xml有那么一段。(我添加了注释)
<!-- 使emmc的boot0分区变为可读写 -->
<CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD>
<CMD state="Updater" type="push" body="send" file="files/android/%folder%/u-boot-imx%soc%%plus%.imx" >Sending u-boot.bin</CMD>
<!-- 将uboot烧录到emmc的boot0分区,在系统盘符里分区的序号是从0开始,也就是boot0, boot1 -->
<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD>
<!-- 使emmc的boot0分区变为只读 -->
<CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access </CMD>
<!-- 将boot0分区使能,那么启动的时候就会从boot1分区启动,
emmc寄存器序号是从1开始,boot1,boot2.这里的enable 1指的是emmc boot分区的第一个分区,是针对emmc的寄存器而言的。
而上面的/sys/block/mmcblk3boot0指是针对linux系统而言的,其实指的都是统一个分区,就是emmc boot的最开始的分区。
-->
<CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>
emmc boot寄存器
下图是emmc寄存器设置。
不使能引导,将BOOT_PARTITION_ENABLE设置为0,
使能boot1,将BOOT_PARTITION_ENABLE设置为1,
使能boot2,将BOOT_PARTITION_ENABLE设置为2,
使能UDA,将BOOT_PARTITION_ENABLE设置为7.

解决方法
在uboot中有emmc命令,用于设置emmc的寄存器。uboot版本不同,命令有些不一样。
FSL 2009.08 U-boot u-boot-fslc branch patches-2014.07
args mmc bootpart mmc partconf dev boot_ack boot_partition partition_access
example for change boot partition to device 2 partition 1:
mmc bootpart 2 1 mmc partconf 2 1 1 1
example for change boot partition to device 2 partition 0:
mmc bootpart 2 0 mmc partconf 2 1 0 1
具体操作如下:
# uboot中首先查看emmc的编号
Tony> mmc list
FSL_SDHC: 0
FSL_SDHC: 1
FSL_SDHC: 2 (eMMC)
# 确定emmc的序号是2
# 查看emmc命令
Tony> mmc
mmc - MMC sub system
Usage:
mmc info - display info of the current MMC device
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc hwpartition [args...] - does hardware partitioning
arguments (sizes in 512-byte blocks):
[user [enh start cnt] [wrrel {on|off}]] - sets user data area attributes
[gp1|gp2|gp3|gp4 cnt [enh] [wrrel {on|off}]] - general purpose partition
[check|set|complete] - mode, complete set partitioning completed
WARNING: Partitioning is a write-once setting once it is set to complete.
Power cycling is required to initialize partitions after set to complete.
mmc bootbus dev boot_bus_width reset_boot_bus_width boot_mode
- Set the BOOT_BUS_WIDTH field of the specified device
mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>
- Change sizes of boot and RPMB partitions of specified device
mmc partconf dev boot_ack boot_partition partition_access
- Change the bits of the PARTITION_CONFIG field of the specified device
mmc rst-function dev value
- Change the RST_n_FUNCTION field of the specified device
WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.
mmc setdsr <value> - set DSR register value
# 设置emmc的启动分区,主要是partconf后面的第一个和第三个参数。
# 2是emmc的编号,第三个参数设置启动的分区,对应寄存器BOOT_PARTITION_ENABLE字段。设为0表示不使能。
Tony> mmc partconf 2 0 0 0
# 或者设置为7表示从UDA启动, 0和7我都尝试了,烧录原来的镜像都能够启动成功。
Tony> mmc partconf 2 0 7 0
或者更改ucl2.xml文件,使能UDA分区。
<!-- 但是设置成0时,烧录出错,不知道为什么 -->
<CMD state="Updater" type="push" body="$ mmc bootpart enable 0 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>
或者
<!-- 设置成7,烧录成功,再烧录原来的系统,能正常运行 -->
<CMD state="Updater" type="push" body="$ mmc bootpart enable 7 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>
Author
Tony Liu
2016-11-11, Shenzhen
emmc boot1 boot2 partition的更多相关文章
- I.MX6 change boot partition 1 to User area
/************************************************************************************ * I.MX6 change ...
- I.MX6 Android 5.1 回到 Android 4.2 emmc 启动
/*************************************************************************** * I.MX6 Android 5.1 回到 ...
- Android MMC/EMMC/MTD Partition Layout
Android devices have a couple of partitions to store different data. The common ones are the recover ...
- Linux和Uboot下eMMC boot分区读写
关键词:eMMC boot.PARTITION_CONFIG.force_ro等. 1. eMMC的分区 大部分eMMC都有类似如下的分区,其中BOOT.RPMB和UDA一般是默认存在的,gpp分区需 ...
- AOSP5.0换8G eMMC不能开机问题
AOSP5.0 MT6572平台.用H9TP32A4GDBCPR_KGM这颗4G的eMMC就能够.可是用H9TP65A8JDACPR_KGM这个8G的就开不了机,一直是重新启动.用串口抓LOG发现以下 ...
- imx6 MFG TOOL 分析
之前分析过mfgtool的内容,最近从官网下载,返现新版的mfgtool工具将imx6各种版本的linux/android都使用一个工具进行烧录.所以从新分析一下. 新版与旧版的一个区别是烧写使用的u ...
- 编译android后找不到ramdisk-u.img[已解决]
--- --- #!/bin/bash OUTDIR=out/target/product/tiny4412AHOSTBIN=out/host/linux-x86/bin # install vend ...
- Android updater-scripts(Edify Script)各函数详细说明(转)
这是Android系统来运行updater-scripts的Edify语言的基本介绍. 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返回值来 ...
- LPC1800 and LPC4300 Boot/ISP/CRP
MCU的启动方式有很多种:UART接口,扩展的静态存储单元(NOR Flash), SPI Flash,quad SPI Flash,高速USB0和USB1.另外可以通过对OTP存储单元的编程. 首先 ...
随机推荐
- BZOJ 1856 字符串(组合)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1856 题意:有n个1和m个0组成的串,使得任意前k个中1的个数不少于0的个数.有多少种这 ...
- SQL SERVER事务处理
SQL SERVER事务处理 一.事务定义: 事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分. 如果事务遇到错误且必须取消或回滚,则所有 ...
- 【MVC框架整合】之 SpringMVC3.2.0+MyBatis3.1.1+Spring3.2.0
1.先整合spring和Mybatis 第一步基本上都是一样加入jar包 创建测试目录 添加junit jar包和log4j配置文件 Log4j的配置文件基本上都是不会变的复制过来就行了 现在就和Hi ...
- 去掉Xcode源码末尾的空格
去掉Xcode源码末尾的空格 在用 Xcode 开发的时候,很容易就在行末增加一些空格了.这些空格在上传到 review board 上后 , 就会被特别的颜色显示出来.因为一种好的编程风格是说 , ...
- iOS开发中使用[[UIApplication sharedApplication] openURL:]加载其它应用
iOS 应用程序之间(1) 在iOS开发中,经常需要调用其它App,如拨打电话.发送邮件等.UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的u ...
- 使用SBT构建Scala应用(转自git)
# 使用SBT构建Scala应用 ## SBT简介 SBT是Simple Build Tool的简称,如果读者使用过Maven,那么可以简单将SBT看做是Scala世界的Maven,虽然二者各有优劣, ...
- bin/bash 和 /bin/sh 的区别
今天在用ssh Secure shell 连接虚拟机中的Ubuntu编写程序时,想比对一下两个源代码有什么差别,但是在一个ssh 客户端下不断的切换很是费劲.于是想着在主机中再添加一个用户.我原本用s ...
- 一些Office 365的问题收集
1. 按照MS的最佳实践, 应该是先有本地域, 然后再有Office 365. 但是我们公司刚好相反, 于是按照前面的文章做完了硬关联, 但是现在发现对于那些原本就在Office 365上的用户的Pr ...
- Scrum会议8(Beta版本)
组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...
- redis hash怎么用
public static void testHsh() { System.out.println("==Hash=="); Jedis jedis = RedisUtil.get ...