全志R328 standby 休眠管理

standby 配置

在命令行中进入 Tina 根目录,执行命令进入配置主界面:

source build/envsetup.sh (见详注1)
lunch (见详注2)
make kernel_menuconfig (见详注3)

详注:
1 加载环境变量及tina提供的命令
2 输入编号,选择方案
3 进入内核配置主界面(对一个shell而言,前两个命令只需要执行一次)

配置路径:

Power management options --->
[*] Suspend to RAM and standby
[ ] Skip kernel's sys_sync() on suspend to RAM/standby
[ ] Opportunistic sleep
[ ] User space wakeup sources interface
-*- Device power management core functionality
[*] Power Management Debug Support
[*] Extra PM attributes in sysfs for low-level debugging/testing
[ ] Test suspend/resume and wakealarm during bootup
[ ] Device suspend/resume watchdog
< > Advanced Power Management Emulation
[ ] Enable workqueue power-efficient mode by default
CPU Power Management --->
CPU Idle --->
[*] CPU idle PM support
[ ] Ladder governor (for periodic timer tick)
-*- Menu governor (for tickless system)
ARM CPU Idle Drivers --->
[*] Generic ARM/ARM64 CPU idle Driver
[ ] CPU Idle Driver for Calxeda processors
[ ] Cpu Idle Config for sunxi soc

配置成功后可以在 Tina 端看到如下节点:在这里插入图片描述

standby 功能

关键代码和主要流程

linux-4.9/kernel/power/main.c
linux-4.9/kernel/power/suspend.c
linux-4.9/drivers/soc/sunxi/pm.c

主要流程:
在这里插入图片描述

系统休眠

休眠操作就一条命令:

echo mem > /sys/power/state;

系统就会进入休眠。现象:控制台打印 ``PM: Entering mem sleep’’,然后控制台关闭。如下图:
在这里插入图片描述

系统唤醒

通过触发中断的方式,唤醒系统。常用唤醒源有:电源按键唤醒、其他按键唤醒、Wifi 唤醒、
蓝牙唤醒、Usb 唤醒、Sd 卡唤醒、定时唤醒、自配置 GPIO。
注意:不同平台的唤醒源支持情况不同。
目前 Tina 系统普遍支持的有按键、wifi、自配置 GPIO。
现象:控制台打开,打印 ``PM: Finishing wakeup.’’。如下图:

唤醒源的配置

  1. 配置步骤
    几乎所有唤醒源都是通过直接和 CPU 相连的管脚发送中断触发的,所以可以理解为 GPIO 中断
    (Timer 例外)。配置唤醒源就是配置某个管脚的中断功能,
    主要分为几步:
    I. 指定引脚;
    II. 配置该引脚为中断模式;
    III. 设置中断的触发模式;
    IV. 设置中断标志位,使能该引脚中断口;
    V. 使能该引脚对应中断号的中断;
    在这里插入图片描述
  2. 主要接口
request_irq(irq_num, irq_handler, irq_flag,device, device_id)
enable_irq_wake(irq_num)

注:如 LRADC,TPADC,Timer,只需要驱动调用这些接口就可以了。但如果是 GPIO,还得区
分具体是那个 GPIO 口。不同内核版本接口可能存在差异。
3. 例子
如 linux-4.9,wifi 配置的 gpio

sunxi_wlan_probe
{
	data->gpio_wlan_hostwake = of_get_named_gpio_flags(np,
	"wlan_hostwake",0, (enum of_gpio_flags *)&config);
	ret = gpio_direction_input(data->gpio_wlan_hostwake);
	ret = device_init_wakeup(dev, 1);
	ret = dev_pm_set_wake_irq(dev, gpio_to_irq(data->gpio_wlan_hostwake));
	....
}

dts | sys_config 配置

wlan_hostwake = port:PE05<6><default><default><default> //wifi


