rk3576 --- 待机唤醒模式

(一)dts

rockchip-suspend 的节点,用于定义 Rockchip 平台的睡眠模式和电源管理配置。

rockchip_suspend: rockchip-suspend {
		compatible = "rockchip,pm-config";
		status = "disabled";
		// 睡眠模式下调试功能是否启用
		rockchip,sleep-debug-en = <0>;
		// 睡眠模式配置	
		rockchip,sleep-mode-config = <
			(0
			| RKPM_SLP_ARMOFF_LOGOFF
			| RKPM_SLP_PMU_PMUALIVE_32K
			| RKPM_SLP_PMU_DIS_OSC
			| RKPM_SLP_PMIC_LP
			| RKPM_SLP_32K_EXT
			)
		>;
		//启用GPIO唤醒功能
		rockchip,wakeup-config = <
			(0
			| RKPM_GPIO_WKUP_EN
			)
		>;
		//睡眠模式下IO保留配置
		rockchip,sleep-io-ret-config = <
			(0)
		>;
		//睡眠模式下引脚配置
		rockchip,sleep-pin-config = <
			(0
			| RKPM_SLEEP_PIN0_EN
			| RKPM_SLEEP_PIN1_EN
			)
			(0)
		>;
		//电源域相关配置
		power-domains = <&power RK3576_PD_USB>, <&power RK3576_PD_PHP>;
	};

(二)内核

驱动中需要初始化设备的唤醒功能并且添加唤醒源

int device_init_wakeup(struct device *dev, bool enable);
功能	:初始化设备的唤醒功能
参数:
	@dev	:指向设备的struct device结构体
	@enable	:表示是否启用设备的唤醒功能。true,启用;flase,禁用。
返回值:
	成功,返回0
	失败,返回非0
static int device_probe(struct i2c_client *client,
			  const struct i2c_device_id *id)
{
	...
	//注册中断
	int ret;
	
	device-> irq = gpiod_to_irq(gsv6127e->gpio_intp);
	if (device-> irq < 0)
		return -EINVAL;
	
	ret = devm_request_threaded_irq(dev, device->irq, NULL, device_intp_threaded_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "driver-intp", device);
	if (ret) {
    	printk(KERN_ERR "Failed to request threaded IRQ: %d\n", ret);
    	return ret;
	}
	
	//添加唤醒源
	ret = device_init_wakeup(&client->dev, true);
	if (ret) {
		printk(KERN_ERR "Failed to enable wakeup for device: %d\n", ret);
	} else {
		printk(KERN_INFO "Wakeup enabled for device.\n");
	}
	
	...
}

static int device_pm_suspend(struct device *dev)
{
	struct i2c_client *client = to_i2c_client(dev);
	if (device_may_wakeup(dev))
		enable_irq_wake(client->irq);
	else
		disable_irq(client->irq);
	
	return 0;
}

static int device_pm_resume(struct device *dev)
{
	struct i2c_client *client = to_i2c_client(dev);
	if (device_may_wakeup(dev))
		disable_irq_wake(client->irq);
	else
		enable_irq(client->irq);

	return 0;
}

static const struct dev_pm_ops device_pm_ops = {
	.suspend = device_pm_suspend,	//在系统进入低功耗模式时,保存设备的状态并关闭设备的电源。
	.resume = device_pm_resume,
};

static struct i2c_driver device_driver = {
	.probe = device_probe,
	.remove = device_remove,
	.shutdown = device_shutdown,
	.driver = {
		.name = "device",
		.pm = &device_pm_ops,
		.of_match_table = device_dt_ids,
	},
};

(三)调试

/sys/power 目录 存放控制和监控电源管理功能的文件

1、目录内容

mem_sleep				控制内存休眠模式
pm_freeze_timeout		设置冻结模式(Freeze)的超时时间
pm_wakeup_irq			显示触发唤醒的中断号
sync_on_suspend			控制在进入休眠时是否同步文件系统
pm_async				控制电源管理异步操作 	0 禁用/1 启用
pm_print_times			控制电源管理操作的时间打印  
state					控制系统的电源状态	     
wakeup_count			显示系统唤醒的次数。
pm_debug_messages		控制电源管理相关的调试信息输出	0禁用/1启用
pm_test					测试电源管理功能
suspend_stats			显示休眠统计信息
/sys/power/state		控制系统电源状态
mem:内存休眠模式(Suspend-to-RAM)。系统会将当前状态保存到内存中,然后进入低功耗模式。
freeze:冻结模式。系统将当前状态冻结,但不会进入深度休眠。

(三)排查记录

cat /sys/power/pm_wakeup_irq  	//查看当前的唤醒源

echo mem > /sys/power/state		//进入休眠
### RK3588 待机模式的实现方法及效果评估 RK3588 是一款高性能的应用处理器,广泛应用于各种智能设备中。为了满足不同应用场景的需求,该芯片提供了多种省电模式来优化功耗表现。 #### 1. 真正待机模式的技术原理 真正的待机模式是指当系统处于不活跃状态时,通过关闭不必要的模块和降低工作频率等方式减少能耗。对于 RK3588 芯片而言,可以通过配置特定寄存器设置进入不同的低功耗模式- **浅睡眠模式 (Light Sleep Mode)**:保留内存中的数据并维持基本功能运行,在此状态下可以快速唤醒- **深睡眠模式 (Deep Sleep Mode)**:进一步切断更多外设供电路径,仅保持最小限度的操作以节省电力消耗。 - **休眠模式 (Hibernate Mode)**:保存当前上下文至非易失性存储介质后完全断电重启恢复前的状态[^1]。 #### 2. 实现具体操作步骤说明 以下是使用 C 语言编写的一个简单示例程序片段用于切换到轻度休眠模式: ```c #include "rk_aiq_user_api_sysctl.h" void enter_light_sleep(void){ rk_aiq_uapi_sysctl_set_power_mode(RK_AIQ_POWER_MODE_LOW); } ``` 这段代码调用了 `rk_aiq_uapi_sysctl_set_power_mode` 函数并将参数设定为 `RK_AIQ_POWER_MODE_LOW` 来指示 CPU 进入较低功率的工作方式。 #### 3. 效果评测指标介绍 衡量一个有效的待机方案可以从以下几个方面考虑: - **静态电流测量**:利用高精度万用表测试电路板上 VCC 引脚处流入的地线端子之间的直流分量大小; - **唤醒延迟时间测定**:记录从触发事件发生直到应用程序恢复正常执行之间的时间间隔长度; - **温度变化监控**:观察长时间静置条件下 SoC 表面温升情况是否异常升高。 综上所述,通过对上述几个方面的综合考量能够较为全面地评价 RK3588 在实际应用环境下的待机性能表现[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值