编写支持开关机(suspend)的应用程序
思路:
读按键, 得到某个值就执行 echo mem > /sys/power/state 系统就会进入休眠状态,唤醒只需要按某个按键就可以,不需要我们应用程序的支持。
文件8th_buttons_input继承自第3课第2节。这个驱动程序让我们的JZ2440具备唤醒功能。
编译调试:
虚拟机上执行 arm-linux-gcc –o power power.c 编译应用程序
./power /dev/event1 & //&表示在后台执行
实验效果:按下按键送开时进入休眠,再按一下就被唤醒。视频说是要配合那个继承自第3课第2节的驱动程序一起只用,但是视频中并没有看到加载驱动。
不明白系统是怎么被唤醒的?
Power.c代码详解:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h> //在这个头文件里面含有struct timeval的定义
#include <stdlib.h>
#include <stdio.h>
#define EV_KEY 0x01
#define KEY_L 38
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
int value;
};
/* power <dev> */ //该应用程序使用办法
int main(int argc, char **argv)
{
int fd;
int ret;
struct input_event event;
if (argc != 2)
{
printf("Usage:\n");
printf("%s <dev>\n", argv[0]);
return -1;
}
/* open */
fd = open(argv[1], O_RDONLY); //在虚拟机上执行man 2 open命令可查看使用open函数需要包含的头文件。
if (fd < 0)
{
printf("can't open %s\n", argv[1]);
return -1;
}
while (1)
{
/* read */
ret = read(fd, &event, sizeof(event));
if (ret != sizeof(event))
{
printf("can't read: ret = %d\n", ret);
return -1;
}
/* 按键类, L键, 松开 */
if (event.type == EV_KEY && event.code == KEY_L && event.value == 0) //0表示松开按键的时候才休眠
{
/* echo mem > /sys/power/state */
system("echo mem > /sys/power/state");
}
}
return 0;
}