爲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。

這樣俺們的小企鵝就出來了!

 

 

 

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