S3C6410 LCD驱动分析

发布者:RadiantEyes最新更新时间:2024-09-19 来源: cnblogs关键字:S3C6410  LCD  驱动分析 手机看文章 扫描二维码
随时随地手机看文章

一. 理论分析

1. 几个概念:

FIMC :

    Fully Interactive Mobile Camera (完全交互式移动摄像机)

FIMD: 

    Fully Interactive Mobile Display (完全交互式移动显示设备)

2. 设置VCLK

在VIDCON0中

bit[3:2]-->Select the Video Clock source =00 --> HCLK=133MHZ

bit[13:6] --> CLKVAL_F = 13  (这个值是在驱动中计算出来的)

VCLK = Video Clock Source / (CLKVAL+1) where CLKVAL >= 1

         = 133MHZ / (13+1) = 9.5MHZ

3. 刷新频率计

Frame Rate  = VCLK / (HSPW + HBPD + HOZVAL + HFPD) / (VSPW + VBPD + LINEVAL + VFPD)

            = 9.5MHZ/(2+41+2+480)/(2+272+10+2)

            =0.00006327MHZ

            =63HZ

二. 驱动分析

首先在平台的目录中定义platform_device

在arch/arm/plat-samsung/dev-fb.c中


 1 static struct resource s3c_fb_resource[] = {

 2     [0] = {

 3         .start = S3C_PA_FB,

 4         .end = S3C_PA_FB + SZ_16K - 1,

 5         .flags = IORESOURCE_MEM,

 6     },

 7     [1] = {

 8         .start = IRQ_LCD_VSYNC,

 9         .end = IRQ_LCD_VSYNC,

10         .flags = IORESOURCE_IRQ,

11     },

12     [2] = {

13         .start = IRQ_LCD_FIFO,

14         .end = IRQ_LCD_FIFO,

15         .flags = IORESOURCE_IRQ,

16     },

17     [3] = {

18         .start = IRQ_LCD_SYSTEM,

19         .end = IRQ_LCD_SYSTEM,

20         .flags = IORESOURCE_IRQ,

21     },

22 };

23 

24 struct platform_device s3c_device_fb = {

25     .name         = 's3c-fb',

26     .id         = -1,

27     .num_resources     = ARRAY_SIZE(s3c_fb_resource),

28     .resource     = s3c_fb_resource,

29     .dev.dma_mask     = &s3c_device_fb.dev.coherent_dma_mask,

30     .dev.coherent_dma_mask = 0xffffffffUL,

31 };


然后在驱动的probe函数中:

