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

S3C2440上LCD驱动(FrameBuffer)实例开发讲解(二)

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

cd_base;

switch (fbinfo->fix.visual)

{

case FB_VISUAL_TRUECOLOR:

/*真彩色*/

if (regno < 16)

{

u32 *pal = fbinfo->pseudo_palette;

val = chan_to_field(red, &fbinfo->var.red);

val |= chan_to_field(green, &fbinfo->var.green);

val |= chan_to_field(blue, &fbinfo->var.blue);

pal[regno] = val;

}

break;

case FB_VISUAL_PSEUDOCOLOR:

/*伪彩色*/

if (regno < 256)

{

val = (red >> 0) & 0xf800;

val |= (green >> 5) & 0x07e0;

val |= (blue >> 11) & 0x001f;

writel(val, regs + S3C2410_TFTPAL(regno));

/*修改调色板*/

schedule_palette_update(fbvar, regno, val);

}

break;

default:

return 1;

}

return 0;

}

static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf)

{

chan &= 0xffff;

chan >>= 16 - bf->length;

return chan << bf->offset;

}

/*修改调色板*/

static void schedule_palette_update(struct my2440fb_var *fbvar, unsigned int regno, unsigned int val)

{

unsigned long flags;

unsigned long irqen;

/*LCD中断挂起寄存器基地址*/

void __iomem *lcd_irq_base = fbvar->lcd_base + S3C2410_LCDINTBASE;

/*在修改中断寄存器值之前先屏蔽中断,将中断状态保存到flags中*/

local_irq_save(flags);

fbvar->palette_buffer[regno] = val;

/*判断调色板是否准备就像*/

if (!fbvar->palette_ready)

{

fbvar->palette_ready = 1;

/*使能中断屏蔽寄存器*/

irqen = readl(lcd_irq_base + S3C24XX_LCDINTMSK);

irqen &= ~S3C2410_LCDINT_FRSYNC;

writel(irqen, lcd_irq_base + S3C24XX_LCDINTMSK);

}

/*恢复被屏蔽的中断*/

local_irq_restore(flags);

}

五、从整体上再描述一下FrameBuffer设备驱动实例代码的结构:

1、在第①部分代码中主要做的事情有:

a.将LCD设备注册到系统平台设备中;

b.定义LCD平台设备结构体lcd_fb_driver。

2、在第②部分代码中主要做的事情有:

a.获取和设置LCD平台设备的各种资源;

b.分配fb_info结构体空间;

c.初始化fb_info结构体中的各参数;

d.初始化LCD控制器;

e.检查fb_info中可变参数;

f.申请帧缓冲设备的显示缓冲区空间;

g.注册fb_info。

a.实现对fb_info相关参数进行检查的硬件接口函数;

b.实现对LCD显示模式进行设定的硬件接口函数;

c.实现对LCD显示开关(空白)的硬件接口函数等。

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

网站地图

Top