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触摸屏驱动分析

推荐阅读最新更新时间:2026-03-23 11:09

S3C6410开发板LED驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制。在本文的资源中包含了设备驱动的源码和测试的源码。 一、设备驱动源码分析 设备驱动主要实现了模块的初始化、模块的卸载、io模块操作的功能。 1、模块初始化 模块的初始化的源码如下所示。 static int __init dev_init(void) { int ret; { unsigned tmp; tmp = readl(S3C64XX_GPKCON); tmp = (tmp & ~(0xffffU 16))|(0x1111U 16); writel(tmp, S3C64XX_GPKCON);
[单片机]
linux中LCD设备驱动(2)——基于s3c6410平台
上一篇说了framebuffer帧缓冲的有关知识,这一篇具体的说下LCD驱动的实现。 1、LCD设备驱动在linux内核中是作为平台设备存在,所以又要说那些已经说过很多遍的东西。 int __devinit s3cfb_init(void) { return platform_driver_register(&s3cfb_driver); } static void __exit s3cfb_cleanup(void) { platform_driver_unregister(&s3cfb_driver); } module_init(s3cfb_init); module_exit(s3cfb_cleanup); 对
[单片机]
驱动程序实例(五):LCD驱动程序分析(Samsung LCD
正文 /************************************************************************************ *本文为个人学习记录,如有错误,欢迎指正。 *本文参考资料: *        朱有鹏嵌入式课程 *        https://blog.csdn.net/ultraman_hs/article/details/54987874 ************************************************************************************/ 结合之前对Linux的fr
[单片机]
Linux设备驱动开发 - LCD设备驱动分析
一、S3C6410 LCD驱动裸机代码 LCD控制器初始化: 1 unsigned long VideoBuffer = {0}; 2 void lcd_init(void) 3 { 4 /* 1.初始化IO端口为LCD端口 */ 5 /* GPIO configure */ 6 GPICON = 0xAAAAAAAA; 7 GPJCON = 0x00AAAAAA; 8 9 /* 2.使能LCD时钟 */ 10 //HCLK_GATE |= (1 3); //默认打开 11 12 MIFPCON &=~(1 3); 13 14 /* 3.设置I/F类型 *
[单片机]
Linux设备<font color='red'>驱动</font>开发 - <font color='red'>LCD</font>设备<font color='red'>驱动</font><font color='red'>分析</font>
S3C2440裸机学习[2] - LCD驱动原理及代码分析[一]
1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的 形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通 过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 2. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成; b:REGBAN
[单片机]
基于STM8S的LCD驱动电路和LCD显示原理分析
一、LCD的显示原理。 LCD的工作原理和驱动电路 液晶是一种有机化合物,这种有机物质在一定的温度范围内,既具有液体的流动性和连续性,又具有某些晶体的光学性质。LCD就是利用这种物质在电场的作用下能产生特殊的电光效应而制成的。按照使用的电光效应的不同,LCD可分为动态散射效应和扭曲一向列效应两种类型;按采光方式的不同又可分为透射式和反射式。 LCD的基本结构由内表面刻有透明电极(典型图形为7段字形)的两块平板玻璃中间注入薄薄(约10pm厚)的液晶层构成。它的上、下表面各放了一块偏振片(起偏振片、检偏振片)。下偏振片下面常常再放一块高效的反射器件,以获得良好的清晰度。 LCD采用表面排列技术,对刻有透明电极的玻璃进行表面处理
[单片机]
基于STM8S的<font color='red'>LCD</font><font color='red'>驱动</font>电路和<font color='red'>LCD</font>显示原理<font color='red'>分析</font>
基于STM8L152的TAB段式LCD液晶驱动分析
基于STM8L152的TAB段式LCD液晶驱动的分析 - 单片机干货 - 中国电子技术论坛 - 最好最受欢迎电子论坛!.md 主控芯片为STM8L152C4T6自带LCD控制器,低功耗系列,最近公司用到这个芯片,第一次接触STM8,刚毕业第一次做产品,也算是满成功的,发个帖纪念一下, 顺便记录一下自己学习段式LCD的过程,在查找段式LCD工作资料的过程中,确实有几篇好的博客,给了很大的帮助,但是仍然觉得不够详细,希望这次分析能够帮助到大家。 首先看STM8的LCD控制器的两个关键寄存器: 一: Port mask registers (LCD_PM) 这是映射LCD控制IO的寄存器,寄存器内容如下: 由图可知,当你使用了对应
[单片机]
基于STM8L152的TAB段式<font color='red'>LCD</font>液晶<font color='red'>驱动</font>的<font color='red'>分析</font>
LCD电视背光驱动电路设计挑战分析和方案设计
LCD 电视应用中可以采用多种架构产生 驱动 CCFL所需的交流波形,驱动多个CCFL时所要面对的三个关键的设计挑战是选择最佳的驱动架构、多灯驱动、灯频和脉冲调光频率控制。本文对四种常用驱动架构进行了对比分析,并提出多灯设计中解决 亮度 不均以及驱动频率可能干扰画面等问题的方法,并给出基于DS3984/DS3988的电路方案。 液晶 显示 器(LCD)正在成为电视的主流显示技术。LCD 面板 实际上是电子控制的光阀,需要靠背光源产生可视的图像,LCD电视通常用冷阴极荧光灯提供光源。其他背光技术,例如发光二极管也受到一定的重视,但由于成本过高限制了它的应用。 由于LCD电视是消费品,压倒一切的设计考虑是成本—当然必须满足最低
[电源管理]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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