写一自动背光程序,不敢独享,特写此文。
我所讲的自动背光就是在触摸屏一段时间(例:A秒)不进行触摸则自动关闭LCD背光,再次触摸时就点亮背光,这也是所有带LCD显示的电子设备最基本的功能。所以说,嵌入式设备更需要这一特性。
这个程序主要分两块1,当触摸时点亮背光2当触摸时,定时器开始计时A秒,A秒时间到时关闭背光。
两者的条件都是,发生触摸!然而根据友善之臂已经提供的/dev/adc驱动和adc-test应用程序可以看出只有发生触摸时“adc-test”输出为“-1”(如下图)。所以就可以借助这个“-1”的输出做为判断是否发生触摸。
条件有了,那么怎么执行呢?这就得看背光驱动源代码了--mini2440_backlight.c,纵观这个驱动程序我们得出结论:当写入“奇数时(我们取“1”)”会点亮背光,写入“偶数时(我们取“0”)”关闭背光,这样打开或关闭背光就可以实现了。
再一个就是这个定时器了,我用的是"alarm",它非常的适合!具体用法大家可以看《unix环境高级编程》这本书。
到这里,整个流程图就出来了:
唯一的遗憾是在关闭背光状态下,首次触摸时不能仅仅起到点亮背光而不发生触摸动作!
参考资料:《unix环境高级编程》《Linux设备驱动程序》
附上代码:
adc-test.c (友善之臂提供的adc程序点这里看详细注释)
- /***************************************************************************
- zhushi : (C) by kangear ^_^
- email : kangear@163.com
- ***************************************************************************/
- /***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
- #include <stdio.h> //sterr sscanf(存储的数据,格式控制字符串,选择性设定字符串)
- #include <unistd.h> //鸡肋
- #include <stdlib.h> //鸡肋
- #include <sys/types.h> //鸡肋
- #include <sys/stat.h> //鸡肋
- #include <sys/ioctl.h> //鸡肋
- #include <fcntl.h> //open();read();close;
- #include <linux/fs.h> //鸡肋
- #include <errno.h> //鸡肋
- #include <string.h> //鸡肋
- int main(void)
- {
- fprintf(stderr, "press Ctrl-C to stop\n"); //相当于printf;
- int fd = open("/dev/adc", 0); //文件编程中的 文件打开
- if (fd < 0) //文件打开失败
- {
- perror("open ADC device:"); //错误信息打印出来
- return 1;
- }
- for(;;) //呃……这个从功能上说是循环,但是有点不懂……!-_-!
- {
- char buffer[30]; //定义一数组
- int len = read(fd, buffer, sizeof buffer -1); //文件编程中的 文件读 成功返回长度
- if (len > 0) { //读成功
- buffer[len] = '\0'; //在末尾添加“\0”结束符
- int value = -1;
- sscanf(buffer, "%d", &value); //将得到的信息中提取整型数
- printf("ADC Value: %d\n", value); //打印
- }
- else //读失败
- {
- perror("read ADC device:"); //输出错误信息
- return 1;
- }
- usleep(500* 1000); //和sleep()功能一样不过是μ秒(相当于睡眠0.5秒)
- }
-
- close(fd); //文件编程中的 文件关闭
- }
mini2440_backlight.c (友善之臂提供的背光驱动点这里看详细注释 )
- #include <linux/errno.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/input.h>
- #include <linux/init.h>
- #include <linux/serio.h>
- #include <linux/delay.h>
- #include <linux/clk.h>
- #include <linux/miscdevice.h>
- #include <linux/gpio.h>
- #include <asm/io.h>
- #include <asm/irq.h>
- #include <asm/uaccess.h>
- #include <mach/regs-clock.h>
- #include <plat/regs-timer.h>
-
- #include <mach/regs-gpio.h>
- #include <linux/cdev.h>
- #undef DEBUG
- //#define DEBUG
- #ifdef DEBUG
- #define DPRINTK(x...) {printk(__FUNCTION__"(%d): ",__LINE__);printk(##x);}
- #else
- #define DPRINTK(x...) (void)(0)
- #endif
- #define DEVICE_NAME "backlight"
- static unsigned int bl_state;
- static inline void set_bl(int state)
- {
- bl_state = !!state;
- s3c2410_gpio_setpin(S3C2410_GPG(4), bl_state);
- }
- static inline unsigned int get_bl(void)
- {
- return bl_state;
- }
- static ssize_t dev_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
- {
- unsigned char ch;
- int ret;
- if (count == 0) {
- return count;
- }
- ret = copy_from_user(&ch, buffer, sizeof ch) ? -EFAULT : 0;
- if (ret) {
- return ret;
- }
- ch &= 0x01;
- set_bl(ch);
-
- return count;
- }
- static ssize_t dev_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
- {
- int ret;
- unsigned char str[] = {'0', '1' };
- if (count == 0) {
- return 0;
- }
- ret = copy_to_user(buffer, str + get_bl(), sizeof(unsigned char) ) ? -EFAULT : 0;
- if (ret) {
- return ret;
- }
- return sizeof(unsigned char);
- }
- static struct file_operations dev_fops = {
- owner: THIS_MODULE,
- read: dev_read,
- write: dev_write,
- };
- static struct miscdevice misc = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = DEVICE_NAME,
- .fops = &dev_fops,
- };
- static int __init dev_init(void)
- {
- int ret;
- ret = misc_register(&misc);
- printk (DEVICE_NAME"\tinitialized\n");
- s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT);
- set_bl(1);
- return ret;
- }
- static void __exit dev_exit(void)
- {
- misc_deregister(&misc);
- }
- module_init(dev_init);
- module_exit(dev_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("FriendlyARM Inc.");
auto_backlight.c (我根据adc-test.c改写自动背光程序)
- /***************************************************************************
- zhushi : (C) by kangear ^_^
- email : kangear@163.com
- ***************************************************************************/
- /***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
- #include <stdio.h> //sterr sscanf(存储的数据,格式控制字符串,选择性设定字符串)
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/ioctl.h>
- #include <fcntl.h>
- #include <linux/fs.h>
- #include <errno.h>
- #include <string.h>
- #include <signal.h>
- static void
- sig_alrm(int signo)
- {
- char buffer2[1] = {'0'};
- int bl_fd = open("/dev/backlight",1);
- if(bl_fd<0){
- perror("open backlight device:");
- }
- write(bl_fd,buffer2,1);
- close(bl_fd);
- }
- void backlight_wr()
- {
- char buffer2[1] = {'1'};
- int bl_fd = open("/dev/backlight",1);
- if(bl_fd<0){
- perror("open backlight device:");
- }
- write(bl_fd,buffer2,1);
- close(bl_fd);
- }
- int main(void)
- {
- fprintf(stderr, "press Ctrl-C to stop\n"); //相当于printf;
- int fd = open("/dev/adc", 2); //文件编程中的 文件打开
- if (fd < 0) //文件打开失败
- {
- perror("open backlight device:"); //错误信息打印出来
- return 1;
- }
- signal(SIGALRM,sig_alrm);
- alarm(5);//定义一数组
- for(;;) //呃……这个从功能上说是循环,但是有点不懂……!-_-!
- {
- char buffer[30];
- int len = read(fd, buffer, sizeof buffer -1); //文件编程中的 文件读 成功返回长度
- if (len > 0) { //读成功
- buffer[len] = '\0'; //在末尾添加“\0”结束符
- int value = -1;
- sscanf(buffer, "%d", &value); //将得到的信息中提取整型数
- printf("backlight Value: %d\n", value); //打印 printf("backlight Value: %d\n", value); //打印
- if(value==-1)
- {
- backlight_wr();
- alarm(5);
- }
- }
- else //读失败
- {
- perror("read backlight device:"); //输出错误信息
- return 1;
- }
- usleep(50* 1000); //和sleep()功能一样不过是μ秒(相当于睡眠0.05秒)
- }
- close(fd); //文件编程中的 文件关闭
- }
- /*把 signal(SIGALRM,sig_alrm);
- alarm(5);//定义一数组 放到循环之前解决了,首次不自动关背光的问题!
- 不过程序显得有点长,0.3解决这个问题*/
auto_backlight (编译好的auto_backlight,可以下载下来到mini2440中就可运行
auto_backlight.rar
阅读(4341) | 评论(0) | 转发(2) |