S3C2440 LCD驱动(FrameBuffer)实例开发<一>

发布者:温馨的家庭最新更新时间:2024-07-17 来源: elecfans关键字:S3C2440  LCD驱动  FrameBuffer 手机看文章 扫描二维码
随时随地手机看文章

};

5. 帧缓冲设备作为平台设备


    S3C2440的LCD控制器被集成在芯片的内部作为一个相对独立的单元,所以Linux把它看做是一个平台设备,故在内核代码/arch/arm/plat-s3c24xx/devs.c中定义有LCD相关的平台设备及资源,代码如下:


/* LCD Controller */

//LCD控制器的资源信息

static struct resource s3c_lcd_resource[] = {

    [0] = {

        .start = S3C24XX_PA_LCD, //控制器IO端口开始地址

        .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,//控制器IO端口结束地址

        .flags = IORESOURCE_MEM,//标识为LCD控制器IO端口,在驱动中引用这个就表示引用IO端口

    },

    [1] = {

        .start = IRQ_LCD,//LCD中断

        .end = IRQ_LCD,

        .flags = IORESOURCE_IRQ,//标识为LCD中断

    }

};

 

static u64 s3c_device_lcd_dmamask = 0xffffffffUL;

 

struct platform_device s3c_device_lcd = {

    .name         = 's3c2410-lcd',//作为平台设备的LCD设备名

    .id         = -1,

    .num_resources = ARRAY_SIZE(s3c_lcd_resource),//资源数量

    .resource     = s3c_lcd_resource,//引用上面定义的资源

    .dev = {

        .dma_mask = &s3c_device_lcd_dmamask,

        .coherent_dma_mask = 0xffffffffUL

    }

};

 

EXPORT_SYMBOL(s3c_device_lcd);//导出定义的LCD平台设备,好在mach-smdk2440.c的smdk2440_devices[]中添加到平台设备列表中

     除此之外,Linux还在/arch/arm/mach-s3c2410/include/mach/fb.h中为LCD平台设备定义了一个 s3c2410fb_mach_info结构体,该结构体主要是记录LCD的硬件参数信息(比如该结构体的s3c2410fb_display成员结构中 就用于记录LCD的屏幕尺寸、屏幕信息、可变的屏幕参数、LCD配置寄存器等),这样在写驱动的时候就直接使用这个结构体。下面,我们来看一下内核是如果使用这个结构体的。在/arch/arm/mach-s3c2440/mach-smdk2440.c中定义有:


/* LCD driver info */

//LCD硬件的配置信息,注意这里我使用的LCD是NEC 3.5寸TFT屏,这些参数要根据具体的LCD屏进行设置

static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {

    //这个地方的设置是配置LCD寄存器5,这些宏定义在regs-lcd.h中,计算后二进制为:111111111111,然后对照数据手册上LCDCON5的各位来看,注意是从右边开始

    .lcdcon5 = S3C2410_LCDCON5_FRM565 |

               S3C2410_LCDCON5_INVVLINE |

               S3C2410_LCDCON5_INVVFRAME |

               S3C2410_LCDCON5_PWREN |

               S3C2410_LCDCON5_HWSWP,

 

    .type    = S3C2410_LCDCON1_TFT,//TFT类型

 

    /* NEC 3.5'' */

    .width        = 240,//屏幕宽度

    .height       = 320,//屏幕高度

    //以下一些参数在上面的时序图分析中讲到过,各参数的值请跟据具体的LCD屏数据手册结合上面时序分析来设定

    .pixclock     = 100000,//像素时钟

    .xres         = 240,//水平可见的有效像素

    .yres         = 320,//垂直可见的有效像素

    .bpp          = 16,//色位模式

    .left_margin  = 19,//行切换,从同步到绘图之间的延迟

    .right_margin = 36,//行切换,从绘图到同步之间的延迟

    .hsync_len    = 5,//水平同步的长度

    .upper_margin = 1,//帧切换,从同步到绘图之间的延迟

    .lower_margin = 5,//帧切换,从绘图到同步之间的延迟

    .vsync_len    = 1,//垂直同步的长度

};

 

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {

    .displays        = &smdk2440_lcd_cfg,//应用上面定义的配置信息

    .num_displays    = 1,

    .default_display = 0,

 

    .gpccon          = 0xaaaa555a,//将GPC0、GPC1配置成LEND和VCLK,将GPC8-15配置成VD0-7,其他配置成普通输出IO口

    .gpccon_mask     = 0xffffffff,

    .gpcup           = 0x0000ffff,//禁止GPIOC的上拉功能

    .gpcup_mask      = 0xffffffff,

    .gpdcon          = 0xaaaaaaaa,//将GPD0-15配置成VD8-23

    .gpdcon_mask     = 0xffffffff,

    .gpdup           = 0x0000ffff,//禁止GPIOD的上拉功能

    .gpdup_mask      = 0xffffffff,

 

    .lpcsel          = 0x0,//这个是三星TFT屏的参数,这里不用

};

