|
基于OMAP5910图像显示和LCD系统:图像控制器程序代码
unsigned char LUT8[256*3] = { /* 主次色 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0xA0, 0xA0, 0xA0, 0x50, 0x50, 0x50, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0xF0, 0xF0, 0xF0, /* 灰度 */ 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x30, 0x30, 0x30, 0x40, 0x40, 0x40, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60, 0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xA0, 0xA0, 0xA0, 0xB0, 0xB0, 0xB0, 0xC0, 0xC0, 0xC0, 0xD0, 0xD0, 0xD0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, /* 黑色到红色*/ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xB0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xD0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, /*黑色到绿色*/ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xB0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xD0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x00, /*黑色到蓝色*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xB0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xD0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF0, /* 蓝色到青色(蓝绿色) */ 0x00, 0x00, 0xF0, 0x00, 0x10, 0xF0, 0x00, 0x20, 0xF0, 0x00, 0x30, 0xF0, 0x00, 0x40, 0xF0, 0x00, 0x50, 0xF0, 0x00, 0x60, 0xF0, 0x00, 0x70, 0xF0, 0x00, 0x80, 0xF0, 0x00, 0x90, 0xF0, 0x00, 0xA0, 0xF0, 0x00, 0xB0, 0xF0, 0x00, 0xC0, 0xF0, 0x00, 0xD0, 0xF0, 0x00, 0xE0, 0xF0, 0x00, 0xF0, 0xF0, /* 青色(蓝绿色)到绿色*/ 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0xE0, 0x00, 0xF0, 0xD0, 0x00, 0xF0, 0xC0, 0x00, 0xF0, 0xB0, 0x00, 0xF0, 0xA0, 0x00, 0xF0, 0x90, 0x00, 0xF0, 0x80, 0x00, 0xF0, 0x70, 0x00, 0xF0, 0x60, 0x00, 0xF0, 0x50, 0x00, 0xF0, 0x40, 0x00, 0xF0, 0x30, 0x00, 0xF0, 0x20, 0x00, 0xF0, 0x10, 0x00, 0xF0, 0x00, /* 绿色到黄色(红绿色)*/ 0x00, 0xF0, 0x00, 0x10, 0xF0, 0x00, 0x20, 0xF0, 0x00, 0x30, 0xF0, 0x00, 0x40, 0xF0, 0x00, 0x50, 0xF0, 0x00, 0x60, 0xF0, 0x00, 0x70, 0xF0, 0x00, 0x80, 0xF0, 0x00, 0x90, 0xF0, 0x00, 0xA0, 0xF0, 0x00, 0xB0, 0xF0, 0x00, 0xC0, 0xF0, 0x00, 0xD0, 0xF0, 0x00, 0xE0, 0xF0, 0x00, 0xF0, 0xF0, 0x00, /*黄色(红绿色)到红色*/ 0xF0, 0xF0, 0x00, 0xF0, 0xE0, 0x00, 0xF0, 0xD0, 0x00, 0xF0, 0xC0, 0x00, 0xF0, 0xB0, 0x00, 0xF0, 0xA0, 0x00, 0xF0, 0x90, 0x00, 0xF0, 0x80, 0x00, 0xF0, 0x70, 0x00, 0xF0, 0x60, 0x00, 0xF0, 0x50, 0x00, 0xF0, 0x40, 0x00, 0xF0, 0x30, 0x00, 0xF0, 0x20, 0x00, 0xF0, 0x10, 0x00, 0xF0, 0x00, 0x00, /* 红色到洋红(蓝红色) */ 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x10, 0xF0, 0x00, 0x20, 0xF0, 0x00, 0x30, 0xF0, 0x00, 0x40, 0xF0, 0x00, 0x50, 0xF0, 0x00, 0x60, 0xF0, 0x00, 0x70, 0xF0, 0x00, 0x80, 0xF0, 0x00, 0x90, 0xF0, 0x00, 0xA0, 0xF0, 0x00, 0xB0, 0xF0, 0x00, 0xC0, 0xF0, 0x00, 0xD0, 0xF0, 0x00, 0xE0, 0xF0, 0x00, 0xF0, /*洋红(蓝红色)到蓝色 */ 0xF0, 0x00, 0xF0, 0xE0, 0x00, 0xF0, 0xD0, 0x00, 0xF0, 0xC0, 0x00, 0xF0, 0xB0, 0x00, 0xF0, 0xA0, 0x00, 0xF0, 0x90, 0x00, 0xF0, 0x80, 0x00, 0xF0, 0x70, 0x00, 0xF0, 0x60, 0x00, 0xF0, 0x50, 0x00, 0xF0, 0x40, 0x00, 0xF0, 0x30, 0x00, 0xF0, 0x20, 0x00, 0xF0, 0x10, 0x00, 0xF0, 0x00, 0x00, 0xF0, /*黑色到洋红(蓝红色)*/ 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x20, 0x00, 0x20, 0x30, 0x00, 0x30, 0x40, 0x00, 0x40, 0x50, 0x00, 0x50, 0x60, 0x00, 0x60, 0x70, 0x00, 0x70, 0x80, 0x00, 0x80, 0x90, 0x00, 0x90, 0xA0, 0x00, 0xA0, 0xB0, 0x00, 0xB0, 0xC0, 0x00, 0xC0, 0xD0, 0x00, 0xD0, 0xE0, 0x00, 0xE0, 0xF0, 0x00, 0xF0, /* 黑色到青色(蓝绿色) */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x20, 0x20, 0x00, 0x30, 0x30, 0x00, 0x40, 0x40, 0x00, 0x50, 0x50, 0x00, 0x60, 0x60, 0x00, 0x70, 0x70, 0x00, 0x80, 0x80, 0x00, 0x90, 0x90, 0x00, 0xA0, 0xA0, 0x00, 0xB0, 0xB0, 0x00, 0xC0, 0xC0, 0x00, 0xD0, 0xD0, 0x00, 0xE0, 0xE0, 0x00, 0xF0, 0xF0, /* 红色到白色*/ 0xF0, 0x00, 0x00, 0xF0, 0x10, 0x10, 0xF0, 0x20, 0x20, 0xF0, 0x30, 0x30, 0xF0, 0x40, 0x40, 0xF0, 0x50, 0x50, 0xF0, 0x60, 0x60, 0xF0, 0x70, 0x70, 0xF0, 0x80, 0x80, 0xF0, 0x90, 0x90, 0xF0, 0xA0, 0xA0, 0xF0, 0xB0, 0xB0, 0xF0, 0xC0, 0xC0, 0xF0, 0xD0, 0xD0, 0xF0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, /* 绿色到白色 */ 0x00, 0xF0, 0x00, 0x10, 0xF0, 0x10, 0x20, 0xF0, 0x20, 0x30, 0xF0, 0x30, 0x40, 0xF0, 0x40, 0x50, 0xF0, 0x50, 0x60, 0xF0, 0x60, 0x70, 0xF0, 0x70, 0x80, 0xF0, 0x80, 0x90, 0xF0, 0x90, 0xA0, 0xF0, 0xA0, 0xB0, 0xF0, 0xB0, 0xC0, 0xF0, 0xC0, 0xD0, 0xF0, 0xD0, 0xE0, 0xF0, 0xE0, 0xF0, 0xF0, 0xF0, /* 蓝色到白色 */ 0x00, 0x00, 0xF0, 0x10, 0x10, 0xF0, 0x20, 0x20, 0xF0, 0x30, 0x30, 0xF0, 0x40, 0x40, 0xF0, 0x50, 0x50, 0xF0, 0x60, 0x60, 0xF0, 0x70, 0x70, 0xF0, 0x80, 0x80, 0xF0, 0x90, 0x90, 0xF0, 0xA0, 0xA0, 0xF0, 0xB0, 0xB0, 0xF0, 0xC0, 0xC0, 0xF0, 0xD0, 0xD0, 0xF0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0 };
#define REGISTER_OFFSET ((unsigned char *) 0x14000000) // 初始化 S1D13506的寄存器 #define DISP_MEM_OFFSET ((unsigned char *) 0x4000000) #define DISP_MEMORY_SIZE 0x200000
void main(void) { unsigned char * pRegs = REGISTER_OFFSET; unsigned char * pMem = DISP_MEM_OFFSET; unsigned char * pLUT = LUT8; long lCnt; int idx; int rgb;
*(pRegs + 0x001) = 0x00; // 0000 0000 *(pRegs + 0x1FC) = 0x00; // 0000 0000 *(pRegs + 0x004) = 0x00; // 0000 0000 *(pRegs + 0x008) = 0x00; // 0000 0000 *(pRegs + 0x010) = 0x00; // 0000 0000 从CLKI时钟得到MCLK时钟 *(pRegs + 0x014) = 0x10; // 0001 0000 从CLKI时钟得到LCD PCLK时钟 *(pRegs + 0x018) = 0x02; // 0000 0010 从CLKI2时钟得到CRT PCLK时钟 *(pRegs + 0x01C) = 0x02; // 0000 0010 从CLKI2时钟得到MediaPlug时钟 *(pRegs + 0x01E) = 0x01; // 0000 0001 *(pRegs + 0x020) = 0x01; // 0000 0001 两片EDO内存 *(pRegs + 0x021) = 0x06; // 0000 0110 刷新时间小于32 ms *(pRegs + 0x02A) = 0x01; // 0000 0001 设置DRAM时间控制寄存器 *(pRegs + 0x02B) = 0x01; // 0000 0001 设置DRAM时间控制寄存器
// 计算刷新率,计算公式为 // LCD PCLK // FrameRate = ----------------------------------------------- // (HDP + HNDP) * (VDP/2 + VNDP) *(pRegs + 0x030) = 0x26; // 0010 0110 16 bit, 彩色, 双口 *(pRegs + 0x031) = 0x00; // 0000 0000 单色显示设置 *(pRegs + 0x032) = 0x1D; // 0100 1111 - HDP = (0x1D + 1) * 8 = 240 *(pRegs + 0x034) = 0x27; // 0001 1111 - HNDP = (0x27 + 1) * 8 = 320 *(pRegs + 0x035) = 0x00; // 0000 0000 仅在TFT模式下设置 *(pRegs + 0x036) = 0x00; // 0000 0000仅在TFT模式下设置 *(pRegs + 0x038) = 0xDF; // 1101 1111 - VDP = 0x1DF + 1 *(pRegs + 0x039) = 0x01; // 0000 0001 - VDP = 480 *(pRegs + 0x03A) = 0x2C; // 0010 1100 - VNDP = (0x2C + 1) = 45 *(pRegs + 0x03B) = 0x00; // 0000 0000仅在TFT模式下设置 *(pRegs + 0x03C) = 0x00; // 0000 0000仅在TFT模式下设置
*(pRegs + 0x040) = 0x03; // 0000 0000 选择每个像素8 bit *(pRegs + 0x041) = 0x00; // 0000 0000 使能双面板缓冲区
*(pRegs + 0x042) = 0x00; // 0000 0000 设置LCD 起始地址 *(pRegs + 0x043) = 0x00; // 0000 0000 第一个字节 *(pRegs + 0x044) = 0x00; // 0000 0000 显示内存缓冲区 *(pRegs + 0x046) = 0x40; // 0000 0000 LCD内存地址偏移 *(pRegs + 0x047) = 0x01; // 0000 0000 - 0x140 Words = 640 Bytes
*(pRegs + 0x048) = 0x00; // 0000 0000
*(pRegs + 0x04A) = 0x00; // 0000 0000 使能硬件 *(pRegs + 0x04B) = 0x00; // 0000 0000 设置FIFO值
*(pRegs + 0x050) = 0x00; // 0000 0000 *(pRegs + 0x052) = 0x00; // 0000 0000 *(pRegs + 0x053) = 0x00; // 0000 0000 *(pRegs + 0x054) = 0x00; // 0000 0000 *(pRegs + 0x056) = 0x00; // 0000 0000 *(pRegs + 0x057) = 0x00; // 0000 0000 *(pRegs + 0x058) = 0x00; // 0000 0000 *(pRegs + 0x059) = 0x00; // 0000 0000 *(pRegs + 0x05A) = 0x00; // 0000 0000 *(pRegs + 0x05B) = 0x00; // 0000 0000
*(pRegs + 0x060) = 0x00; // 0000 0000 *(pRegs + 0x062) = 0x00; // 0000 0000 *(pRegs + 0x063) = 0x00; // 0000 0000 *(pRegs + 0x064) = 0x00; // 0000 0000 *(pRegs + 0x066) = 0x00; // 0000 0000 *(pRegs + 0x067) = 0x00; // 0000 0000 *(pRegs + 0x068) = 0x00; // 0000 0000 *(pRegs + 0x06A) = 0x00; // 0000 0000 *(pRegs + 0x06B) = 0x00; // 0000 0000
*(pRegs + 0x080) = 0x00; // 0000 0000 *(pRegs + 0x081) = 0x00; // 0000 0000 *(pRegs + 0x082) = 0x00; // 0000 0000 *(pRegs + 0x083) = 0x00; // 0000 0000 *(pRegs + 0x084) = 0x00; // 0000 0000 *(pRegs + 0x085) = 0x00; // 0000 0000 *(pRegs + 0x086) = 0x00; // 0000 0000 *(pRegs + 0x087) = 0x00; // 0000 0000 *(pRegs + 0x088) = 0x00; // 0000 0000 *(pRegs + 0x08A) = 0x00; // 0000 0000 *(pRegs + 0x08B) = 0x00; // 0000 0000 *(pRegs + 0x08C) = 0x00; // 0000 0000 *(pRegs + 0x08E) = 0x00; // 0000 0000
*(pRegs + 0x100) = 0x00; // 0000 0000 *(pRegs + 0x101) = 0x00; // 0000 0000 *(pRegs + 0x102) = 0x00; // 0000 0000 *(pRegs + 0x103) = 0x00; // 0000 0000 *(pRegs + 0x104) = 0x00; // 0000 0000 *(pRegs + 0x105) = 0x00; // 0000 0000 *(pRegs + 0x106) = 0x00; // 0000 0000 *(pRegs + 0x108) = 0x00; // 0000 0000 *(pRegs + 0x109) = 0x00; // 0000 0000 *(pRegs + 0x10A) = 0x00; // 0000 0000 *(pRegs + 0x10C) = 0x00; // 0000 0000 *(pRegs + 0x10D) = 0x00; // 0000 0000 *(pRegs + 0x110) = 0x00; // 0000 0000 *(pRegs + 0x111) = 0x00; // 0000 0000 *(pRegs + 0x112) = 0x00; // 0000 0000 *(pRegs + 0x113) = 0x00; // 0000 0000 *(pRegs + 0x114) = 0x00; // 0000 0000 *(pRegs + 0x115) = 0x00; // 0000 0000 *(pRegs + 0x116) = 0x00; // 0000 0000 *(pRegs + 0x118) = 0x00; // 0000 0000 *(pRegs + 0x119) = 0x00; // 0000 0000
*(pRegs + 0x1E0) = 0x01; // 使能LCD LUT读写
*(pRegs + 0x1E2) = 0; // 复位LUT地址
for (idx = 0; idx < 256; idx++) { for (rgb = 0; rgb < 3; rgb++) { *(pRegs + 0x1E4) = *pLUT; pLUT++; } }
*(pRegs + 0x1F0) = 0; // 000 000 禁止节省电源模式
*(pRegs + 0x1F4) = 0; // 0000 0000
*(pRegs + 0x1FC) = 0x01; // 0000 0001禁止节省电源模式
for (lCnt = 0; lCnt < DISP_MEMORY_SIZE; lCnt++) { *pMem = 0; pMem++; } }
|