[国嵌攻略][061][2440LCD驱动设计]

LCD初始化

1.引脚初始化

2.时序初始化

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计算

LCDCON1:

CLKVAL=7   VCLK=HCLK/((CLKVAL+1)*2) VCLK=6.0-7.1MHz HCLK=100MHz

PNRMODE 11

BPPMODE 1100

ENVID

LCDCON2:

VSPW(pulse width) 4

VBPD(back proch) 4

VFPD(front proch) 4

LINEVAL 319   LINEVAL+1=320

LCDCON3:

HBPD(back proch) 1

HFPD(front proch) 14

HOZVAL 239   HOZVAL+1=240

LCDCON4:

HSPW -14 (左边边界)

LCDCON5

FRM560 1

INVVLINE 1

INVVFRAME 1

HWSWP 1

3.帧缓冲初始化

每个像素点用2个字节 16bpp,帧缓冲大小240*320*2

1.分配帧缓冲空间

2.告知帧缓冲地址给LCD控制器

4.杂项初始化

/********************************************************************
*名称:lcd
*作者:D
*时间:2015.11.18
*功能:液晶显示屏驱动
********************************************************************/

/********************************************************************
*							 宏定义
********************************************************************/
#define GPCCON ( (*(volatile unsigned long *)0x56000020) )   //GPC组控制寄存器
#define GPDCON ( (*(volatile unsigned long *)0x56000030) )   //GPD组控制寄存器
#define GPGCON ( (*(volatile unsigned long *)0x56000060) )   //GPG组控制寄存器

#define LCDCON1 ( (*(volatile unsigned long *)0X4D000000) )   //LCD控制1寄存器
#define LCDCON2 ( (*(volatile unsigned long *)0X4D000004) )   //LCD控制2寄存器
#define LCDCON3 ( (*(volatile unsigned long *)0X4D000008) )   //LCD控制3寄存器
#define LCDCON4 ( (*(volatile unsigned long *)0X4D00000C) )   //LCD控制4寄存器
#define LCDCON5 ( (*(volatile unsigned long *)0X4D000010) )   //LCD控制5寄存器

#define LCDSADDR1 ( (*(volatile unsigned long *)0X4D000014) )   //帧缓冲起始地址1寄存器
#define LCDSADDR2 ( (*(volatile unsigned long *)0X4D000018) )   //帧缓冲起始地址2寄存器
#define LCDSADDR3 ( (*(volatile unsigned long *)0X4D00001C) )   //帧缓冲起始地址3寄存器

#define TPAL ( (*(volatile unsigned long *)0X4D000050) )   //临时调色板寄存器

#define HIGHT 320   //屏高,vertical
#define WIDTH 240   //屏宽,horizontal

//LCDCON1配置
#define CLKVAL 7      //CLKVAL[17:8]:4 VCLK=HCLK/((CLKVAL+1)*2) VCLK=6.0-7.1MHz HCLK=100MHz
#define PNRMODE 0x3   //PNRMODE[6:5]:11 TFT LCD
#define BPPMODE 0xC   //BPPMODE[4:1]:1100 16 bpp for TFT
#define ENVID_ON 1    //ENVID[0]:0 打开LCD输出
#define ENVID_OFF 0   //ENVID[0]:0 关闭LCD输出

//LCDCON2配置
#define VBPD 1              //VBPD[31:24]:2-1 垂直后肩
#define LINEVAL (HIGHT-1)   //LINEVAL[23:14]:240-1 屏高,对应于Vertical Display Active
#define VFPD 1              //VFPD[13:6]:2-1 垂直前肩
#define VSPW 12             //VSPW[5:0]:13-1 垂直脉宽,对应于Vertical Blank Time

//LCDCON3配置
#define HBPD 1            //HBPD[25:19]:2-1 水平后肩
#define HOZVAL (WIDTH-1)  //HOZVAL[18:8]:240-1 屏宽,对应于Horizontal Display Active
#define HFPD 1            //HFPD[7:0]:2-1 水平前肩

//LCDCON4配置
#define HSPW 79   //HSPW[7:0]:80-1 水平脉宽,对应于Horizontal Blank Time

//LCDCON5配置
#define FRM565 1      //FRM565[11]:1 5:6:5 Format
#define INVVLINE 1    //INVVLINE[9]:1 HSYNC Inverted
#define INVVFRAME 1   //INVVFRAME[8]:1 VSYNC Inverted
#define PWREN_ON 1    //PWREN[3]:1 打开LCD电源
#define PWREN_OFF 1   //PWREN[3]:0 关闭LCD电源
#define HWSWP 1       //HWSWP[0]:1 Swap Enable

//TPAL配置
#define TPALEN_ON 1        //TPALEN[24]:1 Enable
#define TPALEN_OFF 0       //TPALEN[24]:0 Disable
#define TPALVAL 0xFF0000   //TPALVAL[23:16]:RED, TPALVAL[15:8], GREEN,TPALVAL[7:0]:BLUE

/********************************************************************
*							 全局变量
********************************************************************/
unsigned short LCDBUFFER[HIGHT][WIDTH];   //帧缓冲320*240*2字节

/********************************************************************
*名称:init_lcd
*功能:初始化液晶显示屏
*********************************************************************/
void init_lcd(){
	unsigned long LCDBANK;     //LCDSADDR1[29:21] 帧缓冲起始地址30:22位
	unsigned long LCDBASEU;    //LCDSADDR2[20:0]  帧缓冲起始地址21:1位
	unsigned long LCDBASEL;    //LCDSADDR2[20:0]  帧缓冲结束地址21:1位
	unsigned long OFFSIZE;     //LCDSADDR3[21:11] 每行偏移的半字
	unsigned long PAGEWIDTH;   //LCDSADDR3[10:0]  每行字节的半字

	//初始化引脚
	GPCCON = 0xAAAAAAAA;   //GPC15-GPC8:10 VD[7-0], GPC7:10 LCD_LPCREVB, GPC6:10 LCD_LPCREV, GPC5:10 LCD_LPCOE, GPC4:10 VM, GPC3:10 VFRAME, GPC2:10 VLINE, GPC1:10 VCLK, GPC0:10 LEND
	GPDCON = 0xAAAAAAAA;   //GPD15-GPD0:10 VD[23-8]
	GPGCON |= (0x3<<8);    //GPG4[9:8]:11 LCD_PWRDN

	//初始化时序
	LCDCON1 = (CLKVAL<<8)|(PNRMODE<<5)|(BPPMODE<<1)|(ENVID_OFF<<0);
	LCDCON2 = (VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW<<0);
	LCDCON3 = (HBPD<<19)|(HOZVAL<<8)|(HFPD<<0);
	LCDCON4 = (HSPW<<0);
	LCDCON5 = (FRM565<<11)|(INVVLINE<<9)|(INVVFRAME<<8)|(TPALEN_OFF<<3)|(HWSWP<<0);

	//初始化帧缓冲
	LCDBANK = ((unsigned long)LCDBUFFER>>22)&0x1FF;      //取出帧缓冲地址的30:22位
	LCDBASEU = ((unsigned long)LCDBUFFER>>1)&0x1FFFFF;   //取出帧缓冲起始地址的21:1位
	LCDSADDR1 = (LCDBANK<<21)|(LCDBASEU<<0);

	LCDBASEL = ( (((unsigned long)LCDBUFFER + WIDTH*HIGHT*2)>>1) )&0x1FFFFF;   //取出帧缓冲结束地址的21:1位
	LCDSADDR2 = (LCDBASEL<<0);

	OFFSIZE = 0;
	PAGEWIDTH = WIDTH*2/2;   //页宽一个字是2个字节,所以乘以2,又因为该值是半字,所以除以2
	LCDSADDR3 = (OFFSIZE<<11)|(PAGEWIDTH<<0);

	//关闭临时调色板
	TPAL = (TPALEN_OFF<<24);

	//打开液晶显示屏
	LCDCON5 |= (PWREN_ON<<3);
	LCDCON1 |= (ENVID_ON<<0);
}

