高通平台避免误入FFBM模式和退出FFBM

1、高通平台如何避免误入FFBM模式
修改init直接过滤掉该模式,无论misc分区被修改成什么样,都直接启动到Android系统,而不进入FFBM。修改的代码很少,如下。
在这里插入图片描述
修改代码后,执行命令make systemimage -j8编译生成system.img,通过fastboot将新生成的system.img烧录到处于FFBM模式下的故障机器里,并重启。奇迹出现了,果然正常进入了Android系统
在这里插入图片描述
可以看到,Kernel是老的,Android是新的。再查看misc分区的内容及dmesg,如下图所示:
在这里插入图片描述
通过dd命令查看misc分区,内容为ffbm-00,Kernel command line有androidboot.mode=ffbm-00的配置,在init中直接忽略了androidboot.mode的配置,Android系统正常启动,相关log如下。

msm8998:/ # dd if=/dev/block/bootdevice/by-name/misc count=1 bs=128
ffbm-00                                                         boot-factory                                                    1+0 records in
1+0 records out
128 bytes transferred in 0.004 secs (32000 bytes/sec)
msm8998:/ # dmesg | grep -iE "ffbm|androidboot"
[    0.000000] Kernel command line: rcupdate.rcu_expedited=1 console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 earlycon=msm_serial_dm,0xc1b0000 androidboot.hardware=qcom androidboot.veritymode=enforcing androidboot.verifiedbootstate=orange androidboot.keymaster=1 androidboot.bootdevice=1da4000.ufshc androidboot.serialno=25f47d23 androidboot.mode=ffbm-00 quite dvt androidboot.baseband=apq skip_initramfs rootwait ro init=/init root=/dev/sda6
[    1.172876] init: Ignore androidboot.mode!

改动之前的log如下,init会根据Kernel command line的配置进入ffbm模式,fs_mgr不挂载userdatafs_mgr,并且不启动Android:

[    0.000000] Kernel command line: rcupdate.rcu_expedited=1 console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 earlycon=msm_serial_dm,0xc1b0000 androidboot.hardware=qcom androidboot.veritymode=enforcing androidboot.verifiedbootstate=orange androidboot.keymaster=1 androidboot.bootdevice=1da4000.ufshc androidboot.serialno=25f47d23 androidboot.mode=ffbm-00 quite dvt androidboot.baseband=apq skip_initramfs rootwait ro init=/init root=/dev/sda6
[    1.355482] init: Booting into ffbm mode
[    1.849985] fs_mgr: ffbm mode,skip mount userdatafs_mgr: __mount(source=/dev/block/bootdevice/by-name/modem_a,target=/firmware,type=vfat)=0 
[    1.869366] init: ffbm mode, not start class main

2、高通平台如何退出FFBM
2.1 使用fast命令擦除misc分区
Fast Factory Boot Mode(FFBM)是一种半开机的模式,它的主要目的是方便工厂测试,提高生产效率。正常情况下终端用户是不会碰到的。但售后的同学最近连续收到几台客户退回的VR一体机,都进入了该模式。具体表现为屏幕显示既不是开机动画也不是VR界面,通过USB线连接上电脑后adb可以正常识别并可输入命令,但安卓投屏助手(ARDC)一直显示等待系统启动完成。查看内核启动命令行,如下:
sched_enable_hmp=1 sched_enable_power_aware=1 console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x237 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 cma=32M@0-0xffffffff androidboot.bootdevice=624000.ufshc androidboot.verifiedbootstate=orange androidboot.veritymode=enforcing androidboot.keymaster=1 androidboot.serialno=7e9ca27c androidboot.mode=ffbm-00 quiet androidboot.baseband=apq
可以看到androidboot.mode=ffbm-00,同时[ro.bootmode]为[ffbm-00],以此可确认VR一体机确实进入了Fast Factory Boot Mode。
进入该模式后,即使强制重启机器也无法恢复。手机如果进入该模式,可点击触屏操作,选择重启进入Android即可恢复。而VR一体机没有触屏,只能通过PC操作。由于FFBM是一种半开机的模式,此时安卓投屏助手或Vysor等远程投屏工具都无法正常使用,只能通过fastboot命令擦除misc分区来恢复,具体步骤如下图所示。
在这里插入图片描述
其中涉及的命令如下:
adb reboot bootloader
fastboot erase misc
fastboot reboot
为了方便后续debug,趁手在安卓投屏助手(ARDC)中增加了FFBM模式的判断,当处于该模式时直接显示Fast Factory Boot Mode,而不是Waiting boot completely,以便快速判断VR一体机所处的状态。
2.2 使用FQIL工具擦除分区
QFIL是高通提供的刷机工具。首先让VR一体机进入紧急下载模式(EDL),方法有两种。如adb可用,可输入adb reboot edl,进入紧急下载模式。如adb不可用,则先关机,然后同时按住BACK和OK键(某些设备可能是音量+和音量-的组合),再按Power键开机,即可进入紧急下载模式。进入EDL模式后,设备管理器中会有一个设备端口,Forge HS-USB QDloader 9008。如果没有,则需要先安装一下驱动程序,Qualcomm_Drivers_QDLoader.zip
在这里插入图片描述
接着,按照如下步骤操作即可退出FFBM模式。
Select Build Type选择Flat Build,
Select Programmer选择prog_ufs_firehose_8998_ddr.elf文件,// 该文件与硬件相关,对应的CPU为8998,flash为ufs
在Tools菜单中选择Partition Manager,
在弹出的Confirm对话框中,点击OK按钮,
在弹出的Partition Manager中,左键点击misc分区,然后点击右键,
在右键弹出的菜单中,点击Manage Partition Data,
在弹出的Raw Data Manager中,点击Load Image按钮,
选择zero.bin文件并发送,Status框中显示Finish Send Image说明已经OK了。
详细流程:
在这里插入图片描述
文中提到的zero.bin及prog_ufs_firehose_8998_ddr.elf的下载地址:https://files.cnblogs.com/files/we-hjb/FFBM.7z

参考博客:https://www.cnblogs.com/we-hjb/p/9769467.html
https://www.cnblogs.com/we-hjb/p/9769467.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章