kernel lcd

原创:kylin_zeng  http://blog.sina.com.cn/u/2312748742

一、系统架构:

kernel <wbr>lcd

二、先看 include\linux\fb.h
       struct fb_info
       {
          有三个比较重要的结构体:
          struct fb_var_screeninfo var;//用户可以修改的显示参数,包括屏幕分辨率。
          struct fb_fix_screeninfo fix: //用户不能修改的显示控制器的参数,入显示缓存的物理地址。
          struct fb_ops *fbops;//对控制器进行的操作函数。        
        }

三、分析 drivers\video\davincifb.c
            这里有两层含义,可以编译成模块,也能编译进内核中。入口见module_init(davincifb_init),可见入口在davincifb_init函数中。
       里面函数:platform_device_register(&davincifb_device)函数注册平台设备,这是一个总线设备模型,它通过设备的名字和驱动的名字进行匹配,
       如果能过匹配后则调用了probe这个函数。注册驱动在driver_register(&davincifb_driver),probe在davincifb_driver和davincifb_device里有两个.name
       可知设备和驱动都匹配了。    这时就开始执行davincifb_probe了。 
    
四、还需两步,一个是分配一个内存,一个是告知控制寄存器内存在哪里。
      1)
      内存是在fb_fix_screeninfo 里的smem_start.通过这个变量可以找到在arch\arm\mach-netx\fb.c
      里面有netx_clcd_setup(){ fb->fb.fix.smem_start=dma}.此时frambuffer就已经有啦。
      2)
      怎么告知lcd控制寄存器呢?


 1、修改lcd屏幕的参数:
 drivers/media/video/davinci/logicpd_encoder.c
 修改logicpd_encoder_configuration里面的。
 
 2、在/arch/arm/mach-davnici/Board-dm365-evm.c
 中的dm365_evm_init(void)加入dm365_lcd_hw_init()点亮lcd.
 
 static int dm365_lcd_hw_init(void)
{
 int status;

davinci_cfg_reg(DM365_AEMIF_D15_8);
 davinci_cfg_reg(DM365_PWM3_G81);

status = gpio_request(62, "lcd avdd\n");
 if (status < 0)
 {
  printk("gpio_request gpio62 failed.\n");
  return status;
 }
 
 status = gpio_request(81, "lcd b/l\n");
 if (status < 0) {
  gpio_free(81);
  printk("gpio_request gpio81 failed.\n");
  return status;
 }

gpio_direction_output(62, 0);
 gpio_direction_output(81, 0);


 gpio_set_value(81, 0);


 gpio_set_value(62, 0);


 gpio_set_value(62, 1);

mdelay(30);
 
 
 gpio_set_value(81, 1);

return 0;
}
//kylin end

3、修改管脚功能:
  arch/arm/mach-davinci/dm365.c 里面的dm365_pins[]

4、显示logo.和进度条。
  driver/video/console/fbcon.c中;
  fbcon_switch()
  {
    fb_show_logo();
    fb_show_progress_bar();
   }

 

5、

void fbcon_init 
{
  void fbcon_prepare_logo
   {
     int fb_prepare_logo
       {
              fb_find_logo
              {
                  logo_linux_clut224        
               {
                   struct linux_logo logo_linux_clut224
               }
              }
        }
   }
}


    6、止光标两种方法:

方法一:

在内核的当前目录进入到drivers/video/console/fbcon.c文件
 将static void fb_flashcursor(void *private)和函数static void fbcon_cursor(struct vc_data *vc, int mode)

这两个函数内容置空掉。

 

方法二:

drivers/video/console/Makefile

#obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o softcursor.o
obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o

编译遇到一个soft_cursor没有定义的问题问题,注释代码:
drivers/video/console/bitblit.c
//      if (err)
//              soft_cursor(info, &cursor);

 

7、制作内核启动的图片Logo
     一)先下载工具:
          apt-get install netpbm(如果下载失败,先查看虚拟机是否能上网)
     二)开始制作图片:
         (1)让内核支持启动LOGO
             在内核目录中 make menuconfig
             Device Drivers ---->   Graphics support ---->
             选中 Bootup logo ----> Standard 224-color Linux logo

         (2) 制作一张启动LOGO的bmp格式的图片tem1.bmp
         (3) #bmptoppm temp1.bmp > temp2.ppm    //生产ppm格式
              #ppmquant 224 temp2.ppm > temp3.ppm //转换成 224 颜色
              #pnmnoraw temp3.ppm > logo_linux_clut224.ppm  //这张就是可用的logo,ascii格式的。
         (4)将LOGO文件放入内核中
              拷贝到制作好的LOGO文件到  /drivers/video/logo 文件夹
              替换  logo_linux_clut224.ppm 文件
         (5)重新编译内核
        这个已经验证,可用。
         (同理还可以先制作一张启动LOGO的PNG格式的图片logo_linux_clut224.png
            在执行下面装换
          #pngtopnm logo_linux_clut224.png > logo_linux.pnm
          #pnmquant 224 logo_linux.pnm > logo_linux_224.pnm
          #pnmtoplainpnm logo_linux_224.pnm > logo_linux_clut224.ppm  未尝试)。
       

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值