linux otg状态,Android系统插入OTG后不休眠

博客详细分析了Android设备在插入OTG设备时为何不会休眠的问题。作者通过查阅代码和充电芯片文档,发现OTG插入会激活一个wakelock锁,防止系统进入休眠状态,以确保数据传输时系统的稳定性。同时,硬件问题如电池保护点设置过低也可能导致设备死机。
摘要由CSDN通过智能技术生成

这两天一直忙着搞插入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盘,拷贝东西的时候系统休眠从而导致一些问题?0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值