adb 恢復後啟動無法使用問題分析

2021-06-18 04:52:44 字數 4917 閱讀 9284

v1.0

根據任務一步步推進,對其按時間和要點進行劃分如下:

根據之前在a10以及freescale上的經驗,系統恢復後adb無法使用,但是重新啟動adb服務就可以使adb可以使用

因此在任務之初嘗試使用這個方式解決問題

adb服務在裝置端名稱為adbd ,adb的啟動定義在init.rc檔案中,具體內容如下:

service adbd /sbin/adbd

class core

socket adbd stream 660 system system

disabled

seclabel u:r:adbd:s0

為了完成adb重啟操作,可以採用的方式有兩種:

1.在init.rc中新增restar的屬性對應的指令序列

on property:service.adb.root=1

write /sys/class/android_usb/android0/enable 0

restart adbd

write /sys/class/android_usb/android0/enable 1

在需要使用的時候使用下面命令就可以 setprop service.adb.root 1

2.也可以使用setprop指令直接操作adb服務,具體指令如下

關閉adb服務使用 setprop ctl.stop adbd

開啟adb服務使用 setprop ctl.start adbd

休眠恢復之後由於adb和串列埠都無法使用,需要系統內部自動的去重新啟動adb,為此需要新增乙個服務程式,該程式能夠在系統

恢復後重新啟動adb。這裡採用的基本思路是在init.rc中新增乙個開機啟動服務,該服務sleep一段時間之後執行重啟adb操 作。

在該服務sleep的過程中執行休眠操作,這樣,在系統恢復後該程式繼續執行便會重新啟動adb。

在init.rc中新增服務的方式如下:

service ***xx /system/bin/yyyyyyy

class main

oneshot

***xx 為想要的服務名稱 yyyyyyy為可執行程式或者指令碼的名稱

通過在系統恢復後重新啟動adb的方式,無法使adb正常使用

重新啟動adb的方式無法使adb在恢復後的系統中正常使用,因此除錯adb程式裝置端和pc端,

檢視是否是adb程式的通訊問題。

pc端adb即執行在pc機上的adb程式,對程式流程進行分析,發現adb程式執行的log輸出到/tmp/下

logfile的名稱為adb.log ,因此在pc端啟動adb之後,可以通過跟蹤adb.log 檔案的方式跟蹤adb程式

的執行狀況 :

tail -f /tmp/adb.log

裝置端adb即執行於開發板上的adb程式,對程式流程進行分析,發現adb程式會在裝置分割槽data上建立adb資料夾

並在該資料夾內建立名稱跟時間相關的adb-log

存在問題:實際執行中,沒有發現該log存在,adb程式沒有能夠成功建立出資料夾以及log檔案

對比系統正常啟動情況下和休眠恢復後pc端adb程式響應狀況

發現pc端adb程式在休眠恢復狀況下無法識別到裝置端任何資訊

通過lsusb 指令也無法發現任何usb裝置資訊,初步估計是裝置端出了問題

linux-usb gadget 驅動框架(以下簡稱 gadget )實現了 usb 協議定義的裝置端的軟體功能。相對於 linux usb 主機端( host ) 驅動而言,

gadget 驅動出現較晚,它出現在 2.4.23 以後

甚至基於同樣的 udc 的不同板子也需要進行**修改。這一層我們可以稱之為平台相關層。

在本小節重點介紹 gadget drvier ,下一小節會介紹udc driver。

1.原始碼位置:

driver/usb/gadget/android.c

2.gadget driver實現說明:

struct usb_gadget_driver 通過該driver同底層硬體通訊

udc module位置為:

udc module的編譯方式為:

1.將mstar udc driver 編譯為module (通過make menuconfig 修改) 產生如下五個ko檔案: ms_otg.ko ms_dma.ko ms_usbmain.ko msb250x_udc.ko msb250x_udc_proc.ko 修改full_mstarcedric3.mk,將ko檔案打包放入映象中,參照modules.order 中模 塊順序,在android系統啟動指令碼init.rc中新增 insmod ***x,ko語句

結果: 正常啟動情況下 adb無法使用

2.編譯module以及生成映象方式不變,改變android啟動指令碼修改方式,在init.rc 中新增啟動指令碼的服務:總共新增兩個服務 ,乙個為休眠一段時間插入module指令碼,

另乙個為執行休眠指令碼

結果: 休眠恢復後 adb也無法使用

