DirectFB学习之使用devmem驱动

DirectFB学习之使用devmem驱动

为什么要使用devmem驱动

相比使用fb驱动来说使用devmem驱动要显的更麻烦,但是它给我们带来更大的灵活性,更适用于嵌入式系统。

使用devmem驱动可以方便向dfb注册多个层,在一个系统中除了framebuff看作一个层外,如果系统还可以有多个OSD,那每个OSD则被视为一个层,即可以很方便的把系统中的OSD等层利用起来。

这在某些系统中是非常有用的,比如在TV系统中有视频、菜单、字幕以及码流中的html应用等当它们在一块屏幕显示时它们其实是会分属于不同的层上,这些层可以通过dfb轻松的对应到硬件上的层,让它们的混合完全由硬件来完成,极大的充分利用硬件。

如何使用devmem驱动

要使用devmem驱动时我们要完善如下几个配置项并把他们写到directfbrc文件中被dfb读取到

  • system=devmem
  • video-phys=<hexaddress>
  • video-length=<bytes>
  • mmio-phys=<hexaddress>
  • mmio-length=<bytes>
  • accelerator=<id>

video-phys 这里是要我们告诉dfb我们显存的位置,是一个物理地址,对于没有固定显存的嵌入式系统来说,我们可以让linux系统启动的时候为我们预留一块内存区域来作为我们的显存,比如通过内核启动参数mem来指定比实际物理内存少一点的内存。

mmio-phys 这里是要我们告诉我们的显示控制器或者说是显卡的物理起始地址,这个其实是给我们自己在gfx驱动中用的,因为dfb并不知道要往里面写啥起作用。

accelerator 这个即是用来匹配gfx驱动的ID,我们可以随意填写但要和gfx驱动匹配上。

如下是我在新塘的n32926上的一个配置示例,

system=devmem
video-phys=0x03800000
video-length=8388608
mmio-phys=0xb1002000
mmio-length=4095
accelerator=998

我通过内核启动参数mem告诉内核我只有56M内存从而预留出了高8M内存区域来作为我的显存区域,查看数据手册可知n32926的显示控制器(VPOST)的起始地址为0xb1002000这个即是我们想要的,后面我们会在gfx驱动中得到它然后直接对寄存器进行读写来控制它。

完善我们的gfx驱动

在上一篇文章《Directfb学习之添加gfx驱动》中我们使用的system还是fb驱动,所以有两个原本需要我们在gfx驱动的driver_init_driver中要做的事情交给了fb驱动,即注册screen和注册layers。

这里我们主要参考dfb里面的sh772x的gfx驱动参考着来写就好了,它是dfb里面第一个支持的gfx器件,几乎所有gfx想关的示例都能在里面得到参考,下面简单做个简单说明。

注册screen

要注册一个screen我们至少需要完善如下两个函数:

  • InitScreen()
  • GetScreenSize()

意如其名,他们的实现还可参考dfb的fb驱动里面关于screen的注册部分来写,相对较简单。

注册layers

要注册一个layers我们至少需要完善如下函数:

  • LayerDataSize()
  • RegionDataSize()
  • InitLayer()
  • TestRegion()
  • SetRegion()
  • RemoveRegion()
  • FlipRegion()

以上函数的实现均可从sh772x的gfx驱动来参考着写,根据我们当前系统的实际情况进行写就行。

在InitLayer()中我们主要要告知dfb我们当前layer支持的特性,把支持的特性填在DFBDisplayLayerDescription中返回。

TestRegion()/SetRegion()的作用和gfx中的CheckState()/SetState()调用流程类似,它会根据我们在InitLayer中设置的特性在SetRegion中完成相应的操作。

其中会有关于layer显存地址的更新,这个即是我们要重点关注的,此时我们要把传入的地址写到显示控制器的寄存器中画面才会显示出来。

FlipRegion()里面也会给到一个显存buffer地址给我们需要我们填到正确的寄存器中让画面显示出来。

其余函数这边不再做详细介绍了,按照gfx接口的惯例,相应的头文件里面均会有相应的说明。

小结

有了devmem驱动后,我们可以不用去实现fb驱动即可完全在dfb下把画面显示出来,这在嵌入式系统中非常的有用,特别是需要用到多层显示的应用,而且硬件刚好支持这一特性。

写在最后

DirectFB学习的系列文章到这里就要告一段落了,陆陆续续大半年过去了,还想起起初对dfb感兴趣的时候还是我刚开始做TV软件的时候,发现系统里面居然没有fb驱动的实现,这和我之前认知的系统有些差别,后面才知道原来是dfb在支持整个系统的显示处理。

但这部分和硬件联系紧密,方案商把它们多做成了库,对里面也是一无所知。

后来有幸拿到两块新塘的硬件平台nuc972和n32926,看到他们多有2D硬件部分还有OSD功能,然后就开始在上面移植dfb并且去适配硬件,马马虎虎算是搞懂了些吧,但在n32926上出来的效果不是特别好,他们所有的实现我后续会更新到我的github上,地址在上一篇文章中有,上面已经有nuc972平台的gfx驱动实现了。

但对dfb关注的和使用的人较少,关于它的文章和资料也不像linux一样多,写出来的东西也没几个人看(哈哈,自娱自乐的感觉),但想了解的东西基本也都能在官网找到,只是它的官网会时不时的打不开(http://www.directfb.net/)。

如下这份来自官方的文档是我最后两篇文章的主要参考来源,可以说是对它的再阐述吧,想了解更多的话,建议看下

http://pan.baidu.com/s/1c23vh4G

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值