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 位色的画点函数
有了画点函数,你还愁什么?图形汉字都可以搞定了吧!