首页 > 其他分享 >Android Qcom USB Driver学习(十二)

Android Qcom USB Driver学习(十二)

时间:2024-08-29 17:53:23浏览次数:10  
标签:suspend USB Driver intf hid && usbhid Qcom usb

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
};

标签:suspend,USB,Driver,intf,hid,&&,usbhid,Qcom,usb
From: https://www.cnblogs.com/linhaostudy/p/18387303

相关文章

  • Qcom高通平台抓取wifi fw/driver + sniffer log
    抓取WLANDRIVER+WLANFW3日志进入开发者模式打开启动WLAN详细日志记录功能操作完之后,日志会保存在/data/vendor/wifi目录下adbpull出来压缩wifi.zip//WCNSS_qcom_cfg.ini#Firmwarelogmode#Validvaluesare0,1,2#0=Disable,1=WMI,2=DIAGgEnablefwlog=1orgEn......
  • linux下UsbMon-WireShark之USB协议抓取分析
    usbmon配置使用usbmon抓包分的,是需要内核开启CONFIG_USB_MON=m,重新编译内核,编译ko:makeARCH=arm64CROSS_COMPILE=aarch64-himix100-linux-CONFIG_USB_MON=mM=./drivers/usb/modules设备挂载debugfs,加载ko:mount-tdebugfsdebugfs/sys/kernel/debug/insmod......
  • Windows下使用Wireshark分析USB通信
    WireShark中对USB数据捕获可以监视与主机连接的usb数据.usb设备是三段地址描述,例如1.15.1,第一个是总线,第二个是设备地址,第三个是端口.USB数据抓包分析这些是鼠标的数据包包抓包内容键盘数据包,按下一个键后抓到的数据包,查询usb标准,对照后是a。......
  • USB设置之间通信
    在电脑上连接的USB设备之间,通常不能直接通信。USB(通用串行总线)是一种主从结构的总线系统,其中只有一个USB主机(通常是电脑),而其他连接的设备都作为从机。在这种结构中,设备之间的通信必须通过USB主机进行转发,即设备不能直接与其他设备交换数据或信号。USB主机负责控制和管理所有连接......
  • Q: USB无线网卡搜不到路由器WiFi,但也能搜索到少部分信号。
    原因分析:一般在路由器的配置的无线信道是自动,路由器的2.4G频段有13个左右交叠的信道。由于USB无线网卡的设置信道区间可能不在无线信道范围内,导致无线网卡搜索不到对应wifi。解决问题:鼠标右键点击任务栏上的网络图标,点击“打开网络和Internet设置”,在弹出的设置窗口左边选择......
  • Android Qcom USB Driver学习(十一)
    基于TI的FirmwareUpdate固件升级的流程分析usbapplictionlayers的数据USBProtocolPackage①/②maptocheckpasswordcorrectPackageFormat:Byte[0]=ReportIdByte[1]=ValidLength(0x21=33)Byte[2]=BSLCoreCommands(0x11RXPassword)Byte[3]=Val......
  • USB 逻辑分析仪分析丢包怎么分析(lecroy USB 逻辑分析仪)
    使用LeCroyUSB逻辑分析仪分析USB数据传输中的丢包现象,通常涉及以下步骤:1.设置触发条件在LeCroyUSB逻辑分析仪中,设置适当的触发条件来捕获数据包丢失的场景。常见的触发条件可以包括:特定的PID(PacketIdentifier)值,如DATA0或DATA1。错误类型,如CRCError(循环冗余......
  • 基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器,然后进行识别,识别结果如下:  本课题中,使用的USB摄像头为:   2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频) 程......
  • USB入门系列(二)USB事务处理(上)
    USB事务处理(上)​ USB的事务处理分为三个阶段,这三个阶段的作用分别和can的标准帧很像。令牌阶段(包含了本次数据的类型信息)数据阶段(包含了本次数据的数据信息)握手阶段(包含传输是否成功的状态信息)​ 而每个阶段都由同步字段+信息包+EOP组成。令牌阶段的信息包又叫做令牌......
  • Android Qcom USB Driver学习(十)
    本章主要是基于之前的学习,实现一个hidraw的驱动,发现有两种用于识别usb设备的方式,放别是usb_device_id和hid_device_idhid_probe(1)hid_device_idkernel/msm-4.19/drivers/hid/usbhid/hid-core.cbus=usbusb_register注册驱动->sys/bus/usb/driver↓↓↓↓↓↓......