欢迎指正错误,链接如下公海赌船网址

本节来上学裸机下的LCD
驱动,本节学完后,再来学习Linux下怎么样选择LCD驱动

阳台消息:

内核:linux3.4.39
系统:android4.4 
平台:S5P4418(cortex a9)

笔者:瘋耔(欢迎转发,请注解笔者)

迎接指正错误,共同学习、共同提高!!

 

关爱博主天涯论坛博客:http://weibo.com/cpjphone

 

参考:S5PV210显得驱动分析与移植(android)
那篇文章中间转播载的成分比较多,但是多数剧情是从芯片手册上翻译过来。Framebuffer部分是德阳先生–《嵌入式Linux之我行》这一密密麻麻博客中的,嵌入式Linux之我行这一连串博客写的不行精,作者刚上学Linux时日常拜读他的博客。这一部分剧情比较原则性,三星(Samsung)的芯片跟新了众多代,可是那有些变化非常的小,技术是2个累积的进度,谢谢那么些前辈给大家整理比较好的上学材质,有比较好的技艺三番伍回。
那篇从LCD控制器、接口信号硬件接口
寄存器、Framebuffer 、接口函数的落到实处及寄存器的操作来上课,同事补充八个知点:怎么样阅读LCD、PWM概述;
一、     LCD控制器
效率模块的兑现其实是芯片内部集成了2个对应的控制器,比如IIC有IIC控制器,UA汉兰达T有UARAV4T控制器等,像别的功用模块一样LCD也有1个控制器,来贯彻图形音讯的拍卖。LCD控制器能够经过编制程序补助差异LCD屏的渴求,例如行和列像素数,数据总线宽度,接口时序和刷新频率等。LCD控制器的根本职能,是将一定在系统存款和储蓄器中的展现缓冲区中的LCD图像数据传送到表面LCD驱动器,并发生要求的操纵信号,例如卡宴GB_VSYNC,RGB_HSYNC,
RGB_VCLK等。
一般来说图所示,在Exynos4412规格书中截图,LCD控制器的咬合。

公海赌船网址 1

 

(上面那有的来源于网络翻译,规格书中的描述)

第壹由VSF奥迪Q5,VDMA, VP大切诺基CS , VTIME和摄像时钟发生器多少个模块组成:

(1)、VSF奔驰G级由12二个可编制程序序控制制器组,一套gamma
LUT寄存器组(包蕴六1九个寄存器),一套i80命令寄存器组(包蕴13个寄存器)和5块256*32调色板存款和储蓄器组成,首要用以对lcd控制器举行安排。

(2)、VDMA是LCD专用的DMA传输通道,能够自动从系统总线上赢得摄像数据传送到VPMuranoCS,无需CPU干涉。

(3)、VP牧马人CS收到多少后组合特定的格式(如16bpp或24bpp),然后经过数量接口(PRADOGB_VD,
VEN_VD, V656_VD or SYS_VD)传送到表面LCD屏上。

(4)、VTIME模块由可编程逻辑组成,负责不相同lcd驱动器的接口时序控制供给。VTIME模块发生 帕杰罗GB_VSYNC,
RGB_HSYNC, RGB_VCLK, RGB_VDEN,VEN_VSYNC等信号。

重中之重特色:

(1)、协助4种接口类型:帕杰罗GB/i80/ITU 601(656)/YTU444
(2)、匡助单色、4级灰度、16级灰度、256色的调色板展现形式 (3)、支持64K和16M色非调色板彰显方式 (4)、协助各类尺度和分辨率的LCD
(5)、虚拟荧屏最大可达16MB
(6)、5个256*3一人调色板内存
(7)、帮助透明叠加
② 、接口信号 FIMD彰显控制器全体信号定义如下所示

Signal

I/O

Description

LCD Type

LCD_HSYNC

O

水平同步信号

 

 

RGB I/F

LCD_VSYNC

O

笔直同步信号

LCD_VDEN

O

多少使能

LCD_VCLK

O

录制时钟

LCD_VD[23:0]

O

LCD像素数据输出

SYS_OE

O

输出使能

VSYNC_LDI

O

Indirect i80接口,垂直同步信号

 

 

 

i80 I/F

SYS_CS0

O

Indirect i80接口,片选LCD0

SYS_CS1

O

Indirect i80接口,片选LCD1

SYS_RS

O

Indirect i80接口,寄存器选择信号

SYS_WE

O

Indirect i80接口,写使能信号

SYS_VD[23:0]

IO

Indirect i80接口,录像数据输入输出

SYS_OE

O

Indirect i80接口,输出使能信号

VEN_HSYNC

O

601接口水平同步信号

 

 

 

ITU 601/656 I/F

VEN_VSYNC

O

601接口垂直同步信号

VEN_HREF

O

601接口数据使能

V601_CLK

O

601接口数据时钟

VEN_DATA[7:0]

O

601接口YUV422格式数据输出

V656_DATA[7:0]

O

656接口YUV422格式数据输出

V656_CLK

O

656接口数据时钟

VEN_FIELD

O

601接口域信号

一 、个中第③的奥迪Q3GB接口信号:
(1)、LCD_HSYNC:
行同步信号,表示一行数据的发端,LCD控制器在一切水平线(整行)数据移入LCD驱动器后,插入1个LCD_HSYNC信号;
2)、LCD_VSYNC: 帧同步信号,表示一帧多少的起初,LCD控制器在一个完全帧显示成功后立马插入3个LCD_VSYNC信号,伊始新一帧的显得;VSYNC信号出现的作用表示一分钟内能呈现多少帧图像,称为“显示器的作用
(3)、LCD_VCLK:像素时钟信号,表示正在传输3个像素的数码;
(4)、LCD_VDEN:数据使能信号;
(5)、 LCD_VD[23:0]: LCD像素数据输出端口
贰 、奥迪Q5GB信号的时序 下图是LCD昂CoraGB接口工作时序图:

公海赌船网址 2

 

(1)、下边时序图上各时钟延时参数的意义如下:这一个布署能够在LCD规格书中查取

VBPD(vertical back
porch):表示在一帧图像开头时,垂直同步信号之后的无用的行数

VFBD(vertical front
porch):表示在一帧图像截至后,垂直同步信号从前的无用的行数VSPW(vertical
sync pulse width):表示垂直同步脉冲的宽窄,用行数计算

HBPD(horizontal back
porch):表示从品位同步信号开端到一行的可行数据发轫之间的VCLK的个数HFPD(horizontal
front
porth):表示一行的卓有功用数据截至到下三个品位同步信号起始之间的VCLK的个数

HSPW(horizontal sync pulse width):表示水平同步信号的增长幅度,用VCLK总括
(2)、帧的传导进度
VSYNC信号有效时,表示一帧多少的起初,   信号宽度为(VSPW
+1)个HSYNC信号周期,即(VSPW +1)个无效行;

VSYNC信号脉冲之后,总共还要通过(VBPD+
1)个HSYNC信号周期,有效的行数据才面世; 所以,在VSYNC信号有效之后,还要通过(VSPW
+1  + VBPD + 1)个不算的行;

随即发出(LINEVAL + 1)行的得力数据

最终是(VFPD + 1)个空头的行

(3)、行中像素数据的传导进度
HSYNC信号有效时,表示一行数据的初步,信号宽度为(HSPW+
1)个VCLK信号周期,即(HSPW +1)个不算像素;
HSYNC信号脉冲之后,还要经过(HBPD
+1)个VCLK信号周期,有效的像素数量才出现;
随即产生(HOZVAL+ 1)个像素的管用数据;
最后是(HFPD +1)个空头的像素;
(4)、将VSYNC、HSYNC、VCLK等信号的时光参数设置好将来,并将帧内部存款和储蓄器的地址告诉LCD控制器,它即可自行地倡导DMA传输从帧内部存储器中得到图像数据,最后在上述信号的支配下冒出在数量总线VD[23:0]上。用户只供给把要出示的图像数据写入帧内部存款和储蓄器中。      
 其实具体的图像有像素点主城行、行组成场、场结缘动画、动画叠加也便是3D的面世,也便是我们所说的“点动成线、线动成面、面动成体”。
叁 、LCD的硬件接口

公海赌船网址 3

 

1、16M(24BPP)色的展现方式

用25人的多少来表示二个像素的颜色,每个颜色使用七位。 LCD控制器从内存中获得某些像素的24为颜色值后,间接通过VD[23:0]数据线发送给LCD;在内部存款和储蓄器中,使用多少个字节(三11位)来表示3个像素,在那之中的三个字节从高到低分别代表红、绿、蓝,剩余的1个字节无效;
2、64K(16BPP)色的来得方式      
 用十三位的数额来表示多个像素的水彩;格式又分为二种: 5:6:5 ——使用5个人来表示天蓝,5人表示海军蓝,6人代表雪白 ; 5:5:5:1——分别使用三个人来表示红、绿、蓝,最终一个人代表发光度; 
  
3、16BPP
4、serialRGB
       差别的BPP接线方式如下所示:

公海赌船网址 4
四、寄存器
首要寄存器如下:
VIDCON0:配置录像输出格式,展现使能
VIDCON1:凯雷德GB 接口控制信号
VIDCON2: 输出数据格式控制
VIDCON3: 图像增强控制
I80IFCONx:i80接口控制信号
ITUIFCON: ITU接口控制信号
VIDTCONx:配置录像输出时序及体现大小
WINCONx:种种窗口本性设置
VIDOSDxA,B: 窗口岗位设置
VIDOSDxC,D:OSD大小设置
5、Framebuffer驱动部分

这一部分是:分析的相比好,小编刚学linux的时候就拿个mini2440的板子对着他的博客演习)。其实那有的也是博主从S3c2440上分析的,三星(Samsung)芯片更新了那样多代,那块的规律照旧不变的。就如有的共谋一样,这么长年累月基本上不会变卦,唯一出现的结果正是出去新的接口替代。LCD这块正是:TTL、LVDS、EDP、MIPI、HDMI等等…………速度更快,接线、PCB走线更简便易行,这便是集成化的功利。
1、简介