在driver/video/samsun/s3cfb.c中


 1 static int __init s3cfb_probe(struct platform_device *pdev)

 2 {

 3     struct resource *res;

 4     struct fb_info *fbinfo;

 5     s3cfb_info_t *info;

 6 

 7     char driver_name[] = 's3cfb';

 8     int index = 0, ret, size;

 9     //分配sizeof(fb_info+私有成员)大小的内存,使par指向s3cfb_info_t结构体

10     fbinfo = framebuffer_alloc(sizeof(s3cfb_info_t), &pdev->dev);   

11 

12     platform_set_drvdata(pdev, fbinfo);

13 

14     info = fbinfo->par;                //私有数据是一个结构体s3cfb_info_t

15     info->dev = &pdev->dev;

16     

17     //获取LCD的io端口,并映射

18     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

19     size = (res->end - res->start) + 1;

20     info->mem = request_mem_region(res->start, size, pdev->name);

21     info->io = ioremap(res->start, size);

22 

23     s3cfb_pre_init();                                 //2.使能中断寄存器,s3cfb_fimd的第一次初始化

24     s3cfb_set_backlight_power(1);                     //设置backlight_power = 1;

25     s3cfb_set_lcd_power(1);                           //设置lcd_power = 1;

26     s3cfb_set_backlight_level(S3CFB_DEFAULT_BACKLIGHT_LEVEL); //设置backlight_level = 2;

27     

28     //获取时钟,并使能

29     info->clk = clk_get(NULL, 'lcd');     //133.000Mhz,使用的是HCLK

30     clk_enable(info->clk);

31 

32     s3cfb_fimd.vsync_info.count = 0;

33     init_waitqueue_head(&s3cfb_fimd.vsync_info.wait_queue);

34     

35     //申请中断

36     res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

37     ret = request_irq(res->start, s3cfb_irq, 0, 's3c-lcd', pdev);

38     msleep(5);

39     //对4个framebuffer分别初始化

40     for (index = 0; index < S3CFB_NUM; index++) {

41         s3cfb_info[index].mem = info->mem;

42         s3cfb_info[index].io = info->io;

43         s3cfb_info[index].clk = info->clk;

44 

45         s3cfb_init_fbinfo(&s3cfb_info[index], driver_name, index);  //3.初始化fbinfo

46         ret = s3cfb_map_video_memory(&s3cfb_info[index]);           //4.分配dma内存 

47 

48         ret = s3cfb_init_registers(&s3cfb_info[index]);            //5.写寄存器

49         ret = s3cfb_check_var(&s3cfb_info[index].fb.var, &s3cfb_info[index].fb);  //6.设置var范围

50 

51         if (index < 2){

52             if (fb_alloc_cmap(&s3cfb_info[index].fb.cmap, 256, 0) < 0)     //7.申请color map

53                 goto dealloc_fb;

54         } else {

55             if (fb_alloc_cmap(&s3cfb_info[index].fb.cmap, 16, 0) < 0)

56                 goto dealloc_fb;

57         }

58 

59         ret = register_framebuffer(&s3cfb_info[index].fb);                 //8.注册framebuffer

60     }

61 

62     ret = device_create_file(&(pdev->dev), &dev_attr_backlight_power);

63     ret = device_create_file(&(pdev->dev), &dev_attr_backlight_level);

64     ret = device_create_file(&(pdev->dev), &dev_attr_lcd_power);

65     return 0;

66 }


1.分配内存

分配fb_info+size大小的内存,并使par指向私有数据size


 1 struct fb_info *framebuffer_alloc(size_t size, struct device *dev)

 2 {

 3     fb_info_size += PADDING;          //加上PADDING是让私有数据4字节对齐

 4     char *p = kzalloc(fb_info_size + size, GFP_KERNEL);

 5 

 6     struct fb_info * info = (struct fb_info *) p;

 7     info->par = p + fb_info_size;     //par指向私有数据

 8     info->device = dev;

 9     return info;                      //返回申请内存的首指针

10 }


2. 初始化视频中断控制寄存器0

在drivers/video/samsun/s3cfb_fimd4x.c中


 1 void s3cfb_pre_init(void)

 2 {

 3     //Video Frame Interrupt 0 at start of VSYNC,并使能

 4     s3cfb_fimd.vidintcon0 &= ~S3C_VIDINTCON0_FRAMESEL0_MASK;

 5     s3cfb_fimd.vidintcon0 |= S3C_VIDINTCON0_FRAMESEL0_VSYNC;

 6     s3cfb_fimd.vidintcon0 |= S3C_VIDINTCON0_INTFRMEN_ENABLE;

 7    //0x9021=1001 0000 0010 0001

 8    //打开video 中断,关闭fifo 中断

 9    //打开 video frame 中断, Video Frame Interrupt 0 at start of VSYNC

10     writel(s3cfb_fimd.vidintcon0, S3C_VIDINTCON0);

11 }


在driver/vidoe/samsun/s3cfb.c中


 1 static void s3cfb_set_lcd_power(int to)

 2 {

 3     s3cfb_fimd.lcd_power = to;

 4 }

 5 

 6 static void s3cfb_set_backlight_power(int to)

 7 {

 8     s3cfb_fimd.backlight_power = to;

 9 }

10 

11 static void s3cfb_set_backlight_level(int to)

12 {

13     s3cfb_fimd.backlight_level = to;

14 }


3. 初始化s3cfb_info_t结构体

