当前位置: 技术问答>linux和unix
显示驱动求助!新手提问
来源: 互联网 发布时间:2015-08-10
本文导语: 我要写一个板载linux(不是uclinux)下的驱动程序,因为板子上没有专门的显卡,所以要自己写显示驱动程序来处理应用程序发送过来的数据并交给LCD去显示。不知道如何动手才好。 我是这么想的,从内存中分配一块...
我要写一个板载linux(不是uclinux)下的驱动程序,因为板子上没有专门的显卡,所以要自己写显示驱动程序来处理应用程序发送过来的数据并交给LCD去显示。不知道如何动手才好。
我是这么想的,从内存中分配一块区域作为显存,然后把这一块显存当作一个设备。当应用程序发送数据过来的时候,我保存到这块内存上面,我不作任何处理,并通知某个硬件来处理这些数据。就相当操作这块显存,写一个关于显存的驱动程序。
我想问的是我这种想法是否可行,还有这块显存是属于块设备,还是字符设备?
我开始认为这块显存应当是一个块设备,但是后来发现有些资料说帧缓冲设备属于字符设备。我觉得我这块显存应当也是帧缓冲设备,所以它也应该是一个字符设备。
我是这么想的,从内存中分配一块区域作为显存,然后把这一块显存当作一个设备。当应用程序发送数据过来的时候,我保存到这块内存上面,我不作任何处理,并通知某个硬件来处理这些数据。就相当操作这块显存,写一个关于显存的驱动程序。
我想问的是我这种想法是否可行,还有这块显存是属于块设备,还是字符设备?
我开始认为这块显存应当是一个块设备,但是后来发现有些资料说帧缓冲设备属于字符设备。我觉得我这块显存应当也是帧缓冲设备,所以它也应该是一个字符设备。
|
前几天我刚刚写过一个LCD的驱动程序,用的也是Framebuffer方式,freasy说的基本正确,你不可以用一般的char方式来完成这个驱动程序,按char设备驱动需要将对你的显存的所有操作都摹拟成对文件的操作,而且,这个操作最后由内核完成,这个也算是个系统调用.一般的用户空间的程序都只会提供有限的几个针对驱动的操作(drawpixel,drawh(v)line,fillrect)那么,完成描画的大量工作都要通过这样的系统调用将会大大降低速度,因此,需要采用framebuffer的方式,将显存映射到用户空间,用户通过mmap得到显存首地址.这样,访问起来不需要进程切换.
此外,你的驱动程序应该放在drivers/vedio里面.你可以分析一下fbmem.c,这个是向上的接口,fbgen.c,这个是通用函数.此外,可以模仿其中已有的针对不同设备的驱动来完成你的驱动.目前比较好的驱动中涉及到很多vt的操作,这个你如果用的是嵌入式设备,一般不需要,在配置内核的时候将vt相关的东西关闭,或者找到相关代码,修改一下,以求编译通过.
此外,你的驱动程序应该放在drivers/vedio里面.你可以分析一下fbmem.c,这个是向上的接口,fbgen.c,这个是通用函数.此外,可以模仿其中已有的针对不同设备的驱动来完成你的驱动.目前比较好的驱动中涉及到很多vt的操作,这个你如果用的是嵌入式设备,一般不需要,在配置内核的时候将vt相关的东西关闭,或者找到相关代码,修改一下,以求编译通过.
|
据我的了解,块设备通常都是能够安装文件系统的。如果不需要安装文件系统,通常就不用做成块设备。
在嵌入式的设备当中,通常会有一些LCD的控制器,初始化控制器后,把数据往那个内存区域扔就可以了。不知道你用的是不是这样的Linux系统。对于这样的系统,驱动程序最好应该实现Linux的Framebuffer,使得应用程序可以像操作自己内存区域一样操作LCD。
在嵌入式的设备当中,通常会有一些LCD的控制器,初始化控制器后,把数据往那个内存区域扔就可以了。不知道你用的是不是这样的Linux系统。对于这样的系统,驱动程序最好应该实现Linux的Framebuffer,使得应用程序可以像操作自己内存区域一样操作LCD。
|
可以参考这篇文章
Writting Linux Frame Buffer Driver fo LCD Device
http://www.linuxforum.net/docnew/showflat.php?Board=new&Number=705
Writting Linux Frame Buffer Driver fo LCD Device
http://www.linuxforum.net/docnew/showflat.php?Board=new&Number=705