Android系统插入OTG后不休眠
来源:互联网 发布:php可以开发什么 编辑:程序博客网 时间:2024/05/13 02:49
这两天一直忙着搞插入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)
{
otgwl_handle_event(event);
return NOTIFY_OK;
}
可以看出来,该通知链就是用来处理OTG(应该所有的USB事件)事件的。
static void otgwl_handle_event(unsigned long event)
{
unsigned long irqflags;
spin_lock_irqsave(&otgwl_spinlock, irqflags);
if (!enabled) {
otgwl_drop(&vbus_lock);
spin_unlock_irqrestore(&otgwl_spinlock, irqflags);
return;
}
switch (event) {
case USB_EVENT_VBUS:
case USB_EVENT_ID:
case USB_EVENT_ENUMERATED:
otgwl_hold(&vbus_lock); //如果是这三种类型,则进行wakelock加锁操作,从而不会进入休眠了。USB_EVENT_ID就是接OTG了,因为接了OTG,USB的ID会接地,所以这样命名。
break;
case USB_EVENT_NONE: //拔掉USB的时候,加一个超时锁,2s后自动解锁
case USB_EVENT_CHARGER:
otgwl_temporary_hold(&vbus_lock);
break;
default:
break;
}
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后不休眠
- Android系统插入OTG后不休眠
- Android系统插入OTG后不休眠
- Android手机休眠后时间不准确的解决方案
- Android手机休眠后时间不准确的解决方案
- 避免系统休眠后线程休眠
- Android 不休眠 不锁屏
- android 不休眠不锁屏
- android service启动Activity后系统无法自动休眠
- 关于Android系统休眠后,线程的执行情况
- Android 禁止系统休眠,使屏幕不变暗
- Android Kitkat 如何让系统永久不休眠
- android wake_lock 在底层实现系统不休眠
- android 6.0后usb otg设备不显示在文件管理器中
- 修改Android 休眠逻辑使系统关屏而不进入休眠
- 防止Android系统休眠
- Android 系统永不休眠
- Android设置WIFI不休眠并确保黑屏后网络通信正常的方法
- 开篇语
- 中医53个很牛的秘方
- 算法 - 输出一个字符串的全排列(C++)
- [转]ubuntu 安装deb的qq的时候报错 version number does not start with digit
- Quartz2D -(-)
- Android系统插入OTG后不休眠
- VS2003试图运行项目时出错:无法启动调试 没有正确安装调试器
- windows监测进程一切活动
- 重构 改善即有的代码 读书笔记2
- C#数字图像处理时注意图像的未用区域
- Android中Intent的使用
- sqlplus "/ as sysdba"报错ORA-01031: insufficient privileges
- ORA-12154: TNS: TNS-12533: TNS:illegal IMP-00038
- php操作excel文件--使用phpexcel