问题背景
在设备进行休眠时,休眠成功后被唤醒,查看休眠GPIO口被拉高,排除单片机拉高的可能,打印如下:
suspend: set mcu wakeup(pin2) to high level 休眠下去
Detect USB Vbus is:0(off) 关vbus
msm_hsusb msm_hsusb: CI13XXX_CONTROLLER_DISCONNECT_EVENT received
android_work: android_work: did not send uevent (0 0 (null))
mmc1: card 0001 removed
blk_update_request: I/O error, dev mmcblk0, sector 0
sdhci_msm 7864900.sdhci: card claims to support voltages below defined range
mmc1: error -110 whilst initialising SDIO card
sdhci_msm 7864900.sdhci: card claims to support voltages below defined range
blk_update_request: I/O error, dev mmcblk0, sector 0
mmc1: mmc_init_card: mmc_send_op_cond() fails -110
mmc1: error -110 whilst initialising MMC card
这里电平被拉进行异常唤醒
Detect USB Vbus is:1(On)
msm_hsusb msm_hsusb: CI13XXX_CONTROLLER_RESET_EVENT received
msm_hsusb msm_hsusb: CI13XXX_CONTROLLER_CONNECT_EVENT received
suspend: set mcu wakeup(pin2) to low level 唤醒上来
mmc1: Out-of-interrupt timeout is 100[ms]
mmc1: BKOPS_EN equals 0x2
mmc1: eMMC FW version: 0x37
mmc1: CMDQ supported: depth: 32
mmc1: cache barrier support 1 flush policy 1
mmc1: new HS200 MMC card at address 0001
mmc1: -524: cmdq: unable to set-up
mmcblk0: mmc1:0001 DG4008 7.28 GiB
mmcblk0: p1
mdm9607-asoc-snd soc:sound: ASoC: CODEC DAI quec-stub-rx Name: quec-stub-codec.2-0001, not registered
QCMAP:bringup v6
EXT4-fs (mmcblk0p1): recovery complete
EXT4-fs (mmcblk0p1): mounted filesystem with ordered data mode. Opts: nodelalloc,barrier=1,journal_checksum,noauto_da_alloc
问题分析
1、怀疑是wifi在polling时进行异常唤醒,验证:
echo 0 > /sys/devices/7864900.sdhci/polling 无改善
2、怀疑是加了gbtest影响休眠,验证:
cat /sys/module/usb_storage/parameters/gbtest N 默认关闭无影响
3、回退git版本验证:
+# CONFIG_LEDS_ANDROMEDA is not set 有影响,查看代码编译进andromeda_leds,继续代码与dtsi中查看GPIO冲突管脚:
查看andromeda-leds.c源码
.name = "CODEC_PWR",
.gpio = 11, 【冲突】
查看dtsi
sleep_ind_active: sleep_ind_active {
mux {
pins = "gpio11";
function = "gpio";
};
明显冲突,需要加宏控制不编译
问题原因
andromeda-leds中的CODEC_PWR GPIO口与sleep口11冲突,导致codec有信号时会影响休眠成功后被马上唤醒。
总结
熟悉休眠唤醒流程,找到问题原因,杜绝不规范配置GPIO口导致的冲突难排查问题。