首先感谢su_ky大神,没有他的博客和帖子,这次救砖根本没有成功的可能。其次谢谢A840S交流群284998898的Sunny deng,没有他提供的分区镜像同样也完成不了这次的工作。
现象:手机完全没有反应,同时按音量上下+开机键都没有反应。USB连上电脑后电脑显示一个“QHSUSB_DLOAD”的设备。这就是典型的黑砖了。
变砖原因:刷机脚本写错,把rawdata.img写入了mmcblk0p8,也就是tz分区。
请继续前详细阅读su_ky大神的A820L救砖贴

经过痛苦的google、阅读,再google再阅读的过程,找到此贴和其他一些大神的帖子,终于弄明白了救砖的原理和方法。
救砖原理:通过QPST软件的emmcswdownload.exe重构一个EMMC存储镜像,然后用该镜像覆盖手机EMMC,从而修复错误的部分,达到至少让手机能进入fastboot的程度。

准备工作:
1、下载官方的BINX文件,根据su_ky博客的泛泰binx解包所描述的方法进行解包
得到一个BIN文件和如下img文件:

2、QPST软件,我用的是374的版本
3、小米2的刷机程序
4、MPRG8960.hex,8960_msimage.mbn和rawprogram0.xml。这三个是QPST刷机时必需的文件。MPRG8960.hex我不确定是否8960的GPT分区方式的都一样还是不一样,它们的获得方法下面我们详细地逐一说明,方法来自su_ky的博客。

MPRG8660.hex:这个su_ky大神说了的,我们没有能力自己生成这个,所以我在网上找了个,需要注意的是su_ky帖子里面提到的820L是MBR分区格式的,840是GPT的,下面再详细说。我在这里找到的,用的是190K那个hex,需要FQ,各位同学自己搞定。

其次是8960_msimage.mbn:这个文件其实差不多就是整个EMMC的磁盘镜像,为什么说差不多呢,根据我的判断,它不是完整的磁盘镜像,而是记录了分区信息,然后只包含了在partition.xml中提供了文件名的分区的镜像。这就是评论中那位兄弟有疑问的地方。比如system、preload这些分区就只有分区信息,没有实际的分区镜像包含在内,所以8960_msimage.mbn才不显得巨大。

它至少需要partition.bin、partition.xml和sbl1\sbl2\sbl3\rpm\tz\aboot这几个分区的镜像才能构建出来。为什么说至少呢,看我下面的分析。partition.bin是分区表,这个是一定要的。另外根据我的变砖原因,是我把rawdata.img写入了mmcblk0p8,也就是tz分区。经查看,rawdata.img大小是1kb ,而tz分区大小是512kb,按理说即使写错了也没有越界,我的分区表应该是好的。但是为什么黑砖了呢?后来我估计是tz分区保存了启动早起需要的重要文件,它被写坏了造成的黑砖。由此,我就在想我只要构造一个mbn把tz分区重写应该就可以了。同时之前刷机时rawdata写错了位置,改写的地方反而没有写进去,所以我就多准备了rawdata.img。各位可以分析自己的变砖原因,准备相关的img。最好是在手机正常的时候备份一个完整的所有img的镜像,用别人的可能造成IMEI被篡改等等问题。

接下来就先得到partition0.bin:将正常的同型号手机用USB连接到电脑,确保电脑上有adb工具,手机已经root,通过下面的命令得到partition0.bin:

[plain] view plaincopy
  1. adb shell su -c 'dd if=/dev/block/mmcblk0 of=/cache/partition0.bin bs=512 count=1'

参考su_ky的帖子,这里应该是MBR分区表,所有的分区都在这里。但是当我打开这个bin时,看到的基本全是0,奇怪了,难道群友搞错了,没拿到第一扇区?然而最后的MBR结束标志55AA又是对的。这时候索性

[plain] view plaincopy
  1. adb shell su -c 'dd if=/dev/block/mmcblk0 of=/cache/partition0.bin bs=512 count=20480'

拿回来10M的镜像,在0x200除看到了EFI PART的字样,这下明白了,原来A840S是采用了GPT的分区方式,启动分区表位于第二扇区。关于GPT分区格式的详细介绍见
GPT的维基百科,以下是840S的GPT分区表头:

这个表头截图不完整,应该也是512字节,这里说明一下。
根据wiki和这个表头,我们可以得到840S的完整分区表:

[plain] view plaincopy
  1. adb shell su -c 'dd if=/dev/block/mmcblk0 of=/cache/partition0.bin bs=512 count=9'

