keypad 在suspend的过程中导致Android无法进入suspend的问题,导致整体功耗过高,其实是主机都没有进入睡眠,通过以下打log的方式最终定位到问题,pmic vbus输出的时候会有reverse boost所以pmic侧的功耗也会有增加,当pmic电量低的时候会触发uvlo导致vbus上的电断开,需要需要的话,我们可以降低这个uvlo的触发阈值,是得对应的固件能在低电量使用

usb_enable_autosuspend -> pm_runtime_allow -> rpm_idle -> rpm_suspend -> rpm_callback

.runtime_suspend =      usb_runtime_suspend 入口

usb_runtime_suspend -> autosuspend_check
-> usb_suspend_both <return error>
-> usb_suspend_interface<return error>
-> driver->suspend(intf, msg)<return error>
-> hid_suspend
-> hidinput_count_leds
-> if(!test_bit(HID_RESET_PENDING, &usbhid->iofl)
&& !test_bit(HID_CLEAR_HALT, &usbhid->iofl)
&& !test_bit(HID_OUT_RUNNING, &usbhid->iofl)
&& !test_bit(HID_CTRL_RUNNING, &usbhid->iofl)
&& !test_bit(HID_KEYS_PRESSED, &usbhid->iofl)
&& (!ledcount || ignoreled ))<return error>
-> driver_suspend = true -> usb_suspend_device
-> udriver->suspend(udev, msg)
-> generic_suspend
-> usb_port_suspend
-> usb_enable_remote_wakeup
-> usb_disable_usb2_hardware_lpm
-> usb_disable_ltm
-> set_port_feature(USB_PORT_FEAT_SUSPEND)
-> usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port1,
NULL, 0, 1000);
-> usb_set_device_state(USB_STATE_SUSPENDED)
-> pm_runtime_put_sync

问题分析下来确定在usb_suspend_both 中的ledcount中,ignoreled是Module params中得到

usb suspend/resume是通过setportfeature命令控制的,linux usb驱动也是通过这种port command来控制suspend以及resume状态,如果让一个要让一个设备suspend,则想向其所在的 hub port发送USB_PORT_FEAT_SUSPEND即可让设备进入suspend状态,此时基本主机进入suspend状态,而功耗依旧是高的状态基本可以断掉是设备没有进入suspend状态,那基本可以定位为usb外部设备suspend failed,对于roothub,它没有所在的port,所以没有对应的 setportfeatre的方法,那它使用的是系统的全局调用的bus_suspend,除了以上遇到的led report的问题,还需要注意remote wakeup的功能也会是usb_suspend_both发生failedAndroid

一种方法就是过滤出我们的设备,使其走入正常的suspend流程,另一方方法就是将ignoreled设置true

bool isKeypad(struct hid_device *hid,struct usb_interface *intf){
if(hid->vendor == 0xXXXX && hid->product == 0xXXXX)
return true;
return false;
} usbhid_probe
ifisKeypad(hid, intf)){
usb_enable_autosuspend(dev);
hid_err(intf, "enable autosuspend++++++\n");
} usbhid_disconnect
ifisKeypad(hid, intf)){
usb_disable_autosuspend(dev);
hid_err(intf, "disable autosuspend++++++\n");
} hid_suspend
- && (!ledcount || ignoreled ))
+ && (!ledcount || ignoreled || isCW45Keypad(hid, intf)))

Firmware

HID 报告及报告描述简介这篇文章中可以得知键盘的报告描述符和报告中usage有led相关的,可能是让Android能支持对keypad led的处理,如果不对Android处理,将keypad firmware中的ReportDescriptor中这一段删除或者修改某些值可能就OK了,我猜的,固件代码没分析过

code char KeyBoardReportDescriptor[63] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop) //表示用途页为通用桌面设备
0x09, 0x06, // USAGE (Keyboard) //表示用途为键盘
0xa1, 0x01, // COLLECTION (Application)
...
- 0x05, 0x08, // USAGE_PAGE (LEDs) //用途是 LED,即用来控制键盘上的 LED 用的,因此下面会说明它是输出用
- 0x19, 0x01, // USAGE_MINIMUM (Num Lock) //用途最小值是 Num Lock,即数字键锁定灯
- 0x29, 0x05, // USAGE_MAXIMUM (Kana) //用途最大值是 Kana,这个是什么灯我也不清楚
- 0x91, 0x02, // OUTPUT (Data,Var,Abs) //1 表示灯亮, 0 表示灯灭
- 0x95, 0x01, // REPORT_COUNT (1) //这样的数据段个数为 1
- 0x75, 0x03, // REPORT_SIZE (3) //每个段大小为 3bits
- 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) 输出用,常量,值,绝对 对上面的5字节进行补齐
...
0xc0 // END_COLLECTION
};

