调试休眠和唤醒

调试休眠和唤醒


在做Android或者是Linux的调试中,在消费电子领域中对用电的要求比较的严格,所以大家对设备的休眠比较关注。一定要在系统发起休眠命令的时候要进入,这里来看下平时可以采取什么方式来调试。


1、no_console_suspend 
在kernel启动参数里面加上no_console_suspend,这个是最基本的,因为kernel在把console suspend掉以后,不管里面出了什么事情,从串口上都看不到。大部分在suspend/resume时候的死机都可以通过串口看到kernel Panic的信息,这样才会知道是哪里出了问题。因为有的时候resume出错,或者suspend到很后面出错的console不加这个参数都看不到。
bootargs中找到console在其后添加no_console_suspend例如
"console=ttyO0,115200n8 no_console_suspend"
或者在Uboot中直接设置后boot:
setenv console ttyO0,115200n8 no_console_suspend
 
2、initcall_debug
这个也许知道的人不多, 其实有的时候你不知道哪个driver在suspend/resume的时候出错的时候,很迷茫, 就想在哪里加上一些调试信息来看看是哪里的driver, 其实有些时候加的不合适的话, 会看不到很多有用的信息。其实kernel本身已经有这样的功能了(只不过不是很人性化)。
echo 1 > /sys/module/kernel/parameters/initcall_debugecho 9 > /proc/sys/kernel/printk


3、Wakelocks
cat /proc/wakelocks
下面的输出信息就是从galaxy nexus手机中cat出来的信息。
----------------------------------------------------------------------------------------------------------------------------
shell@android:/ $ cat /proc/wakelocks
cat /proc/wakelocks
name    count   expire_count    wake_count      active_since    total_time      sleep_time      max_time        last_change
"mipi_link"     69785   0       532     0       43248494951477  35451590103286  96727142333     184684078765708
"secril_fmt-interface"  101115  0       0       0       73367645997     56320313151     10838775632 184683582671958
"PowerManagerService"   20630   0       0       0       157187043244357 138806242646218 1796233337401   184677811614830
"alarm" 25844   0       1891    0       442550295993    433528323276    677124023       184677762389977
"KeyEvents"     100068  0       0       0       17888672017     3594574034      467163086       184659815185387
"alarm_rtc"     8306    2152    0       0       5017010652325   4942625154243   1998779293      183585703704674
"power-supply"  662     0       0       0       474365222       398406981       25146484        184648222167809
"max17040-battery"      4942    0       0       0       107889100461    99009583842     204589843   184648222045738
"twl6030 adc"   55740   0       0       0       136497710917    63467041679     14465332        184648221282799
"radio-interface"       5649    0       0       0       5987510983528   4494391751372   3640716553  184167530090172
"main"  385     0       0       0       27589451721195  0       1801661376953   183621222076256
"event2-301"    7512    0       0       0       111976470123    111660643686    407470703       183620469085534
"gpio_input"    826     0       52      0       3543701172      1258148215      6103516 183620468932946
"gpio_input"    608     0       17      0       3142333999      509887700       20996093        183617260894616
"event1-301"    73319   0       0       0       6583892939      0       25177002        183615457549889
"vibrator"      464     0       0       0       133468658426    26794189441     1003906250      183598213287194
"power-supply"  21      0       0       0       5523682 3387452 396729  183579602599937
"musb_autosuspend_wake_lock"    6301    0       3505    0       322516479827    312862884844    229400633       183578392913659
"mmc0_detect"   12914   1       0       0       1781005894      1146667475      605804444       183578384948571
"prx_wake_lock" 197     197     43      0       680666198829    311204620424    17666870119     183468741668546
"wlan_ctrl_wake"        912     912     0       0       1556927338368   827446624987    5618377684  182058829467620
"wlan_rx_wake"  4811    4811    0       0       6445298708108   3614577642010   38278076173     182058829467620
"wlan_wake"     104298  0       14      0       133928470101    54380007761     875823975       181999492339936
"suspend_backoff"       35      35      0       0       349706695589    349698791545    10000762940 180100141631934
"power-supply"  18      0       0       0       4150390 2227783 335693  179754180908064
"sec_jack_det"  6       6       0       0       29969024660     19172149659     4997924804      178495711700304
"BTLowPower"    34      31      0       0       34581329374     0       2529754639      173389314849718
"secril_rfs-interface"  59      0       0       0       6252319329      1922790526      295440674   172882026977411
"gps-lock"      13      0       0       0       402296051025    158244323729    136370635986    153166899169669
"client-interface"      26      0       0       0       2044672 183105  1251220 8923188262929
"mmc1_detect"   2       1       0       0       782775880       0       666595460       303422546390
"event5-301"    0       0       0       0       0       0       0       0
"tf_driver"     5       0       0       0       225280762       0       225067139       10488037113
"serial-debug"  0       0       0       0       0       0       0       0
"pogo"  0       0       0       0       0       0       0       0
"sii9234(mhl)"  0       0       0       0       0       0       0       0
"unknown_wakeups"       0       0       0       0       0       0       0       0
"deleted_wake_locks"    45      0       0       0       855010987       853912354       229522704   0
"vbus-tuna_otg" 18      17      0       1110345611571   10458468719490  8412140533438   4085013397217   183578602355798
"nfc"   1076    1076    121     0       563650971468    405111420422    7022674561      183622267028649
----------------------------------------------------------------------------------------------------------------------------
可以从上面的信息中可以看到vbus-tuna_otg这个服务还没有把wakelock来释放掉。当然如果你想了解这个wakelocks的内容,或者是想添加一些自己希望添加的信息,可以参考kernel/kernel/power/wakelocks.c这个文件。