这个应该只要是GPT分区的EMMC都是一样,用上面的命令就可以得到partition0.bin

然后是partition.xml,在上面得到的partition0.bin中,每一个分区表项的大小是128字节,包含了该分区的UUID、序号、起始LBA、结束LBA和分区名称。截图如下:

根据这个我们可以得到partition.xml和rawprogram0.xml:
partition.xml

  1. <?xml version="1.0"?>
  2. <data>
  3. <physical_partition number="0">
  4. <primary order="1" label="modem" size="65536" readonly="true">
  5. <!--file name="1_modem.img" offset="0"/-->
  6. </primary>
  7. .........

参考图2

order = 分区序号
size  = (结束LBA-起始LBA+1)/2   转换成十进制,为什么除以2是因为每扇区512字节,2个扇区是1K。

label = 分区名称

offset=分区相对于第一个分区的偏移量

这里最好包含所有分区的信息,其中file name 字段只在需要覆盖对应的分区的时候才需要,上面提到的partition.bin\sbl1\sbl2\sbl3\rpm\tz\aboot都是需要的,其他的应该都不需要,可以恢复以后再刷。如果不需要覆盖对应的分区,请像下面一样注释掉,不懂怎么注释的去百度"xml语法 注释"。

  1. 包含文件名的分区记录:
  2. <primary order="1" label="modem" size="65536" readonly="true">
  3. <file name="1_modem.img" offset="0">
  4. </primary>
  5. 说明:第1分区,名字是modem,大小65536,只读,镜像文件名是1_modem.img,偏移量为0
  6. 不包含文件名的分区记录:
  7. <primary order="20" label="recovery" size="10240" readonly="true">
  8. </primary>
  9. 说明:第20分区,名字是recovery,大小10240,只读,不需要覆盖该区域数据

建议尽量少的覆盖分区,特别是在BINX包中没有的那些分区。
sbl1分区必须加上字段 bootable="true" ,这个不加的话手机仍然不会有动静,因为找不到程序入口。我在这里困扰了很久……,感谢su_ky,是这个地方提醒了我,第54楼。
840和820不同,GPT都是primary,没有extend分区。

rawprogram0.xml

  1. <?xml version="1.0" ?>
  2. <data>
  3. <!--NOTE: Sector size is 512bytes-->
  4. <program file_sector_offset="0" filename="" label="modem" num_partition_sectors="131072" physical_partition_number="0" size_in_KB="65536" start_sector="1024"/>

同样参考图2,label、size_in_KB同上
filename除了必须的那几个之外,还需要覆盖的分区只需要填文件名,前提是你从正常的手机或者以前的备份里面得到了相应的img文件。建议也只填写前面提到的那些分区
num_partition_sectors = 结束LBA-起始LBA+1  转换成十进制
start_sector=起始LBA  转换成十进制
其中partition0.bin的start_sector是0

partition.xml和rawprogram0.xml有了,下面就可以得到最后一个关键的东西8960_msimage.mbn
QHSUSB_DLOAD驱动在小米刷机工具运行时和QPST安装时都会自动安装
QPST的安装和添加端口不说了,网上找。现在假定你运行QPST Configuration,并且添加好端口,在Phone里面已经能看到一个设备处于Downloaded状态了。

把下面这些文件都放到同一个文件夹,像下面这样:

然后开一个cmd,运行如下命令生成8960_msimage.mbn:

[plain] view plaincopy
  1. emmcswdownload.exe -f 8960_msimage.mbn -x partition.xml -s 16G

s是整个EMMC的大小,840S是16G

仔细检查命令行的输出,看看有没有报错的地方,顺便核对一下输出中的地址,看看每个img对应的地址是不是分区表中那个,不对的话修改xml文件重来。

至此,MPRG8960.hex,8960_msimage.mbn和rawprogram0.xml都齐全了。把这三个文件拷贝到Miflash.exe所在目录下,剩下的事情就简单了,按照Miflash.exe的提示进行刷机。就是刷新,然后刷机。然后等漫长的进度完成。不出意外的话,你的840S就应该显示那个充电的大圆形图标,还有那句韩文。

这时拔电池,然后同时按音量上下+开机键就可以进入官方升级或者fastboot界面了,fastboot boot recovery.img就可以进recovery重刷rom了。网上教程很多,不再叙述。

本文中的数据还请同学们根据自己手中的partition0.bin进行计算、修改。个人观点,仅供参考,一切后果请自负。

