微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440上LCD驱动(FramBuffer)实例开发详解(一)

S3C2440上LCD驱动(FramBuffer)实例开发详解(一)

时间:08-15 来源:互联网 点击:

d blue, d transp, struct fb_info *info);

//显示空白

int (*fb_blank)(int blank, struct fb_info *info);

//矩形填充

void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);

//复制数据

void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);

//图形填充

void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);

};

  3. 帧缓冲设备作为平台设备:

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

/* LCD Controller */

//LCD控制器的资源信息

static struct resource s3c_lcd_resource[] = {

[0] = {

.start = S3C24XX_PA_LCD

}

};

static u64 s3c_device_lcd_dmamask = 0xffffffffUL;

struct platform_device s3c_device_lcd = {

.name = "s3c2410-lcd"

.id = -1,

.num_resources = ARRAY_SIZE(s3c_lcd_resource)

.dev = {

.dma_mask = &s3c_device_lcd_dmamask,

.coherent_dma_mask = 0xffffffffUL

}

};

EXPORT_SYMBOL(s3c_device_lcd)

除此之外,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

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

};

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {

.displays = &smdk2440_lcd_cfg

.num_displays = 1,

.default_display = 0,

.gpccon = 0xaaaa555a

.gpccon_mask = 0xffffffff,

.gpcup = 0x0000ffff

.gpcup_mask = 0xffffffff,

.gpdcon = 0xaaaaaaaa

.gpdcon_mask = 0xffffffff,

.gpdup = 0x0000ffff

.gpdup_mask = 0xffffffff,

.lpcsel = 0x0

};

注意:可能有很多朋友不知道上面红色部分的参数是做什么的,其值又是怎么设置的?其实它是跟你的开发板LCD控制器密切相关的,看了下面两幅图相信就大概知道他们是干什么用的:

上面第一幅图是开发板原理图的LCD控制器部分,第二幅图是S3c2440数据手册中IO端口C和IO端口D控制器部分。原理图中使用了GPC8-15和GPD0-15来用做LCD控制器VD0-VD23的数据端口,又分别使用GPC0、GPC1端口用做LCD控制器的LEND和VCLK信号,对于GPC2-7则是用做STN屏或者三星专业TFT屏的相关信号。然而,S3C2440的各个IO口并不是单一的功能,都是复用端口,要使用他们首先要对他们进行配置。所以上面红色部分的参数就是把GPC和GPD的部分端口配置成LCD控制功能模式。

从以上讲述的内容来看,要使LCD控制器支持其他的LCD屏,重要的是根据LCD的数据手册修改以上这些参数的值。下面,我们再看一下在驱动中是如果引用到s3c2410fb_mach_info结构体的(注意上面讲的是在内核中如何使用的)。在mach-smdk2440.c中有:

//S3C2440初始化函数

static void __init smdk2440_machine_init(void)

{

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) {

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top