4、dunpsys命令
The dumpsys tool runs on the device and dumps interesting information about the status of system services.


dumpsys power
127|shell@android:/ $ dumpsys power
dumpsys power
Power Manager State:
  mIsPowered=true mPowerState=0 mScreenOffTime=1561998 ms
  mPartialCount=0
  mWakeLockState=
  mUserState=
  mPowerState=
  mLocks.gather=
  mNextTimeout=183628133 now=185182465 -1554s from now
  mDimScreen=true mStayOnConditions=0 mPreparingForScreenOn=false mSkippedScreenOn=false
  mScreenOffReason=2 mUserState=0
  mBroadcastQueue={-1,-1,-1}
  mBroadcastWhy={0,0,0}
  mPokey=0 mPokeAwakeonSet=false
  mKeyboardVisible=false mUserActivityAllowed=false
  mKeylightDelay=6000 mDimDelay=47000 mScreenOffDelay=7000
  mPreventScreenOn=false  mScreenBrightnessOverride=-1  mButtonBrightnessOverride=-1
  mScreenOffTimeoutSetting=60000 mMaximumScreenOffTimeout=2147483647
  mLastScreenOnTime=0
  mBroadcastWakeLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
  mStayOnWhilePluggedInScreenDimLock=UnsynchronizedWakeLock(mFlags=0x6 mCount=0 mHeld=false)
  mStayOnWhilePluggedInPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
  mPreventScreenOnPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
  mProximityPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
  mProximityWakeLockCount=0
  mProximitySensorEnabled=false
  mProximitySensorActive=false
  mProximityPendingValue=-1
  mLastProximityEventTime=320267148
  mLightSensorEnabled=false mLightSensorAdjustSetting=0.0
  mLightSensorValue=114.0 mLightSensorPendingValue=193.0
  mHighestLightSensorValue=111 mWaitingForFirstLightSensor=false
  mLightSensorPendingDecrease=false mLightSensorPendingIncrease=false
  mLightSensorScreenBrightness=59 mLightSensorButtonBrightness=0 mLightSensorKeyboardBrightness=0
  mUseSoftwareAutoBrightness=true
  mAutoBrightessEnabled=true
mScreenBrightnessAnimator:
  animating: start:59, end:0, duration:200, current:0
  startSensorValue:111 endSensorValue:111
  startTimeMillis:323078467 now:324640479
  currentMask:SCREEN_BRIGHT_BIT


mLocks.size=0:


mPokeLocks.size=0:




补充dumpsys


Android has an interesting command called dumpsys  to dump some system information. Even described on adb manual  I think that some points should be reinforced. In order to get the complete status just run (will produce a large output):


adb shell dumpsys
Also you can apply filters to running services:


1 SurfaceFlinger 
2 accessibility
3 account
4 activity
5 alarm
6 appwidget
7 audio
8 backup
9 battery
10 batteryinfo
11 bluetooth
12 bluetooth_a2dp
13 clipboard
14 connectivity
15 content
16 cpuinfo 
17 device_policy
18 devicestoragemonitor 
19 diskstats
20 dropbox
21 entropy
22 ethernet
23 hardware
24 input_method
25 iphonesubinfo
26 isms
27 keybar
28 location
29 media.audio_flinger
30 media.audio_policy
31 media.camera
32 media.player
33 meminfo
34 mount
35 netstat
36 network_management 
37 notification
38 package
39 permission
40 phone
41 power
42 search
43 sensorservice
44 simphonebook
45 statusbar
46 telephony.registry
47 throttle
48 uimode
49 usagestats
50 vibrator
51 wallpaper
52 wifi 
53 window


Some examples:


adb shell dumpsys wifi
adb shell dumpsys cpuinfo
I suggest you try other items on the list above and be creative using all the power of Unix pipes. Example, to get all memory allocated by each process you can do something like:


adb shell dumpsys meminfo | grep "allocated:" | awk '{total = total + $5}END{print total}
<think>嗯,用户想了解RK平台USB休眠唤醒问题的调试方法。这个问题涉及嵌入式系统开发中的电源管理模块,属于硬件驱动层面的技术问题。用户很可能是嵌入式系统工程师,正在调试RK3568或RK3399这类Rockchip处理器的设备。 从用户引用的资料来看,ta已经查阅过官方文档社区讨论,但可能遇到具体实现问题。USB休眠唤醒是个复杂问题,涉及供电检测、时钟管理、唤醒源配置等多个环节。用户可能遇到设备无法唤醒唤醒后功能异常等问题。 参考官方文档[^1],首先要确认USB供电是否正常。很多唤醒失败是由于休眠时供电被切断导致的。需要检查VCC_USB电源域在休眠状态是否维持供电,特别是当USB作为主机(HOST)使用时。 另一个关键点是唤醒源配置[^2]。RK平台通过/sys/kernel/debug/wakeup_sources文件可以查看当前持有的休眠锁。如果USB设备持有休眠锁,系统就无法进入深度休眠。用户需要检查USB控制器或连接的USB设备是否意外持锁。 对于唤醒后显示异常的问题[^3],虽然引用的是LCD案例,但思路可以借鉴:在resume过程中可能需要复位USB控制器。Rockchip的USB控制器驱动在resume函数里可能缺少必要的重新初始化操作。 调试时建议分步骤验证:先用示波器测量USB供电引脚在休眠期间的电压;然后通过sysfs接口强制系统进入不同休眠模式测试;最后在驱动代码中加入调试打印,追踪休眠唤醒流程中的函数调用顺序。如果使用RK官方SDK,可以重点检查drivers/usb/dwc3/dwc3-rockchip.c这个文件里的电源管理回调函数。 用户可能还需要注意USB PHY的配置,有些型号需要额外初始化PHY寄存器。官方补丁包里通常会有针对具体芯片的PHY配置说明文件。</think>以下是RK平台USB休眠唤醒问题的调试方法及关键步骤,结合官方文档实际调试经验整理: ### 调试步骤 1. **确认供电配置** - 检查USB控制器供电域(如`VCC_USB`)在休眠状态是否维持 - 测量VBUS电压是否满足USB规范(典型值5V±5%) - 参考官方补丁包`Rockchip_Support_USB_HOST_Wakeup.7z`中的供电配置说明[^1] 2. **验证休眠模式支持** ```bash cat /sys/power/state # 查看支持的休眠模式 echo mem > /sys/power/state # 测试深度休眠 ``` 系统应返回支持的休眠模式:`freeze standby mem`[^2] 3. **检测休眠锁持有** ```bash awk '$6 != 0 {print $1" "$6}' /sys/kernel/debug/wakeup_sources ``` 若输出包含`dwc3`或`xhci-hcd`等USB相关条目,表明USB设备持有唤醒锁[^2] 4. **检查唤醒源配置** - 确认设备树中USB唤醒使能: ```dts &usbdrd_dwc3 { extcon = <&u2phy0>; dr_mode = "host"; wakeup-source; // 关键唤醒属性 }; ``` - 验证`/proc/interrupts`中USB中断是否注册为唤醒源 5. **唤醒后异常处理** - 复位USB控制器(借鉴显示异常解决方案): ```c // 在resume回调函数中添加控制器复位 dwc3_rockchip_reset_controller(); ``` - 检查PHY重新初始化流程[^3] 6. **关键日志分析** 在内核启动参数添加: ``` earlycon=uart8250,mmio32,0xff1a0000 console=ttyFIQ0 rootwait root=/dev/mmcblk0p5 rw init=/sbin/init loglevel=8 ``` 重点关注以下日志: ``` [PM] Suspending system... dwc3 fe800000.usb: Entering suspend state [PM] Waking up from suspend... dwc3 fe800000.usb: Resume interrupt received ``` ### 常见问题解决 | 问题现象 | 排查方向 | 解决方案 | |---------|---------|---------| | 无法进入休眠 | 唤醒锁持有 | 检查`wakeup_sources`持有者 | | USB设备唤醒失败 | VBUS供电中断 | 修改PMIC配置维持供电 | | 唤醒后枚举失败 | 控制器状态异常 | 添加复位操作[^3] | | 唤醒后系统卡死 | 时钟未恢复 | 检查CRU时钟配置补丁 | ### 进阶调试工具 1. **USB协议分析仪**:捕获休眠前后的USB数据包 2. **电源域监测**: ```bash cat /sys/kernel/debug/regulator/regulator_summary ``` 3. **时钟状态检查**: ```bash cat /sys/kernel/debug/clk/clk_summary | grep usb ``` > **重要提示**:RK不同平台(如RK3568/RK3399)的USB控制器实现存在差异,务必使用对应芯片版本的官方补丁包。调试前建议备份原始固件,避免休眠失败导致设备无法启动。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值