還有g_android ,以及ehci_hcd ,嘗試調整載入順序,adb仍然無法正常使用

通過對比系統正常啟動以及休眠恢復之後系統執行狀況,發現在休眠恢復情況下,driver註冊的中斷函式在休眠恢復後的系統中不會被運 行。

通過指令碼檢視休眠恢復後檢視中斷註冊情況 ,中斷已經註冊,插入裝置,沒有呼叫中斷函式。因此對linux中斷子系統的執行過程進行分析,

整理清楚從硬體中斷到系統中斷被執行這個過程

說明: 1.asm_do_irq 即為彙編**呼叫的函式口,硬體裝置出發電訊號之後會在彙編**中簡易處理之後呼叫該函式介面

2.ms_irq_handle_cascade_host0_irq 該函式口為mstar實現,通過該函式mstar將硬體中斷號為31的硬體中斷

根據暫存器中的值轉換為中斷函式對應的中斷(如 2117,2123等等)

3.handle_level_irq 該函式口是電平中斷的通用實現,在當前硬體情況下,系統內的中斷處理被指定到該處執行

1.資料結構表示

struct irq_desc cacheline_internodealigned_in_smp;

上述結構即為中斷在程式中的實現結構,在程式中我門可以通過 irq_to_desc 函式將irq號轉化為該結構,方便呼叫中斷的處理函式或者屬性等等

由於系統內中斷會頻繁被執行,因此在系統的處理中斷的函式中新增的log資訊會導致系統無法正常使用

為使系統在正常情況下沒有log,在休眠恢復後可以列印log,可以參照toi實現的系統操縱介面來控制log的輸出狀況

新增說明: 1.toi 中同下面的結構定義檔案操作結構:

struct toi_module_ops toi_fileops = {

.type                                   = bio_allocator_module,

.name = "file storage",

.directory = "file",

.module = this_module,

.print_debug_info = toi_file_print_debug_stats,

.cleanup = toi_file_cleanup,

.bio_allocator_ops = &toi_bio_fileops,

.sysfs_data             = sysfs_params,

.num_sysfs_entries = sizeof(sysfs_params) /

sizeof(struct toi_sysfs_data),

為新增操作介面,需要修改其中的sysfs_params物件。 2.對sysfs_params修改示例如下,

static struct toi_sysfs_data sysfs_params = {

sysfs_string("target", sysfs_rw, toi_file_target, 256,

sysfs_needs_sm_for_write, test_toi_file_target),

sysfs_int("enabled", sysfs_rw, &toi_fileops.enabled, 0, 1, 0, null),

sysfs_int("***x", sysfs_rw, &yyyy, 0, 1, 0, null),

sysfs_int("priority", sysfs_rw, &file_target_priority, -4095,

4096, 0, null),

***x 為最終會看到的檔案節點名稱 ,yyyy 為變數名稱(該變數為全域性變數)

yyyy的值這裡指定為0/1.

3.在中斷處理函式中通過變數yyyy控制log的輸出,示例如下

handle_irq() {

if(yyyy)

printk("##");

1.休眠恢復後,無法看到adb gadget 裝置驅動中log資訊,層層向上追蹤,發現在ms_irq_handle_cascade_host0_irq中就

沒有31號中斷被轉換為裝置需要的2117訊號。對硬體介面層除錯,由於log資訊太多問題導致無法確定硬體中斷是否傳送。

2.對比分析sd卡中斷訊號傳遞過程 ,將sd卡driver的suspend以及resume設定為空,對中斷處理部分無影響

解決Docker安裝後無法啟動的問題

採用聯網yum方式安裝了docker,啟動docker systemctl start docker.service發現啟動不了,提示讓我檢視啟動狀態 systemctl status docker.service l 發現問題error的錯誤提示是 selinux和docker版本不匹配,錯誤訊息...

mysql安裝後無法啟動和連線問題

5.7的版本 1.無法啟動,報錯 服務沒有報告任何錯誤。輸入命令 mysqld initialize進行初始化,初始化成功後再重新輸入命令啟動net start mysql 2.安裝後root無法連線 首次安裝後,root連線的密碼在 data my pc.err中查詢 a temporary pa...

Apache連線PHP後無法啟動問題解決思路

問題 apache之前正常,連線配置完php後無法啟動,用apache test configration測試後報錯形式為 cannot load d php php5apache2 2.dll into server 或者php5apache2 4.dll 我個人的解決軌跡是這樣的 1 先檢視一下...