ret= s3c2410fb_map_video_memory();//分配LCD显示缓冲区
if(ret){kfree(fbi); return ret; } //出错返回
s3c2410fb_set_var(&fbi->fb.var ,-1,&fbi->fb); //设置显示控制参数
ret=register_frambuffer(&fbi->fb); //注册显示驱动程序
if(ret<0){kfree(fbi);return ret;} //出错返回
printk(“Installed s3c2410 framebuffer \n”); //控制台显示驱动安装成功
return 0;
…
}
(2) 编写结构fb_info中函数指针fb_ops对应的成员函数。对于本系统的实现,需要将函数进行如下设置:
static struct fb_ops s3c2410fb_ops=
{owner: THIS_MODULE,
fb_get_fix: s3c2410fb_get_fix,
fb_get_var: s3c2410fb_get_var,
fb_set_var: s3c2410fb_set_var,
fb_get_cmp: s3c2410fb_get_cmp,
fb_set_cmp: s3c2410fb_set_cmp,
fb_io_ctl: s3c2410fb_io_ctl,
};
这些函数都是用来设置/获取fb_info结构中的成员变量的。当应用程序对设备文件进行ioctl操作时候会调用它们。对于fb_get_fix()函数,应用程序传入的是fb_fix_screeninfo结构,在函数中对其成员变量smem_start(缓冲区起始地址)和smem_len(缓冲区长度)赋值,最终返回给应用程序。fb_set_var()函数的传入参数是fb_var_screeninfo,函数中xres变量赋值为屏幕一行的像素数目,yres赋值为屏幕一列像素点的数目,bits_per_pixel赋值为每个点用多少个字节表示。
LCD驱动程序的框架就是上述提到的几个部分,下面的工作就是把一些调用的函数编写完整,然后选择将其编译为动态或静态加载模块,编译到内核中。
5 结语
在ARM平台上,嵌入式Linux操作下编写LCD驱动程序的原理和程序框架。虽然图形设备种类多种多样,但是其驱动的编写都是有一定可以遵循的模式。研究图形驱动程序的编写,对于嵌入式系统的图形化界面的应用,有很大的借鉴意义。
参考文献
[1] RUBINI A, CORBET J.LINUX设备驱动程序[M].魏永明,骆勇,姜均 译.北京:中国电力出版社,2002.
[2] 王粉花.基于Linux字符设备驱动程序的设计与实现[J].计算机工程,2006,31(4):88-90.
[3] 熊敏,万频,等.基于AT91ARM9200的LCD驱动程序设计[J].微计算机信息,2007,23(10-2):81-83.
[4] 田泽.ARM9嵌入式开发与实践[M].北京:北京航空航天出版社,2006. [5] 雷洪,熊文龙,等.基于Frambuffer的LCD驱动程序的实现[J].武汉理工大学学报(交通科学与工程版),2006,30(1):106-109.
|