Android Qcom USB Driver学习(十二)的更多相关文章

  1. Android系统--输入系统(十二)Dispatch线程_总体框架

    Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...

  2. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  3. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  4. (转载)Android项目实战(三十二):圆角对话框Dialog

    Android项目实战(三十二):圆角对话框Dialog   前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...

  5. android 与usb 设备通信(二)

    再次遇到android  mUsbManager.getDevicelist() 得不到usb 设备的问题.于是深入去探讨android 与usb 外围设备通信的问题.第一篇文章写的有点乱,本质就是需 ...

  6. Scala学习十二——高阶函数

    一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...

  7. Android学习十二---在android上实现图像匹配

    一.效果图及功能描述 效果图 点击ShowImg后 点击match,然后点击showmatch,可以不断点击showmatch. 主要功能描述:显示在SD卡上已经存在的图片test.jpg,根据图片在 ...

  8. Android学习十二:跑马灯程序实现(简单联系)

    package org.tonny; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; ...

  9. Android学习十二:自定义控件学习

    自定义控件: 1.定义控件的属性,atts.xml 2.代码实现自定义控件的控制 3.引用该控件 首先定义相关的属性 <?xml version="1.0" encoding ...

  10. android学习十二(android的Content Provider(内容提供器)的使用)

    文件存储和SharePreference存储以及数据存储一般为了安全,最好用于当前应用程序中訪问和存储数据.内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能 ...

随机推荐

  1. 对比python学julia(第一章)--(第五节)八十天环游地球

    5.1.  问题描述 <八十天环游地球>是法国作家儒勒·凡尔纳创作的一部长篇小说,讲述了这样一个神奇的故事. 在1872年的伦敦,英国绅士福格跟俱乐部的朋友以巨资打赌他能在80天实现环游地 ...

  2. 【MySQL】 将字段相同的记录排在一起,按时间倒序

    一.实现效果: 蓝牙mac字段是相同的记录,排在一起,再按时间倒序,总体时间来说也需要倒序 二.SQL编写: 最开始的想法就是,那我直接按mac和时间排序不就好了 SELECT * FROM aca_ ...

  3. 【Half-Life】 Steam 安装半条命模组

    安装办法参考自B站UP主[百科全叔]的文章 https://www.bilibili.com/read/cv543926 半条命模组在ModDB站上下载资源 https://www.moddb.com ...

  4. 【ECharts】02 饼图

    饼状图: <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="width: 600px;he ...

  5. 论文写作:“et al.”和“etc.”在英语中的区别

    "et al."和"etc."在英语中有不同的用法和含义.以下是它们的区别和具体用法: et al. "et al."是拉丁短语" ...

  6. 动手煮面的一次经历,加餐DIY

    去年和今年一直是有疫情的,也是如此像我这种在学校呆着的不是在家窝着就是在学校窝着,尤其是到了假期的时候,如果晚回家几天那食堂的伙食就会变得十分的恐怖. 面对这样的伙食也是十分的无奈,虽然也是十分理解当 ...

  7. 美国空军未来利用AI控制无人僚机执行空战或对地作战任务成为可能——AI算法强化学习控制无人机执行空战或对地作战成为可能

    来源: https://export.shobserver.com/baijiahao/html/640202.html https://baijiahao.baidu.com/s?id=177346 ...

  8. Python使用pynvml查看GPU信息

    参考: https://blog.csdn.net/TracelessLe/article/details/107405544 ==================================== ...

  9. 在vscode中通过修改launch.json文件为项目添加环境变量——在launch.json文件中修改env变量

    在vscode中launch.json文件具有十分重要的作用,在vscode中可以通过修改launch.json文件修改调试和运行代码时的设置. 本文假设已对vscode有初步了解,已可以创建laun ...

  10. 9组-Beta冲刺-总结

    一.基本情况 组长博客链接:9组-Beta冲刺-总结 现场答辩总结:本次答辩,我们演示了我们到Beta冲刺周结束时的成果展示,离目标还有一些距离,不过本次答辩完成了任务,总体来说还不错,希望下次最终答 ...