帧缓冲是Linux为突显设备提供的2个接口,它把一些呈现设备描述成2个缓冲区,允许应用程序通过FrameBuffer定义好的接口访问那几个图片设备,从而不用去关切具体的硬件细节。对于帧缓冲设备而言,只要在展示缓冲区与展现点对应的区域写入颜色值,对应的水彩就会自行的在显示器上海展览中心示。上面来看一下在差别色位形式下缓冲区与呈现点的相应关系:

公海赌船网址 5
贰 、驱动结构
帧缓冲设备为规范的字符型设备,在Linux中主设备号29,定义在/linux/major.h中的FB_MAJO安德拉,次设备号定义帧缓冲的个数,最大允许有三13个FrameBuffer,定义在/include/linux/fb.h中的FB_MAX,对应于文件系统下/dev/fb%d设备文件。
帧缓冲设备驱动在Linux子系统中的结构如下:

公海赌船网址 6

 

咱俩从地点那幅图看,帧缓冲设备在Linux中也足以看作是二个总体的子系统,大体由fbmem.c和xxxfb.c(对应大家的s3cfb.c)组成。向上给应用程序提供完善的设施文件操作接口(即对FrameBuffer设备进行read、write、ioctl等操作),接口在Linux提供的fbmem.c文件中贯彻;向下提供了硬件操作的接口,只是那么些接口Linux并没有提供完毕,因为那要依照实际的LCD控制器硬件进行安装,所以那便是大家要做的业务了(即s3cfb.c部分的贯彻)。
3、数据结构及接口函数
从帧缓冲设备驱动程序结构看,该驱动首要跟fb_info结构体有关,该结构体记录了帧缓冲设备的全方位消息,包涵设备的安装参数、状态以及对底层硬件操作的函数指针。在Linux中,每1个帧缓冲设备都必须呼应一个fb_info,fb_info在/linux/fb.h中的定义如下:(只列出首要的部分) 

 

esynos4412

struct fb_info {  
    int node;  
    int flags;  
    struct fb_var_screeninfo var;/*LCD可变参数结构体*/  
    struct fb_fix_screeninfo fix;/*LCD固定参数结构体*/  
    struct fb_monspecs monspecs; /*LCD显示器标准*/  
    struct work_struct queue;    /*帧缓冲事件队列*/  
    struct fb_pixmap pixmap;     /*图像硬件mapper*/  
    struct fb_pixmap sprite;     /*光标硬件mapper*/  
    struct fb_cmap cmap;         /*当前的颜色表*/  
    struct fb_videomode *mode;   /*当前的显示模式*/  
#ifdef CONFIG_FB_BACKLIGHT  
    struct backlight_device *bl_dev;/*对应的背光设备*/  
    struct mutex bl_curve_mutex;  
    u8 bl_curve[FB_BACKLIGHT_LEVELS];/*背光调整*/  
#endif  
#ifdef CONFIG_FB_DEFERRED_IO  
    struct delayed_work deferred_work;  
    struct fb_deferred_io *fbdefio;  
#endif  
    struct fb_ops *fbops; /*对底层硬件操作的函数指针*/  
    struct device *device;  
    struct device *dev;   /*fb设备*/  
    int class_flag;      
#ifdef CONFIG_FB_TILEBLITTING  
    struct fb_tile_ops *tileops; /*图块Blitting*/  
#endif  
    char __iomem *screen_base;   /*虚拟基地址*/  
    unsigned long screen_size;   /*LCD IO映射的虚拟内存大小*/   
    void *pseudo_palette;        /*伪16色颜色表*/   
#define FBINFO_STATE_RUNNING    0  
#define FBINFO_STATE_SUSPENDED  1  
    u32 state;  /*LCD的挂起或恢复状态*/  
    void *fbcon_par;  
    void *par;      
};  

S5P4418

struct fb_info {
    atomic_t count;
    int node;
    int flags;
    struct mutex lock;        /* Lock for open/release/ioctl funcs */
    struct mutex mm_lock;        /* Lock for fb_mmap and smem_* fields */
    struct fb_var_screeninfo var;    /* Current var */
    struct fb_fix_screeninfo fix;    /* Current fix */
    struct fb_monspecs monspecs;    /* Current Monitor specs */
    struct work_struct queue;    /* Framebuffer event queue */
    struct fb_pixmap pixmap;    /* Image hardware mapper */
    struct fb_pixmap sprite;    /* Cursor hardware mapper */
    struct fb_cmap cmap;        /* Current cmap */
    struct list_head modelist;      /* mode list */
    struct fb_videomode *mode;    /* current mode */

#ifdef CONFIG_FB_BACKLIGHT
    /* assigned backlight device */
    /* set before framebuffer registration, 
       remove after unregister */
    struct backlight_device *bl_dev;

    /* Backlight level curve */
    struct mutex bl_curve_mutex;    
    u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdef CONFIG_FB_DEFERRED_IO
    struct delayed_work deferred_work;
    struct fb_deferred_io *fbdefio;
#endif

    struct fb_ops *fbops;
    struct device *device;        /* This is the parent */
    struct device *dev;        /* This is this fb device */
    int class_flag;                    /* private sysfs flags */
#ifdef CONFIG_FB_TILEBLITTING
    struct fb_tile_ops *tileops;    /* Tile Blitting */
#endif
    char __iomem *screen_base;    /* Virtual address */
    unsigned long screen_size;    /* Amount of ioremapped VRAM or 0 */ 
    void *pseudo_palette;        /* Fake palette of 16 colors */ 
#define FBINFO_STATE_RUNNING    0
#define FBINFO_STATE_SUSPENDED    1
    u32 state;            /* Hardware state i.e suspend */
    void *fbcon_par;                /* fbcon use-only private area */
    /* From here on everything is device dependent */
    void *par;
    /* we need the PCI or similar aperture base/size not
       smem_start/size as smem_start may just be an object
       allocated inside the aperture so may not actually overlap */
    struct apertures_struct {
        unsigned int count;
        struct aperture {
            resource_size_t base;
            resource_size_t size;
        } ranges[0];
    } *apertures;
};

 

个中,比较首要的分子有struct fb_var_screeninfo
var、structfb_fix_screeninfo fix和struct fb_ops
*fbops,他们也都以结构体。
fb_var_screeninfo结构体首要记录用户能够修改的控制器的参数,比如显示屏的分辨率和各种像素的比特数等,该组织体定义如下:

 4412

struct fb_var_screeninfo {  
    __u32 xres;                /*可见屏幕一行有多少个像素点*/  
    __u32 yres;                /*可见屏幕一列有多少个像素点*/  
    __u32 xres_virtual;        /*虚拟屏幕一行有多少个像素点*/          
    __u32 yres_virtual;        /*虚拟屏幕一列有多少个像素点*/  
    __u32 xoffset;             /*虚拟到可见屏幕之间的行偏移*/  
    __u32 yoffset;             /*虚拟到可见屏幕之间的列偏移*/  
    __u32 bits_per_pixel;      /*每个像素的位数即BPP*/  
    __u32 grayscale;           /*非0时,指的是灰度*/  
    struct fb_bitfield red;    /*fb缓存的R位域*/  
    struct fb_bitfield green;  /*fb缓存的G位域*/  
    struct fb_bitfield blue;   /*fb缓存的B位域*/  
    struct fb_bitfield transp; /*透明度*/      
    __u32 nonstd;              /* != 0 非标准像素格式*/  
    __u32 activate;                  
    __u32 height;              /*高度*/  
    __u32 width;               /*宽度*/  
    __u32 accel_flags;      
    /*定时:除了pixclock本身外,其他的都以像素时钟为单位*/  
    __u32 pixclock;            /*像素时钟(皮秒)*/  
    __u32 left_margin;         /*行切换,从同步到绘图之间的延迟*/  
    __u32 right_margin;        /*行切换,从绘图到同步之间的延迟*/  
    __u32 upper_margin;        /*帧切换,从同步到绘图之间的延迟*/  
    __u32 lower_margin;        /*帧切换,从绘图到同步之间的延迟*/  
    __u32 hsync_len;           /*水平同步的长度*/  
    __u32 vsync_len;           /*垂直同步的长度*/  
    __u32 sync;  
    __u32 vmode;  
    __u32 rotate;  
    __u32 reserved[5];         /*保留*/  
};   

 4418

struct fb_var_screeninfo {
    __u32 xres;            /* visible resolution        */
    __u32 yres;
    __u32 xres_virtual;        /* virtual resolution        */
    __u32 yres_virtual;
    __u32 xoffset;            /* offset from virtual to visible */
    __u32 yoffset;            /* resolution            */

    __u32 bits_per_pixel;        /* guess what            */
    __u32 grayscale;        /* 0 = color, 1 = grayscale,    */
                    /* >1 = FOURCC            */
    struct fb_bitfield red;        /* bitfield in fb mem if true color, */
    struct fb_bitfield green;    /* else only length is significant */
    struct fb_bitfield blue;
    struct fb_bitfield transp;    /* transparency            */    

    __u32 nonstd;            /* != 0 Non standard pixel format */

    __u32 activate;            /* see FB_ACTIVATE_*        */

    __u32 height;            /* height of picture in mm    */
    __u32 width;            /* width of picture in mm     */

    __u32 accel_flags;        /* (OBSOLETE) see fb_info.flags */

    /* Timing: All values in pixclocks, except pixclock (of course) */
    __u32 pixclock;            /* pixel clock in ps (pico seconds) */
    __u32 left_margin;        /* time from sync to picture    */
    __u32 right_margin;        /* time from picture to sync    */
    __u32 upper_margin;        /* time from sync to picture    */
    __u32 lower_margin;
    __u32 hsync_len;        /* length of horizontal sync    */
    __u32 vsync_len;        /* length of vertical sync    */
    __u32 sync;            /* see FB_SYNC_*        */
    __u32 vmode;            /* see FB_VMODE_*        */
    __u32 rotate;            /* angle we rotate counter clockwise */
    __u32 colorspace;        /* colorspace for FOURCC-based modes */
    __u32 reserved[4];        /* Reserved for future compatibility */
};

 

而fb_fix_screeninfo结构体又重视记录用户不能修改的控制器的参数,比如显示屏缓冲区的大体地址和长短等,该结构体的概念如下:

4412

struct fb_fix_screeninfo {  
    char id[16];                /*字符串形式的标示符 */  
    unsigned long smem_start;   /*fb缓存的开始位置 */  
    __u32 smem_len;             /*fb缓存的长度 */  
    __u32 type;                 /*看FB_TYPE_* */  
    __u32 type_aux;             /*分界*/  
    __u32 visual;               /*看FB_VISUAL_* */   
    __u16 xpanstep;             /*如果没有硬件panning就赋值为0 */  
    __u16 ypanstep;             /*如果没有硬件panning就赋值为0 */  
    __u16 ywrapstep;            /*如果没有硬件ywrap就赋值为0 */  
    __u32 line_length;          /*一行的字节数 */  
    unsigned long mmio_start;   /*内存映射IO的开始位置*/  
    __u32 mmio_len;             /*内存映射IO的长度*/  
    __u32 accel;  
    __u16 reserved[3];          /*保留*/  
}; 

4418

struct fb_fix_screeninfo {
    char id[16];            /* identification string eg "TT Builtin" */
    unsigned long smem_start;    /* Start of frame buffer mem */
                    /* (physical address) */
    __u32 smem_len;            /* Length of frame buffer mem */
    __u32 type;            /* see FB_TYPE_*        */
    __u32 type_aux;            /* Interleave for interleaved Planes */
    __u32 visual;            /* see FB_VISUAL_*        */ 
    __u16 xpanstep;            /* zero if no hardware panning  */
    __u16 ypanstep;            /* zero if no hardware panning  */
    __u16 ywrapstep;        /* zero if no hardware ywrap    */
    __u32 line_length;        /* length of a line in bytes    */
    unsigned long mmio_start;    /* Start of Memory Mapped I/O   */
                    /* (physical address) */
    __u32 mmio_len;            /* Length of Memory Mapped I/O  */
    __u32 accel;            /* Indicate to driver which    */
                    /*  specific chip/card we have    */
    __u16 capabilities;        /* see FB_CAP_*            */
    __u16 reserved[2];        /* Reserved for future compatibility */
};

 

 

fb_ops结构体是对底层硬件操作的函数指针,该结构体中定义了对硬件的操作有:(这里只列出了常用的操作) 

 4412

struct fb_ops {  
    struct module *owner;  
    //检查可变参数并进行设置  
    int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);  
    //根据设置的值进行更新,使之有效  
    int (*fb_set_par)(struct fb_info *info);  
    //设置颜色寄存器  
    int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,  
             unsigned blue, unsigned 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);  
};  

 4418

struct fb_ops {
    /* open/release and usage marking */
    struct module *owner;
    int (*fb_open)(struct fb_info *info, int user);
    int (*fb_release)(struct fb_info *info, int user);

    /* For framebuffers with strange non linear layouts or that do not
     * work with normal memory mapped access
     */
    ssize_t (*fb_read)(struct fb_info *info, char __user *buf,
               size_t count, loff_t *ppos);
    ssize_t (*fb_write)(struct fb_info *info, const char __user *buf,
                size_t count, loff_t *ppos);

    /* checks var and eventually tweaks it to something supported,
     * DO NOT MODIFY PAR */
    int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);

    /* set the video mode according to info->var */
    int (*fb_set_par)(struct fb_info *info);

    /* set color register */
    int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
                unsigned blue, unsigned transp, struct fb_info *info);

    /* set color registers in batch */
    int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);

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

    /* pan display */
    int (*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);

    /* Draws a rectangle */
    void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);
    /* Copy data from area to another */
    void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);
    /* Draws a image to the display */
    void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);

    /* Draws cursor */
    int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor);

    /* Rotates the display */
    void (*fb_rotate)(struct fb_info *info, int angle);

    /* wait for blit idle, optional */
    int (*fb_sync)(struct fb_info *info);

    /* perform fb specific ioctl (optional) */
    int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,
            unsigned long arg);

    /* Handle 32bit compat ioctl (optional) */
    int (*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,
            unsigned long arg);

    /* perform fb specific mmap */
    int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);

    /* get capability given var */
    void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,
                struct fb_var_screeninfo *var);

    /* teardown any resources to do with this framebuffer */
    void (*fb_destroy)(struct fb_info *info);

    /* called at KDB enter and leave time to prepare the console */
    int (*fb_debug_enter)(struct fb_info *info);
    int (*fb_debug_leave)(struct fb_info *info);
};

 

6、Framebuffer设备注册 S3cfb.c中的s3cfb_probe设备探测,是驱动注册的最主要函数,

公海赌船网址 7

/*概念一个构造体用来保卫安全驱动程序中各函数中用到的变量
  先别看结构体要定义这几个分子,到各函数使用的地点就了解了*/

static int __devinit s3cfb_probe(struct platform_device *pdev)  
{  
    struct s3c_platform_fb *pdata;/*LCD屏配置信息结构体*/  
    struct s3cfb_global *fbdev;/*驱动程序全局变量结构体*/  
    struct resource *res; /*用来保存从LCD平台设备中获取的LCD资源*/  
    int i, j, ret = 0;  

    printk("%s\n",__func__);  
    fbdev = kzalloc(sizeof(struct s3cfb_global), GFP_KERNEL);  
    if (!fbdev) {  
        dev_err(&pdev->dev, "failed to allocate for "  
            "global fb structure\n");  
        ret = -ENOMEM;  
        goto err_global;  
    }  
    fbdev->dev = &pdev->dev;  

    fbdev->regulator = regulator_get(&pdev->dev, "pd");  
    if (!fbdev->regulator) {  
        dev_err(fbdev->dev, "failed to get regulator\n");  
        ret = -EINVAL;  
        goto err_regulator;  
    }  
    ret = regulator_enable(fbdev->regulator);  
    if (ret < 0) {  
        dev_err(fbdev->dev, "failed to enable regulator\n");  
        ret = -EINVAL;  
        goto err_regulator;  
    }  

    /*获取LCD参数信息*/  
    pdata = to_fb_plat(&pdev->dev);  
    if (!pdata) {  
        dev_err(fbdev->dev, "failed to get platform data\n");  
        ret = -EINVAL;  
        goto err_pdata;  
    }  

    fbdev->lcd = (struct s3cfb_lcd *)pdata->lcd;  

    /*配置GPIO端口*/  
    if (pdata->cfg_gpio)  
        pdata->cfg_gpio(pdev);  

    /*设置时钟参数*/  
    if (pdata->clk_on)  
        pdata->clk_on(pdev, &fbdev->clock);  

    /*获取LCD平台设备所使用的IO端口资源,注意这个IORESOURCE_MEM标志和LCD平台设备定义中的一致*/  
    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  
    if (!res) {  
        dev_err(fbdev->dev, "failed to get io memory region\n");  
        ret = -EINVAL;  
        goto err_io;  
    }  

    /*申请LCD IO端口所占用的IO空间(注意理解IO空间和内存空间的区别),request_mem_region定义在ioport.h中*/  
    res = request_mem_region(res->start,  
                 res->end - res->start + 1, pdev->name);  
    if (!res) {  
        dev_err(fbdev->dev, "failed to request io memory region\n");  
        ret = -EINVAL;  
        goto err_io;  
    }  

    /*将LCD的IO端口占用的这段IO空间映射到内存的虚拟地址,ioremap定义在io.h中 
         注意:IO空间要映射后才能使用,以后对虚拟地址的操作就是对IO空间的操作*/  
    fbdev->regs = ioremap(res->start, res->end - res->start + 1);  
    if (!fbdev->regs) {  
        dev_err(fbdev->dev, "failed to remap io region\n");  
        ret = -EINVAL;  
        goto err_mem;  
    }  
#ifdef CONFIG_FB_S3C_LTE480WV  
    /*设置寄存器初始状态*/  
    s3cfb_pre_init_para(fbdev);   
#endif  

    /*设置gamma 值*/   
    s3cfb_set_gamma(fbdev);  
    /*设置VSYNC中断*/  
    s3cfb_set_vsync_interrupt(fbdev, 1);  
    /*设置全局中断*/  
    s3cfb_set_global_interrupt(fbdev, 1);  
    /*fb设备参数信息初始化*/  
    s3cfb_init_global(fbdev);  

    /*为framebuffer分配空间,进行内存映射,填充fb_info*/  
    if (s3cfb_alloc_framebuffer(fbdev)) {  
        ret = -ENOMEM;  
        goto err_alloc;  
    }  

    /*注册fb设备到系统中*/  
    if (s3cfb_register_framebuffer(fbdev)) {  
        ret = -EINVAL;  
        goto err_register;  
    }  

    s3cfb_set_clock(fbdev);  
    s3cfb_set_window(fbdev, pdata->default_win, 1);  

    s3cfb_display_on(fbdev);  

    fbdev->irq = platform_get_irq(pdev, 0);  
    if (request_irq(fbdev->irq, s3cfb_irq_frame, IRQF_SHARED,  
            pdev->name, fbdev)) {  
        dev_err(fbdev->dev, "request_irq failed\n");  
        ret = -EINVAL;  
        goto err_irq;  
    }  

#ifdef CONFIG_FB_S3C_LCD_INIT  
    if (pdata->backlight_on)  
        pdata->backlight_on(pdev);  

    if (!bootloaderfb && pdata->reset_lcd)  
        pdata->reset_lcd(pdev);  

    if (pdata->lcd_on)  
        pdata->lcd_on(pdev);  
#endif  

#ifdef CONFIG_HAS_EARLYSUSPEND  
    fbdev->early_suspend.suspend = s3cfb_early_suspend;  
    fbdev->early_suspend.resume = s3cfb_late_resume;  
    fbdev->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB;  
    register_early_suspend(&fbdev->early_suspend);  
#endif  

    /*对设备文件系统的支持,创建fb设备文件*/  
    ret = device_create_file(&(pdev->dev), &dev_attr_win_power);  
    if (ret < 0)  
        dev_err(fbdev->dev, "failed to add sysfs entries\n");  

    dev_info(fbdev->dev, "registered successfully\n");  

    /*显示开机logo*/  
#if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)  
    if (fb_prepare_logo( fbdev->fb[pdata->default_win], FB_ROTATE_UR)) {  
        printk("Start display and show logo\n");  
        /* Start display and show logo on boot */  
        fb_set_cmap(&fbdev->fb[pdata->default_win]->cmap, fbdev->fb[pdata->default_win]);  
        fb_show_logo(fbdev->fb[pdata->default_win], FB_ROTATE_UR);  
    }  
#endif  

    return 0;  
}  

4418的是在kernel\drivers\video 重要不外乎 nxp-fb.c

LCD控制器作为挂载在S5P4418
CPU总线上的多个模块,是platform虚拟总线上的一个设施。因而,在外边的驱动里应该将该驱动注册到platform
bus。同时,大家依照第2篇所学知识,简单精晓该驱动应该是二个字符设备类驱动。代码如下:

static int nxp_fb_probe(struct platform_device *pdev)
{
    struct nxp_fb_plat_data *plat = pdev->dev.platform_data;
    struct fb_info *info = NULL;
#ifdef CONFIG_FB_NXP_ION_MEM
    struct nxp_fb_device *fbdev;
    struct nxp_fb_param *fbpar;
#endif
    int i = 0, ret = 0;

    pr_debug("\n%s (name=%s, id=%d)\n", __func__, dev_name(&pdev->dev), pdev->id);

    /*    allocate fb_info and init */
    info = nxp_fb_init_fb(pdev->id, &pdev->dev);
    if(! info) {
        ret = -ENOMEM;
        goto err_fb;
    }

    ret = nxp_fb_setup_param(pdev->id, info, plat);
    if (0 > ret)
        goto err_map;

    nxp_fb_setup_info(info);

#ifdef CONFIG_FB_NXP_ION_MEM
    fbpar = info->par;
    fbdev = &fbpar->fb_dev;
    fbdev->dev = &pdev->dev;

    ret = nxp_fb_setup_ion(&fbpar->fb_dev.dma_buf_data);
    if (ret) {
        printk(KERN_ERR "Fail to setup ion\n");
        goto err_map;
    }
#endif

    /*    allocate frame buffer memory from here */
    ret = nxp_fb_alloc_mem(info);
    if(ret) {
        printk(KERN_ERR "Fail, unable to allcate frame buffer (%d)\n", pdev->id);
        goto err_map;
    }
    nxp_fb_init_display(info);

    /*
      *     device_create '/proc/fb0' & fb class
     *     register machine file operation to frame buffer file operation
      *     registered_fb[]
      *     (drivers/video/fbmem.c)
      */
    if (pdev->id != 0) {
        for (i = 0; pdev->id > i; i++) {
            if (!registered_fb[i]) {
                printk("FB: Reserve dev/node [%d]\n", i);
                registered_fb[i] = info;
            }
        }
    }

    ret = register_framebuffer(info);
    if(ret < 0) {
        printk(KERN_ERR "Fail, unable to register frame buffer(%d)\n", pdev->id);
        goto err_reg;
    }

    /* register to driver data, use platform_get_drvdata */
    platform_set_drvdata(pdev, info);

    //gpio_request(CFG_IO_LCD_POWER, "LCE_POWER");
    //gpio_direction_output(CFG_IO_LCD_POWER,0);
    //mdelay(300);
    //gpio_direction_output(CFG_IO_LCD_POWER,1);
    printk("--%s----\n\n",__func__);

    return ret;

err_reg:
    unregister_framebuffer(info);
err_map:
    nxp_fb_free_mem(info);
err_fb:
    nxp_fb_exit_fb(info);

    return ret;
}

 

七、怎么着阅读LCD规格书
首先大家调节和测试LCD的时候要获得的局部参数,没须求把全部规格书通读二次,小编刚起初调节和测试屏的时候获得二个规格书不清楚从何入手,也不知那个参数有用,相比较模糊,其实只领到部分卓有效用的音信就足以,上边那几个对初学者或者有点用处。

1、GeneralSpecification 尺寸、分辨率、位数、色彩、像素时钟频率、接口类型
(1)、尺寸:

公海赌船网址 8

 

(2)、分辨率:1920
1200;

公海赌船网址 9

(3)、接口:双通道LVDS;

公海赌船网址 10

(4)、色彩:16.7M,那里能够确认数据位数8bitGL450GB三色:3*8=24,2的24次方=16.7M

6bitRGB 三色:3*6=18,2的18次方=262
144;

故而当见到色彩是1.7M是,说明LCD是24bit的,借使是262 144验证LCD是18bit的。

公海赌船网址 11

2、Timing
Characteristics

公海赌船网址 12

 

(1)、Frame rate :是60HZ,也正是帧率;
(2)、clock
frequency:像素时钟,那中间有最大值、中间值和微小值,这几个屏暗中同意值为:76.36MHz;
(3)、Vertical Seciton:VSWidth +Back Porc+Front
Porch,前距离、后间距。这几个大家再帕JeroGB信号哪儿详细分解,那几个大家如今有说过;
(4)、Horizontal Section:HS Width +Back Porc+Front Porch,这个跟VS的Porch相同。

三 、LCD  Timing
diagram信号时序图,如下所示

稍加读者会问,为啥没有行、场、数据等信号。其实这一个是LVDS信号的时序,那几个依据屏厂的习惯,有的画的是LVDS输入的信号时序,有的是TTL(LacrosseGB)的时序。

公海赌船网址 13

 

上边大家以二个例子表明,做驱动的(软件上边)要了解的片段参数,要是是硬件方面包车型大巴题材,能够再对一下接口。其实一个LCD规格书要打听的不过如此多,调节和测试软件就足足:
(1)、General
Specification中可获得,尺寸、分辨率、位数、色彩、像素时钟频率、接口类型;
(2)、Timing Characteristics中得以拿走一些切实可行的参数;
(3)、LCD  Timing diagram信号时序图,能够看到有的信号的时序、极性等;

八、PWM概述
一 、先表达三个名词:
PWM:脉冲宽度调制(PWM),是英文“Pulse
WidthModulation”的缩写,简称脉宽调制。
占空比:占空比(DutyRation)在邮电通讯领域中有如下含义:
在一串理想的脉冲周期系列中(如方波),正脉冲的持续时间与脉冲总周期的比值。例如:(要是脉冲为3V)
脉冲宽度
1μs,信号周期4μs的脉冲类别占空比为0.25,平均电压为:3*0.25=0.75V;
脉冲宽度 0μs,信号周期4μs的脉冲种类占空比为0,平均电压为:0V;
脉冲宽度 4μs,信号周期4μs的脉冲类别占空比为1,平均电压为:3V;

公海赌船网址 14

 

平均电压的变化成阶梯型变化,假使T丰富小,成线性。

公海赌船网址 15

看下芯片片规格书中的描述:寄存器填分歧值是,脉冲宽度不雷同。

公海赌船网址 16
2、samusng 中的PWM控制器

公海赌船网址 17

 

PWM时钟分频。跟单片机里面包车型大巴有点像。死区控制器:那个是依照晶体管的天性,设置那个功用的,然则我工作中还不曾利用死区控制这块。理解有其一概念。

公海赌船网址 18

看这一个寄存器,记得用MINI2440写裸机程序的时候,直接写这一个寄存器,记得上学时把s3c2440当单片机玩,有点浪费。学生时期,已长逝的常青??

公海赌船网址 19

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. S3C2440内部LCD控制器结构图:

Linux中的LCD驱动,链接如下:

公海赌船网址 20

(Linux-LCD层次分析链接:http://www.cnblogs.com/lifexy/p/7603327.html)

大家依据数量手册来叙述一下以此集成在S3C2440里边的LCD控制器:

(Linux-LCD驱动分析链接:http://www.cnblogs.com/lifexy/p/7604011.html)

a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDP奇骏CS寄存器组成;

 

b:REGBANK由1多少个可编制程序的寄存器组和一块256*16的调色板内存组合,它们用来配置LCD控制器的;

 

c:LCDCDMA是3个专用的DMA,它能活动地把在侦内部存款和储蓄器中的录像数据传送到LCD驱动器,通过选择那一个DMA通道,摄像数据在不需求CPU的干预的意况下显得在LCD屏上;


d:VIDPRCS接收来自LCDCDMA的数据,将数据转换为适龄的数量格式,比如说八分之四位单扫,4个人双扫呈现情势,然后经过数据端口VD[23:0]传送录像数据到LCD驱动器;

 

e:TIMEGEN由可编制程序的逻辑组成,他生成LCD驱动器必要的操纵信号,比如VSYNC、HSYNC、VCLK和LEND等,而这么些决定信号又与REGBANK寄存器组中的LCDCON3/6/75%/5的陈设密切相关,通过区别的布署,TIMEGEN就能发出那么些信号的不比形态,从而帮助分化的LCD驱动器(即区别的STN/TFT屏)。

横屏4.3寸LCD为480*272(行:477个像素点
       列:2柒十二个行)

  FIFO存款和储蓄器位于LCDCDMA.。当FIFO空或部分空时,LCDCDMA须要从帧缓冲中取来要体现的图像数据,而以此帧缓冲是LCD控制器在RAM中开辟的一片缓冲区。当以此传输请求被储存控制器中的总线仲裁器接收到后,从系统存款和储蓄器到里头FIFO就会中标传输多少个字节。FIFO的总大小是27个字,个中没有FIFOL是11个字,高位FIFOH是15个字。

1.LCD原理图 :

 

公海赌船网址 21

2. 常见TFT屏工作时序分析:

Pin1- Pin6:Von/ Voff
 
电源正/负(由GPG4说了算,高电平有效)

公海赌船网址 22

Pin2:VM/VDEN 数据使能信号
(0:表示正在跳行,1:表示能够传输像素数据) 

 

Pin8:VLINE/HSYNC 水平同步信号(每扫完一行,即发3回水平同步信号)  

3.LCD提供的外部接口信号:
VSYNC/VFRAME/S电视机:垂直同步信号(TFT)/帧同步信号(STN)/SEC
TFT信号;
HSYNC/VLINE/CPV:水平同步信号(TFT)/行同步脉冲信号(STN)/SEC
TFT信号;
VCLK/LCD_HCLK:象素时钟信号(TFT/STN)/SEC
TFT信号;
VD[23:0]:LCD像素数据输出端口(TFT/STN/SEC
TFT);
VDEN/VM/TP:数据使能信号(TFT)/LCD驱动调换偏置信号(STN)/SEC
TFT 信号;
LEND/STH:行终止信号(TFT)/SEC
TFT信号;
LCD_LPCOE:SEC TFT OE信号;
LCD_LPCREV:SEC TFT REV信号;
LCD_LPCREVB:SEC TFT
REVB信号。

Pin28:VFRAME/VSNC 垂直同步信号(每扫完一屏,即发三遍垂直同步信号) 

 

Pin30:VLCK 时钟信号 

负有显示屏显示图像的规律都是从上到下,从左到右的。那是如何看头吧?这么说啊,一副图像能够当做是3个矩形,由许多排列整齐的点一行一行组成,那么些点称之为像素。那么那幅图在LCD上的显得原理正是:
A:展现指针从矩形左上角的第三行第②个点早先,贰个点1个点的在LCD上出示,在上头的时序图上用时间线意味着就为VCLK,我们称为像素时钟信号;
B:当呈现指针平素展现到矩形的右手就终止这一行,那么这一行的动作在上面的时序图中就称为1
Line;
C:接下去呈现指针又回到矩形的左侧从第壹行初始显得,注意,显示指针在从第3行的右边回到第1行的右边是索要一定的年华的,大家称为行切换;
D:如此类推,呈现指针就像是此一行一行的显得至矩形的右下角才把一副图展现成功。由此,这一行一行的映未来岁月线上看,正是时序图上的HSYNC;
E:然则,LCD的体现并不是对一副图像飞快的显示一下,为了不断和鄂州久安的在LCD上显得,就供给切换成另一幅图上(另一幅图能够和上一副图一样恐怕不均等,目的只是为了将图像持续的展现在LCD上)。那么这一副一副的图像就称之为帧,在时序图上就象征为1
Frame,由此从时序图上可以看出1 Line只是1 Frame中的一行;
F:同样的,在帧与帧切换之间也是亟需自然的日子的,大家称之为帧切换,那么LCD整个展现的历程在岁月线上看,就可代表为时序图上的VSYNC。

Pin42,Pin45 LED+,LED-   背光呈现开关
(由0:off   1:no)

 

VD23~VD19:R信号   

下边时序图上各时钟延时参数的意义如下:(这个参数的值,LCD发生香港中华厂商联合会提供相应的数量手册)
VBPD(vertical back
porch):表示在一帧图像初叶时,垂直同步信号之后的失效的行数,对应驱动中的upper_margin;
VFBD(vertical front
porch):表示在一帧图像结束后,垂直同步信号在此以前的失效的行数,对应驱动中的lower_margin;
VSPW(vertical sync pulse
width):表示垂直同步脉冲的增长幅度,用行数总括,对应驱动中的vsync_len;
HBPD(horizontal back
porch):表示从品位同步信号初步到一行的卓有作用数据开端之间的VCLK的个数,对应驱动中的left_margin;
HFPD(horizontal front
porth):表示一行的有用数据截至到下一个品位同步信号开端之间的VCLK的个数,对应驱动中的right_margin;
HSPW(horizontal sync pulse
width):表示水平同步信号的上升幅度,用VCLK计算,对应驱动中的hsync_len;

VD15~VD10:G信号 

注:对此2个已知尺寸的LCD屏,只要分明了VCLK值,行频和场频就应有领悟了。但如此还万分的,因为在每一帧时钟信号中,还会有部分与屏显示非亲非故的时钟出现,那就给明确行频和场频带来了肯定的复杂性。如在HSYNC信号先后会有档次同步信号前肩(HFPD)和品位同步信号后肩(HBPD)出现,在VSYNC信号先后会有垂直同步信号前肩(VFPD)和垂直同步信号后肩(VBPD)出现,在那么些信号时序内,不会有有效像素信号出现,此外HSYNC和VSYNC信号有效时,其电平要保险自然的时光,它们分小名叫水平同步信号脉宽HSPW和垂直同步信号脉宽VSPW,那段日子也无法有像素信号。因而总括行频和场频时,一定要包含那一个信号。

VD7~VD3    :B信号 

 

多少是选择16Bpp像素,SportageGB565格式(因为LCD控制器不支持18Bpp格式) 

对此上述这么些参数的值将分头保存到REGBANK寄存器组中的LCDCON一半/百分之七十五/5寄存器中:(对寄存器的操作请查看S3c2440数据手册LCD部分)

诸如:灰褐陆风X8GB值分别为209,92,174(11010001,01011100,10101110)

公海赌船网址 23

数码从高位往下取,Escort和B取陆人,G取7个人,那么值为0XD2F5。

公海赌船网址 24

565TiguanGB引脚总是图如下:

公海赌船网址 25

公海赌船网址 26

 

 

公海赌船网址 27

1.2配备引脚

 

1     GPCUP   = 0xffffffff;   // 禁止内部上拉
2     GPCCON  = 0xaaaaaaaa;   // GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND 
3     GPDUP   = 0xffffffff;   // 禁止内部上拉
4     GPDCON  = 0xaaaaaaaa;   // GPIO管脚用于VD[23:8]
5     GPBCON &= ~(GPB0_MSK);  // Power enable pin
6     GPBCON |= GPB0_out;
7     GPBDAT &= ~(1<<0);            // Power off

公海赌船网址 28

2.设置LCDCON1~5控制寄存器

 

2.1BSWP和HWSWP介绍

  1. 帧缓冲(FrameBuffer):

更改存款和储蓄格式,对于16bppCRUISERGB565(高数据在后)来说,BSWP=0,
HWSWP=1

  帧缓冲是Linux为展现设备提供的四个接口,它把部分来得设备描述成三个缓冲区,允许应用程序通过
FrameBuffer定义好的接口访问那么些图片设备,从而不用去关注具体的硬件细节。对于帧缓冲设备而言,只要在突显缓冲区与展现点对应的区域写入颜色值,对应的水彩就会自行的在显示器上显得。下边来看一下在不相同色位情势下缓冲区与显示点的相应关系:

公海赌船网址 29

公海赌船网址 30

2.2翻看2440中LCD控制器开首状态时序图:

 

公海赌船网址 31

一.开端化(GPC管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND)

VSPW: 垂直同步脉冲宽度 pulse
widch 

二.对此控制TFT
LCD来说,只用设置寄存器LCDCON1~LCDCON5(用于选拔LCD类型,设置各个控制信号的时辰脾性等)和LCDSADDEscort1~LCDSADD途睿欧3(用于安装帧内部存款和储蓄器地址)多少个寄存器就足以了。对于那多少个寄存器的安装

VBPD:
垂直脉冲后沿延迟(用来等待LCD模块响应的小运)  back delay 

其间VBPD,VFPD,VSPW,HBPD,HFPD,HSPW那多少个参数是有LCD生产商提供的,依据其datashet修改正是了。

VFPD:
垂直脉冲前沿延迟(用来等待LCD模块响应的小运)  Front delay

7人色显比14个人等多早先化了调色板

HSPW: 行同步脉冲宽度 pulse
widch 

公海赌船网址 32公海赌船网址 33

HBPD:
行脉冲后沿延迟(用来等待LCD模块响应的光阴)  back delay 

  1 /*
  2  * FILE: lcddrv.h
  3  * 操作LCD控制器、调色板等的底层函数接口
  4  */
  5 
  6 #ifndef __LCDDRV_H__
  7 #define __LCDDRV_H__
  8 
  9 #include <types.h>
 10 
 11 #define LOWER21BITS(n)  ((n) & 0x1fffff)
 12 
 13 #define BPPMODE_1BPP    0x8
 14 #define BPPMODE_2BPP    0x9
 15 #define BPPMODE_4BPP    0xA
 16 #define BPPMODE_8BPP    0xB
 17 #define BPPMODE_16BPP   0xC
 18 #define BPPMODE_24BPP   0xD
 19 
 20 #define LCDTYPE_TFT     0x3
 21 
 22 #define ENVID_DISABLE   0
 23 #define ENVID_ENABLE    1
 24 
 25 #define FORMAT8BPP_5551 0
 26 #define FORMAT8BPP_565  1
 27 
 28 #define HSYNC_NORM      0
 29 #define HSYNC_INV       1
 30 
 31 #define VSYNC_NORM      0
 32 #define VSYNC_INV       1
 33 
 34 #define BSWP            1
 35 #define HWSWP           1
 36 
 37 //TFT LCD Panel(240*320)
 38 #define MODE_TFT_1BIT_240320     (0x4101)
 39 #define MODE_TFT_8BIT_240320      (0x4102)
 40 #define MODE_TFT_16BIT_240320    (0x4104)
 41 #define MODE_TFT_24BIT_240320    (0x4108)
 42 
 43 //TFT 240320
 44 #define LCD_XSIZE_TFT_240320     (240)    
 45 #define LCD_YSIZE_TFT_240320     (320)
 46 
 47 //TFT 240320
 48 #define HOZVAL_TFT_240320    (LCD_XSIZE_TFT_240320-1)
 49 #define LINEVAL_TFT_240320    (LCD_YSIZE_TFT_240320-1)
 50 
 51 #define CLKVAL_TFT_240320    (4)
 52 // 60hz @133Mhz
 53 // (9) 60hz @100Mhz
 54 
 55 //Timing parameter for LTS350Q1(SAMSUNG) 
 56 #define VBPD_240320        ((6-1)&0xff)
 57 #define VFPD_240320        ((4-1)&0xff)
 58 #define VSPW_240320        ((2-1) &0x3f)
 59 #define HBPD_240320        ((11-1)&0x7f)
 60 #define HFPD_240320        ((2-1)&0xff)
 61 #define HSPW_240320        ((1-1)&0xff)
 62 
 63 
 64 
 65 //TFT LCD Panel(640*480)
 66 #define MODE_TFT_1BIT_640480     (0x4201)
 67 #define MODE_TFT_8BIT_640480     (0x4202)
 68 #define MODE_TFT_16BIT_640480    (0x4204)
 69 #define MODE_TFT_24BIT_640480    (0x4208)
 70 
 71 //TFT 640480
 72 #define LCD_XSIZE_TFT_640480     (640)    
 73 #define LCD_YSIZE_TFT_640480     (480)
 74 
 75 //TFT640480
 76 #define HOZVAL_TFT_640480    (LCD_XSIZE_TFT_640480-1)
 77 #define LINEVAL_TFT_640480    (LCD_YSIZE_TFT_640480-1)
 78 
 79 //Timing parameter for V16C6448AB(PRIME VIEW) 
 80 #define VBPD_640480        ((33-1)&0xff)
 81 #define VFPD_640480        ((10-1)&0xff)
 82 #define VSPW_640480        ((2-1) &0x3f)
 83 #define HBPD_640480        ((48-1)&0x7f)
 84 #define HFPD_640480        ((16-1)&0xff)
 85 #define HSPW_640480        ((96-1)&0xff)
 86 
 87 
 88 #define CLKVAL_TFT_640480     (1)
 89     //53.5hz @90Mhz
 90     //VSYNC,HSYNC should be inverted
 91     //HBPD=47VCLK,HFPD=15VCLK,HSPW=95VCLK
 92     //VBPD=32HSYNC,VFPD=9HSYNC,VSPW=1HSYNC
 93 
 94 #define LCDFRAMEBUFFER 0x30400000
 95 
 96 /*
 97  * 初始化用于LCD的引脚
 98  */
 99 void Lcd_Port_Init(void);
100 
101 /*
102  * 初始化LCD控制器
103  * 输入参数:
104  * type: 显示模式
105  *      MODE_TFT_8BIT_640480  : 640*640 8bpp的TFT LCD
106  *      MODE_TFT_16BIT_640480 : 640*640 16bpp的TFT LCD
107  */
108 void Tft_Lcd_Init(int type);
109 
110 /*
111  * 设置调色板
112  */
113 void Lcd_Palette8Bit_Init(void);
114 
115 /*
116  * 设置LCD控制器是否输出信号
117  * 输入参数:
118  * onoff: 
119  *      0 : 关闭
120  *      1 : 打开
121  */
122 void Lcd_EnvidOnOff(int onoff);
123 
124 /*
125  * 设置是否输出LCD电源开关信号LCD_PWREN
126  * 输入参数:
127  *     invpwren: 0 - LCD_PWREN有效时为正常极性
128  *               1 - LCD_PWREN有效时为反转极性
129  *     pwren:    0 - LCD_PWREN输出有效
130  *               1 - LCD_PWREN输出无效
131  */
132 void Lcd_PowerEnable(int invpwren, int pwren);
133 
134 /*
135  * 使用临时调色板寄存器输出单色图像
136  * 输入参数:
137  *     color: 颜色值,格式为0xRRGGBB
138  */
139 void ClearScrWithTmpPlt(UINT32 color);
140 
141 /*
142  * 停止使用临时调色板寄存器
143  */
144 void DisableTmpPlt(void);
145 
146 /*
147  * 改变调色板为一种颜色
148  * 输入参数:
149  *     color: 颜色值,格式为0xRRGGBB
150  */
151 void ChangePalette(UINT32 color);
152 
153 
154 #endif /*__LCDDRV_H__*/

HFPD:
行脉冲前沿延迟(用来等待LCD模块响应的小运)  Front delay

lcddrv.h

 LINEVAL:行数,用来控制垂直尺寸,对于4.3寸时,LINEVAL=272-1

 

HOZVAL:行数,用来控制水平像素点个数,对于4.3寸时,HOZVAL=480-1

公海赌船网址 34公海赌船网址 35

2.3 查看
LCD芯片手册时序图,总计周期时间:

  1 /*
  2  * FILE: lcddrv.c
  3  * 提供操作LCD控制器、调色板等的底层函数
  4  */
  5 
  6 #include <stdio.h>
  7 #include "s3c24xx.h"
  8 #include "lcddrv.h"
  9 
 10 #define GPB0_tout0  (2<<(0*2))
 11 #define GPB0_out    (1<<(0*2))
 12 #define GPB1_out    (1<<(1*2))
 13 
 14 #define GPB0_MSK    (3<<(0*2))
 15 #define GPB1_MSK    (3<<(1*2))
 16 
 17 
 18 unsigned int fb_base_addr;
 19 unsigned int bpp;
 20 unsigned int xsize;
 21 unsigned int ysize;
 22 
 23 static const unsigned short DEMO256pal[]={
 24     0x0b5e,0xce9a,0xffd9,0x9d99,0xb63a,0xae7c,0xdd71,0x6c57,0xfd4d,0x00ae,0x9c4d,0xb5f8,0xad96,0x0131,0x0176,0xefff,0xcedd,0x9556,0xe4bf,0x00b6,0x22b7,0x002b,0x89de,0x002c,0x57df,0xab5f,0x3031,0x14bf,0x797e,0x5391,0x93ab,0x7239,0x7453,0xafdf,0x71b9,0x8c92,0x014d,0x302e,0x5175,0x0029,0x0969,0x004e,0x2a6d,0x0021,0x3155,0x4b6e,0xd677,0xf6b6,0x9b5f,0x4bb5,0xffd5,0x0027,0xdfdf,0x74d8,0x1256,0x6bcd,0x9b08,0x2ab2,0xbd72,0x84b5,0xfe52,0xd4ad,0x00ad,0xfffc,0x422b,0x73b0,0x0024,0x5246,0x8e5e,0x28b3,0x0050,0x3b52,0x2a4a,0x3a74,0x8559,0x3356,0x1251,0x9abf,0x4034,0x40b1,
 25     0x8cb9,0x00b3,0x5c55,0xdf3d,0x61b7,0x1f5f,0x00d9,0x4c59,0x0926,0xac3f,0x925f,0x85bc,0x29d2,0xc73f,0xef5c,0xcb9f,0x827b,0x5279,0x4af5,0x01b9,0x4290,0xf718,0x126d,0x21a6,0x515e,0xefbd,0xd75e,0x42ab,0x00aa,0x10b3,0x7349,0x63b5,0x61a3,0xaadf,0xcb27,0x87df,0x6359,0xc7df,0x4876,0xb5bc,0x4114,0xfe2e,0xef5e,0x65be,0x43b9,0xe5df,0x21c9,0x7d16,0x6abb,0x5c11,0x49f7,0xbc0b,0x9e1a,0x3b0f,0x202b,0xff12,0x821b,0x842f,0xbccf,0xdefb,0x8a3e,0x68fa,0xa4f1,0x38ae,0x28b7,0x21ad,0x31d7,0x0073,0x182b,0x1831,0x3415,0xbdf6,0x2dbf,0x0a5d,0xc73d,0x182c,0x293e,0x7b3d,0x643d,0x3cbd,
 26     0x92dd,0x09d4,0x1029,0x7cdd,0x6239,0x182e,0x5aea,0x11eb,0x8abc,0x7bfa,0x00a7,0x2153,0x1853,0x1318,0x0109,0x54fa,0x72a7,0x89e3,0x01cf,0x3a07,0x7b17,0x1a14,0x2150,0x23dc,0x4142,0x1b33,0x00a4,0xf6df,0x08fc,0x18ae,0x3a7e,0x18d1,0xa51c,0xff5a,0x1a0f,0x28fa,0xdfbe,0x82de,0x60d7,0x1027,0x48fa,0x5150,0x6213,0x89d6,0x110d,0x9bbb,0xbedd,0x28e1,0x1925,0xf449,0xaa79,0xd5f4,0x693c,0x110a,0x2889,0x08a2,0x923d,0x10a6,0xd9bc,0x5b2e,0x32ec,0xcf7f,0x1025,0x2148,0x74b4,0x6d59,0x9d14,0x0132,0x00f0,0x56bf,0x00f1,0xffff,0x0173,0x0133,0x00b0,0x00b1,0xf7ff,0x08b1,0xfffe,0x08b0,
 27     0x0171,0xf7bf,0x10f3,0xf7fe,0x08ef,0x1192,0xefbe,0x1131,0x2177,0xff9f,0x1116,0xffbc,0x5914,0x22ef,0xb285,0xa6df,
 28 };
 29 
 30 /*
 31  * 初始化用于LCD的引脚
 32  */
 33 void Lcd_Port_Init(void)
 34 {
 35     GPCUP   = 0xffffffff;   // 禁止内部上拉
 36     GPCCON  = 0xaaaaaaaa;   // GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND 
 37     GPDUP   = 0xffffffff;   // 禁止内部上拉
 38     GPDCON  = 0xaaaaaaaa;   // GPIO管脚用于VD[23:8]
 39       GPBCON &= ~(GPB0_MSK);  // Power enable pin
 40     GPBCON |= GPB0_out;
 41     GPBDAT &= ~(1<<0);            // Power off
 42     printf("Initializing GPIO ports..........\n");
 43 }
 44 
 45 /*
 46  * 初始化LCD控制器
 47  * 输入参数:
 48  * type: 显示模式
 49  *      MODE_TFT_8BIT_240320  : 240*320 8bpp的TFT LCD
 50  *      MODE_TFT_16BIT_240320 : 240*320 16bpp的TFT LCD
 51  *      MODE_TFT_8BIT_640480  : 640*480 8bpp的TFT LCD
 52  *      MODE_TFT_16BIT_640480 : 640*480 16bpp的TFT LCD
 53  */
 54 void Tft_Lcd_Init(int type)
 55 {
 56     switch(type)
 57     {
 58     case MODE_TFT_8BIT_240320:
 59         /* 
 60          * 设置LCD控制器的控制寄存器LCDCON1~5
 61          * 1. LCDCON1:
 62          *    设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2]
 63          *    选择LCD类型: TFT LCD   
 64          *    设置显示模式: 8BPP
 65          *    先禁止LCD信号输出
 66          * 2. LCDCON2/3/4:
 67          *    设置控制信号的时间参数
 68          *    设置分辨率,即行数及列数
 69          * 现在,可以根据公式计算出显示器的频率:
 70          * 当HCLK=100MHz时,
 71          * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x
 72          *              {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x
 73          *              {2x(CLKVAL+1)/(HCLK)}]
 74          *            = 60Hz
 75          * 3. LCDCON5:
 76          *    设置显示模式为8BPP时,调色板中的数据格式: 5:6:5
 77          *    设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转
 78          *    字节交换使能
 79          */
 80         LCDCON1 = (CLKVAL_TFT_240320<<8) | (LCDTYPE_TFT<<5) | \
 81                   (BPPMODE_8BPP<<1) | (ENVID_DISABLE<<0);
 82         LCDCON2 = (VBPD_240320<<24) | (LINEVAL_TFT_240320<<14) | \
 83                   (VFPD_240320<<6) | (VSPW_240320);
 84         LCDCON3 = (HBPD_240320<<19) | (HOZVAL_TFT_240320<<8) | (HFPD_240320);
 85         LCDCON4 = HSPW_240320;
 86         LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | \
 87                   (BSWP<<1);
 88 
 89         /*
 90          * 设置LCD控制器的地址寄存器LCDSADDR1~3
 91          * 帧内存与视口(view point)完全吻合,
 92          * 图像数据格式如下(8BPP时,帧缓冲区中的数据为调色板中的索引值):
 93          *         |----PAGEWIDTH----|
 94          *    y/x  0   1   2       239
 95          *     0   idx idx idx ... idx
 96          *     1   idx idx idx ... idx
 97          * 1. LCDSADDR1:
 98          *    设置LCDBANK、LCDBASEU
 99          * 2. LCDSADDR2:
100          *    设置LCDBASEL: 帧缓冲区的结束地址A[21:1]
101          * 3. LCDSADDR3:
102          *    OFFSIZE等于0,PAGEWIDTH等于(240/2)
103          */
104         LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21) | LOWER21BITS(LCDFRAMEBUFFER>>1);
105         LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ \
106                     (LINEVAL_TFT_240320+1)*(HOZVAL_TFT_240320+1)*1)>>1);
107         LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_240320/2);
108 
109         /* 禁止临时调色板寄存器 */
110         TPAL = 0;
111 
112         fb_base_addr = LCDFRAMEBUFFER;
113         bpp = 8;
114         xsize = 240;
115         ysize = 320;
116         
117         break;
118 
119     case MODE_TFT_16BIT_240320:
120         /* 
121          * 设置LCD控制器的控制寄存器LCDCON1~5
122          * 1. LCDCON1:
123          *    设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2]
124          *    选择LCD类型: TFT LCD   
125          *    设置显示模式: 16BPP
126          *    先禁止LCD信号输出
127          * 2. LCDCON2/3/4:
128          *    设置控制信号的时间参数
129          *    设置分辨率,即行数及列数
130          * 现在,可以根据公式计算出显示器的频率:
131          * 当HCLK=100MHz时,
132          * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x
133          *              {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x
134          *              {2x(CLKVAL+1)/(HCLK)}]
135          *            = 60Hz
136          * 3. LCDCON5:
137          *    设置显示模式为16BPP时的数据格式: 5:6:5
138          *    设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转
139          *    半字(2字节)交换使能
140          */
141         LCDCON1 = (CLKVAL_TFT_240320<<8) | (LCDTYPE_TFT<<5) | \
142                   (BPPMODE_16BPP<<1) | (ENVID_DISABLE<<0);
143         LCDCON2 = (VBPD_240320<<24) | (LINEVAL_TFT_240320<<14) | \
144                   (VFPD_240320<<6) | (VSPW_240320);
145         LCDCON3 = (HBPD_240320<<19) | (HOZVAL_TFT_240320<<8) | (HFPD_240320);
146         LCDCON4 = HSPW_240320;
147         LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | \
148                   (HWSWP<<1);
149 
150         /*
151          * 设置LCD控制器的地址寄存器LCDSADDR1~3
152          * 帧内存与视口(view point)完全吻合,
153          * 图像数据格式如下:
154          *         |----PAGEWIDTH----|
155          *    y/x  0   1   2       239
156          *     0   rgb rgb rgb ... rgb
157          *     1   rgb rgb rgb ... rgb
158          * 1. LCDSADDR1:
159          *    设置LCDBANK、LCDBASEU
160          * 2. LCDSADDR2:
161          *    设置LCDBASEL: 帧缓冲区的结束地址A[21:1]
162          * 3. LCDSADDR3:
163          *    OFFSIZE等于0,PAGEWIDTH等于(240*2/2)
164          */
165         LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21) | LOWER21BITS(LCDFRAMEBUFFER>>1);
166         LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ \
167                     (LINEVAL_TFT_240320+1)*(HOZVAL_TFT_240320+1)*2)>>1);
168         LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_240320*2/2);
169 
170         /* 禁止临时调色板寄存器 */
171         TPAL = 0;
172 
173         fb_base_addr = LCDFRAMEBUFFER;
174         bpp = 16;
175         xsize = 240;
176         ysize = 320;
177 
178         break;
179 
180     case MODE_TFT_8BIT_640480:
181         /* 
182          * 设置LCD控制器的控制寄存器LCDCON1~5
183          * 1. LCDCON1:
184          *    设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2]
185          *    选择LCD类型: TFT LCD   
186          *    设置显示模式: 8BPP
187          *    先禁止LCD信号输出
188          * 2. LCDCON2/3/4:
189          *    设置控制信号的时间参数
190          *    设置分辨率,即行数及列数
191          * 现在,可以根据公式计算出显示器的频率:
192          * 当HCLK=100MHz时,
193          * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x
194          *              {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x
195          *              {2x(CLKVAL+1)/(HCLK)}]
196          *            = 60Hz
197          * 3. LCDCON5:
198          *    设置显示模式为8BPP时,调色板中的数据格式: 5:6:5
199          *    设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转
200          *    字节交换使能
201          */
202         LCDCON1 = (CLKVAL_TFT_640480<<8) | (LCDTYPE_TFT<<5) | \
203                   (BPPMODE_8BPP<<1) | (ENVID_DISABLE<<0);
204         LCDCON2 = (VBPD_640480<<24) | (LINEVAL_TFT_640480<<14) | \
205                   (VFPD_640480<<6) | (VSPW_640480);
206         LCDCON3 = (HBPD_640480<<19) | (HOZVAL_TFT_640480<<8) | (HFPD_640480);
207         LCDCON4 = HSPW_640480;
208         LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | \
209                   (BSWP<<1);
210 
211         /*
212          * 设置LCD控制器的地址寄存器LCDSADDR1~3
213          * 帧内存与视口(view point)完全吻合,
214          * 图像数据格式如下(8BPP时,帧缓冲区中的数据为调色板中的索引值):
215          *         |----PAGEWIDTH----|
216          *    y/x  0   1   2       639
217          *     0   idx idx idx ... idx
218          *     1   idx idx idx ... idx
219          * 1. LCDSADDR1:
220          *    设置LCDBANK、LCDBASEU
221          * 2. LCDSADDR2:
222          *    设置LCDBASEL: 帧缓冲区的结束地址A[21:1]
223          * 3. LCDSADDR3:
224          *    OFFSIZE等于0,PAGEWIDTH等于(640/2)
225          */
226         LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21) | LOWER21BITS(LCDFRAMEBUFFER>>1);
227         LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ \
228                     (LINEVAL_TFT_640480+1)*(HOZVAL_TFT_640480+1)*1)>>1);
229         LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_640480/2);
230 
231         /* 禁止临时调色板寄存器 */
232         TPAL = 0;
233 
234         fb_base_addr = LCDFRAMEBUFFER;
235         bpp = 8;
236         xsize = 640;
237         ysize = 480;
238         
239         break;
240         
241     case MODE_TFT_16BIT_640480:
242         /* 
243          * 设置LCD控制器的控制寄存器LCDCON1~5
244          * 1. LCDCON1:
245          *    设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2]
246          *    选择LCD类型: TFT LCD   
247          *    设置显示模式: 16BPP
248          *    先禁止LCD信号输出
249          * 2. LCDCON2/3/4:
250          *    设置控制信号的时间参数
251          *    设置分辨率,即行数及列数
252          * 现在,可以根据公式计算出显示器的频率:
253          * 当HCLK=100MHz时,
254          * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x
255          *              {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x
256          *              {2x(CLKVAL+1)/(HCLK)}]
257          *            = 60Hz
258          * 3. LCDCON5:
259          *    设置显示模式为16BPP时的数据格式: 5:6:5
260          *    设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转
261          *    半字(2字节)交换使能
262          */
263         LCDCON1 = (CLKVAL_TFT_640480<<8) | (LCDTYPE_TFT<<5) | \
264                   (BPPMODE_16BPP<<1) | (ENVID_DISABLE<<0);
265         LCDCON2 = (VBPD_640480<<24) | (LINEVAL_TFT_640480<<14) | \
266                   (VFPD_640480<<6) | (VSPW_640480);
267         LCDCON3 = (HBPD_640480<<19) | (HOZVAL_TFT_640480<<8) | (HFPD_640480);
268         LCDCON4 = HSPW_640480;
269         LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | \
270                   (HWSWP<<1);
271 
272         /*
273          * 设置LCD控制器的地址寄存器LCDSADDR1~3
274          * 帧内存与视口(view point)完全吻合,
275          * 图像数据格式如下:
276          *         |----PAGEWIDTH----|
277          *    y/x  0   1   2       639
278          *     0   rgb rgb rgb ... rgb
279          *     1   rgb rgb rgb ... rgb
280          * 1. LCDSADDR1:
281          *    设置LCDBANK、LCDBASEU
282          * 2. LCDSADDR2:
283          *    设置LCDBASEL: 帧缓冲区的结束地址A[21:1]
284          * 3. LCDSADDR3:
285          *    OFFSIZE等于0,PAGEWIDTH等于(640*2/2)
286          */
287         LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21) | LOWER21BITS(LCDFRAMEBUFFER>>1);
288         LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ \
289                     (LINEVAL_TFT_640480+1)*(HOZVAL_TFT_640480+1)*2)>>1);
290         LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_640480*2/2);
291 
292         /* 禁止临时调色板寄存器 */
293         TPAL = 0;
294 
295         fb_base_addr = LCDFRAMEBUFFER;
296         bpp = 16;
297         xsize = 640;
298         ysize = 480;
299 
300         break;
301 
302     default:
303         break;
304     }   
305 }
306 
307 /*
308  * 设置调色板
309  */
310 void Lcd_Palette8Bit_Init(void)
311 {
312     int i;  
313     volatile unsigned int *palette;
314 
315     LCDCON1 &= ~0x01;    // stop lcd controller
316     
317     LCDCON5 |= (FORMAT8BPP_565<<11); // 设置调色板中数据格式为5:6:5
318 
319     palette = (volatile unsigned int *)PALETTE;
320     for (i = 0; i < 256; i++)
321         *palette++ = DEMO256pal[i];
322 
323     LCDCON1 |= 0x01;    // re-enable lcd controller
324 }
325 
326 /*
327  * 改变调色板为一种颜色
328  * 输入参数:
329  *     color: 颜色值,格式为0xRRGGBB
330  */
331 void ChangePalette(UINT32 color)
332 {
333     int i;
334     unsigned char red, green, blue;
335     UINT32 *palette;
336 
337     red   = (color >> 19) & 0x1f;
338     green = (color >> 10) & 0x3f;
339     blue  = (color >>  3) & 0x1f;
340     color = (red << 11) | (green << 5) | blue; // 格式5:6:5
341     
342     palette=(UINT32 *)PALETTE;
343     LCDCON1 &= ~0x01;    // stop lcd controller
344     for (i = 0; i < 256; i++)
345     {
346 //        while (((LCDCON5>>15) & 0x3) == 2);     // 等待直到VSTATUS不为”有效”
347         *palette++ = color;
348     }
349     LCDCON1 |= 0x01;    // re-enable lcd controller
350 }
351 
352 /*
353  * 设置是否输出LCD电源开关信号LCD_PWREN
354  * 输入参数:
355  *     invpwren: 0 - LCD_PWREN有效时为正常极性
356  *               1 - LCD_PWREN有效时为反转极性
357  *     pwren:    0 - LCD_PWREN输出有效
358  *               1 - LCD_PWREN输出无效
359  */
360 void Lcd_PowerEnable(int invpwren, int pwren)
361 {
362     GPGCON = (GPGCON & (~(3<<8))) | (3<<8);   // GPG4用作LCD_PWREN
363     GPGUP  = (GPGUP & (~(1<<4))) | (1<<4);    // 禁止内部上拉    
364         
365     LCDCON5 = (LCDCON5 & (~(1<<5))) | (invpwren<<5);  // 设置LCD_PWREN的极性: 正常/反转
366     LCDCON5 = (LCDCON5 & (~(1<<3))) | (pwren<<3);     // 设置是否输出LCD_PWREN
367 }    
368 
369 /*
370  * 设置LCD控制器是否输出信号
371  * 输入参数:
372  * onoff: 
373  *      0 : 关闭
374  *      1 : 打开
375  */
376 void Lcd_EnvidOnOff(int onoff)
377 {
378     if (onoff == 1)
379     {
380         LCDCON1 |= 1;         // ENVID ON
381         GPBDAT |= (1<<0);            // Power on
382     }
383     else
384     {
385         LCDCON1 &= 0x3fffe;  // ENVID Off
386         GPBDAT &= ~(1<<0);     // Power off
387     }
388 }    
389 
390 /*
391  * 使用临时调色板寄存器输出单色图像
392  * 输入参数:
393  *     color: 颜色值,格式为0xRRGGBB
394  */
395 void ClearScrWithTmpPlt(UINT32 color)
396 {
397     TPAL = (1<<24)|((color & 0xffffff)<<0);
398 }
399 
400 /*
401  * 停止使用临时调色板寄存器
402  */
403 void DisableTmpPlt(void)
404 {
405     TPAL = 0;
406 }

公海赌船网址 36

lcddrv.c

公海赌船网址 37

 

公海赌船网址 38

从上海教室第22中学取得时钟周期为10Mhz(100ns)

通过图1和图3计算出:

HSPW+1=T7=5 clock

HFPD+1=T8-T11=11 clock 

HBPD+1=T6-T7-T8=17 clock

VSPW+1=T1=1 Line

VFPD+1=T2-T5=2 Line

VBPD+1=T0-T2-T1=4 Line

2.4
配置LCDCON1~5

听新闻说地方就先来定义全局变量:

 #define  HSPW_16bpp      5-1
 #define  HFPD _16bpp     11-1
 #define  HBPD _16bpp     17-1
 #define  VSPW _16bpp     1-1
 #define  VFPD _16bpp     2-1
 #define  VBPD _16bpp     4-1

设置LCDCON1寄存器:

CLKVAL[17:8]:

设置VCLK时钟, CLKVAL
=HCLK/(LCD时钟*2)-1

本裸板的HCLK=100Mhz,LCD时钟=10MHZ,所以CLKVAL
=4

PNRMODE [6:5]:

设置为TFT模式,PNRMODE =0x3

BPPMODE[4:1]:

设置为16BPP, BPPMODE=0x0C

ENVID [0]:

决定PWREN信号(GPG4)输出,先配备好再出口PWREN,
ENVID =0

(开启在此以前应该设置LCDCON五个人[3]同意PWREN信号才有效)

设置LCDCON2寄存器:

VBPD [31:24]:垂直脉冲后沿延时, VBPD=VBPD_16bpp;

LINEVAL[23:14]:垂直行数,决定垂直大小, LINEVAL=272-1;

VFPD[13:6]:垂直脉冲前沿延时, VFPD= VFPD_16bpp;

VSPW[5:0]:垂直同步脉冲宽度, VSPW= VSPW_16bpp;

设置LCDCON3寄存器:

HBPD[25:19]:水平脉冲后沿延时, HBPD= HBPD_16bpp;

HOZVAL[18:8]:水平像素点个数, HBPD= 479;

HFPD[7:0]:水平脉冲前沿延时, HFPD= HFPD_16bpp;

设置LCDCON4寄存器:

HSPW[7:0]:水平同步脉冲宽度, HSPW = HSPW_16bpp;

设置LCDCON5寄存器:

FRM565[11]:设置16bpp输出格式, F猎豹CS6M565=1(CRUISERGB565);

INVVCLK[10]:设置VCLK记性,LCD手册如下,所以等于0,不设置(下跌沿读取数据)

INVVLINE [9]:HSYNC水平同步信号反转,
因为LCD手册和2440手册不一样等,所以INVVLINE=1;

INVVFRAME[8]:VSYNC垂直同步信号反转,
因为LCD手册和2440手册不雷同,所以INVVFRAME =1;

INVVFRAME[3]:PWREN信号(GPG4)允许位,=0,不设置,等设置了缓存寄存器后才设置

HWSWP [0]:更改存款和储蓄格式,那里HWSWP=1,BSWP[1]暗中认可等于0,使大家的LCD像素展现从低到高排列

代码如下:

 LCDCON1 = (4<<8) | (0X3<<5) |  (0x0C <<1) |
(0<<0);

 LCDCON2 = ((VBPD_16bpp)<<24) | (271<<14) | 
((VFPD_16bpp)<<6) |((VSPW_16bpp)<<0);

 LCDCON3 = ((HBPD_16bpp)<<19) | (479<<8) |
((HFPD_16bpp));

 LCDCON4 = (HSPW_16bpp);

 LCDCON5 = (1<<11) | (1<<9) | (1<<8) | 
(1<<0);

 LCDCON1 &=~(1<<0);          // 关闭PWREN信号输出

 LCDCON5 &=~(1<<3);          //禁止PWREN信号

 

3.设置LCDSADDR1~3缓冲地址寄存器

设置LCDSADDR1寄存器:

LCDBANK[29:21]:

保存缓冲初叶地址A[30:22]   

LCDBASEU[20:0]:

保留缓冲初叶地址A[21:1]

设置LCDSADDR2寄存器:

LCDBASEL[20:0]:

保存存缓冲甘休地址A[21:1],那里咱们选择4.3寸LCD,所以等于((0x30陆仟00+(480)*(272)*2)>>1)&0x1fffff;
这里*2是代表多少个像素占了2字节,若是8bpp形式,则就不需求倍加2  

设置LCDSADDR3寄存器:

OFFSIZE[21:11]:

保存LCD上一行结尾和下一行开始的地点之间的差(半字数为单位),大家运用的是接连地址,所以不设置,默许为0

PAGEWIDTH [10:0]:

保存LCD一行占的增长幅度(半字数为单位),大家每一个像素点是半字数,所以等于480

代码如下:               

1 LCDSADDR1 = ((0x30400000>>22)<<21) |  ((0x30400000>>1)& 0x1fffff);
2 LCDSADDR2 = ((0x30400000+(480)*(272)*2)>>1)& 0x1fffff; 
3 LCDSADDR3 = (0<<11) | (480*2/2);

 

4.允许并出口PWREN信号

GPGCON = (GPGCON & (~(3<<8))) | (3<<8);   // GPG4用作LCD_PWREN
GPGUP  = (GPGUP & (~(1<<4))) | (1<<4);    // 禁止内部上拉   

LCDCON5 = (LCDCON5 & (~(1<<5))) | (0<<5);  // 设置LCD_PWREN的极性: 正常
LCDCON5 = (LCDCON5 & (~(1<<3))) | (1<<3);     // 允许LCD_PWREN信号输出

LCDCON1 |= 1;                  //输出LCD_PWREN信号

 5.驱动LCD来得橄榄黄**

 fb_base_addr=0x30400000;    //缓存起始地址
 LCDCON1 |= 1;                // 使能LCD驱动
 GPBDAT |= (1<<0);         // 开背光
 color=0xffffff;                   //显示白色颜色
 for (y = 0; y < 272; y++)         //向缓存地址里存数据
      for (x = 0; x < 480; x++)
    {
    UINT16 *addr = (UINT16 *)fb_base_addr + (y * 480 + x);  //定义指针变量等于缓存地址
     red   = (color >> 19) & 0x1f;
     green = (color >> 10) & 0x3f;
     blue  = (color >>  3) & 0x1f;
     color = (red << 11) | (green << 5) | blue; // 格式5:6:5
   *addr = (UINT16) color;               //addr表示缓存地址,*addr表示缓存地址里的变量,                                 
    }
 LCDCON1 &= 0x3fffe;                // 失能LCD驱动
 GPBDAT &= ~(1<<0);         // 关背光

  

6.TPAL暂且调色板寄存器介绍

   
当清屏时,可以采取TPAL寄存器,快捷清屏 

    位[24]     TPAL使能位

    位[23:0]  RGB数据位

例如: TPAL=0x1ffffff
(使能TPAL寄存器,并设为草绿屏)

相关文章