免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3252 | 回复: 0
打印 上一主题 下一主题

[应用] 新手请教:如何编写测试程序,控制LCD背光的开启和关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-27 20:58 |只看该作者 |倒序浏览
本帖最后由 Lethe_Ascetic 于 2014-08-27 21:21 编辑

论文里的各位大虾好,小弟最近在做一个项目,关于LCD背光的控制问题,劳烦大神们帮我仔细看看。
下面我详细叙述下我的情况:

ARM板:Te6410的ARM 11核心板
Linux内核:linux-3.0.1

问题:想编写一个测试程序,实现对LCD的背光灯的控制(开启和关闭)

为了写测试程序,我先仔细看了下linux中LCD驱动的架构。先把我了解的LCD驱动的架构情况简单介绍下,如有理解上的错误,劳烦您指出:

/linux-3.0.1/inculde/fb.h文件中声明了lcd使用的framebuffer结构体;
/linux-3.0.1/arch/arm/plat-s3c64xx中的mach-smdk6410中有lcd驱动相关的平台设备信息,并注册了平台设备

/linux-3.0.1/drivers/video/fbmem.c向上给应用程序 “提供并实现“ 了完善的设备文件操作接口。文件中声明了对应的file_operation结构体如下:



因此我个人认为,当我在应用程序中执行  open("/dev/fb0",xxx), ioctl(fd,xxx,xxx)  时,就是调用了fbmem.c中定义的file_operation结构体中对应的函数

其中的ioctl()函数如下,其调用了do_fb_ioctl函数:

static long fb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
        struct fb_info *info = file_fb_info(file);

        if (!info)
                return -ENODEV;
        return do_fb_ioctl(info, cmd, arg);
}

追踪do_fb_ictol()函数,其部分代码如下,可见其调用了fbmem.c中定义的fb_blank函数:

        case FBIOBLANK:
                if (!lock_fb_info(info))
                        return -ENODEV;
                console_lock();
                info->flags |= FBINFO_MISC_USEREVENT;
                ret = fb_blank(info, arg);
                info->flags &= ~FBINFO_MISC_USEREVENT;
                console_unlock();
                unlock_fb_info(info);
                break;

fbmem.c中的fb_blank函数最终会调用硬件驱动层中的fb_blank函数(该函数在/linux-3.0.1/drivers/video/samsung的s3cfb.c文件中定义),其代码如下:

static int s3cfb_blank(int blank_mode, struct fb_info *info)
{
        DPRINTK("blank(mode=%d, info=%p)\n", blank_mode, info);

        switch (blank_mode) {
        case VESA_NO_BLANKING:        /* lcd on, backlight on */
                s3cfb_set_lcd_power(1);
                s3cfb_set_backlight_power(1);
                break;

        case VESA_VSYNC_SUSPEND: /* lcd on, backlight off */
        case VESA_HSYNC_SUSPEND:
                s3cfb_set_lcd_power(1);
                s3cfb_set_backlight_power(0);
                break;

        case VESA_POWERDOWN: /* lcd and backlight off */
                s3cfb_set_lcd_power(0);
                s3cfb_set_backlight_power(0);
                break;

        default:
                return -EINVAL;
        }

        return 0;
}
代码不难看懂,就是根据输入的参数,执行对背光的集中不同的控制。

按照上述的理解,我觉得只要在测试程序中,1、fd=open("/dev/fb0",O_RDWD),打开设备;2、执行ioctl(fd,FBIOBLANK,val),通过不同的val值,控制背光灯即可

我按此想法,编写了测试程序,代码很短。但是失败了。
网上有关于ioctl(fd,FBIOGET_VSCREENINFO,&val)的操作介绍,是用来读取LCD屏的参数,并对LCD屏设置颜色的。我执行了网上的这个程序,是可以成功执行的
附地址:http://blog.csdn.net/lonlycorner520/article/details/8035378


但是网上没有LCD的” FBIOBLANK “的使用介绍,有哪位大神懂的,真心求教。现在读硕士,之前师兄没人做arm-linux开发的。没人请教,很痛苦。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP