Android Qcom USB Driver学习(十二)

news/2025/4/2 15:32:35/

该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零)
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发生failed

Android

一种方法就是过滤出我们的设备,使其走入正常的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_probeifisKeypad(hid, intf)){usb_enable_autosuspend(dev);hid_err(intf, "enable autosuspend++++++\n");}usbhid_disconnectifisKeypad(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学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)
Android Qcom USB Driver学习(十二)


http://www.ppmy.cn/news/116627.html

相关文章

HttpServletRequestWrapper处理request数据流多次读取问题

本次讨论post方式获取参数&#xff0c;request.getInputStream()获取一次以后不能第二次获取&#xff0c;以及 request.getParameter()与request.getInputStream()也存在这种情况 一、获取请求参数 1、request.getParameter() 2、request.getInputStream()或request.getReader…

Java的volatile

介绍 volatile volatile 关键字可以说是 Java 虚拟机提供的最轻量级的同步机制&#xff0c;但是它并不容易被正确、完整地理解&#xff0c;以至于许多程序员都习惯去避免使用它&#xff0c;遇到需要处理多线程数据竞争问题的时候一律使用 synchronized 来进行同步。了解 volat…

centos8修改网卡名称成eth0

新安装的centos8网卡名称有时候会变成ensXXX&#xff0c;不太符合以往的习惯&#xff0c;要修改成ethXX并不难&#xff0c;简单记录一下过程。 1.查看现网卡名 [root10-0-200-120 ~]# ifconfig ens3: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.0.20…

n5095和n5100哪个好 n5095和n5100区别

n5095采用10纳米制造工艺 四核心4线程 “CPU主频2-2.9GHz 三级缓存4MB 热设计功耗15W内存类型 DDR4 2933MHz&#xff0c;LPDDR4x 2933MHz 选n5100还是n5095这些点很重要http://www.adiannao.cn/dy n5100采用10纳米制造工艺 四核心 “CPU主频1.1-2.8 GHz 三级缓存4MB 热设计功…

诺基亚5800XM

一:关于打电话或来电话黑屏问题,这是因为你有东西遮挡住5800的距离感应器,就在光线感应器和副摄象头的中间,有两个不很明显的小孔,那是距离感应器,任何东西遮挡住它都会在来电话或者打电话时使屏幕黑屏,包括透明的贴膜,所以已经在那个位置贴膜的朋友请把那个位置的贴膜剪去即可…

java之多线程详解(基础版)

1.什么是进程? 1.1进程就是执行程序的一次执行过程,他是应该动态的概念&#xff0c;是系统分资源分配的单位。 2.什么是线程 2.1一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义,线程是CPI调度和执行的单位。 3.创建线程的方式 3.1继承Th…

Clickhouse limit by函数

关注微信公共号&#xff1a;小程在线 关注CSDN博客&#xff1a;程志伟的博客 ClickHouse server version 21.6.6 创建表 dblab-VirtualBox :) CREATE TABLE limit_by(id Int, val Int) ENGINE Memory; CREATE TABLE limit_by ( id Int, val Int ) ENGINE Memory Q…

IPC网络高清摄像机基础知识2(安霸半导体公司产品介绍 “来自2016年”)

需求说明&#xff1a;了解IC供应商安霸公司的产品体系 来自&#xff1a;http://tieba.baidu.com/p/4236056905 一、GoPro的灵魂 -- 安霸半导体公司&#xff08;Ambarella, Inc&#xff09; 一家位于加州SantaClara的初创公司&#xff0c;主营H264压缩处理芯片。说是初创是相…