为EVB添加Frame Buffer驱动(二),让Frame Buffer动起来

      上一回写到Frame Buffer驱动如孙小空一样砰然出世,可是只是申请了一个Buffer和向系统注册成功了而已,仅仅是个雏形。为了让LCD可以周而复始的不停刷新,在那些有控制器的CPU里面是可以通过配置时钟来控制得,咱这Ultra Low Cost的系统就用Timer来代替好了,这样在系统系统繁忙的时候或许还能少刷几帧缓解系统压力,难道这就是所谓因祸得福?!

      首先当然是要初始化液晶模组了,当然就是包括Reset,然后写入一大堆的LCD参数:

      cbp_reset_lcd();

      cbp_init_9320();
      cbp_init_lcd_bklight(31);
      具体过程暂且不表,实在是比较繁琐,而且一般都有厂家的基本参数,如果运行完了还有问题,那肯定跟厂家没关系,乖乖的去找万用表和示波器吧!

      首先为我们的DMA写一个Descriptor,这个是俺们的特色,当然Motorola,不好意思,是Freescale的DMA也是有这个东西的,其实就是相当于一些专门给DMA使用微代码,其中包括跳转,搬数,判断等等基本指令,这样就可以比较灵活了,或许后面会写一些Camera之类的博文,其中就是这个玩意儿当家了。

   LcdDMAInitDescriptor((LCDDescriptorT *)sgpDesc ,(unsigned char *)map_dma,
                              0, 0, 240,320 );
   HwdWrite32(HWD_DMA_C2_DBAR_ADDR,sgpDesc_PA);
然后再注册一个timer,让这个timer以每秒十次的速度任劳任怨的工作吧!

   init_timer(&cbp_lcd_refresh_timer);
   cbp_lcd_refresh_timer.function = cbp_lcd_refresh;
   cbp_lcd_refresh_timer.expires = jiffies + (HZ / 10);
   add_timer(&cbp_lcd_refresh_timer);
当一次timer到了以后就会调用安装的函数,在这里当然就是 cbp_lcd_refresh了

void cbp_lcd_refresh(void)
{
   if((refresh_count%10)==0) printk("LCD refresh++");
   refresh_count++;
   if(((HwdRead32(HWD_DMA_STR_ADDR)>>CBP_FB_DMA_CHANNEL)&0x01)!=0x01)
   {
      HwdWrite32(HWD_DMA_C2_GCR_ADDR,0x01);      
   }

   cbp_lcd_refresh_timer.expires = jiffies + (HZ / 10);
   add_timer(&cbp_lcd_refresh_timer);
}
其中的蓝色部分首先判断是否一次刷屏完成,如果已经完成了就启动新的一次刷屏,没有完成的话就跳帧了。

这样,这个驱动基本上就可以运作起来了,但是现在俺们企鹅呢?那黄肚皮的企鹅呢??

小企鹅是咱们Linux界的形象代表,当年为啥Linus不选大象。作为一个重要人物,当然不能轻易出来,要配置的。

首先配置Device driver-->Graphics support 里面的Bootup Logo.其中的格式选标准就O了。

然后还需要配置Device driver-->Graphics support-->Console display driver support里面的 Frame Buffer Console Support。

这样俺们的小企鹅就出来了!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章