如何读取emmc bootrpmb partition emmc

智能手机采用EMMC存储,批量灌装操作系统_51copy数据处理中心_天涯博客
51copy数据拷贝中心成立于2002年,曾致力于光盘拷贝机的生产与销售,如今随着IT行业的高速发展,各种硬盘存储、U盘存储快速发展起来,逐渐取代光盘,我中心顺应时代潮流,从台湾引进各种硬盘复制机、U盘复制机、SD卡复制机、TF卡复制机、CF卡复制机等设备,为满足不同客户的需求,我司可为各企业提供不同口数、不同功能、不同造型、不同接口的复制设备,也可根据客户要求进行定制化服务。
今日访问:[$DayVisitCount$]
总访问量:10835
开博时间:
博客排名:195550
(3)(5)(2)(1)
智能手机的使用范围已经布满全世界,但不是人人都知晓与使用因为智能手机具有优秀的操作系统、可自由安装各类软件(仅安卓系统)、完全大屏的全式操作感这三大特性,所以完全终结了前几年的键盘式手机。
其中Google(谷歌)、&、、、(宏达电) 这五大品牌在全世界最广为皆知,而(Mi)、(HUAWEI)、(MEIZU)、(Lenovo)、(ZTE)、(Coolpad)、(oneplus)、(GIONEE)、天宇(,K-Touch)等品牌在中国备受关注。
很多智能手机为使系统启动速度更换响应及存储速度更高,自日三星开始量产行业首款eMMC 5.0存储产品,国内的小米4、小米note、红米note2、魅族MX4 、魅族MX5、魅蓝note、魅蓝note2、奇酷手机、乐视手机、华为手机等都已经采取EMMC作为存储芯片,从而更消费带来响应速度更快的体验。
智能手机2014年创下接近13亿台的出货量,2015年第一季度全球智能手机销售量达3.36亿台,这么庞大出货量,手机厂的操作系统是如何进行灌装的呢,会不会像是电脑一样进行Ghost网络克隆能,显然这个不且实际,那到底是怎么进行的呢?下面我们揭晓答案。
智能手机的系统灌装会使用一种叫EMMC烧录器的设备,他可以同时烧录很多个芯片,只要将系统及引导信息置入母卡内并确保母卡是可以正常启动,就可以把此母卡放入EMMC拷贝机上,只需点一个按键就会自动灌装,且仅需几分钟就可以搞定,EMMC拷贝机在完成拷贝时可以进行数据完整性校验,从而可以确保每一张EMMC数据都是百分百正确的。
51copy数据处理中心2013年开始从事EMMC拷贝机开发与研究,从而研发出一款与以往常见的IC烧录器不同的拷贝机,我们的eMMC拷贝机不再需要透过连接计算机,便能直接对eMMC内存进行拷贝作业;此外,6./Min的高速能力,搭配支持Windows(FAT16/32/64,NTFS)和Linux(Ext2/Ext3/Ext4)等系统格式的快速拷贝,以及拷贝数据区(user&area)、开机区(&boot&partition&)及保护区(RPMB&Partition)之能力,使得行动装置生产商所渴望的量产标准获得全面性的满足。
提供最佳的兼容性,向上支持到eMMC5.0。且支持支持拷贝开机区( Boot partition)、用户档案区域(user area copy) 以及RPMB区。
在突破过去eMMC装置的技术限制下,51copy数据处理中心eMMC拷贝机纳入工业应用厂商所引颈期待的需求。生产管理日志(Log)能自动记录工作结果,使得生产管理更有效率;3种专业抹除功能保证产品出厂质量;独家快拆承座模块设计,能处理各种不同规格的eMMC内存。此外,此系列拷贝机更提供了超高兼容性,直接支持并向容eMMC&5.0及以下之规格。
EMMC拷贝机特色
● 支持1对9,1对19拷贝。
● 用户可自行选择拷贝区域,包括开机区( Boot partition)、 RPMB区、一般用途区和用户档案区域
● 智能型LED 指示灯清楚显示工作状态及结果
● &位对位&比对功能提供更可靠的拷贝解决方案&
伴随着行动科技多角化的发展与eMMC的广泛应用,eMMC拷贝机将会是存储科技产品市场中的不二选择。想了解更多有关eMMC拷贝机的细节,欢迎莅临我中心进行现场测试。
&51copy数据处理中心
http://www.51copy.cc分类: |  eMMC专用烧录器 编程器 eMMC拷贝机   eMMC驱动科技新进展,佑华科技推荐EMMC专用烧录器  全球行动装置科技的核心发展自2010以来,随着eMMC内嵌式整合型内存(Embedded Multi Media Card)的出现而迅速向前迈进。举凡智能手机、平板电脑、笔记本电脑等,任何意图朝向「轻、薄、短、小」的装置设计,都需要降低零组件使用面积,也因此都能见到eMMC内存出现的身影。而由于结构的关系,过去对eMMC内存内的数据复制,需要特殊设备才能完成。但随着eMMC专用拷贝机的出现,行动装置的应用发展迈向了一个新的里程碑。  图片1: eMMC 1-9机器图    带来产品创新与成本优势  以手机或平板电脑的厂商来说,使用eMMC最大的好处就是不再会为了内存更换或芯片制程更新,而造成必须重新设计的困扰。因为只要eMMC在设计之初被妥善配置,开发单位就无需再去处理控制芯片与不同内存之间的配合问题。毫无疑问地,eMMC帮助了厂商加快了产品开发时程,也降低了成本。  平板市场eMMC存储方案渗透率提升  2015全球平板市场需求下滑,平板出货量大约2.35亿部,较2013年仅呈个位数成长。中高端平板芯片主要由联发科技和英特尔主导,2014年联发科技推出的几款四核、八核芯片稳固中高端平板市场,主流存储方案为8GB-32GB eMMC+LPDDR2/3。英特尔凭借高性能优势主要占领高端的商务平板市场,针对平板设计的BayTrail-T 低功耗移动处理器的几款四核主流存储器都是支持eMMC的,主流存储方案为16GB-64GB eMMC+LPDDR,Android 平板以 8GB-16GB eMMC+LPDDR 存储方案为主。2014 年英特尔向紫光投资人民币 90 亿元(约15亿美元),与瑞芯微联合发布具有低成本和低功耗、高集成度的3G XMM6321方案,eMMC为首选,存储容量基本在16GB以上。为了避免在低端平板市场价格战或走上灭亡之路,国内芯片厂商纷纷寻找新的策略突围,瑞芯微、全志、炬力等在低端以及中高端市场主推的四核、八核芯片都支持eMMC存储方案。  图2:平板主流嵌入式解决方案    eMMC是智能盒子和可穿戴智能硬件等市场的主流存储方案  智能盒子市场在 2013 年开始呈现爆炸性增长,2014下半年受到广电总局禁令政策影响市场需求低迷,但仍然实现了2,000万台的销售量。盒子市场主流厂商之一的晶晨,在单核 M3、双核M6芯片时代主要采取SPI NOR+NAND TSOP的解决方案,2014 年晶晨S8系列四核智能盒子芯片,以及全志、瑞芯微的四核、八核芯片在设计上开始支持 eMMC 方案,传统机顶盒芯片厂商海思最新量产的芯片同样是支持 eMMC,eMMC将成为主流方案。  图3:盒子市场主流嵌入式存储解决方案    智能电视市场主要芯片方案为晨星、联发科技、Releatek等,存储方式大多默认采用4GB MLC eMMC ,高端机型已开始转向8GB,同时在车载导航、学习机、电子书、游戏机、广告机等上eMMC也逐步开始普及。2014年瑞芯微、全志、炬力等已不再只专注于低端平板市场,正在极力向中高端市场转移,同时还纷纷推出面向智能盒子的四核和八核的解决方案,支持eMMC存储方案。  欣佑科技EMMC烧录器操作简易、高速作业  欣佑科技于今(2015)年推出全新一代的eMMC专用拷贝机。与以往常见的IC烧录器不同的是,此系列eMMC拷贝机不再需要透过连接计算机,便能直接对eMMC内存进行拷贝作业;此外,6.2GB/m的高速能力,搭配支持Windows(FAT16/32/64,NTFS)和Linux(Ext2/Ext3/Ext4)等系统格式的快速拷贝,以及拷贝数据区(user area)、开机区( boot partition )及保护区(RPMB Partition)之能力,使得行动装置生产商所渴望的量产标准获得全面性的满足。  复合多功能,物超所值新机种    在突破过去eMMC装置的技术限制下,欣佑科技eMMC拷贝机纳入工业应用厂商所引颈期待的需求。生产管理日志(Log)能自动记录工作结果,使得生产管理更有效率;3种专业抹除功能保证产品出厂质量;独家快拆承座模块设计,能处理各种不同规格的eMMC内存。此外,此系列拷贝机更提供了超高兼容性,直接支持并向容eMMC 5.0及以下之规格。  伴随着行动科技多角化的发展与eMMC的广泛应用,欣佑科技eMMC拷贝机将会是存储科技产品市场中的不二选择。想了解更多有关eMMC拷贝机的细节,欢迎莅临欣佑科技网站查询: .cn 。  欣佑电子科技(上海)有限公司  电话:021-(Coco)  传真:021-  QQ:(Coco)  邮箱:Coco@  公司地址:上海市闵行区吴宝路255号力国大厦928室
楼主发言:1次 发图:
请遵守言论规则,不得违反国家法律法规From Texas Instruments Wiki
AM335xEVM has on board NAND and MMC interface. Either interface can be used for booting a system.
NAND boot is raw boot, as it reads raw data and manipulates it.
MMC boot is FAT boot, as it reads file from MMC sector and manipulates it.
MMC and NAND boot is already supported by android devkit releases available at .
This wiki highlights on:
Using the available MMC interface on the AM335xEVM to simulate the eMMC functionality.
Adding eMMC support for fastboot.
Updating images to eMMC over fastboot.
Boot android from eMMC using RAW boot technique.
Wiki will also act as porting guide to port eMMC support on other platforms.
Note: All patches described in this documents are validated on Texas Instruments' AM335xEVM board.
eMMC describes an architecture consisting of an embedded storage solution with MMC interface, flash memory and controller. In one line it is a flash/NAND over MMC interface.
The OMAP processor follows a 2 stage boot process. Details on the boot procedure can be found at the
Fastboot is the method that android uses to flash the android built onto the target.
Fastboot protocol specification is found .
Fastboot speeds up your development NOT the time it takes to boot.
Also, fastboot is used to update x-loader, bootloader, kernel, systemfs, userdata etc. by oem.
In the discussion that follows, “sector” refers to a 512-byte disk sector, addressed by its Logical Block Address (LBA). Although the UEFI specs allow for disk sectors of other sizes, in practice 512 bytes is the norm.
The master boot record is the first sector on the hard drive (LBA 0). As mentioned above, legacy BIOSes will boot from this sector.
To protect the GUID partitions on the drive from legacy OSes, the MBR partition table normally contains a single partition entry of type 0xEE, filling the entire drive.
The second sector (LBA 1) contains the primary GPT header, followed immediately by 16K (32 sectors) of the primary GUID Partition Entry Array. In conformance with the EFI spec, another copy of these data should be located at the end of the disk as well, with the secondary GPT header in the last accessible sector and the secondary GUID Partition Entry Array immediately preceding it. In current implementation secondary GPT is not included.
GPT allows a large number of partitions on a drive. Choosing a partition scheme may vary across OEM vendor. Partition scheme described here is most chosen by OEM for mobile/hand-held device for a 1GB eMMC.
Start LBA-End LBR
Description
0xx000000FF
Master Boot Record and GUID Partition Table.
0xx000001FF
First stage bootloader.
bootloader(u-boot.bin)
0xx000005FF
Second stage bootloader.
0xx000006FF
Reserved. This partition can be used for internal purpose.
0xx000007FF
recovery (zImage + recovery-ramdisk.img)
0xx000047FF
Recovery partition.
boot (boot.img = zImage + ramdisk.img)
0xx000087FF
Partition contains kernel + ramdisk images.
system (system.img)
0xx000887FF
Android file system.
cache (cache.img)
0xx001087FF
Partition will be used to store application cache.
userdata (userdata.img)
0xx001887FF
Partition contains userdata supplied by oem vendor like configuration files,utilities etc..
0xx001FFFFF
Partition contains media files, supplied by oem vendor.
Download source (if it is not downloaded).
/* download u-boot source, if not available */
$git clone git://gitorious.org/rowboat/u-boot.git
$cd u-boot
/* checkout mentioned commit id, branch:am335x-master-android-ics */
$git checkout 429a3860feea1ac1a431b849f45729
With the u-boot with the eMMC RAW boot patches integrated, has support for RAW booting from eMMC and flashing the images to eMMC through Fastboot for AM335x.
The code is enabled for SD/MMC boot by default. Also it can be used for NAND boot by loading the images to NAND using Fastboot.
For enabling eMMC booting with Fastboot, do the following modifications in "include/configs/am335x_evm.h":
Enable "#define CONFIG_STORAGE_EMMC"
Disable "#define FASTBOOT_PORT_OMAPZOOM_NAND_FLASHING"
And for NAND boot with Fastboot, do the following modifications in "include/configs/am335x_evm.h":
Disable "#define CONFIG_STORAGE_EMMC"
Enable "#define FASTBOOT_PORT_OMAPZOOM_NAND_FLASHING"
When eMMC boot mode is enabled, the normal SD/MMC FAT boot will not work. For getting the SD?MMC FAT boot user has to enable the configuration for NAND boot.
The AM335x General Purpose EVM has two SD/MMC connectors.
The SD/MMC0 connector is placed on the Base board and is available for all the 7 Profile modes.
The SD/MMC1 connector is placed on the General purpose Daughterboard and is available only on Profile 2.
The code adds two Macros to the board config file (include/configs/am335x_evm.h), named:
CONFIG_USE_MMC0: To enable the SD/MMC0 as the boot device.
CONFIG_USE_MMC1: To enable the SD/MMC1 as the boot device.
By default when the CONFIG_STORAGE_EMMC boot option is enabled the MMC0 device gets selected as the boot medium.
For eMMC booting support for SD/MMC0 or SD/MMC1 the boot mode switch should be set as:
SW3 (8:1):
(ON | ON | ON | OFF | OFF | OFF | ON | ON)
This will change the SYSBOOT[4:0] to 11100
Also configure the AM335xEVM to Profile 2 mode, in order to enable both the MMC slots.
All the binaries can be flashed to the device, with the eMMC card interfaced to the respective slot, as per the enabled Macro in the board config file, using fastboot.
After flashing those binaries, on reboot the device boots Android through the raw read from the eMMC.
Build u-boot (both MLO and u-boot.img)
$make CROSS_COMPILE=arm-eabi- distclean
$make CROSS_COMPILE=arm-eabi- am335x_evm_config
$make CROSS_COMPILE=arm-eabi-
The above commands will generate MLO and u-boot.img files.
Append eMMC raw header to MLO
Download eMMC raw header
(right click and "save link as").
$dd if=&eMMC_raw_header& of=./MLO.final
$dd if=&MLO-Path&/MLO of=./MLO.final conv=notrunc oflag=append
Download source (if it is not downloaded).
/* download kernel source, if not available */
$git clone git://gitorious.org/rowboat/kernel.git
$cd kernel
/* checkout mentioned commit id, branch:rowboat-am335x-kernel-3.2 */
$git checkout a621dd8616dbbc741b5e978e36034a
Build kernel
$make ARCH=arm CROSS_COMPILE=arm-eabi- distclean
$make ARCH=arm CROSS_COMPILE=arm-eabi- am335x_evm_android_defconfig
$make ARCH=arm CROSS_COMPILE=arm-eabi- uImage
Follow build steps mentioned .
$mkdir &YOUR_PATH&/images
$cd &YOUR_PATH&/images
$cp &ANDROID_SOURCE&/kernel/arch/arm/boot/zImage .
Update init.rc file and rebuild images
Add following lines to &ANDROID_SOURCE&/out/target/product/am335x3evm/root/init.rc
mount ext4 /dev/block/mmcblk0p6 /system wait ro
mount ext4 /dev/block/mmcblk0p8 /data wait noatime nosuid nodev
mount ext4 /dev/block/mmcblk0p7 /cache wait noatime nosuid nodev
Rebuild images
$cd &ANDROID_SOURCE&
$find out/target/product/am335xevm -name *.img -exec rm -f {} \;
$make TARGET_PRODUCT=am335xevm OMAPES=4.x
Prepare boot.img
$cd &YOUR_PATH&/images
$cp &ANDROID_SOURCE&/out/target/product/am335xevm/ramdisk.img .
$cp &ANDROID_SOURCE&/out/host/linux-x86/bin/mkbootimg .
$./mkbootimg --kernel zImage --ramdisk ramdisk.img --base 0x --cmdline &console=ttyO0, androidboot.console=ttyO0 mem=256M root=/dev/ram0 rw initramfs=0xM init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y vram=&2M& omapfb.vram=0:2M& -o boot.img
$cd &YOUR_PATH&/images
/* creating 192MB, it can be configure as per need */
$dd if=/dev/zero of=./system.img bs=1M count=192
$mkfs.ext4 system.img
$mkdir mnt-point
$sudo mount -t ext4 -o loop system.img mnt-point/
$cp -rfp &ANDROID_SOURCE&/out/target/product/am335xevm/system/* mnt-point/
$sudo umount mnt-point
$cd &YOUR_PATH&/images
/* creating 192MB, it can be configure as per need */
$dd if=/dev/zero of=./userdata.img bs=1M count=192
$mkfs.ext4 userdata.img
$sudo mount -t ext4 -o loop userdata.img mnt-point/
$cp -rfp &ANDROID_SOURCE&/out/target/product/am335xevm/data/* mnt-point/
$cp -rfp &ANDROID_SOURCE&/out/target/product/am335xevm/root/data/* mnt-point/
$sudo umount mnt-point
$cd &YOUR_PATH&/images
/* creating 192MB, it can be configure as per need */
$dd if=/dev/zero of=./cache.img bs=1M count=192
$mkfs.ext4 cache.img
Create MMC card for FAT boot mentioned .
Connect target to host machine using USB cable. Connect USB cable to OTG port on target.
Boot target and enter any key at the U-boot prompt.
At the u-boot prompt enter following command:
Fastboot entered...
On Host Machine
/* locate fastboot in android filesystem */
$cd &ANDROID_SOURCE&/out/host/linux-x86/bin/
/* search for fastboot devices */
$./fastboot devices
/* create GPT table on eMMC/SD card */
$./fastboot oem format
/* flash all partitions: ./fastboot flash &name& &binary& */
/* flash SPL */
$./fastboot flash spl &YOUR_PATH&/images/MLO.final
/* flash bootloader */
$./fastboot flash bootloader &YOUR_PATH&/images/u-boot.img
/* flash boot image */
$./fastboot flash boot &YOUR_PATH&/images/boot.img
/* flash file system - system image */
$./fastboot flash system &YOUR_PATH&/images/system.img
/* flash user data */
$./fastboot flash userdata &YOUR_PATH&/images/userdata.img
/* flash cache partition */
$./fastboot flash cache &YOUR_PATH&/images/cache.img
/* reboot target */
$./fastboot reboot
Flashing of system.img, userdata.img, cache.img, each may take around 10-12 minutes.
GPT configuration has been defined in "&ANDROID_PATH&/u-boot/board/ti/am335x/mmc.c" as below. Kindly change as per need
static struct partition partitions[] = {
{ &-&, 128 },
{ &spl&, 128 },
{ &bootloader&, 512 },
/* &misc& partition is required for recovery */
{ &misc&, 128 },
{ &-&, 128 },
{ &recovery&, 8*1024 },
{ &boot&, 8*1024 },
{ &system&, 256*1024 },
{ &cache&, 256*1024 },
{ &userdata&, 256*1024},
{ &media&, 0 },
For further information or to report any problems, contact
For community support join
For IRC #rowboat on irc.freenode.net后使用快捷导航没有帐号?
查看: 6698|回复: 23
关于三星cortex A9 4412 uboot 启动的一些问题释疑
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
最近,发现4412 和S5PV210的一些iNand/TF启动方式有些不同,4412 的一些磁盘索引不是固定在某一个通道的上的,而S5PV210 是固定的,这就导致一些人在烧写4412 ,分区格式化的时候会莫名其妙,不知所以然,现在看看代码,看是4412 代码到底是为何会这样了。
首先看从iNand 启动时候uboot打印信息。
U-Boot 2010.12 (Jul 29 2013 - 10:01:49) for SMDK4412
CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
APLL = 1200MHz, MPLL = 800MHz
DRAM:&&1023 MiB
TrustZone Enabled BSP
BL1 version:
OM_STAT=0x
Checking Boot Mode ... EMMC4.41
REVISION: 1.1
NAME: S5P_MSHC4
MMC Device 0: 7576 MB
MMC Device 1: 0 MB
MMC Device 2 not found
Using default environment
MMC read: dev # 0, block # 26624, count 1 ... 1 blocks read: OK
Hit 'a' key to stop autoboot:&&0
SMDK4412 #
查找OM_STAT 所在位置
unsigned int OmP
OmPin = INF_REG3_REG;
& && &&&printf(&OM_STAT=0x%08x\n&, *((unsigned int *)(0x)));
& && &&&printf(&Checking Boot Mode ...&);
& && &&&if(OmPin == BOOT_ONENAND) {
& && && && && & printf(& OneNand\n&);
& && &&&} else if (OmPin == BOOT_NAND) {
& && && && && & printf(& NAND\n&);
& && &&&} else if (OmPin == BOOT_MMCSD) {
& && && && && & printf(& SDMMC\n&);
& && &&&} else if (OmPin == BOOT_EMMC) {
& && && && && & printf(& EMMC4.3\n&);
& && &&&} else if (OmPin == BOOT_EMMC_4_4) {
& && && && && & printf(& EMMC4.41\n&);
[ 本帖最后由 Wince.Android 于
14:36 编辑 ]
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
查询一下 OmPin 所用到的位置,这个变量的确非常重要,决定了到底烧写哪个存储器(nandflash ,还是mmc,还是iNand.........等等)
common/cmd_fastboot.c:extern unsigned int OmP
common/cmd_fastboot.c:& & & & & & & & & & & & if (OmPin == BOOT_MMCSD) {
common/cmd_fastboot.c:& & & & & & & & & & & & } else if (OmPin == BOOT_EMMC_4_4 || OmPin == BOOT_EMMC) {
common/cmd_fastboot.c:& & & & & & & & & & & & } else if (OmPin == BOOT_ONENAND) {
common/cmd_fastboot.c:& & & & & & & & & & & & if (OmPin == BOOT_MMCSD) {
common/cmd_fastboot.c:& & & & & & & & & & & & } else if(OmPin == BOOT_EMMC_4_4 || OmPin == BOOT_EMMC) {
common/cmd_fastboot.c:& & & & & & & & & & & & else if(OmPin == BOOT_ONENAND) {
common/cmd_fastboot.c:....& & & & & & & & & & & & & & & & if (OmPin == BOOT_ONENAND) {
common/cmd_fastboot.c:& & & & & & & & & & & & & & & & } else if (OmPin == BOOT_MMCSD) {
common/cmd_fastboot.c:& & & & & & & & & & & & & & & & } else if (OmPin == BOOT_EMMC_4_4 || OmPin == BOOT_EMMC) {
common/cmd_fastboot.c:& & & & & & & & & & & & & & & & if (OmPin == BOOT_ONENAND) {
common/cmd_fastboot.c:& & & & & & & & & & & & & & & & } else if (OmPin == BOOT_MMCSD) {
common/cmd_fastboot.c:& & & & & & & & & & & & & & & & } else if (OmPin == BOOT_EMMC_4_4 || OmPin == BOOT_EMMC) {
common/cmd_fastboot.c:& & & & & & & & & & & & & & & & & & & & if (OmPin == BOOT_ONENAND) {
common/cmd_fastboot.c:& & & & & & & & & & & & & & & & & & & & } else if (OmPin == BOOT_MMCSD) {
common/cmd_fastboot.c:& & & & & & & & & & & & & & & & & & & & } else if (OmPin == BOOT_EMMC_4_4 || OmPin == BOOT_EMMC) {
common/cmd_fastboot.c:& & & & switch(OmPin) {
common/cmd_fastboot.c:& & & & switch(OmPin) {
drivers/mmc/s5p_mshc.c:extern unsigned int OmP
drivers/mmc/s5p_mshc.c:& & & & if (OmPin == BOOT_EMMC_4_4 || OmPin == BOOT_EMMC) {
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
从上面的代码看,我以前写的Sate4412 开发板镜像烧写方法似乎是错误的,但是...........那个步骤是我一边烧写一边写的,的的确确是能够烧写成功启动的,why?
我觉得其中程序必有一些暗藏的东西,继续找找......
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
找到4412 uboot玄妙的地方了
关键代码如下:
从上面的代码看,我以前写的Sate4412 开发板镜像烧写方法似乎是错误的,但是...........那个步骤是我一边烧写一边写的,的的确确是能够烧写成功启动的,why?
我觉得其中程序必有一些暗藏的东西,继续找找......
#if defined(CFG_FASTBOOT_SDMMCBSP)
#if defined(CONFIG_S5P6450) && !defined(CONFIG_EMMC_4_4)
#define& && &&&DEV_NUM 1
#define& && &&&DEV_NUM 0
static int write_to_ptn_sdmmc(struct fastboot_ptentry *ptn, unsigned int addr, unsigned int size)
& &.......
/* use the partition name that can be understood by a command, movi */
& && && && && & if (!strcmp(ptn-&name, &bl_uboot&))
& && && && && & {
& && && && && && && && &strncpy(part, &bl_uboot&, 10);
& && && && && && && && &sprintf(run_cmd,&emmc open 0&);
& && && && && && && && &run_command(run_cmd, 0);
& && && && && & }
..............................
if (INF_REG3_REG == 7 && (!strcmp(ptn-&name, &bl_uboot&))){
& && && && && && && && &sprintf(run_cmd,&emmc close 0&);
& && && && && && && && &run_command(run_cmd, 0);
前面看到了吧INF_REG3_REG 这个不是OM 的寄存器啊,只是在启动阶段读OM寄存器,然后存到INF_REG3_REG,也够恶心的。这里居然不用OM,直接用这个,用意何在?!INF_REG3_REG == 7 这个值正是OM为 EMMC4.4 时候的值(INF_REG3_REG不是OM寄存器的值,只是一个强制的赋值,所以不要混淆,不是Sate4412 开发板TF 小卡启动的配置),这里判断到是iNand启动,烧写完毕镜像那么就关闭了emmc?
所以一般人找不到,总以为OM是在开机时候读一次就没再改过了.........囧!
先看看怎么回事再说吧,继续。
[ 本帖最后由 Wince.Android 于
14:46 编辑 ]
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
试试执行 emmc close 0 会有什么结果
SMDK4412 # emmc close 0
there are pending interrupts 0x
eMMC CLOSE Success.!!
然后操作这个 iNand ,居然照样操作,压根没关闭,看来不是操作了这个iNand。
SMDK4412 # fdisk -c 0
NAME: S5P_MSHC4
fdisk is completed
partion #& & size(MB)& &&&block start #& & block count& & partition_Id
& &1& && && &&&500& && && && &67584& && && &1024000& && && & 0x83
& &2& && && &&&150& && && & 1091584& && && & 307200& && && & 0x83
& &3& && && & 6893& && && & 1398784& && &&&& && && & 0x83
SMDK4412 #
[ 本帖最后由 Wince.Android 于
11:08 编辑 ]
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间13 小时
威望200 分
TA的帖子TA的资源
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
我也发现这个问题很奇怪.不知我用的烧写文档是否来自你手? 
OM开机就已经定了, 这个INF_REG3_REG 只是被系统用来存放OM设置值而已.请看lowlevel_init.S中的read_om函数, 
& & & & ldr& & & & r0, =S5PV310_POWER_BASE
& & & & ldr& & & & r1, [r0,#OMR_OFFSET]
& & & & bic& & & & r2, r1, #0xffffffc1
这个就是读取OM设置pin状态,并写入r2.
& & & & /* SD/MMC BOOT */
& & & & cmp& &&&r2, #0x4
& & & & moveq& &r3, #BOOT_MMCSD
& & & & /* eMMC BOOT */
& & & & cmp& & & & r2, #0x6
& & & & moveq& & & & r3, #BOOT_EMMC
& & & & /* eMMC 4.4 BOOT */
& & & & cmp& & & & r2, #0x8
& & & & moveq& & & & r3, #BOOT_EMMC_4_4
& & & & cmp& & & & r2, #0x28
& & & & moveq& & & & r3, #BOOT_EMMC_4_4
上面就是根据r2值,记入相应的启动方式到r3
& & & & ldr& & & & r0, =INF_REG_BASE
& & & & str& & & & r3, [r0, #INF_REG3_OFFSET]
& & & & mov& & & & pc, lr
上面就是将存放在r3中的OM设置值存入INF_REG3_REG.
原帖由 seanew 于
11:21 发表 .cn/images/common/back.gif
我也发现这个问题很奇怪.不知我用的烧写文档是否来自你手? 
OM开机就已经定了, 这个INF_REG3_REG 只是被系统用来&
在线时间13 小时
威望200 分
TA的帖子TA的资源
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
!INF_REG3_REG == 7 这个值正是Sate4412 开发板TF 小卡启动的配置,这里判断到是TF 小卡启动,那么就关闭了emmc?
不对吧? #define BOOT_EMMC_4_4 7
/* eMMC 4.4 BOOT */
& && &&&cmp& && &&&r2, #0x8
& && &&&moveq& && &&&r3, #BOOT_EMMC_4_4
& && &&&cmp& && &&&r2, #0x28
& && &&&moveq& && &&&r3, #BOOT_EMMC_4_4
从eMMC启动的时候,才会向r3写入7, 然后INF_REG3_REG的值才会是7.
你说的对,我上面搞错了,已经纠正,
INF_REG3_REG 这个也太扯了吧,本身就有OM_STAT 寄存器的,为啥这么搞,其实可以随时对OM_STAT
来判断的。[/backcolor]
上面的INF_REG3_REG 这个不是OM 的寄存器啊,只是在启&
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
原帖由 seanew 于
11:59 发表
!INF_REG3_REG == 7 这个值正是Sate4412 开发板TF 小卡启动的配置,这里判断到是TF 小卡启动,那么就关闭了emmc?
不对吧? #define BOOT_EMMC_4_4 7
/* eMMC 4.4 BOOT */
& && &&&cmp& && &&&r2, #0x8
& &... 你说的对,我上面搞错了,已经纠正,
INF_REG3_REG 这个也太扯了吧,本身就有OM_STAT 寄存器的,为啥这么搞,其实可以随时对OM_STAT&&来判断的。
上面的INF_REG3_REG 这个不是OM 的寄存器啊,只是在启动阶段读OM寄存器,然后存到INF_REG3_REG,也够恶心的。这里居然不用OM,直接用这个,用意何在?!INF_REG3_REG == 7 这个值正是OM为 EMMC4.4 时候的值(INF_REG3_REG不是OM寄存器的值,只是一个强制的赋值,所以不要混淆,不是Sate4412 开发板TF 小卡启动的配置),这里判断到是iNand启动,烧写完毕镜像那么就关闭了emmc?
去看看emmc close 命令的代码,发现有一些注释,就是要求镜像烧写完毕以后,需要关闭这个成功烧写的emmc,难道不关闭会被刷掉吗?
int do_emmc(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
& & & & int rc = 0;
& & & & u32
& & & & switch (argc) {
& & & & case 5:
& & & & & & & & if (strcmp(argv[1], &partition&) == 0) {
& & & & & & & & & & & & dev = simple_strtoul(argv[2], NULL, 10);
& & & & & & & & & & & & struct mmc *mmc = find_mmc_device(dev);
& & & & & & & & & & & & u32 bootsize = simple_strtoul(argv[3], NULL, 10);
& & & & & & & & & & & & u32 rpmbsize = simple_strtoul(argv[4], NULL, 10);
& & & & & & & & & & & & if (!mmc)
& & & & & & & & & & & & & & & & rc = 1;
& & & & & & & & & & & & rc = emmc_boot_partition_size_change(mmc, bootsize, rpmbsize);
& & & & & & & & & & & & if (rc == 0) {
& & & & & & & & & & & & & & & & printf(&eMMC boot partition Size is %d MB.!!\n&, bootsize);
& & & & & & & & & & & & & & & & printf(&eMMC RPMB partition Size is %d MB.!!\n&, rpmbsize);
& & & & & & & & & & & & } else {
& & & & & & & & & & & & & & & & printf(&eMMC boot partition Size change Failed.!!\n&);
& & & & & & & & & & & & }
& & & & & & & & } else {
& & & & & & & & & & & & printf(&Usage:\n%s\n&, cmdtp-&usage);
& & & & & & & & & & & & rc =1;
& & & & & & & & }
& & & & & & & &
& & & & case 3:
& & & & & & & & if (strcmp(argv[1], &open&) == 0) {
& & & & & & & & & & & & int dev = simple_strtoul(argv[2], NULL, 10);
& & & & & & & & & & & & struct mmc *mmc = find_mmc_device(dev);
& & & & & & & & & & & & if (!mmc)
& & & & & & & & & & & & & & & & rc = 1;
& & & & & & & & & & & & rc = emmc_boot_open(mmc);
& & & & & & & & & & & & if (rc == 0) {
& & & & & & & & & & & & printf(&eMMC OPEN Success.!!\n&);
& & & & & & & & & & & & printf(&\t\t\t!!!Notice!!!\n&);
& & & & & & & & & & & & printf(&!You must close eMMC boot Partition after all image writing!\n&);
& & & & & & & & & & & & printf(&!eMMC boot partition has continuity at image writing time.!\n&);
& & & & & & & & & & & & printf(&!So, Do not close boot partition, Before, all images is written.!\n&);
& & & & & & & & & & & & } else {
& & & & & & & & & & & & & & & & printf(&eMMC OPEN Failed.!!\n&);
& & & & & & & & & & & & }
& & & & & & & & } else if (strcmp(argv[1], &close&) == 0) {
& & & & & & & & & & & & int dev = simple_strtoul(argv[2], NULL, 10);
& & & & & & & & & & & & struct mmc *mmc = find_mmc_device(dev);
& & & & & & & & & & & & if (!mmc)
& & & & & & & & & & & & & & & & rc = 1;
& & & & & & & & & & & & rc = emmc_boot_close(mmc);
& & & & & & & & & & & & if (rc == 0) {
& & & & & & & & & & & & & & & & printf(&eMMC CLOSE Success.!!\n&);
& & & & & & & & & & & & } else {
& & & & & & & & & & & & & & & & printf(&eMMC CLOSE Failed.!!\n&);
& & & & & & & & & & & & }
& & & & & & & & } else {
& & & & & & & & & & & & printf(&Usage:\n%s\n&, cmdtp-&usage);
& & & & & & & & & & & & rc =1;
& & & & & & & & }
& & & & & & & &
& & & & case 0:
& & & & case 1:& & & & & & & &
& & & & case 2:
& & & & case 4:
& & & & default:
& & & & & & & & printf(&Usage:\n%s\n&, cmdtp-&usage);
& & & & & & & & rc = 1;
& & & & & & & &
注意这里emmc 的关闭不是指电源关闭,而是关闭了一些功能
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
int emmc_boot_open(struct mmc *mmc)
& & & & struct mmc_
& & & & /* Boot ack enable, boot partition enable , boot partition access */
& & & & cmd.cmdidx = MMC_CMD_SWITCH;
& & & & cmd.resp_type = MMC_RSP_R1b;
& & & & cmd.cmdarg = ((3&&24)|(179&&16)|(((1&&6)|(1&&3)|(1&&0))&&8));
& & & & cmd.flags = 0;
& & & & err = mmc_send_cmd(mmc, &cmd, NULL);
& & & & if (err)
& & & & & & & &
& & & & /* 4bit transfer mode at booting time. */
& & & & cmd.cmdidx = MMC_CMD_SWITCH;
& & & & cmd.resp_type = MMC_RSP_R1b;
& & & & cmd.cmdarg = ((3&&24)|(177&&16)|((1&&0)&&8));
& & & & cmd.flags = 0;
& & & & err = mmc_send_cmd(mmc, &cmd, NULL);
& & & & if (err)
& & & & & & & &
& & & & return 0;
int emmc_boot_close(struct mmc *mmc)
& & & & struct mmc_
& & & & /* Boot ack enable, boot partition enable , boot partition access */
& & & & cmd.cmdidx = MMC_CMD_SWITCH;
& & & & cmd.resp_type = MMC_RSP_R1b;
& & & & cmd.cmdarg = ((3&&24)|(179&&16)|(((1&&6)|(1&&3)|(0&&0))&&8));
& & & & cmd.flags = 0;
& & & & err = mmc_send_cmd(mmc, &cmd, NULL);
& & & & if (err)
& & & & & & & &
& & & & return 0;
上面可以知道,有一个判断,判断是iNand启动烧写后 才关闭了mmc ,但是TF 卡却没有,这个就是OM 在TF 烧写模式下,TF 烧写完毕会连bootloader 都会被冲掉的原因。囧。S5pv210 没有这个现象,难道这个是4412 有什么特殊的原因要这么样的?三星不可能会这么混的啊。
是的,我现在就是这样的,每次烧写完后,TF卡必须重新烧卡.我认为,这个烧写方式一定是有问题的.三星没有这么混的.&
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
原帖由 seanew 于
11:21 发表
我也发现这个问题很奇怪.不知我用的烧写文档是否来自你手? 
OM开机就已经定了, 这个INF_REG3_REG 只是被系统用来存放OM设置值而已.请看lowlevel_init.S中的read_om函数, 
& && &&&ldr& && &&&r0, =S5PV310_POWER_BASE
& && &&&l ...
INF_REG3_REG&&应该是这个 ,就是Base Address: 0x +0x080C
INFORM3&&0x080C&&Information register 3&&0x
比较奇怪, 0x 本身就是OM 寄存器地址但是却转存到INFORM3&&,再看看,三星不可能绕一大圈来做这个无谓的事情。
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
8.8.1.40 INFORM3
&&Base Address: 0x
&&Address = Base Address + 0x080C, Reset Value = 0x
Name&&Bit&&Type&&Description&&Reset Value
INFORM&&[31:0]&&RW
User-defined information register. By asserting
XnRESET pin, PMU clears INFORM0 to 3
registers.& &
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
Reset Type
Hardware reset&&Reset
Watchdog timer reset&&Reset
Software reset&&Keep its value
Warm reset&&Keep its value
Wakeup reset&&Keep its value
4412 完整版本datasheet 624page 上有图
这个值可以再适当时候保存不变,这个是要用的原因之一。
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间13 小时
威望200 分
TA的帖子TA的资源
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
就当是4412留给开发者的&NVRAM&用的就好啦.原来我的烧写文档是你写的啊,这里面是很奇怪,不带电切换烧写模式,这个才让人摸不着头脑的步骤. 切换开关只是在最后烧写完才用的的步骤,结果被用在下载img时使用,不对的地方........
在线时间130 小时
威望3732 分
芯币3505 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
五彩晶圆(中级), 积分 3732, 距离下一级还需 2268 积分
烧写这个环节最好在前面增加一个擦除uboot的环节即可无往而不利了
先把薄码开关拨到MMC2启动,即OM[5:1] 为b'00010,把启动TF卡插入MMC2,上电启动,进入uboot命令行模式后执行命令:
mmc erase boot 0 0 10240
即可擦除uboot分区最前面的引导部分。注意,不要此时烧写uboot,此时烧写会把uboot烧写到TF卡上而不是INAND上。接着断电,薄码开关调回INAND启动,即OM[5:1] B'10100,上电就会检查iNand,但是iNand 没有uboot启动代码,所以就会自动切换到TF卡启动,这时就可以烧写uboot到inand上了
——这个里面有笔误,上面应该改成如下就可以了。
先把薄码开关拨到MMC2启动,即OM[5:1] 为b'00010,把启动TF卡插入MMC2,上电启动,进入uboot命令行模式后执行命令:
mmc erase boot 1 0 1024 (当从mmc2 TF卡启动时i,TF卡设备索引号是0,而nand 设备索引号应该是1)
即可擦除iNand uboot分区最前面的引导部分。注意,不要此时烧写uboot,此时烧写会把uboot烧写到TF卡上而不是INAND上。接着断电,薄码开关调回INAND启动,即OM[5:1] B'10100,上电就会检查iNand,但是iNand 没有uboot启动代码,所以就会自动切换到TF卡启动,但是此时的OM值是iNand 模式的,所以iNand 设备索引值是0,而mmc2 TF卡是1,所以能够正常用fdisk -c 0 ,ext3format mmc 0:1 等分区命令进行烧写。这时就可以烧写uboot到inand上了。整个过程终于明白了,今天主要看了Sate4412 的uboot代码,并且举一反三,终于明白4412 烧写是怎么回事。终于清静了......
intdo_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){& && && &int rc = 0;& && && &int part = 0;
& && && &switch (argc) {& && && &case 3:& && && && && && & if (strcmp(argv[1],&rescan&) == 0) {& && && && && && && && && & int dev =simple_strtoul(argv[2], NULL, 10);& && && && && && && && && & struct mmc *mmc =find_mmc_device(dev);
& && && && && && && && && & if (!mmc)& && && && && && && && && && && && & return 1;
& && && && && && && && && & mmc_init(mmc);
& && && && && && && && && & return 0;& && && && && && & }
& && && &case 0:& && && &case 1:& && && &case 4:& && && && && && & printf(&Usage:\n%s\n&,cmdtp-&usage);& && && && && && & return 1;
& && && &case 2:& && && && && && & if (!strcmp(argv[1],&list&)) {& && && && && && && && && & print_mmc_devices('\n');& && && && && && && && && & return 0;& && && && && && & }& && && && && && & return 1;& && &&& case 6:& && && && && && & if (strcmp(argv[1],&erase&) == 0) {& && && && && && && && && & /* Read inputvariable */& && && && && && && && && & int dev =simple_strtoul(argv[3], NULL, 10);& && && && && && && && && & u32 start =simple_strtoul(argv[4], NULL, 10);& && && && && && && && && & u32 block =simple_strtoul(argv[5], NULL, 10);
& && && && && && && && && & struct mmc *mmc =find_mmc_device(dev);
& && && && && && && && && & if (!mmc)& && && && && && && && && && && && & return 1;
& && && && && && && && && & u32 count = 0;
& && && && && && && && && & /* Select erasepartition */& && && && && && && && && & if (strcmp(argv[2],&boot&) == 0) {& && && && && && && && && && && && & part = 0;& && && && && && && && && && && && & /* ReadBoot partition size. */& && && && && && && && && && && && & count =((mmc-&ext_csd.boot_size_multi)*256);& && && && && && && && && & } else if(strcmp(argv[2], &user&) == 0) {& && && && && && && && && && && && & part = 1;& && && && && && && && && && && && & /* ReadUser partition size. */& && && && && && && && && && && && & count =mmc-&& && && && && && && && && & } else {& && && && && && && && && && && && & part = 1;& && && && && && && && && && && && & count =mmc-&& && && && && && && && && && && && & printf(&Defaulterase user partition\n&);& && && && && && && && && & }
& && && && && && && && && & /* If input counteris larger than max counter */& && && && && && && && && & if ((start + block)& count) {& && && && && && && && && && && && & block =(count - start) - 1;& && && && && && && && && && && && & printf(&Blockcount is Too BIG!!\n&);& && && && && && && && && & }
& && && && && && && && && & /* If input counteris 0 */& && && && && && && && && & if (!block ) {& && && && && && && && && && && && & block =(count - start) - 1;& && && && && && && && && && && && & printf(&Eraseall from %d block\n&, start);& && && && && && && && && & }
& && && && && && && && && & rc = mmc_erase(mmc,part, start, block);
& && && && && && && && && & if (rc == 0) {& && && && && && && && && && && && & printf(&MMCerase Success.!!\n&);& && && && && && && && && & } else {& && && && && && && && && && && && & printf(&MMCerase Failed.!!\n&);& && && && && && && && && && && && & return -1;& && && && && && && && && & }& && && && && && && && && & return 0;& && && && && && & } else if (strcmp(argv[1],&read&) == 0) {& && && && && && && && && & int dev =simple_strtoul(argv[2], NULL, 10);& && && && && && && && && & void *addr = (void*)simple_strtoul(argv[3], NULL, 16);& && && && && && && && && & u32 cnt =simple_strtoul(argv[5], NULL, 10);& && && && && && && && && & u32& && && && && && && && && & u32 blk =simple_strtoul(argv[4], NULL, 10);& && && && && && && && && & u32 read_& && && && && && && && && & u32 cnt_to_& && && && && && && && && & void *addr_to_read =& && && && && && && && && & struct mmc *mmc =find_mmc_device(dev);
& && && && && && && && && & if (!mmc)& && && && && && && && && && && && & return 1;
& && && && && && && && && & printf(&\nMMCread: dev # %d, block # %d, count %d ... &,& && && && && && && && && && && && & dev, blk,cnt);
& && && && && && && && && & n = 0;& && && && && && && && && & addr_to_read =& && && && && && && && && & do {& && && && && && && && && && && && & if (cnt - n& MAXIMUM_BLOCK_COUNT)& && && && && && && && && && && && && && && &&&cnt_to_read= MAXIMUM_BLOCK_COUNT;& && && && && && && && && && && && & else& && && && && && && && && && && && && && && &&&cnt_to_read= cnt -
& && && && && && && && && && && && & read_cnt =mmc-&block_dev.block_read(dev, blk, cnt_to_read, addr_to_read);& && && && && && && && && && && && & n +=read_& && && && && && && && && && && && & blk +=read_& && && && && && && && && && && && & addr_to_read+= read_cnt * 512;& && && && && && && && && && && && & if(cnt_to_read!= read_cnt) {& && && && && && && && && && && && && && && &&&printf(&%dblocks read: %s\n&,& && && && && && && && && && && && && && && && && && &&&n,&ERROR&);& && && && && && && && && && && && && && && &&&return-1;& && && && && && && && && && && && & }& && && && && && && && && & } while(cnt & n);
& && && && && && && && && & /* flush cache afterread */& && && && && && && && && & flush_cache((ulong)addr,cnt * 512); /* FIXME */
& && && && && && && && && & printf(&%dblocks read: %s\n&,& && && && && && && && && && && && & n, (n==cnt)? &OK& : &ERROR&);& && && && && && && && && & return (n == cnt) ?0 : 1;& && && && && && & } else if (strcmp(argv[1],&write&) == 0) {& && && && && && && && && & int dev =simple_strtoul(argv[2], NULL, 10);& && && && && && && && && & void *addr = (void*)simple_strtoul(argv[3], NULL, 16);& && && && && && && && && & u32 cnt =simple_strtoul(argv[5], NULL, 10);& && && && && && && && && & int blk =simple_strtoul(argv[4], NULL, 10);& && && && && && && && && & u32& && && && && && && && && & u32 written_& && && && && && && && && & u32 cnt_to_& && && && && && && && && & void *addr_to_write=& && && && && && && && && & struct mmc *mmc =find_mmc_device(dev);
& && && && && && && && && & if (!mmc)& && && && && && && && && && && && & return 1;
& && && && && && && && && & printf(&\nMMCwrite: dev # %d, block # %d, count %d ... &,& && && && && && && && && && && && & dev, blk,cnt);
& && && && && && && && && & n = 0;& && && && && && && && && & addr_to_write =& && && && && && && && && & do {& && && && && && && && && && && && & if (cnt - n& MAXIMUM_BLOCK_COUNT)& && && && && && && && && && && && && && && &&&cnt_to_write= MAXIMUM_BLOCK_COUNT;& && && && && && && && && && && && & else& && && && && && && && && && && && && && && &&&cnt_to_write= cnt -
& && && && && && && && && && && && & written_cnt= mmc-&block_dev.block_write(dev, blk, cnt_to_write, addr_to_write);& && && && && && && && && && && && & n +=written_& && && && && && && && && && && && & blk +=written_& && && && && && && && && && && && & addr_to_write+= written_cnt * 512;& && && && && && && && && && && && & if(cnt_to_write!= written_cnt) {& && && && && && && && && && && && && && && &&&printf(&%dblocks written: %s\n&,& && && && && && && && && && && && && && && && && && &&&n,&ERROR&);& && && && && && && && && && && && && && && &&&return-1;& && && && && && && && && && && && & }& && && && && && && && && & } while(cnt & n);
& && && && && && && && && & printf(&%dblocks written: %s\n&,& && && && && && && && && && && && & n, (n ==cnt) ? &OK& : &ERROR&);& && && && && && && && && & return (n == cnt) ?0 : 1;& && && && && && & } else {& && && && && && && && && & printf(&Usage:\n%s\n&,cmdtp-&usage);& && && && && && && && && & rc = 1;& && && && && && & }
& && && && && && && && && &default: /* at least 5 args */& && && && && && & printf(&Usage:\n%s\n&,cmdtp-&usage);& && && && && && & return 1;& && && &}}
[ 本帖最后由 gooogleman 于
23:22 编辑 ]
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:
在线时间13 小时
威望200 分
TA的帖子TA的资源
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
原帖由 Wince.Android 于
15:04 发表
int emmc_boot_open(struct mmc *mmc)
& && &&&struct mmc_
& && &&&/* Boot ack enable, boot partition enable , boot partition access */
& && &&&cmd.cmdidx = MMC_CMD_SWITCH;
& && &&&cmd.resp_type = MMC_RS ... 是的,我现在就是这样的,每次烧写完后,TF卡必须重新烧卡.我认为,这个烧写方式一定是有问题的.三星没有这么混的.
在线时间103 小时
威望1952 分
芯币4134 枚
TA的帖子TA的资源
晚上搞定这个事情先。
iNand启动时候
SKD4X12 # mmc list
S5P_MSHC4: 0
S3C_HSMMC2: 1
不关机切换成
SD/TF MM2 启动的时候一样
SKD4X12 # mmc list
S5P_MSHC4: 0
S3C_HSMMC2: 1
SKD4X12 # mmc list
S5P_MSHC4: 0
S3C_HSMMC2: 1
fdisk -c 0 分区仍然是给iNand 分的区
SKD4X12 # fdisk -c 0
NAME: S5P_MSHC4
fdisk is completed
partion #& & size(MB)& &&&block start #& & block count& & partition_Id
& &1& && && &&&500& && && &&&102400& && && &1024000& && && & 0x83
& &2& && && &&&150& && && & 1126400& && && & 307200& && && & 0x83
& &3& && && & 6876& && && & 1433600& && &&&& && && & 0x83
设置SD/TF MM2 启动,关机,重启
发现变了。索引号 mmc2 和inand 颠倒了位置所以对应分区命令也跟着变了。
SMDK4412 # mmc list
S3C_HSMMC2: 0
S5P_MSHC4: 1
SMDK4412 #
SMDK4412 # fdisk -c 0
fdisk is completed
partion #& & size(MB)& &&&block start #& & block count& & partition_Id
& &1& && && &&&500& && && && &67584& && && &1024000& && && & 0x83
& &2& && && &&&150& && && & 1091584& && && & 307200& && && & 0x83
& &3& && && & 6777& && && & 1398784& && &&&& && && & 0x83
SMDK4412 # fdisk -c 1
NAME: S5P_MSHC4
fdisk is completed
partion #& & size(MB)& &&&block start #& & block count& & partition_Id
& &1& && && &&&500& && && && &67584& && && &1024000& && && & 0x83
& &2& && && &&&150& && && & 1091584& && && & 307200& && && & 0x83
& &3& && && & 6893& && && & 1398784& && &&&& && && & 0x83
SMDK4412 #
[ 本帖最后由 gooogleman 于
22:56 编辑 ]
为什么变? 我前面已经给出代码分析了.可以看看.&
在线时间103 小时
威望1952 分
芯币4134 枚
TA的帖子TA的资源
先把薄码开关拨到MMC2启动,即OM[5:1] 为b'00010,把启动TF卡插入MMC2,上电启动,进入uboot命令行模式后执行命令:
mmc erase boot 0 0 10240
即可擦除uboot分区最前面的引导部分。注意,不要此时烧写uboot,此时烧写会把uboot烧写到TF卡上而不是INAND上。接着断电,薄码开关调回INAND启动,即OM[5:1] B'10100,上电就会检查iNand,但是iNand 没有uboot启动代码,所以就会自动切换到TF卡启动,这时就可以烧写uboot到inand上了
——这个里面有笔误,上面应该改成如下就可以了。
先把薄码开关拨到MMC2启动,即OM[5:1] 为b'00010,把启动TF卡插入MMC2,上电启动,进入uboot命令行模式后执行命令:
mmc erase boot 1 0 1024 (当从mmc2 TF卡启动时i,TF卡设备索引号是0,而nand 设备索引号应该是1)
即可擦除iNand uboot分区最前面的引导部分。注意,不要此时烧写uboot,此时烧写会把uboot烧写到TF卡上而不是INAND上。接着断电,薄码开关调回INAND启动,即OM[5:1] B'10100,上电就会检查iNand,但是iNand 没有uboot启动代码,所以就会自动切换到TF卡启动,但是此时的OM值是iNand 模式的,所以iNand 设备索引值是0,而mmc2 TF卡是1,所以能够正常用fdisk -c 0 ,ext3format mmc 0:1 等分区命令进行烧写。这时就可以烧写uboot到inand上了。整个过程终于明白了,今天主要看了Sate4412 的uboot代码,并且举一反三,终于明白4412 烧写是怎么回事。终于清静了......
SMDK4412 # mmc erase boot 1 0 1024
START: 0 BLOCK: 1024
high_capacity: 1
..........
& && && && && && && && &*** NOTICE ***
*** High Capacity(higher than 2GB) MMC's erase minimum size is 512KB ***
512 KB erase Done
MMC erase Success.!!
SMDK4412 #
用fastboot 下载所有镜像。
最后自动启动到android系统,重启发现已经正常从iNand启动。
切换到mmc2 启动,依然能够正常从TF卡启动,TF卡并没有被冲刷掉。主要是现在过程对了。经过这么一折腾,说明三星原版的bootloader 没有经过改进,没有做好限制,防止一些误操作导致烧写失败,看来等我把Sate210 和Sate-F 开发板的智能型bootloader 改好以后再来改进这个Sate4412 uboot吧,其实很简单,只要固定住这个iNand 索引号是1 ,其他索引也一直固定住就好了,这样就不会出错。还是信念啊,一个人做事的要求很重要。呵呵,是可以正常启动的了。
SMDK4412 # OK
U-Boot 2010.12-svn1 (Jun 07 2013 - 08:26:59) for SMDK4412
CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
APLL = 1200MHz, MPLL = 800MHz
DRAM:&&1023 MiB
TrustZone Enabled BSP
BL1 version:
OM_STAT=0x
Checking Boot Mode ... SDMMC
REVISION: 1.1
MMC Device 0: 7460 MB
there are pending interrupts 0x
NAME: S5P_MSHC4
MMC Device 1: 7576 MB
MMC Device 2 not found
Using default environment
MMC read: dev # 0, block # 26624, count 1 ... 1 blocks read: OK
Hit 'a' key to stop autoboot:&&0
SMDK4412 #
如果输入mmc erase boot 0 0 1024 就会进入死循环,不停的打印如下点
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
[ 本帖最后由 gooogleman 于
23:42 编辑 ]
从TF启动,就是mmc erase boot 1 0 0, 从eMMC启动,mmc erase boot 0 0 0 , 不用那个1024. 它最终调用mmc_erase的
[ 本帖最后由 seanew 于
16:18 编辑 ]&
呵呵,所以我说你们的烧写文档有问题,你们还否认.在给客户设计前自己一定要明白原理,这是最起码的,因为迟早会出问题的......&
在线时间870 小时
威望3129 分
芯币2579 枚
E金币89 枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 3129, 距离下一级还需 371 积分
五彩晶圆(初级), 积分 3129, 距离下一级还需 371 积分
高级货,看不懂
在线时间13 小时
威望200 分
TA的帖子TA的资源
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
原帖由 gooogleman 于
23:23 发表
先把薄码开关拨到MMC2启动,即OM[5:1] 为b'00010,把启动TF卡插入MMC2,上电启动,进入uboot命令行模式后执行命令:
mmc erase boot 0 0 10240
即可擦除uboot分区最前面的引导部分。注意,不要此时烧写uboot,此时 ... 呵呵,所以我说你们的烧写文档有问题,你们还否认.在给客户设计前自己一定要明白原理,这是最起码的,因为迟早会出问题的......
我试过,文档这样烧写在正常情况下是没有问题的,
因为正常情况下,iNand是不会出现你那种 情况的,我们也经常这么烧写,但是一旦出现你那种iNand 前面一些分区出问题时候就会导致启动不了,无解的情况。
在线时间13 小时
威望200 分
TA的帖子TA的资源
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
一粒金砂(高级), 积分 200, 距离下一级还需 300 积分
原帖由 gooogleman 于
22:40 发表
晚上搞定这个事情先。
iNand启动时候
SKD4X12 # mmc list
S5P_MSHC4: 0
S3C_HSMMC2: 1
不关机切换成
SD/TF MM2 启动的时候一样
SKD4X12 # mmc list
S5P_MSHC4: 0
S3C_HSMMC2: 1
SKD4X12 # ... 为什么变? 我前面已经给出代码分析了.可以看看.
你的那个只是一个小的起点,昨晚我看了一下,这个主要还是uboot代码里面他自己这么做了,这样做也没什么不好,或者这样做有他的好处,就是他可以自由选择从mmc2 还是iNand 通道启动系统应该都没问题,不过内核那些&
荣誉会员勋章
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
Powered by
逛了这许久,何不进去瞧瞧?

我要回帖

更多关于 rpmb partition emmc 的文章

 

随机推荐