S5PV210(TQ210)学习笔记――按键驱动程序 (三)

2014-11-24 03:25:54 · 作者: · 浏览: 2
eturn -ENOMEM;
}

return 0;
}这样,驱动程序就支持异步获取键值了,为了测试效果,测试程序也需要修改,代码如下:[cpp] view plaincopyprint #include
#include
#include
#include
#include
#include
#include


/* sixthdrvtest
*/
int fd;

void my_signal_fun(int signum)
{
unsigned char key_val;
read(fd, &key_val, 1);
printf("key_val: 0x%x\n", key_val);
}

int main(int argc, char **argv)
{
unsigned char key_val;
int ret;
int Oflags;

signal(SIGIO, my_signal_fun);

fd = open("/dev/buttons", O_RDWR | O_NONBLOCK);
if (fd < 0){
printf("can't open!\n");
return -1;
}

fcntl(fd, F_SETOWN, getpid());
Oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, Oflags | FASYNC);


int rest;
while (1){
printf("Hello\n");
while(rest = sleep(50)){
sleep(rest);
}
}

return 0;
}

#include
#include
#include
#include
#include
#include
#include


/* sixthdrvtest
*/
int fd;

void my_signal_fun(int signum)
{
unsigned char key_val;
read(fd, &key_val, 1);
printf("key_val: 0x%x\n", key_val);
}

int main(int argc, char **argv)
{
unsigned char key_val;
int ret;
int Oflags;

signal(SIGIO, my_signal_fun);

fd = open("/dev/buttons", O_RDWR | O_NONBLOCK);
if (fd < 0){
printf("can't open!\n");
return -1;
}

fcntl(fd, F_SETOWN, getpid());
Oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, Oflags | FASYNC);


int rest;
while (1){
printf("Hello\n");
while(rest = sleep(50)){
sleep(rest);
}
}

return 0;
}这里需要注意的是,应用程序接收到消息会打断sleep,比如执行sleep(5)之后程序接收到了一个消息,这时,应用程序就被唤醒了,虽然是去执行的消息处理函数。如果程序接收到消息时仅睡眠了2秒,那么sleep被中断时会返回5-2=3,所以代码中采用while循环方式进行sleep,这样,即使接收到了消息也能完整的休眠5秒,当然,sleep函数本身是不够精确的,不过相差无几。

到这里,这个驱动程序基本上就算可以了,当然,还有对阻塞和非阻塞的支持,同步与互斥的支持,而阻塞与非阻塞无非是加上个逻辑判断,同步与互斥根应用程序的同步控制也差不多,无非就是信号量或者原子操作,这里就不多说了,如果有朋友需要这些内容可以留言讨论。