這兩天一直忙著搞插入otg宕機的問題。有時候機器上面插入個u盤,滑鼠,或者硬碟,如果這個時候沒有接充電器的話,有很大的概率機器直接宕機了,而且必須插入充電器才能開機。實測電池電壓基本為0,原來是電池過流保護了。由於採購的電池保護點過低(1.5a的時候就掛了),只能想辦法把輸出電流降到最低了,嘗試過很多方法,調低背光亮度可以有效解決在正常使用中宕機,但是插入otg宕機的問題一直沒有得到解決。
硬體部同事說在插入otg的時候,充電晶元上仍然有500ma的電流輸入,奇怪,這個時候又不是usb充電狀態,怎麼會有電流呢?不管他,硬體做的事情,俺不懂。想辦法把這個電流去掉吧,查了下充電晶元的文件,還真有防止otg插入時回流的,設個暫存器,ok。
今天把otg插上,接上串列埠,發現機器竟然不休眠了。問了下同事,說插入otg就是不休眠的。於是看了下**,這裡就簡單分析下吧。
大家知道android系**有的wakelock鎖,只要某個模組還持有wakelock,系統就不能進入休眠。usb otg 也是這麼幹的。
在drivers/usb/otg/otg-wakelock.c中
wake_lock_init(&vbus_lock.wakelock, wake_lock_suspend,
vbus_lock.name); //這裡初始化乙個wakelock鎖
otgwl_nb.notifier_call = otgwl_otg_notifications;
ret = otg_register_notifier(otgwl_xceiv, &otgwl_nb);
//這裡定義乙個通知鏈,當有usb event發生時(比如usb 的插入,拔掉),其他核心模組會呼叫該通知鏈
由於都是在中斷上下文處理的,otg_register_notifier實現為atomic_notifier_chain_register
看下otgwl_otg_notifications的實現吧
static int otgwl_otg_notifications(struct notifier_block *nb,
unsigned long event, void *unused)
可以看出來,該通知鏈就是用來處理otg(應該所有的usb事件)事件的。
static void otgwl_handle_event(unsigned long event)
switch (event)
spin_unlock_irqrestore(&otgwl_spinlock, irqflags);
}再看看在什麼地方通知的該通知鏈
drivers/usb/otg/twl6030-usb.c中的usb中斷處理函式中
當插入或拔掉usb,會有乙個中斷發生,在中斷處理函式中發通知
atomic_notifier_call_chain(&twl->otg.notifier,
status, &charger_type);
這樣就做到了當插入usb otg的時候,系統不能進入休眠。還不知道為什麼這麼做。難道是怕插入u盤,拷貝東西的時候系統休眠從而導致一些問題?
Android裝置上的OTG
關於驅動 otg驅動在核心配置好 usb host 控制器的時候就已經支援 otg了。如果硬體上不支援otg 那麼就沒有辦法識別插入到 usb guest 口上的裝置。待測試 關於應用 otg對於應用程式來說是和普通的 usb host 口是一樣樣的。所以開發應用程式完全不用管是插入 host 口的...
Android系統簡單研究後的缺陷總結
最近剛買了乙個moto me600,android系統的,版本1.5,發現此系統有下面幾個缺陷 1.手機sim卡,有時會被系統自動鎖住,我到現在還不知道怎麼回事,誰能告訴我?2.打 時不能錄音。3.應用程式程序有時會突然停止。4.藍芽功能居然不能傳檔案。5.相機拍照有聲音。6.手機關機不能鬧鐘,但是...
Android系統簡單研究後的缺陷總結
最近剛買了乙個moto me600,android系統的,版本1.5,發現此系統有下面幾個缺陷 1.手機sim卡,有時會被系統自動鎖住,我到現在還不知道怎麼回事,誰能告訴我?2.打 時不能錄音。3.應用程式程序有時會突然停止。4.藍芽功能居然不能傳檔案。5.相機拍照有聲音。6.手機關機不能鬧鐘,但是...