A840S黑砖修复过程(2013-05-22修改)的更多相关文章

  1. nubia Z5 mini 小牛 黑砖qhsusb dload修复

    给手机分区,用了分区助手,将一些分区移动. 结果分区坏了,只有两三个分区在电脑显示,当时晕菜把数据线拔了重插. 手机变砖,不能启动,黑屏,不能进recovery... 参考 http://bbs.nu ...

  2. json(http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html)

    http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html

  3. kFreeBSD 7.0于2013/05/04发布 桌面环境 GNOME 3....

    kFreeBSD 7.0于2013/05/04发布 桌面环境 GNOME 3.4, KDE 4.8.4, Xfce 4.8, and LXDE

  4. Samung Galaxy III I535 黑砖救活经过

    昨天不小心把手机给搞成黑砖了,如下是昨天发帖求助,结果还没审核过,晕. http://bbs.zhiyoo.com/forum.php?mod=viewthread&tid=9673138&a ...

  5. http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html深入理解Java:SimpleDateFormat安全的时间格式化

    http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html

  6. 2、RenderScript的计算(2013.05.07)

    一.官方文档翻译: Android Renderscript计算 参考网址: http://blog.csdn.net/fireofstar/article/details/7748143 http: ...

  7. SNS团队Beta阶段第一次站立会议(2017.05.22)

    1.立会照片 2.每个人的工作 成员任务分工: 成员 今天已完成的工作 明天计划完成的工作 罗于婕 修改之前的文档 界面优化  龚晓婷 修改之前的文档 界面优化 林仕庄 修复不能发音bug  界面图标 ...

  8. MOSS 2013研究系列---修改默认Logo

    开发SharePoint2013 的时候,系统里面有一个“SharePoint” 的logo,客户很少不满意,我们的系统不能出现产品的名称,如下图: 咋么修改呢,咨询了广大网友,给出了一个解决方案: ...

  9. 软件工程项目组Z.XML会议记录 2013/10/22

    软件工程项目组Z.XML会议记录 [例会时间]2013年10月22日星期二21:00-22:30 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]周敏轩 会议整体流程 ...

随机推荐

  1. paper 34 :常见函数的举例(更新ing)2

    在研究opencv,不是很难,但是需要换种思维来认知这个C/C++为编程函数的开源代码库,OK,我现在还是总结一些常用MATLAB的函数,随时更新,下一阶段就是opencv方面的认知了! 1.std ...

  2. 07---Net基础加强

    第六节复习 泛型和非泛型集合的区别 通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员.此外,如果集合元素为值类型,泛型集合类型的性能通常优 ...

  3. sql 中延迟执行

    SQL有定时执行的语句WaitFor. 语法格式:waitfor {delay 'time'|time 'time'} delay后面的时间是需要延迟多长时间后执行. time后面的时间是指定何时执行 ...

  4. SQl中drop与truncate的区别

    在对SQL的表操作时,我们因不同的需求做出相应的操作. 我来对比一下truncate table '表明'与drop table '表格名'的区别,跟大家一起学习. drop table '表格名'- ...

  5. selenium验证码处理

    在爬虫过程中经常遇到验证码,如何处理验证码就显得很重要 现在来说貌似没有完美的解决方案,很多都是通过第三方平台来实现验证码的验证 将获取的验证码的url发送到第三方平台,接收平台返回的验证码,貌似很简 ...

  6. 关于 ActiveMQ

    今天玩了下 ActiveMQ,希望实现服务器的消息可以通知到各个客户终端. 安装: 1.安装 ActiveMQ 之前必须安装 Java 的 jdk , 可以从此下载:   http://www.ora ...

  7. 【python】__future__模块

    转自:http://www.jb51.net/article/65030.htm Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动.有些改动是不兼容旧版本的,也就是在当前版本运 ...

  8. 161021、spring异步调用,完美解决!

    前言 项目中,用户抢单,下单需要向对方推送消息,但是加上推送就会造成抢单和下单性能降低,反应变慢,因为抢单下单动作跟推送部分是同步的,现在想改成异步推送. 在Java应用中,绝大多数情况下都是通过同步 ...

  9. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.3.本地化语言包

    1 引用本地化语言包 在 js/i18n 文件夹中,提供了大量预定义的语言包.它包括为所有字符串定义的,包括消息,标题,分页信息,搜索/添加/删除 的对话框 文本等. 在jQuery库文件后,在jqG ...

  10. Android应用插件式开发解决方法

    转自:http://blog.csdn.net/arui319/article/details/8109650 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来 ...