/********************************************************************
*名称:clear_lcd
*参数:
*	none
*返回:
*	none
*功能:清屏
*********************************************************************/
void clear_lcd(){
	//打开临时调色板
	TPAL = (TPALEN_ON<<24)|(TPALVAL<<0);
}
时间: 2024-11-08 14:44:07

[国嵌攻略][061][2440LCD驱动设计]的相关文章

[国嵌攻略][117][LED驱动程序设计]

LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() leddev.h //设备命令 #define LED_MAGIC 'L' //LED幻数 #define LED_ON _IO(LED_MAGIC, 0) //打开LED #define LED_OFF _IO(LED_MAGIC, 1) //关闭LED leddev.c /***********************************************

[国嵌攻略][164][USB驱动程序设计]

USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口

[国嵌攻略][131][串口驱动分析-接收]

tty数据接收流程 //tty子系统 1.tty_fops中的tty_read响应系统调用 2.tty_read调用tty_ldisc_N_TTY中的n_tty_read n_tty_read 1.设置app的状态 2.如果没有数据可读,让阻塞生效 3.如果有数据可读,从read_buf中读走数据 什么时候串口驱动会把数据送到n_tty_read的read_buf中 当串口接收到数据时会产生接收中断,然后中断处理程序会把数据送到read_buf中. 串口驱动如何收到数据 串口中断处理程序s3c2

[国嵌攻略][151][nandflash驱动程序设计]

初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函数. 1.使能时钟 2.进行物理地址到虚拟地址转换 3.硬件纠错初始化 4.搜索nand flash 5.注册分区信息 nand flash读操作 nand flash读写函数位于通用驱动/drivers/mtd/nand/nand_base.c.nand flash的读函数位于nand_read的

[国嵌攻略][140][触摸屏驱动分析]

触摸屏驱动分析 初始化 1.使能ADC时钟 2.将物理地址转化为虚拟地址 3.让触摸屏进入等待中断模式 4.分配输入设备结构 5.设置可能上报的事件类型和按键类型 6.为TC和ADC中断注册处理函数 7.注册输入型设备 按下处理 1.判断按下或弹起 2.如果是按下情况,那么启动XY坐标的AD转换 3.进行4次ADC转换,获取4次XY坐标值 4.计算4次采集的平均值,并上报给内核

[国嵌攻略][063][电阻屏驱动程序设计]

/******************************************************************** *名称:touchscreen.c *作者:D *时间:2015.11.23 *功能: * 触摸屏驱动,由于MINI2440采用一线触控,而非四线电阻触控所以触摸屏 * 驱动无法使用. ********************************************************************/ /****************

[国嵌攻略][133][网卡驱动架构分析]

Linux网络子系统 1.系统调用接口:提供系统调用 2.协议无关接口:统一网络协议给系统调用接口使用 3.网络协议栈  :实现网络协议 4.设备无关接口:统一设备驱动程序给网络协议使用 5.设备驱动程序:实现网卡驱动 Linux驱动在内核中都有一个结构来描述,首先找到设备描述结构,然后找到设备如何注册和初始化. 网卡描述结构 在Linux内核中,每个网卡都由一个net_device结构来描述,其中一些重要成员: char name[IFNAMSIZ]   设备名,如:eth%d unsigne

[国嵌攻略][132][串口驱动实现]

如何开发Linux驱动程序 一般情况下都会有现成的驱动程序,不需要从零开始开发驱动程序.所以Linux驱动开发主要分为两个步骤:1.读得懂驱动程序:2.写的了核心功能. 发送中断处理程序 发送中断处理函数在/drivers/serial/samsung.c的s3c24xx_serial_tx_chars 循环缓冲 struct circ_buf { char *buf; int head; int tail; }; 存数据的时候移动head,取数据的时候移动tail. static irqret

[国嵌攻略][102][内核驱动开发环境搭建]

服务器环境搭建 1.配置tftp服务器 1.1.设置tftp目录 vim /etc/xinetd.d/tftp server_args             = -s .../tftp disable                 = no 1.2.启动tftp服务 /etc/init.d/xinetd restart 2.配置nfs服务器 2.1.设置nfs目录 vim /etc/exports .../nfs *(rw,sync,no_root_squash) 2.2.启动nfs服务 /