下面,我们再看一下在驱动中是如果引用 到s3c2410fb_mach_info结构体的(注意上面讲的是在内核中如何使用的)。在mach-smdk2440.c中有:


//S3C2440初始化函数

static void __init smdk2440_machine_init(void)

{

    //调用该函数将上面定义的LCD硬件信息保存到平台数据中

    s3c24xx_fb_set_platdata(&smdk2440_fb_info);

     

    s3c_i2c0_set_platdata(NULL);

 

    platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));

    smdk_machine_init();

}

s3c24xx_fb_set_platdata定义在plat-s3c24xx/devs.c中:


void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)

{

    struct s3c2410fb_mach_info *npd;

 

    npd = kmalloc(sizeof(*npd), GFP_KERNEL);

    if (npd) {

        memcpy(npd, pd, sizeof(*npd));

        //这里就是将内核中定义的s3c2410fb_mach_info结构体数据保存到LCD平台数据中,所以在写驱动的时候就可以直接在平台数据中获取s3c2410fb_mach_info结构体的数据(即LCD各种参数信息)进行操作

        s3c_device_lcd.dev.platform_data = npd;

    } else {

        printk(KERN_ERR 'no memory for LCD platform datan');

    }

}

一个小知识:不知大家有没有留意,在平台设备驱动中,platform_data可以保存各自平台设备实例的数据,但这些数据的类型都是不同的,为什么都可以保存?这就要看看platform_data的定义,定义在/linux/device.h中,void *platform_data是一个void类型的指针,在Linux中void可保存任何数据类型。


上面平台驱动如何应用平台设备的数据以达到板与驱动分离的目地可有下图表示:

image

image


[1] [2]
关键字:S3C2440  LCD驱动  FrameBuffer 引用地址:S3C2440 LCD驱动(FrameBuffer)实例开发<一>

上一篇:S3C2440中的GPIO
下一篇:S3C2440 ARM芯片时钟

推荐阅读最新更新时间:2024-11-02 12:18

