s3c2440 LCD驱动

引脚说明:
VCLK:发出lcd时钟信号,每来一个时钟,就会在屏幕上显示一个像素 ——GPC1 :配置为lcd引脚
VLINE:发出lcd行扫描信号 ——GPC2 :配置为lcd引脚
VFRAME:发出lcd桢扫描信号 ——GPC3 :配置为lcd引脚
VM:VDEN,有效时才会在屏幕上显示象素 ——GPC4 :配置为lcd引脚
LCD_PWREN:发出lcd面板电源使能控制信号 ——GPG4 :配置为lcd引脚
KEYBOARD:背光电路引脚 ——GPB0 :配置为输出引脚
VD[3]——VD[7] :lcd数据总线 ——GPC11:GPC15 :配置为lcd引脚
VD[10]——VD[15] :lcd数据总线 ——GPD2:GPD7 :配置为lcd引脚
VD[19]——VD[23] :lcd数据总线 ——GPD11:GPD15 :配置为lcd引脚

各信号的含义
VSYNC:帧同步信号
每发出一个脉冲,表示新的一屏图像数据开始传送。
HSYNC:行同步信号
每发出一个脉冲,表示新的一行图像数据开始传送。
VCLK:像素时钟信号
每发出一个脉冲,表示新的一个点图像数据开始传送。
LEND:行结束信号
VBPD:表示在一帧图像开始时,帧同步信号以后的无效的行数,对应驱动中的upper_margin;
VFBD:表示在一帧图像结束后,帧同步信号以前的无效的行数,对应驱动中的lower_margin;
VSPW:表示垂直同步脉冲的宽度;
HBPD:表示从水平同步信号开始到一行的有效数据开始之间的vclk的个数,对应驱动中的left_margin;
HFPD:表示一行的有效数据结束到下一个水平同步信号开始之间的vclk的个数,对应驱动中的right_margin;
HSPW:表示水平同步信号的宽度;

原理简述
lcd屏可以看作是由许多象素构成的,比如240*320就是由240*320个象素构成的,每个象素由RGB三色调和,每种颜色又由多个位组成。比如我们的开发板上的lcd,有320*240个象素,每个象素由RGB三色调和,RGB三色位数分别为:565。

s3c2440内集成了lcd控制器,lcd控制器外接lcd,每来一个VLCK,就会从左到右在lcd屏幕上显示一个象素的颜色,而这一个个象素的颜色就存放在显存里,在嵌入式领域,一般不会佩戴专门的显存,而是从内存SDRAM中划分出一部分充当显存。VLINE引脚每发出一个行同步信号HSYNC就表示一行的数据发送完成,就会换行,从上一行的最右边跳到下一行的最左边。VFRAME引脚每发出一个帧同步信号VSYNC就表示一帧的数据发送完,这时就会跳到屏幕起始位置,开始下一帧数据的发送。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/fb.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/wait.h>
#include <linux/platform_device.h>
#include <linux/clk.h>

#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/div64.h>

#include <asm/mach/map.h>
#include <asm/arch/regs-lcd.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/fb.h>


static struct fb_info *s3c_lcd;

static int lcd_init(void)
{
	/* 1. 分配一个fb_info */
	s3c_lcd = framebuffer_alloc(0, NULL);

	/* 2. 设置 */
	/* 2.1 设置固定的参数 */
	/* 2.2 设置可变的参数 */
	/* 2.3 设置操作函数 */
	/* 2.4 其他的设置 */

	/* 3. 硬件相关的操作 */
	/* 3.1 配置GPIO用于LCD */
	/* 3.2 根据LCD手册设置LCD控制器, 比如VCLK的频率等 */
	/* 3.3 分配显存(framebuffer), 并把地址告诉LCD控制器 */

	/* 4. 注册 */
	register_framebuffer(s3c_lcd);
	
	return 0;
}

static void lcd_exit(void)
{
}

module_init(lcd_init);
module_exit(lcd_exit);

MODULE_LICENSE("GPL");


     framebuffer_alloc()在<span style="font-family: Arial, Helvetica, sans-serif;">linux-2.6.22/include/linux/fb.h中,</span>功能是向内核申请一段大小为sizeof(struct fb_info) + size的空间,其中size的大小代表设备的私有数据空间,并用fb_info的par域指向该私有空间。

struct fb_info *framebuffer_alloc(size_t size, struct device *dev)
{
#define BYTES_PER_LONG (BITS_PER_LONG/8)
#define PADDING (BYTES_PER_LONG - (sizeof(struct fb_info) % BYTES_PER_LONG))
        int fb_info_size = sizeof(struct fb_info);
        struct fb_info *info;
        char *p;

        if (size)
                fb_info_size += PADDING;
        p = kzalloc(fb_info_size + size, GFP_KERNEL);
        if (!p)
                return NULL;
        info = (struct fb_info *) p;
        if (size)
                info->par = p + fb_info_size;
        info->device = dev;

#ifdef CONFIG_FB_BACKLIGHT
        mutex_init(&info->bl_curve_mutex);
#endif
        return info;
#undef PADDING
#undef BYTES_PER_LONG
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值