第04课第2节_runtime_PM修改驱动程序和使用

2. 修改驱动程序和使用

怎么修改?

参考内核驱动示例: drivers\input\misc\bma150.c

2.1 在dev_pm_ops里提供3个回调函数: runtime_suspend, runtime_resume, runtime_idle

2.2 对于runtime PM,默认状态下设备的状态是suspended, 如果硬件上它是运行状态,需要调用pm_runtime_set_active()来修改它的状态

    然后调用pm_runtime_enable()来使能runtime PM   

    一般是在probe函数里调用上述函数

2.3 在对应的系统调用接口里调用: pm_runtime_get_sync / pm_runtime_put_sync : 增加/减小计数值, 并且让设备处于resume或suspend状态

2.4 在remove函数里调用pm_runtime_disable()

 

 

前提: 配置内核支持runtime PM

make menuconfig

Power management options  --->

         [*] Run-time PM core functionality

 

查看内核有没有配置电源管理的方法: vi .config命令  并/RUNTIME

 

 

寄存器在初始化之前就被某些函数调用的话,有可能会导致内核无法启动,如下图所示,因此在碰到类似问题时注意检查源码是否有问题。本节实验时刚开始是将平台注册函数放在了init函数里的最开头,平台设备一注册完有可能就去调用系统电源管理函数,而这些函数会用到某些寄存器,但是在这时这些寄存器还没有被初始化,因此要将这些函数往后放,等到寄存器被初始化完成后再调用,问题得到解决。在视频12:00处。

 

 

使用:

1. (这个使用方法对应第一个半成品)

echo on >  /sys/devices/platform/mylcd/power/control

echo auto >  /sys/devices/platform/mylcd/power/control

 

echo on后执行fb_test /dev/fb0  在LCD上即可显示圆圈。不执行echo on将无法显示圆圈,那程序应该怎么改进呢?在对应的系统调用接口里调用: pm_runtime_get_sync / pm_runtime_put_sync : 增加/减小计数值, 并且让设备处于resume或suspend状态

 

2. (这个方法对应第二个半成品)在对应的系统调用接口里调用: pm_runtime_get_sync / pm_runtime_put_sync

 

3. autosuspend: 如果不想让设备频繁地开、关,可以使用autosuspend功能

驱动里: 执行pm_runtime_use_autosuspend来设置启动autosuspend功能,

        put设备时, 执行这2个函数:

         pm_runtime_mark_last_busy(&lcd_dev.dev);

         pm_runtime_put_sync_autosuspend(&lcd_dev.dev);

 

用户空间, 执行以下命令设置时间值:     

echo 2000 > /sys/devices/platform/mylcd/power/autosuspend_delay_ms

 

 

 

最终代码参照本节资料。

 

 

 

 

视频中上图这一步设置环境变量没看明白是什么意思?在视频06:00处。说是编译新内核需要新的工具链。

猜你喜欢

转载自blog.csdn.net/hahaha_2017/article/details/81209598