LCD驱动IC调整库存 颀邦Q4营收跌幅扩大
受到面板和LCD驱动IC产业相继调整库存,连带地冲击后段封测厂颀邦科技第4季出货量将比上季下降10%。若考虑新台币汇率持续走升,颀邦第4季营收跌幅恐将扩大到10~15%。颀邦已感受到主要产线的产能利用率普遍下滑,10月营收亦呈现月减9.6%的情况。唯一产业面正向消息为大尺寸面板相关卷带式覆晶薄膜封装(COF)需求可望在11月落底、12月回升。     颀邦投资人关系经理人郑凯元表示,观察面板相关供应链,面板产业第3季比上季下滑6.4%,LCD驱动IC则下滑6.4%,后段也同步走弱2.7%,该公司预测第4季面板产业跌幅趋缓,落在0~5%之间,LCD驱动IC季跌15%,后段供应链较贴近IC设计端,估计跌幅约10%。由上所述显示面板
[电源管理]
TQ2440平台上LCD驱动的移植
参考: http://liu1227787871.blog.163.com/blog/static/205363197201242393031250/ http://blog.csdn.net/cumtgao/article/details/8649006 http://www.360doc.com/content/12/0424/17/9159905_206213245.shtml http://blog.csdn.net/yj4231/article/details/7878762 硬件平台:TQ2440 LCD型号:WXCAT43,分辨率480*270 U-boot版本:u-boot-2015.04 内核版本:L
[单片机]
TQ2440平台上<font color='red'>LCD驱动</font>的移植
s3c2440裸机-内存控制器3-SDRAM原理-cpu是如何访问sdram的
1.SDRAM原理 black (1)SDRAM内部存储结构: (2)再看看与2440连接的SDRAM原理图: sdram引脚说明: A0-A12:地址总线 D0-D15:数据总线(位宽16,2片级联成位宽32) BA0-BA1:bank选择 nSCS:片选 nSRAS:行地址选择 nSCAS:列地址选择 nWE:写使能 SCLK:时钟 SCKE:时钟使能 (3)SDRAM的地址范围: 之前我们讲“二、不同位宽外设与CPU地址总线的连接”这一节的时候,我们留下了一个问题,SDRAM的地址范围是多少? 我们知道地址范围肯定是base_addr + size。我们根据片选接了nGCS6,base_addr=0x30
[单片机]
S3C2440裸机实验之timer(定时器)
S3c2440 有5 个16 位的定时器。定时器0、1、2、3 有脉宽调制功能(PWM)。定时器4有一个没有输出引脚的内部定时器。定时器0 有一个用于大电流设备的死区生成器。 定时器0 和1 共享一个8 位的预分频器(预定标器),定时器2,3,4 共享另一个8 位预分 频器. 定时器的时钟源为PCLK,首先经过预分频器降低频率后,进入第二个分频.可以生成5 种不同的分频信号(1/2,1/4,1/8,1/16 和TCLK) 定时器启动后,TCNTn开始减一计数,当TCNTn 等于TCMPn时, TOUTn 反转, TCNTn继续减数. 当TCNTn= 0 时, TOUTn 再次反转,并触发中断(中断已经使能). 若TCON
[单片机]
S3C2440裸机------LCD_LCD控制器介绍
1.LCD控制器的功能 LCD控制器主要完成两个工作: 取数据:把framebuffer的地址告诉LCD控制器,bpp,分辨率。 发数据: 把时序告诉LCD控制器、设置引脚的极性。 2.LCD控制器框图 我们的LCD控制器中的LCDDMA会从内存中把数据取出来,然后发送给LCD,我们通过设置寄存器来控制LCD控制器发出合适的时序。 3.LCD像素数据格式 如果像素数据使用8bpp,那么会用到一个调色板的概念, 4.LCD控制器时序图
[单片机]
<font color='red'>S3C2440</font>裸机------LCD_LCD控制器介绍
S3C2440下linux按键驱动编写及测试程序
驱动程序tang2440_buttons.c #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/poll.h #include linux/irq.h #include asm/irq.h #include linux/interrupt.h #include asm/uaccess.h #include mach/regs-gpio.h #include mach/hardware.h #include linux/platf
[单片机]
S3C2440的RAM和启动过程!
2440自带的RAM是:16K Instruction cache + 16K data cache + 4K Boot Internal SRAM。但是我们能用到的只有4K Boot Internal SRAM;2440不自带ROM。 2440的启动方式有两种,norflash和nandflash,怎么选择? OM = 01,10为norflash启动,分别对应16bit和32bit,OM = 00为nandflash启动。 两种启动方式:先贴张图。 可以观察到,s3c2440总共有8个内存banks,6个内存bank可以当作ROM或者SRAM来使用,留下的2个bank除了当作ROM 或者SRAM,还可以用SDRAM
[单片机]
<font color='red'>S3C2440</font>的RAM和启动过程!
移植OK6410 LCD驱动
1.本次移植过程选择 linux-2.6.28 lcd驱动为参考移植到 linux-2.6.34 ok6410 开发板上。 2.移植过程 主要以给内核增加驱动的思想,在/driver/video/ 下增加 samsung目录,提取 2.6.28 中驱动相关源代码,将源代码复制到samsung 下。 修改 /driver/video 下的Makefile 文件,增加进入samsung目录编译的编译条目 obj-$(CONFIG_FB_S3C) += samsung/ 修改 /driver/video 下的Kconfig 文件,增加 /samsung/Kconfig 配置条目 comment F
[单片机]
移植OK6410 <font color='red'>LCD驱动</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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