在driver/vidoe/samsun/s3cfb.c中


 1 static void s3cfb_init_fbinfo(s3cfb_info_t *finfo, char *drv_name, int index)

 2 {

 3     int i = 0;   

 4     if (index == 0)

 5     {

 6         if(lcdsize == 1)

 7             s3cfb_init_hw_43();        //3.1 s3cfb_fimd及gpio的初始化

 8     }

 9     strcpy(finfo->fb.fix.id, drv_name);

10     //下面一大段就是要将初始化好后的s3cfb_fimd赋给finfo,类似于结构体转化

11     finfo->win_id = index;

12     finfo->fb.fix.type = FB_TYPE_PACKED_PIXELS;

13     finfo->fb.fix.type_aux = 0;

14     finfo->fb.fix.xpanstep = 0;

15     finfo->fb.fix.ypanstep = 1;

16     finfo->fb.fix.ywrapstep = 0;

17     finfo->fb.fix.accel = FB_ACCEL_NONE;

18 

19     finfo->fb.fbops = &s3cfb_ops;                //fb操作函数

20     finfo->fb.flags    = FBINFO_FLAG_DEFAULT;

21 

22     finfo->fb.pseudo_palette = &finfo->pseudo_pal;

23 

24     finfo->fb.var.nonstd = 0;

25     finfo->fb.var.activate = FB_ACTIVATE_NOW;

26     finfo->fb.var.accel_flags = 0;

27     finfo->fb.var.vmode = FB_VMODE_NONINTERLACED;

28 

29     finfo->fb.var.xoffset = s3cfb_fimd.xoffset;     //xoffset=0 

[1] [2] [3] [4]
关键字:S3C6410  LCD  驱动分析 引用地址:S3C6410 LCD驱动分析

上一篇:搭建测试环境——针对S3C6410开发板
下一篇:S3C6410触摸屏驱动分析

推荐阅读最新更新时间:2024-11-13 19:01

TFT-LCD技术及生产工艺流程简介
概述   TFT(Thin Film Transistor)LCD即薄膜场效应晶体管LCD,是有源矩阵类型液晶显示器(AM-LCD)中的一种。 液晶平板显示器,特别TFT-LCD,是目前唯一在亮度、对比度、功耗、寿命、体积和重量等综合性能上全面赶上和超过CRT的显示器件,它的性能优良、大规模生产特性好,自动化程度高,原材料成本低廉,发展空间广阔,将迅速成为新世纪的主流产品,是21世纪全球经济增长的一个亮点。   主要特点   和TN技术不同的是,TFT的显示采用“背透式”照射方式——假想的光源路径不是像TN液晶那样从上至下,而是从下向上。这样的作法是在液晶的背部设置特殊光管,光源照射时通过下偏光板向上透出。由于上下夹层的电极
[模拟电子]
TFT-<font color='red'>LCD</font>技术及生产工艺流程简介
LCD显示图片的函数-ARM体系-2440
void Paint_BMP(int x0,int y0,int level,int vertical,const unsigned char *bmp)/*在屏幕上画图*/ { int x,y; UINT32 col; int p = 0; UINT16 *addr; for( y = 0 ; y 272 ; y++ ) { for( x = 0 ; x 480 ; x++ ) { col = bmp | (bmp 8) ; // if ( ( (x0+x) SCR_XSIZE) && ( (y0+y) SCR_YSIZE) ) // LCD_BUFFER
[单片机]
MSP430常见问题之LCD 显示驱动
Q1:晶体一般都是接32768,然后使用液晶很正常。我打算将晶体接6M的替换32768,那么液晶还能正常显示吗 A1:看你所用的LCM 模块时序极限是多少HZ,然后看6M情况下,MSP430去驱动LCM 时,程序时间会不会超过这个极限频率,如果超过,得加延时。 Q2:I/O 怎样直接驱动LCD,如何做? A2:建议采用带LCD 驱动的芯片。可采用MSP430F4xx系列的芯片。如果不用带LCD 驱动的芯片,可以用IO 口仿LCD 的波形,比较复杂些,不过也能做出来。可以到TI 网站上去下载关于LCD 的应用报告。 Q3:段式液晶和点阵式液晶区别和不同的应用? A3:段式液晶显示的信息较少,但是便宜,驱动电路简单。点阵
[单片机]
基于STM32驱动CC1101的程序分析 浅谈CC1101调试
首先明确:CC1101是通过SPI与MCU进行通信的。根据从TI官方上获得CC1101驱动,直接先移植SPI部分,STM32F103提供了SPI1和SPI2两条SPI总线,可自行选择,对于SPI的移植,直接参考STM32开发板上关于通过SPI操作Flash示例代码,对于SPI的配置与TI提供的驱动代码里的SPI配置保持一致。SPI移植完成之后,接上CC1101射频模块,测试SPI是否能正常通信,主要通过向CC1101任意可读可写寄存器写一个任意值,然后再读出该寄存器里的值,通过串口打印出该值,通过以上操作判断SPI是否正常通信,SPI移植是否成功。当然,这里使用到了串口,所以需要同时将串口的代码实现,同样参考串口实例。 其次,
[单片机]
三星关闭了LCD业务,京东方、华星将占据全球面板半壁江山
据韩联社报道,随着三星显示器公司(Samsung Display)决定从明年起停止生产液晶面板(LCD),业界对中国面板商市占率的扩大表示出了极大兴趣。 根据市场研究公司Display Supply Chain Consultants (DSCC) 8日发布的报告,去年三星电子液晶面板的三分之一由其子公司三星显示器供应。 不过DSCC预测,在2021年,因三星显示器公司关闭液晶面板业务,中国的华星光电、京东方等将会填补该公司的空位。 另外,据悉,鸿海收购的夏普也将从上半年开始为三星电子供应面板。这样来看,三星电子大部分的货源将会由中国厂商把持。 与此同时,DSCC还指出,三星显示器位于中国的液晶面板工厂很有可能会被华星光电的母
[手机便携]
MSP430G2553操作LCD12864(并行/串行)
1.MSP430驱动LCD12864 MSP430驱动12864有两种方式, 一种是并口驱动,优点是数据传输特别快,缺点是占用单片机资源太多. 一种是串口驱动,优点是只需要占用单片机两个引脚,缺点是相对于并口传输慢了许多. 2.LCD12864引脚 从上往下依次为 GND(接地), VCC(接3.3V!!!一定要3.3V), V0(偏压,接滑动变阻器或电位器再接5V), RS(CS)(并口写0为命令传输,写1为数据传输)(串口为片选,接VCC即可), R/W(SID)(并口写0为写操作,写1为读操作)(串口为数据位), E(SCLK)(并口为使能端口)(串口为时钟端口), DB0----
[单片机]
MSP430G2553操作<font color='red'>LCD</font>12864(并行/串行)
自制单片机之五(2)……LCD1602的驱动
具体电路的制作是很简单的,就接了两个电阻,一个是10欧姆的背光限流电阻,另一个是2K的LCD极板电压调节电阻。这两个电阻的阻值怎么定呢?背光比较简单,它就相当于在后面接了几个发光二极管,任何时候你只要在15、16脚串上个100欧的电位器接上电源,调节电位器,觉得亮度合适。此时的阻值便可。LCD液晶极板驱动电压调节电阻的确定就稍微麻烦一点。在各数据线,控制线接好关通上电源的前提下在第3脚(VEE)和地之间接一个10K的电位器。调节电位器。当3脚电压高时为全亮,电压为0时为全暗(液晶全显示为黑块)。你用电位器把屏幕从全暗刚好调到变亮。这时便可调试程序。待屏幕能正确显示后再细调电位器,使对比度合适。这时的阻值便可确定,然后换成等值的固定电
[单片机]
自制单片机之五(2)……<font color='red'>LCD</font>1602的<font color='red'>驱动</font>
GD32F310定时器采样MP6050并在彩色LCD上显示波形
1.开发环境 (1)IAR8.4 (2)MPU6050 1.8寸显示屏 2.软件 (1)MPU6050陀螺仪驱动 i2C配置: void i2c0_gpio_config(void) { rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_I2C0); gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_6); gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_7); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, G
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved