《韦东山视频第二期》——LCD驱动

发布者:fuehrd努力的最新更新时间:2020-04-25 来源: eefocus关键字:LCD驱动  S3C2410  程序框架 手机看文章 扫描二维码
随时随地手机看文章

一、LCD驱动程序框架分析


app: open("/dev/fb0", ...)     主设备号:29, 次设备号:0


————————————————————————————————————————————————————

kernel:(核心文件/drivers/video/fbmem.c)


                fb_open


                          int fbidx = iminor(inode);

                          struct fb_info *info;


                          info = registered_fb[fbidx];      //根据次设备号获得从底层注册的struct fb_info结构体中


                         file->private_data = info;

                         if (info->fbops->fb_open) {                         //调用底层struct fb_info结构体中的fb_open函数

                                 res = info->fbops->fb_open(info,1);

                                 if (res)

                                 module_put(info->fbops->owner);

                         }


———————————————————————————————————————————————————


app:    read()


_____________________________________________________________________________________


kernel:


                fb_read


                            struct inode *inode = file->f_path.dentry->d_inode;

                            int fbidx = iminor(inode);

                            struct fb_info *info = registered_fb[fbidx];


                            if (info->fbops->fb_read)

                           return info->fbops->fb_read(info, buf, count, ppos);




                          src = (u32 __iomem *) (info->screen_base + p);

                          dst = buffer;

                         *dst++ = fb_readl(src++);

                         copy_to_user(buf, buffer, c)          


怎么写LCD驱动程序?


1.分配一个fb_info结构体:framebuffer_alloc()


2.设置


3.注册:register_framebuffer


4.硬件相关的操作  


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#include

#include

#include

 

#include

#include

#include

#include

 

struct lcd_regs {

    unsigned long    lcdcon1;

    unsigned long    lcdcon2;

    unsigned long    lcdcon3;

    unsigned long    lcdcon4;

    unsigned long    lcdcon5;

    unsigned long    lcdsaddr1;

    unsigned long    lcdsaddr2;

    unsigned long    lcdsaddr3;

    unsigned long    redlut;

    unsigned long    greenlut;

    unsigned long    bluelut;

    unsigned long    reserved[9];

    unsigned long    dithmode;

    unsigned long    tpal;

    unsigned long    lcdintpnd;

    unsigned long    lcdsrcpnd;

    unsigned long    lcdintmsk;

    unsigned long    lpcsel;

};

 

static struct fb_ops* s3c_lcdfb_ops = {

    .owner          = THIS_MODULE,

//  .fb_setcplreg = atmel_lcdfb_setolreg,

    .fb_fillrect  = cfb_fillrect,

    .fb_copyarea  = cfb_copyarea,

    .fb_imageblit = cfb_imageblit,

};

 

static struct fb_info* s3c_lcd;

 

static volatile unsigned long *gpbcon;

static volatile unsigned long *gpbdat;

static volatile unsigned long *gpccon;

static volatile unsigned long *gpdcon;

static volatile unsigned long *gpgcon;

static volatile struct lcd_regs* lcd_regs;

 

static u32 pseudo_palette[16];    //为了兼容,设置假的调色板

/* from pxafb.c */

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 int s3c_lcdfb_setcolreg(unsigned int regno, unsigned int red,

                 unsigned int green, unsigned int blue,

                 unsigned int transp, struct fb_info *info)

{

    unsigned int val;

    

    if (regno > 16)

        return 1;

 

    /* 用red,green,blue三原色构造出val */

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

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

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

    

    //((u32 *)(info->pseudo_palette))[regno] = val;

    pseudo_palette[regno] = val;

    return 0;

}

 

static int lcd_init(void)

{

    /* 1. 分配一个fb_info结构体 */

 

    s3c_lcd = framebuffer_alloc(0, NULL);

 

    /* 2. 设置 */

    /* 2.1 设置固定的参数 */

    strcpy(s3c_lcd->fix.id, "mylcd");

    s3c_lcd->fix.smem_len    = 320*240*32/8; /* MINI2440的LCD位宽是24,但是2440里会分配4字节即32位(浪费1字节) */

    s3c_lcd->fix.type        = FB_TYPE_PACKED_PIXELS;

    s3c_lcd->fix.visual      = FB_VISUAL_TRUECOLOR;     /* 真彩色 */

    s3c_lcd->fix.line_length = 320 * 4;    /* 1行的字节数 */

    

    /* 2.2 设置可变的参数 */

    s3c_lcd->var.xres          = 320;

    s3c_lcd->var.yres          = 240;

    s3c_lcd->var.xres_virtual  = 320;

    s3c_lcd->var.yres_virtual  = 240;

    s3c_lcd->var.bits_per_pixel = 32;    /* 每个像素所占的位数 */

 

    /* RGB: 565 */

    s3c_lcd->var.red.offset    = 16;

    s3c_lcd->var.red.length    = 8;

 

    s3c_lcd->var.green.offset  = 8;

    s3c_lcd->var.green.length  = 8;

 

    s3c_lcd->var.blue.offset   = 0;

    s3c_lcd->var.blue.length   = 0;

 

    s3c_lcd->var.activate      = FB_ACTIVATE_NOW;

    

    

    /* 2.3 设置操作函数 */

    s3c_lcd->fops   = &s3c_lcdfb_ops;

        

    /* 2.4 其他设置 */

    //s3c_lcd->pseudo_palette =; //

    //s3c_lcd->screen_base  = ;  /* 显存的虚拟地址 */ 

    s3c_lcd->screen_size   = 320*240*32/8;

 

    /* 3. 硬件相关的操作 */

    /* 3.1 配置GPIO用于LCD */

    gpbcon = ioremap(0x56000010, 8);

    gpbdat = gpbcon+1;

    gpccon = ioremap(0x56000020, 4);

    gpdcon = ioremap(0x56000030, 4);

    gpgcon = ioremap(0x56000060, 4);

 

    *gpccon  = 0xaaaaaaaa;   /* GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND */

    *gpdcon  = 0xaaaaaaaa;   /* GPIO管脚用于VD[23:8] */

    

//    *gpbcon &= ~(3);  /* GPB0设置为输出引脚 */

//    *gpbcon |= 1;

//    *gpbdat &= ~1;     /* 输出低电平 */

 

    *gpgcon |= (3<<8); /* GPG4用作LCD_PWREN */

 

 

    /* 3.2 根据LCD手册设置LCD控制器,比如VCLK的频率等 */

    lcd_regs = ioremap(0x4D000000, sizeof(struct lcd_regs));

    

    /*

     * MINI2440 LCD 3.5英寸 ZQ3506_V0 SPEC.pdf 第11、12页

     *

     * LCD手册11,12页和2440手册"Figure 15-6. TFT LCD Timing Example"一对比就知道参数含义了

     */

 

    /* bit[17:8]: VCLK = HCLK / [(CLKVAL+1) x 2], LCD手册11 (Dclk=6.4MHz~11MHz)

     *            7.1MHz = 100MHz / [(CLKVAL+1) x 2]

     *            CLKVAL = 6

     * bit[6:5]: 0b11, TFT LCD

     * bit[4:1]: 0b1101, 24 bpp for TFT

     * bit[0]  : 0 = Disable the video output and the LCD control signal.

     */

    lcd_regs->lcdcon1  = (6<<8) | (3<<5) | (0x0d<<1);

 

    /* 垂直方向的时间参数

     * 根据数据手册

     * bit[31:24]: VBPD, VSYNC之后再过多长时间才能发出第1行数据

[1] [2]
关键字:LCD驱动  S3C2410  程序框架 引用地址:《韦东山视频第二期》——LCD驱动

上一篇:s3c2440的LCD驱动程序
下一篇:基于arm的LM3S811微控制器与TH12864显示模块的技术应用

推荐阅读最新更新时间:2024-10-31 12:07

ARM S3C2410硬件手册重点
简介:S3C2410提供了外接ROM、SRAM、SDRAM、NOR Flash、NAND Flash的接口。S3C2410外接存储器的空间被分为8 BANKS,每BANK容量为128M:当访问BANKx(x从0到7)所对应的地址范围x*128M到(x+1)*128M-1 SDRAM使用BANK6,它的物理起始地址为6*128M=0x30000000。 a.Memory Controller b.Nand Flash c.UART d.Interrupt e.Timer Memory Controller SDRAM: S3C2410提供了外接ROM、SRAM、SDRAM、NOR Flash、NAND Flash的接口。S3
[单片机]
基于S3C2410处理器实现3G无线网卡接入无线网络功能的设计
本研究的目的是实现一个具有3G无线网络接入功能的嵌入式系统。系统的硬件平台是基于ARM系列的S3C2410微处理器。文章简要介绍了该系统的体系结构,给出USB主机接口硬件电路。研究基于USB接口的3G无线网卡的无线网络接入功能实现,包括研究Linux USB设备驱动程序、实现USB Serial设备的驱动、定制Cramfs文件系统。最后移植和配置PPP拨号程序,实现嵌入式系统通过3G无线网卡接入无线网络的功能。 目前,嵌入式技术已广泛应用于工业控制、无线通讯、网络应用、消费类电子产品、成像和安全产品等各类产品。随着3G牌照的发放,无线网络的带宽大幅扩展,具有3G无线网络接入功能的嵌入式系统更加具有发展前景。本文将介绍中兴的AC
[单片机]
基于<font color='red'>S3C2410</font>处理器实现3G无线网卡接入无线网络功能的设计
裸机系列——DMA工作
DMA 优点是其进行数据传输时不需要 CPU 的干涉,可以大大提高 CPU 的工作效率。 DMA 大容量数据传输中非常重要,比如图像数据传输, SD 卡数据传输, USB 数据传输等等。 S3C2410 有四个 DMA ,每个 DMA 支持工作方式基本相同,但支持的 source Dest 可能略有不同。 那么怎么使用 DMA 呢, S3C2410 内部集成了 DMA 控制器,我们只需要简单的配置一下寄存器就可以实现 DMA 的传输了。 步骤与要点: 1.数据从哪里来,到哪里去? 使用 DMA 当然首先我们要知道数据的流向, DISRCx 寄存器是 DMA 初始源寄存器存放了数据的源地址。 DIDSTx 是 DMA
[单片机]
S3C2410 LED驱动程序
编写驱动程序代码: #include linux/config.h #include linux/module.h #include linux/kernel.h #include linux/devfs_fs_kernel.h #include linux/init.h #include asm/hardware.h #include asm/delay.h #include asm/uaccess.h #undef DEBUG #define DEBUG #ifdef DEBUG #define DPRINTK(x...) printk( s3c2410-led: x) #else #define DPRINTK(x.
[单片机]
51单片机实现判断数据头来接收一串数据的串口通用程序框架
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: USART ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200710 ---- @ModifiedTime: 20200710 ----
[单片机]
51单片机实现判断数据头来接收一串数据的串口通用<font color='red'>程序</font><font color='red'>框架</font>
/bin/sh: can't access tty; job control turned off
问题 最近在做嵌入式文件系统时使用了如下的inittab文件: #/etc/inittab ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh s3c2410_serial0::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r 结果出现了:/bin/sh: can't access tty; job control turned off 分析 BusyBox通过系统控制台来做些工作, 如果我们的shell启动在 /dev/console(5,1)上, tty_io.c 函数op
[单片机]
客户订单5月份回流 台系LCD驱动IC 倒吃甘蔗
近期台系LCD驱动IC设计业者营运表现并不理想,甚至联咏交出低于财测目标的成绩单,然随着两岸面板厂出货量开始回稳,加上LCM模组厂已捎来5月后订单将升温的好消息,台系LCD驱动IC供应商纷预期第2季营运表现有机会呈现倒吃甘蔗走势,由于第3季有传统旺季效应加持,加上届时包括液晶电视、PC及智能型手机等库存问题已消化大半,业绩可望再走高。 联咏第1季营收未达成原先财测目标,让业界吓了一跳,由于智能型手机、电视、平板电脑及PC市场需求都明显疲软,加上两岸面板厂出货量不如预期,拖累联咏营运表现,至于终端市场需求何时会起来,目前台系LCD驱动IC供应商多预期客户订单应会在5月中旬过后陆续回笼,但订单规模有多大仍需要再观察。 由于第
[手机便携]
工程师实战:单片机裸机程序框架是怎样炼成的
前言 前不久,我有位做测试的朋友转去做开发的工作,面试遇到了一个问题,他没明白,打电话问了我。题目大概就是: 在单片机裸机开发时,单片机要处理多个任务,此时你的程序框架是怎样的呢? 这其实是个经典面试问题,我以前面试也被问过。 答案一:轮询系统 代码结构如: 左右滑动查看全部代码 int main(void) { init_something(); while(1) { do_something1(); do_something2(); do_something3(); } } 这种结构大概是我们初学单片机的时候的代码结构。在没有外部事件驱动时,可以较好使用。 只答出了这种情况,印象分估计会比较低,多半
[单片机]
工程师实战:单片机裸机<font color='red'>程序</font><font color='red'>框架</font>是怎样炼成的
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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