S3C2410 LCD 驱动程序移植及GUI程序编写(3)

来源:互联网 发布:nrf24l01编程底板 编辑:程序博客网 时间:2024/06/05 02:23

来源:

http://blog.chinaunix.net/u1/42662/showart_345606.html

 

FrameBuffer  起始寄存器 1
  
这个寄存器的设置没有必要去修改(TFT/STN),都使用默认的代码即可:
 
 
  FrameBuffer  起始寄存器 2 和 FrameBuffer  起始寄存器 3 
 
 
 
这两个寄存器的设置比较重要,在此我给出 12 位色 CSTN 屏和 16 位色TFT 的设置代码:
 
   前面提到的 LINEVAL 和 HOZVAL 以源码的形式给出,其中 CSTN 8 位色没有经过测试。
 
  
RGB Loopup Table Register 
 
  
   这三个寄存器的在驱动 256 色 CSTN 屏的时候需要使用,我在别的芯片上使用过,因为这颗芯片支持 12 位色,所以没有去调试,我给
出两组可能的值:

  •   S3C44B0 上的
    rREDLUT = 0xFCA86420;
    rGREENLUT = 0xFCA86420;
    rBLUELUT = 0xFFFFFA50;
  •   Jupiter 上的
    rREDLUT = 0xFEC85310
    rGREENLUT = 0xFEC85310 
    rBLUELUT = 0xFB40

5) 好了,各个寄存器的设置完成了,最后在驱动 CSTN屏的时候需要提醒大家一句,CSTN的信号引脚中有一个叫VM/DISP的信号线,这个信号线的作用就是打开LCD的显示开关,让其进行显示,它可以接到任何一个 GPIO 口上。S3C2410 中提供了一个 VM 信号,可以将 LCD的这个信号与 S3C2410 的 VM 信号相接即可,然后在驱动中一定要加上如下语句(蓝色选中部分): 
  
否则你的 LCD可能没有任何显示哦(对于 TFT 屏不需要这个语句)
6) 关于 12 位色的 CSTN屏的驱动还需要做一些工作,我在这里简单介绍一下:
a)  首先要完成一个 fbcon-cfb12.c和 fbcon-cfb12.h 的编写,这两个文件很简单,在armLinux 中不是提供了 fbcon-cfb16.c 和 fbcon-cfb12.h 吗?简单修改一下就可以了;
b)  将 fbcon-cfb12.c 的编译加入 Config.in 中(不会的话去 google 搜一下,或者看一下我的另一篇文章《JFFS2 在 HHARM2410 上的实现》,里边有一些说明),并定义一个 FBCON_HAS_CFB12 参数(模仿 FBCON_HAS_CFB16 呗);
c)  另外,需要在 s3c2410fb.c 中的相应部分加上对 12位色的支持即可。呵,说起来简单,但实际做起来可能会有一些问题,给大家一个窍门:在程序中找到#ifdef FBCON_HAS_CFB16 之类的代码,简单理解一下加上对 12 位色的支持;
d)  我只给出函数 s3c2410fb_set_var中的改动,其他的应该都不是很困难,相信朋友们都能搞定。 
 
e)  不要跟我要源码哦,否则老板会不高兴哦 。

4.  驱动写好了,重新 Make,下载就可以了。如果一切顺利,在 TFT 屏或 256 色的 CSTN屏上会有一个漂亮的小蜻蜓(应该是蜻蜓吧)出现。注意,并不是蜻蜓出现了就代表你的驱动 OK了,还要用 GUI 程序做进一步的测试,因为某一个或几个参数虽然不正确,但是仍然能够看到小蜻蜓的,但显示图形的时候就有问题了。另外,在驱动 CSTN到 12位色的时候,我们在屏上看不到小蜻蜓(我的 N块 CSTN屏上都没见到小蜻蜓),我想,可能是 armLinux 本身不支持 12 位色显示,或者我们某些地方没搞对的原因吧,但这不代表你的驱动有问题,用 GUI 程序写 FrameBuffer,看看能否的到正确的结果。 

5.  GUI 程序的编写
FrameBuffer  驱动写好了,那么怎么去使用,怎么在 LCD 上显示图像呢?这就是 GUI程序的任务了,其实要在 LCD 上显示图像,说白了就是把数据(包含颜色)写到FrameBuffer 中对应的位置就可以了。如果你使用如 Microwinow、MiniGui、Qt 之类的GUI,则没有必要关心 FrameBuffer与 LCD屏上的点如何进行映射了,但如果你在使用了 CSTN 屏,并且要显示效果好的照片,选择了 CSTN 的 12 位色(4096色 ),那你就要自己写 GUI 程序了,因为好像 armLinux(Linux)本身都不支持 12 位色的,听说 MiniGui支持 12 位色,但我在工作中的要求只是显示图形而已,没有去深入研究 MiniGui,所以自己写了。
另外请朋友们见谅的是我不能给出全部的源代码,因为我毕竟受雇于人,有些东东是可以 GPL 的,而有些东东暂时是不可以 GPL 的。
下面给出我的程序的部分代码,希望对朋友们有所帮助。
1) 全局变量的定义: 
 
定义几个全局变量,用起来方便。
2) 初始化图形显示引擎,将 fb0与 GUI 的 buffer做个映射
 
   用mmap函数使用户空间的一段地址关联到设备内存(FrameBuffer)上。无论何时,只要程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问,使用 mmap 可以既快速又简单地访问显示卡的内存。对于象这样的性能要求比较严格的应用来说,直接访问能给我们提供很大不同。   不过我曾将帮一个网友调试了一个 S3C44B0 上的 GUI 程序,在他的 GUI 中 mmap 函数总会出错,因为没有拿到他的硬件和驱动源码,没有分析出其中的原因,所以只得用 write函数,直接向 fb0 写入数据,奇怪的是只写入一部分数据好像都不起任何作用,只得整屏数据写入才搞定了。这可就比较痛苦了,不过好在他只是写入的黑白数据,数据量还不是很大,要是彩色的那可真的痛苦了 。  
   另外,我还想多啰嗦两句,FrameBuffer的像素点与LCD屏上的像素点的对应关系 ,深入了解一下对程序的理解可能会更清楚一点。我们知道黑白(2 色)颜色用 0 和 1 就可以表示了,也就是 1 位数据就可以了,那 1 个字节就可以表示 8 位数据,假如这个字节是10101010,FrameBuffer 的偏移地址为 0,则在 LCD 屏上便会显示出 4 个黑点,黑点中间会有 4 个白点出现(假如 1 是黑色);对于 4 色则用 00、01、10、11 就可以表示出四种颜色,即用两位数据可以表示一位数据,那同样是 10101010,则对应于 LCD 屏上则显示的
是颜色值为10,长度为4(8/2)的一条直线;同理,对于8位色(256色),则8位数据才能表示出一个点的颜色值,10101010在LCD屏上就只能显示为颜色值为10101010的点了。  
    有了上面的基础我们就可以很好的理解这个语句了:
     screensize = vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;
即FrameBuffer 的大小=LCD屏的宽度 * LCD屏的高度 * 每像素的位数 / 每字节的位数
例如,一个320*240的黑白平,FrameBuffer的大小为
320 * 240 * 1 / 8 = 9600 (字节)
而一个320 * 240的16位色LCD的 FrameBuffer的大小则为
320 * 240 * 16 / 8 = 153600(字节)
3) TFT 屏 16 位色的画点函数 
 
有了画点函数,你还愁什么?图形汉字都可以搞定了吧!
4) CSTN屏 12位色的画点函数 
 
注意,为了更便于代码书写,我在这个函数中将 fbp 定义为 static char * fbp,而在TFT 屏 16 位色的画点函数中 fbp 的定义为 U16 * fbp,你可以根据需要进行修改。
5) TFT 屏 16 位色下显示 24色位图函数 
 
Bmp文件的格式可以参考网上的一些资料,如果需要也可以直接找我要。
6) CSTN屏 12位色下显示 24 色位图函数 
  
7) 呵呵,别忘了关闭设备哦
void closegraph()
{
   munmap(fbp,screensize);
   close(fb);

8) 另外关于如何显示汉字的 C 语言代码,在我的网站上有现成的源码《点阵字库西那时程序》,在TC2.0 下都是可以跑的,她可以支持 12X12 点阵、14X14 点阵、16X16点阵汉字及 ASC 码的显示,将画点函数和与设备相关的函数简单替换就可以了,移植起来应该不困难。对于有更高需求的朋友,如果 GB 库还不够,我也提供了 GBK支持 2 万多个汉字的显示,只可惜只有 16X16点阵的字库,没有小字体。显示方法我也提供了源码哦(因为网上没有找到相关资料,再加上老刘我比较笨,我研究了好长时间才成功,就让需要的朋友一起分享吧!)

6.  糊里糊涂写了好长时间,从 2004 年 12 月就开始了,一直写到了今天(2005 年 1 月 18日),希望我的辛苦不会白费,希望这些东东对朋友们有所帮助,如果你发现错误或有好的意见,别忘了通知我啊laoliu@laoliu-soft.net,我及读到这片文章的朋友们会感谢你的哦!阿门!

 
原创粉丝点击