keys { //gpio模拟按键
compatible = "gpio-按键唤醒keys";
status = "okay";
wakeup {
	wakeup-source;
	gpios = <&pio PH9 6 2 2 1>;
	label = "wakeup";
	linux,code = <KEY_WAKEUP>;
	};
	};

常用唤醒操作

  1. 按键唤醒
echo mem > sys/power/state; //进入休眠

按下任意 KEYADC 按键唤醒系统。
2. 定时唤醒

echo 1000 > /sys/power/sunxi_debug/time_to_wakeup_ms; //设置定时约5s
echo mem > sys/power/state; //进入休眠

系统将在约 5s 后自动唤醒。
3.wifi 唤醒
准备两块 R328 开发板 A,B(其中可以一块是路由器),确认板子能正常休眠唤醒。

wifi_connect_ap_test AWTest passward //A,B两块板子连接同一个wifi。
ifconfig //查看A,B两块板子的IP地址。
ping IP //保证两块板子在正常工作时能相互ping通。
echo mem > /sys/power/state; //A板进入休眠。
ping IPA //B板执行,尝试唤醒A板

2.4 standby 调试

2.4.1 调试节点
1./sys/power/state

cat /sys/power/state --->freeze standby mem

首先第一个调试节点就是/sys/power/state,我们可以 cat 发现有三个值可以写入,目前 standby 和
mem 是等价的。写入 mem 字符串测试是否能够正常进入休眠,然后通过按键或是其他唤醒源唤醒测
试能否正常唤醒。
2./sys/power/wake_lock

cat /sys/power/wake_lock --->NativePower.Display.lock

有些平台有唤醒锁的机制(有这个锁就不能进入休眠),例如 R16 平台:如果/sys/power/wake_lock
节点下有锁存在需要释放后才能休眠。
3./sys/power/wake_unlock
. . . .

echo NativePower.Display.lock > /sys/power/wake_unlock 用来释放唤醒锁。

与/sys/power/wake_lock 节点成对出现,用来释放唤醒锁。
4./sys/power/pm_test
. . . .

cat /sys/power/pm_test --->[none] core processors platform devices freezer
如:echo devices > /sys/power/pm_test
echo mem > /sys/power/state

该节点专门用来做不同程度的休眠唤醒测试的,休眠5 S 后自动唤醒。
5./sys/module/printk/parameters/console_suspend

echo N > /sys/module/printk/parameters/console_suspend

这个节点默认值为 Y,表明延迟 suspende 控制台,此后所即使进入休眠,也会将打印信息输出到
控制态,这样方便调试。
6./sys/module/kernel/parameters/initcall_debug
. . . .

echo Y > /sys/module/kernel/parameters/initcall_debug

该节点默认值为 N,会打印各个 device 的名称,调用的开始和结束时刻;linux-3.10 及之后的版
本, 打印的是 syscore 对应的设备。这样可以精确到具体是那个设备休眠唤醒出了问题。
7./proc/sys/kernel/printk
. . . .

echo 8 > /proc/sys/kernel/printk

该节点用来修改打印等级,数值越大,等级越高。一般休眠唤醒测试时执行
8./sys/power/wakeup_src
. . . .

