高通平臺避免誤入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

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