高通平台如何避免誤入FFBM模式


        前面兩篇博客分別介紹了通過fastbootQFIL工具退出FFBM模式的方法。雖然售后的同學可以這么指導用戶做恢復,但步驟多操作也麻煩,且屬於事后處理,如果大面積高概率地出現,會嚴重影響用戶體驗。這個問題是高通引入FFBM模式導致的,采用高通芯片方案的Android設備都可能會出現。Google一下,友商Pico的VR一體機用戶在官方論壇反映《進入FFBM模式怎么退出》,一個多月前的帖子目前還沒有回應。這里必須為我們售后的同學點贊,客戶反饋問題24小時內就回應並解決了。Android手機主要是聯想的旗艦機ZUK出現過,《The phone is blocking in mode FFBM》、《stuck in "ffbm" diagnostics》、《HELP. Test Mode / FFBM Mode》。看來必須從根上接決這個問題,否則售后同學的壓力會很大,用戶也會很煩。

      進入FFBM模式是因為misc分區被修改了,誰修改的一時也弄不清楚。從售后同學那里了解到,用戶並沒有做root或unlock等特殊操作。考慮到可能有多個修改的源,沒法都給堵上,所以打算從后端入手,修改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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM