📄 lcdlib.c
字号:
unsigned int compkey, colval;
redkey=greenkey=bluekey=0xff;
redcol=greencol=bluecol=0x0;
switch(displaytype&0xf) {
case 3: //8BPP palettized.
if(((rLCDCON2>>9)&0x3)==1) {//666
redkey&=(0x3);
greenkey&=(0x3);
bluekey&=(0x3);
redcol=(0xfc);
greencol=0;
bluecol=0;
}
else if(((rLCDCON2>>9)&0x3)==2) {//565
redkey&=(0x7);
greenkey&=(0x3);
bluekey&=(0x7);
redcol=(0xf8);
greencol=0;
bluecol=0;
}
else if(((rLCDCON2>>9)&0x3)==3) {//5551
redkey &= (0x7);
greenkey &= (0x7);
bluekey &= (0x6);
redcol=(0xf8);
greencol=0;
bluecol=1;
}
break;
case 4: //8BPP non-palettized.
redkey &= (0x1f);
greenkey &= (0x1f);
bluekey &= (0x3f);
redcol=(0xc0);
greencol=0;
bluecol=0;
break;
case 5: //16BPP 565
redkey &= (0x7);
greenkey &= (0x3);
bluekey &= (0x7);
redcol=(0xf8);
greencol=0;
bluecol=0;
break;
case 6: //16BPP 5551
redkey &= (0x7);
greenkey &= (0x7);
bluekey &= (0x6);
redcol=(0xf8);
greencol=0;
bluecol=1;
break;
case 7: //24BPP
redkey &= (0x3);
greenkey &= (0x3);
bluekey &= (0x3);
redcol=(0xfc);
greencol=0;
bluecol=0;
break;
default:
break;
}
compkey=(redkey<<16)|(greenkey<<8)|(bluekey);
colval=(redcol<<16)|(greencol<<8)|(bluecol);
rLCDKEYCON=(rLCDKEYCON&~(0x1ffffff))|(0<<24)|(0xffffff&compkey);
rLCDKEYVAL=(0xffffff&colval);
}
void LcdSetColorKey(unsigned int direction, unsigned int compkey, unsigned int colval)
{
rLCDKEYCON=(rLCDKEYCON&~(0x1ffffff))|((0x1&direction)<<24)|(0xffffff&compkey);
rLCDKEYVAL=(0xffffff&colval);
}
void MoveViewPort(unsigned int displaytype, unsigned int whichframebuffer)
{
unsigned int vframewidth, framewidth, vframeheight, frameheight;
int vx=0,vy=0,vd;
vd=((displaytype&0xf)==0x0)*32+((displaytype&0xf)==0x1)*16+((displaytype&0xf)==0x2)*8+((displaytype&0xf)==0x3)*4
+((displaytype&0xf)==0x4)*4+((displaytype&0xf)==0x5)*2+((displaytype&0xf)==0x6)*2 +((displaytype&0xf)==0x7)*1;
switch(displaytype&0xff00) {
case 0x1100:
case 0x2100:
vframewidth=BG_VXSIZE_176220;
framewidth=BG_XSIZE_176220;
vframeheight=BG_VYSIZE_176220;
frameheight=BG_YSIZE_176220;
break;
case 0x1200:
case 0x2200:
vframewidth=BG_VXSIZE_240320;
framewidth=BG_XSIZE_240320;
vframeheight=BG_VYSIZE_240320;
frameheight=BG_YSIZE_240320;
break;
case 0x1400:
case 0x2400:
vframewidth=BG_VXSIZE_640480;
framewidth=BG_XSIZE_640480;
vframeheight=BG_VYSIZE_640480;
frameheight=BG_YSIZE_640480;
break;
case 0x1800:
case 0x2800:
vframewidth=BG_VXSIZE_800600;
framewidth=BG_XSIZE_800600;
vframeheight=BG_VYSIZE_800600;
frameheight=BG_YSIZE_800600;
break;
case 0x4100:
vframewidth=FG_VXSIZE_176220;
framewidth=FG_XSIZE_176220;
vframeheight=FG_VYSIZE_176220;
frameheight=FG_YSIZE_176220;
break;
case 0x4200:
vframewidth=FG_VXSIZE_240320;
framewidth=FG_XSIZE_240320;
vframeheight=FG_VYSIZE_240320;
frameheight=FG_YSIZE_240320;
break;
case 0x4400:
vframewidth=FG_VXSIZE_640480;
framewidth=FG_XSIZE_640480;
vframeheight=FG_VYSIZE_640480;
frameheight=FG_YSIZE_640480;
break;
case 0x4800:
vframewidth=FG_VXSIZE_800600;
framewidth=FG_XSIZE_800600;
vframeheight=FG_VYSIZE_800600;
frameheight=FG_YSIZE_800600;
break;
default:
break;
}
while(1) {
switch(getchar()) {
case 'i':
if(vy>=vd)vy-=vd;
break;
case 'j':
if(vx>=vd)vx-=vd;
break;
case 'k':
if(vx<=(vframewidth-framewidth-vd))vx+=vd;
break;
case 'm':
if(vy<=(vframeheight-frameheight-vd))vy+=vd;
break;
case 0x0a:
return;
default:
break;
}
printf("vx=%3d,vy=%3d\n",vx,vy);
LcdMoveViewPort(vx,vy, displaytype, whichframebuffer);
}
}
void LcdMoveViewPort(int vx,int vy, unsigned int displaytype, unsigned int whichframebuffer)
{
unsigned int addr;
unsigned int vframewidth, frameheight;
unsigned int bytefactor;
switch(displaytype&0xf) {
case 0x0:
bytefactor=1;
break;
case 0x1:
bytefactor=2;
break;
case 0x2:
bytefactor=4;
break;
case 0x3:
bytefactor=8;
break;
case 0x4:
bytefactor=8;
break;
case 0x5:
bytefactor=16;
break;
case 0x6:
bytefactor=16;
break;
case 0x7:
bytefactor=32;
break;
default:
break;
}
switch(displaytype&0xff00) {
case 0x1100:
case 0x2100:
vframewidth=BG_VXSIZE_176220;
frameheight=BG_YSIZE_176220;
break;
case 0x1200:
case 0x2200:
vframewidth=BG_VXSIZE_240320;
frameheight=BG_YSIZE_240320;
break;
case 0x1400:
case 0x2400:
vframewidth=BG_VXSIZE_640480;
frameheight=BG_YSIZE_640480;
break;
case 0x1800:
case 0x2800:
vframewidth=BG_VXSIZE_800600;
frameheight=BG_YSIZE_800600;
break;
case 0x4100:
vframewidth=FG_VXSIZE_176220;
frameheight=FG_YSIZE_176220;
break;
case 0x4200:
vframewidth=FG_VXSIZE_240320;
frameheight=FG_YSIZE_240320;
break;
case 0x4400:
vframewidth=FG_VXSIZE_640480;
frameheight=FG_YSIZE_640480;
break;
case 0x4800:
vframewidth=FG_VXSIZE_800600;
frameheight=FG_YSIZE_800600;
break;
default:
break;
}
switch(whichframebuffer) {
case BGBUFFER1:
// The processor mode should be superviser mode.
SET_IF();
while(((rLCDCON2&(0x7ff<<15))>>15)!=1);
addr=(LCDFRAMEBUFFERBG1+(vx*bytefactor/8)+vy*(vframewidth*bytefactor/8));
rLCDSADDRB1= addr;
rLCDEADDRB1=LCDBASEL(addr+(vframewidth*frameheight*bytefactor/8));
CLR_IF();
break;
case BGBUFFER2:
// The processor mode should be superviser mode.
SET_IF();
while(((rLCDCON2&(0x7ff<<15))>>15)!=1);
addr=(LCDFRAMEBUFFERBG2+(vx*bytefactor/8)+vy*(vframewidth*bytefactor/8));
rLCDSADDRB2= addr;
rLCDEADDRB2=LCDBASEL(addr+(vframewidth*frameheight*bytefactor/8));
CLR_IF();
break;
case FGBUFFER1:
// The processor mode should be superviser mode.
SET_IF();
while(((rLCDCON2&(0x7ff<<15))>>15)!=1);
addr=(LCDFRAMEBUFFERFG1+(vx*bytefactor/8)+vy*(vframewidth*bytefactor/8));
rLCDSADDRF1= addr;
rLCDEADDRF1=LCDBASEL(addr+(vframewidth*frameheight*bytefactor/8));
CLR_IF();
break;
case FGBUFFER2:
// The processor mode should be superviser mode.
SET_IF();
while(((rLCDCON2&(0x7ff<<15))>>15)!=1);
addr=(LCDFRAMEBUFFERFG2+(vx*bytefactor/8)+vy*(vframewidth*bytefactor/8));
rLCDSADDRF2= addr;
rLCDEADDRF2=LCDBASEL(addr+(vframewidth*frameheight*bytefactor/8));
CLR_IF();
break;
default:
break;
}
}
void SLcdGpioSet(unsigned char type, unsigned char data)
{
unsigned int GPDATBuf = 0;
rGPHCON = (rGPHCON & ~(0xff<<24)) | (0x2<<26); // MISO, CLK, nSS are input, MOSI is output setting
switch (type)
{
case nCS:
if(data) GPDATBuf |= (1<<15);
else GPDATBuf &= ~(1<<15);
break;
case SCLK:
if(data) GPDATBuf |= (1<<14);
else GPDATBuf &= ~(1<<14);
break;
case SDI:
if(data) GPDATBuf |= (1<<12);
else GPDATBuf &= ~(1<<12);
break;
case ALL:
if(data) GPDATBuf |= (0xd<<12);
else GPDATBuf &= ~(0xd<<12);
break;
default:
break;
}
rGPHDAT = GPDATBuf;
}
void SLcdRegSet(unsigned char IndexReg, unsigned short Inst)
{
SLcdSpiSet(0, 0, (unsigned short)IndexReg); // Set Index Register
SLcdSpiSet(1, 0, (unsigned short)Inst); // Write Instruction
}
void SLcdSpiSet(unsigned char RS, unsigned char RW, unsigned short data)
{
unsigned int buf = 0x740000; // device id
unsigned char i;
buf |= (RS<<17);
buf |= (RW<<16);
buf += data;
SLcdGpioSet(nCS, 0); // transfer start
Delay(1); // 1 -> 120us
for(i=0; i<24; i++) {
SLcdGpioSet(SCLK, 0); // sclk low
if(buf & (1<<(23-i))) SLcdGpioSet(SDI, 1);
else SLcdGpioSet(SDI, 0);
SLcdGpioSet(SCLK, 1); // sclk high
}
SLcdGpioSet(nCS, 1); // transfer end
Delay(1);
}
void SLcdPowerOn(void)
{
SLcdInit1();
SLcdPowerSet();
SLcdInit2();
SLcdRGBModeChange();
SLcdDisplayOn();
SLcdRegSet(0x21, 0x0000);
SLcdSpiSet(0, 0, (unsigned short)0x22);
}
void SLcdPowerOff(void)
{
SLcdInternalModeChange();
SLcdDisplayOff();
SLcdRegSet(0x10, 0x0000);
SLcdRegSet(0x0a, 0x0100);
}
void SLcdInit1(void)
{
SLcdRegSet(0x01, 0x0917); // 0x0117 <-> 0x0917
SLcdRegSet(0x02, 0x0700);
SLcdRegSet(0x03, 0x1230);
SLcdRegSet(0x04, 0x0000);
SLcdRegSet(0x05, 0x0000);
SLcdRegSet(0x07, 0x0005);
SLcdRegSet(0x08, 0x0907); // 0x0306 <-> 0x0808 -> VFP=7H, VBP=9H, VLW=4H, so 0x0907
SLcdRegSet(0x0b, 0xec0a); // 0xe800 <-> 0xec0a
SLcdRegSet(0x0c, 0x0002);
SLcdRegSet(0x0d, 0x0734); // 0x0700 <-> 0x0734
SLcdRegSet(0x40, 0x0000);
}
void SLcdInit2(void)
{
SLcdRegSet(0x30, 0x0000);
SLcdRegSet(0x31, 0x0000);
SLcdRegSet(0x32, 0x0000);
SLcdRegSet(0x33, 0x0000);
SLcdRegSet(0x34, 0x0707);
SLcdRegSet(0x35, 0x0707);
SLcdRegSet(0x36, 0x0707);
SLcdRegSet(0x37, 0x0000);
SLcdRegSet(0x3f, 0x0000);
SLcdRegSet(0x41, 0x0000);
SLcdRegSet(0x42, 0xbf00);
SLcdRegSet(0x43, 0xc2c0);
SLcdRegSet(0x44, 0xaf00);
SLcdRegSet(0x45, 0xbf00);
}
void SLcdPowerSet(void)
{
SLcdRegSet(0x12, 0x0001);
SLcdRegSet(0x13, 0x0404); // 0x0804 <-> 0x0404
SLcdRegSet(0x14, 0x151e); // 0x1118 <-> 0x151e
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x0a, 0x0101);
SLcdRegSet(0x0a, 0x0102);
SLcdRegSet(0x0a, 0x0106);
SLcdRegSet(0x0a, 0x0107);
SLcdRegSet(0x10, 0x2814);
SLcdRegSet(0x11, 0x9010); // 0x8000 <-> 0x9010
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x0a, 0x0101);
//Delay(333); // 40000 us / 120 us = 333, S3C2460X
Delay(400); // 40000 us / 100 us = 400
SLcdRegSet(0x14, 0x351e); // 0x3118 <-> 0x351e
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x0a, 0x0102);
//Delay(333); // 40 ms, S3C2460X
Delay(400); // 40 ms
SLcdRegSet(0x13, 0x0414); // 0x0814 <-> 0x0414
SLcdRegSet(0x0a, 0x0101);
}
void SLcdDisplayOn(void)
{
SLcdRegSet(0x07, 0x0005);
//Delay(333); // 40 ms, S3C2460X
Delay(400); // 40 ms
SLcdRegSet(0x07, 0x0025);
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x07, 0x0027);
SLcdRegSet(0x07, 0x0037);
}
void SLcdDisplayOff(void)
{
SLcdRegSet(0x07, 0x0036);
Delay(333); // 40ms
SLcdRegSet(0x07, 0x0026);
Delay(333); // 40ms
SLcdRegSet(0x07, 0x0004);
SLcdRegSet(0x0a, 0x0100);
}
void SLcdInternalModeChange(void)
{
SLcdRegSet(0x0c, 0x0002);
Delay(167); // 20000 us / 120 us = 167
}
void SLcdRGBModeChange(void)
{
SLcdRegSet(0x21, 0x0000);
SLcdRegSet(0x0c, 0x0112);
SLcdSpiSet(0, 0, (unsigned short)0x22);
//Delay(167); // 20 ms, S3C2460X
Delay(200); // 20 ms
}
void SLcdSleep(void)
{
SLcdInternalModeChange();
SLcdDisplayOff();
SLcdRegSet(0x10, 0x0000);
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x10, 0x0002);
SLcdRegSet(0x0a, 0x0100);
}
void SLcdSleepWakeUp(void)
{
SLcdRegSet(0x10, 0x0000);
SLcdRegSet(0x0a, 0x0100);
SLcdPowerSet();
SLcdDisplayOn();
SLcdRGBModeChange();
}
void SLcdStangBy(void)
{
SLcdInternalModeChange();
SLcdDisplayOff();
SLcdRegSet(0x10, 0x0000);
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x10, 0x0001);
}
void SLcdStandByWakeUp(void)
{
SLcdRegSet(0x00, 0x0001);
Delay(83); // 10000 / 120 = 83
SLcdRegSet(0x10, 0x0000);
SLcdInit1();
SLcdPowerSet();
SLcdInit2();
SLcdRGBModeChange();
SLcdDisplayOn();
SLcdRegSet(0x21, 0x0000);
SLcdSpiSet(0, 0, (unsigned short)0x22);
}
//040616
void delayLoop(int count)
{
int j;
for(j = 0; j < count; j++) ;
}
//040616
void Write_AMLCD(int address, int data)
{
int j;
unsigned char DELAY=100;
LCD_DEN_Hi; // EN = High CS high
// LCD_DCLK_Lo;
LCD_DCLK_Hi; // SCL High
LCD_DSERI_Lo; // Data Low
delayLoop(DELAY);
LCD_DEN_Lo; // EN = Low CS Low
delayLoop(DELAY);
LCD_DCLK_Lo; // SCL Low
delayLoop(DELAY);
for (j = 7; j >= 0; j--)
{
if ((address >> j) & 0x0001) // DATA HIGH or LOW
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -