Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131061
  • 博文数量: 22
  • 博客积分: 949
  • 博客等级: 准尉
  • 技术积分: 266
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-10 22:31
文章分类

全部博文(22)

文章存档

2012年(1)

2011年(2)

2010年(19)

分类: 嵌入式

2010-09-11 09:05:44

上一回写到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。
这样俺们的小企鹅就出来了!
 
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dfysy/archive/2010/09/07/5869268.aspx
阅读(1421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~