LCD驱动

主要原理: 2440内部集成了LCD控制器,写程序时,2440从内存中读取显存到控制器。

 

流程:

1.  根据LCD手册,设置LCD控制器。

2.  分配显存,把地址、颜色格式、大小告诉控制器。

开始写代码:

1.开头引入头文件,

2.写出出入口框架,并修饰之,再加协议。

3.

 

 

static  int  lcd_init(void)

{

  1.分配一个fb_info结构体

  2.设置

  4.硬件相关操作

  3.注册

}

 

static  struct  fb_info  *s3c_lcd;

 

static  int  lcd_init(void)

{

  分配

  s3c_lcd  =  framebuffer_alloc( 0,NULL);

  

2.设置,

        2.1     固定参数

  strcopy(s3c_lcd->fix.id, "mylcd");    //设置设备名字

  s3c_lcd->fix.smem_len = 240*320*16;  //要看LCD手册  240 * 320,RGB  6bit,一般选择565结构。

  s3c_lcd->fix.type   =  FB_TYPE_PACKED_PIXELS  //默认值0

  s3c_lcd->fix.visual  =  FB_VISUAL_TRUECLOLR;  //TFT屏是真彩色

  s3c_lcd->fix..line_length  =  240*2;

  

  2.2  可变参数

  s3c_lcd->var.xres  =  240;  //x轴上的分辨率

  s3c_lcd->var.yres  =  320;  //y轴上的分辨率

  s3c_lcd->var.xres_virtual  =  320;  //x轴上的虚拟分辨率

  s3c_lcd->var.yres_virtual  =  240;  //y轴上的虚拟分辨率

  s3c_lcd->var.bits_per_pixel  =  16;  //每个像素用多少位

  /*RGB:5:6:5

  s3c_lcd->var.red.offset   = 11;

  s3c_lcd->var.red.length  =  5;

  s3c_lcd->var.green.offset  =  5;

  s3c_lcd->var.blue.length  =  6;

  s3c_lcd->var.blue.offset  =  0;

  s3c_lcd->var.blue.length  =  5;

  s3c_lcd->var.activate  =  FB_ACTIVATE_NOW;

 

  2.3  操作函数

  先定义结构体

  static  struct  fb_ops  s3c_lcdfb_ops  =  {

    .owner  =    THIS_MODULE,

    .fb_fillrect  =  cfb_fillrect,        //填充举行

    .fb_copyarea  =  cfb_copyarea,    //填充区域

    .fb_imageblit  =  cfb_imageblit,    //图像

  }

 

  s3c_lcd->fops  =  &s3c_lcdfb_ops;

 

  2.4  其他设置

       先闲置  s3c_lcd->screen_base

  s3c_lcd->screen_base  =      ;    //显存虚拟地址

  s3c_lcd->screen_size      =  320*240*16/8;   //显存物理地址

 

3.  硬件设置

定义变量:

static  volatile  unsigned  long  *gpbcon;

static  volatile  unsigned  long  *gpbdat;

static  volatile  unsigned  long  *gpccon;

static  volatile  unsigned  long  *gpdcon;

static  volatile  unsigned  long  *gpgcon;

 

 

  3.1  配置GPIO

  gpbcon  =  ioremap(0x56000010,8);

  gpbdat  =  gpbcon+1;

  gpccon  =  ioremap(0x56000020  4);

  gpdcon  =  ioremap(0x56000030,  4);    //映射时都是以页为单位,所以写4还是1024没区别。

  gpgcon  =  ioremap(0x56000060,  4);    

  

  *gpccon  =  0xaaaaaaaa;  用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND

  

LCD本身的电源,LCD的背光电路,

 

 

配置好2440硬件之后,LCD控制器就会从设置好的内存中读出像素点,然后写入到显存中。

LCD控制器还没有那么只能,数据必须是连续的。内核分配显存显得尤其重要。

 

  3.2  根据手册设置LCD控制器,发出正确信号。比如VCLK。

 

 

  3.3  分配显存,并把地址告诉LCD控制器

 s3c_lcd->screen_base   =  dma_alloc_writecombine(NULL,  s3c_lcd->fix.smem_len,  &s3c_lcd->fix.smem_start,  GFP_KERNEL);

      返回虚拟地址

  

  s3c_lcd->fix.smem_start = ;

 

4. 注册

  register_framebuffer(s3c_lcd);

 

}

 

调色板:

  得到的八位数据并不是直接发给LED,而是在调色板(内存)存储真正的数据。八位数据为索引。

 

转载于:https://www.cnblogs.com/stm32f4/p/7702189.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值