cat /sys/power/wakeup_src
**************************************************************************************************
dynamic wakeup src config:
wakeup_src 0x800000
WAKEUP_SRC is as follow:
CPUS_WAKEUP_GPIO bit 0x800000
want to know gpio config & suspended status detail?
cat /sys/power/aw_pm/debug_mask for help.
wakeup_gpio_map 0x284
WAKEUP_GPIO,for cpus:pl,pm, and axp, is as follow:
WAKEUP_GPIO_PL port 2.
WAKEUP_GPIO_PL port 7.
WAKEUP_GPIO_PL port 9.
wakeup_gpio_group 0x0
WAKEUP_GPIO,for cpux:pa,pb,pc,pd,.., is as follow:
==========================wakeup src setting usage help info========:
echo wakeup_src_e para (1:enable)/(0:disable) > /sys/power/wakeup_src
demo: echo 0x2000 0x200 1 > /sys/power/wakeup_src
wakeup_src_e para info:
WAKEUP_SRC is as follow:
CPU0_WAKEUP_MSGBOX bit 0x1 CPU0_WAKEUP_KEY bit 0x2
CPUS_WAKEUP_LOWBATT bit 0x1000 CPUS_WAKEUP_USB bit 0x2000
CPUS_WAKEUP_AC bit 0x4000 CPUS_WAKEUP_ASCEND bit 0x8000
CPUS_WAKEUP_DESCEND bit 0x10000 CPUS_WAKEUP_SHORT_KEY bit 0x20000
CPUS_WAKEUP_LONG_KEY bit 0x40000 CPUS_WAKEUP_IR bit 0x80000
CPUS_WAKEUP_ALM0 bit 0x100000 CPUS_WAKEUP_ALM1 bit 0x200000
CPUS_WAKEUP_TIMEOUT bit 0x400000
CPUS_WAKEUP_GPIO bit 0x800000
want to know gpio config & suspended status detail?
cat /sys/power/aw_pm/debug_mask for help.
CPUS_WAKEUP_USBMOUSE bit 0x1000000 CPUS_WAKEUP_LRADC bit 0x2000000
CPUS_WAKEUP_CODEC bit 0x8000000 CPUS_WAKEUP_BAT_TEMP bit 0x10000000
CPUS_WAKEUP_FULLBATT bit 0x20000000 CPUS_WAKEUP_HMIC bit 0x40000000
CPUS_WAKEUP_POWER_EXP bit 0x80000000
gpio para info:
SUNXI_BANK_SIZE bit 0x20
SUNXI_PA_BASE bit 0x0
SUNXI_PB_BASE bit 0x20
SUNXI_PC_BASE bit 0x40
SUNXI_PD_BASE bit 0x60
SUNXI_PE_BASE bit 0x80
SUNXI_PF_BASE bit 0xa0
SUNXI_PG_BASE bit 0xc0
SUNXI_PH_BASE bit 0xe0
SUNXI_PI_BASE bit 0x100
SUNXI_PJ_BASE bit 0x120
SUNXI_PK_BASE bit 0x140
SUNXI_PL_BASE bit 0x160
SUNXI_PM_BASE bit 0x180
SUNXI_PN_BASE bit 0x1a0
SUNXI_PO_BASE bit 0x1c0
AXP_PIN_BASE bit 0x400
**************************************************************************************************

该节点用来配置唤醒源,
. . . .

echo wakeup_src para (1:enable)/(0:disable) > /sys/power/sunxi/wakeup_src

例如添加 PL7 为唤醒源:
. . . .

echo 0x800000 0x167 1 > /sys/power/sunxi/wakeup_src

参数说明:0x800000 表示 CPUS_WAKEUP_GPIO 唤醒源 0x167 指定 PL7 1 表示 enable
9./sys/power/scene_lock

cat /sys/power/scene_lock
talking_standby usb_standby mp3_standby boot_fast super_standby normal_standby gpio_standby misc_standby

该节点用来存放场景锁,做一些场景测试。Scene_unlock 节点用来释放场景锁。
10./sys/power/pm_print_times
. . . .

echo 1 > /sys/power/pm_print_times

该节点用来开启设备调用的开始和结束的打印。
开启打印如下:
. . . .

[ 1168.881358] calling pio+ @ 149, parent: soc
[ 1168.886142] call pio+ returned 0 after 1 usecs
[ 1168.891106] calling soc+ @ 149, parent: none
[ 1168.895983] call soc+ returned 0 after 1 usecs
[ 1168.900923] calling clocks+ @ 149, parent: none
[ 1168.906083] call clocks+ returned 0 after 1 usecs

2.5 常见问题

2.5.1 设备级别
现象:执行 echo mem > /sys/power/state; 无论何种方式系统都无法唤醒。devices 级别测试失败。
定位问题:
根据 pm_test 节点先判断是在那个阶段失败。根据经验最容易出问题的是设备级别。
打开相关调试:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值