- 論壇徽章:
- 0
|
本帖最后由 Lethe_Ascetic 于 2014-08-27 21:21 編輯
論文里的各位大蝦好,小弟最近在做一個(gè)項(xiàng)目,關(guān)于LCD背光的控制問題,勞煩大神們幫我仔細(xì)看看。
下面我詳細(xì)敘述下我的情況:
ARM板:Te6410的ARM 11核心板
Linux內(nèi)核:linux-3.0.1
問題:想編寫一個(gè)測試程序,實(shí)現(xiàn)對(duì)LCD的背光燈的控制(開啟和關(guān)閉)
為了寫測試程序,我先仔細(xì)看了下linux中LCD驅(qū)動(dòng)的架構(gòu)。先把我了解的LCD驅(qū)動(dòng)的架構(gòu)情況簡單介紹下,如有理解上的錯(cuò)誤,勞煩您指出:
/linux-3.0.1/inculde/fb.h文件中聲明了lcd使用的framebuffer結(jié)構(gòu)體;
/linux-3.0.1/arch/arm/plat-s3c64xx中的mach-smdk6410中有l(wèi)cd驅(qū)動(dòng)相關(guān)的平臺(tái)設(shè)備信息,并注冊(cè)了平臺(tái)設(shè)備
/linux-3.0.1/drivers/video/fbmem.c向上給應(yīng)用程序 “提供并實(shí)現(xiàn)“ 了完善的設(shè)備文件操作接口。文件中聲明了對(duì)應(yīng)的file_operation結(jié)構(gòu)體如下:
4.png (6.42 KB, 下載次數(shù): 39)
下載附件
2014-08-27 21:21 上傳
因此我個(gè)人認(rèn)為,當(dāng)我在應(yīng)用程序中執(zhí)行 open("/dev/fb0",xxx), ioctl(fd,xxx,xxx) 時(shí),就是調(diào)用了fbmem.c中定義的file_operation結(jié)構(gòu)體中對(duì)應(yīng)的函數(shù)
其中的ioctl()函數(shù)如下,其調(diào)用了do_fb_ioctl函數(shù):
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()函數(shù),其部分代碼如下,可見其調(diào)用了fbmem.c中定義的fb_blank函數(shù):
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函數(shù)最終會(huì)調(diào)用硬件驅(qū)動(dòng)層中的fb_blank函數(shù)(該函數(shù)在/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;
}
代碼不難看懂,就是根據(jù)輸入的參數(shù),執(zhí)行對(duì)背光的集中不同的控制。
按照上述的理解,我覺得只要在測試程序中,1、fd=open("/dev/fb0",O_RDWD),打開設(shè)備;2、執(zhí)行ioctl(fd,FBIOBLANK,val),通過不同的val值,控制背光燈即可
我按此想法,編寫了測試程序,代碼很短。但是失敗了。
網(wǎng)上有關(guān)于ioctl(fd,FBIOGET_VSCREENINFO,&val)的操作介紹,是用來讀取LCD屏的參數(shù),并對(duì)LCD屏設(shè)置顏色的。我執(zhí)行了網(wǎng)上的這個(gè)程序,是可以成功執(zhí)行的
附地址:http://blog.csdn.net/lonlycorner520/article/details/8035378
但是網(wǎng)上沒有LCD的” FBIOBLANK “的使用介紹,有哪位大神懂的,真心求教,F(xiàn)在讀碩士,之前師兄沒人做arm-linux開發(fā)的。沒人請(qǐng)教,很痛苦。
|
|