QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1951|回复: 9

help:有没有了解lcd framebuffer驱动开发的

[复制链接]
发表于 2005-9-7 18:49:33 | 显示全部楼层 |阅读模式
我在给sed1335 320x240的lcd写驱动,由于以前从来没写过驱动,遇到一些问题。

我是在drivers/video/vfb.c的基础上做的。
开始只把vfb_init改成sed1335fb_init,vfb_setup改成sed1335fb_setup,并把videomemory指向的内存清0,并在fbmem.c的fb_drivers[]的开头加入{"sed1335",sed1335fb_init,sed1335fb_setup},
配置里其它fb设备全部不要。
从内核打印的信息来看,sed1335fb驱动启动成功
进入系统后用dd将fb0的内容读出,大小是1M(刚好是videomemory申请的内存大小),但我查看了一下读出的内容,发现全都是0,也就是屏幕图像并没有放到videomemory里,怎么回事?屏幕图像信息不是应该放到videomemory里的么?

以上实际上还没涉及lcd显示。
发表于 2005-9-7 19:05:42 | 显示全部楼层
不明白你的环境,lcd也不知道是什么,显示芯片?

我也不懂,只有点模糊的概念,一起研究吧?
回复

使用道具 举报

 楼主| 发表于 2005-9-7 23:19:28 | 显示全部楼层
控制芯片就是sed1335。
控制芯片的两个寄存器地址(命令寄存器和数据寄存器)地址也已经知道,并且用直接io的方法我已经能在lcd上画图了,现在是想把它做成一个标准的framebuffer设备,这样就能将qt之类的gui移植上去。
先撇开lcd不管,对于vfb驱动,我想内核应该会把图像数据放到videomemory空间里,然后我才能从videomemory里取出图像数据并把它显示到lcd上。
明天继续看看 :)
回复

使用道具 举报

 楼主| 发表于 2005-9-8 17:05:53 | 显示全部楼层
终于搞定了,将Frame-Buffer Support里的"Advanced low level driver options"和它的子选项全部编进内核就行了(其实不用全部选上,图方便而已),因为vfb.c里会根据颜色深度不同而选择不同的显示函数,而且用了条件编译,如果没选"Advanced low level driver options"就会导致它用fbcon_dummy,fbcon_dummy是个空函数。
[code:1]
            switch (var->bits_per_pixel) {
#ifdef FBCON_HAS_MFB
                case 1:
                    display->dispsw = &fbcon_mfb;
                    break;
#endif
#ifdef FBCON_HAS_CFB2
                case 2:
                    display->dispsw = &fbcon_cfb2;
                    break;
#endif
#ifdef FBCON_HAS_CFB4
                case 4:
                    display->dispsw = &fbcon_cfb4;
                    break;
#endif
#ifdef FBCON_HAS_CFB8
                case 8:
                    display->dispsw = &fbcon_cfb8;
                    break;
#endif
#ifdef FBCON_HAS_CFB16
                case 16:
                    display->dispsw = &fbcon_cfb16;
                    display->dispsw_data = fbcon_cmap.cfb16;
                    break;
#endif
#ifdef FBCON_HAS_CFB24
                case 24:
                    display->dispsw = &fbcon_cfb24;
                    display->dispsw_data = fbcon_cmap.cfb24;
                    break;
#endif
#ifdef FBCON_HAS_CFB32
                case 32:
                    display->dispsw = &fbcon_cfb32;
                    display->dispsw_data = fbcon_cmap.cfb32;
                    break;
#endif
                default:
                    display->dispsw = &fbcon_dummy;
                    break;
            }
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2005-9-8 19:48:51 | 显示全部楼层
现在还有个问题,就是如何定时将虚拟显存里的图像写到lcd屏幕上,我试了一下用任务队列,但是无法控制刷新频率,cpu忙时刷新的慢,cpu闲时狂刷新。用定时器?

我觉得framebuffer应该有定时执行某个函数完成刷新的功能,但我找不到它定时执行的函数是哪个。谁对framebuffer的机制比较熟,帮帮忙,谢谢!
回复

使用道具 举报

发表于 2005-9-8 22:15:03 | 显示全部楼层
不太明白你说的。
一般都是改显示缓冲区内容来改变显示,
缓冲区地址设置好后,驱动芯片自动读缓冲区,刷新LCD。
回复

使用道具 举报

 楼主| 发表于 2005-9-9 09:56:19 | 显示全部楼层
这款lcd本身没有缓冲区,我是申请了一块内存作为缓冲区,所以它是不会自动刷到lcd上的。
用定时器解决了。
回复

使用道具 举报

发表于 2005-9-11 21:16:40 | 显示全部楼层
显示的缓冲区一般都在内存里,将缓存区地址写到对应寄存器,LCD驱动芯片(或者集成的LCD控制器)自动丛缓冲区读数据刷新。
回复

使用道具 举报

 楼主| 发表于 2005-9-16 23:18:25 | 显示全部楼层
这样可以啊,怎么知道我用的芯片支不支持这种方式?
回复

使用道具 举报

发表于 2005-9-19 21:46:42 | 显示全部楼层
只有看芯片资料咯~~
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-3 04:11 , Processed in 0.077342 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表