📄 lcdlib.c
字号:
break;
case BGBUFFER2:
rLCDCON1=(rLCDCON1&~(1<<21))|(1<<21);
break;
case FGBUFFER1:
rLCDCON1=(rLCDCON1&~(1<<20))|(0<<20);
break;
case FGBUFFER2:
rLCDCON1=(rLCDCON1&~(1<<20))|(1<<20);
break;
default:
break;
}
}
void LcdSetFrameInterrupt(U32 framesel0, U32 framesel1)
{
rLCDINTCON=(rLCDINTCON&~(0xf<<8))|((0x3&framesel0)<<10)|((0x3&framesel1)<<8)|(1<<7)|(1);
}
void LcdEnableFrameInterrupt(U32 framesel0, U32 framesel1)
{
rLCDCON1 &= (~3); // ENVID Off
while(((rLCDCON2>>15)&0x3ff)); //waiting for end of current frame.
rLCDCON1 = rLCDCON1|(3); // ENVID On using Per Frame method
rLCDINTCON=(rLCDINTCON&~(0xf<<8))|((0x3&framesel0)<<10)|((0x3&framesel1)<<8)|(1<<7)|(1);
}
void LcdDisableFrameInterrupt(void)
{
rLCDINTCON &=~((1<<7)|1);
rLCDCON1 &= (~3); // ENVID Off
}
void LcdEnableFifoInterrupt(U32 fifosel, U32 fifolevel)
{
rLCDCON1 &= (~3); // ENVID Off
while(((rLCDCON2>>15)&0x3ff)); //waiting for end of current frame.
rLCDCON1 = rLCDCON1|(3); // ENVID On using Per Frame method
rLCDINTCON=(rLCDINTCON&~(0x7f))|((0x3&fifosel)<<5)|((0x7&fifolevel)<<2)|(1<<1)|(1);
}
void LcdDisableFifoInterrupt(void)
{
rLCDINTCON &=~(3);
rLCDCON1 &= (~3); // ENVID Off
}
void LcdSetFifoInterrupt(U32 fifosel, U32 fifolevel)
{
rLCDINTCON=(rLCDINTCON&~(0x1f<<2))|((0x3&fifosel)<<10)|((0x7&fifolevel)<<8)|(1<<1)|(1);
}
void LcdOsdEnDiable(U32 endisable)
{
if(endisable==1)
rLCDOSD1 |= (1<<9);
else
rLCDOSD1 &= (~(1<<9));
}
void LcdOsdSetAlpha(U32 alpha)
{
rLCDOSD1 = (rLCDOSD1 & ~(0xff))|(alpha & 0xff);
}
void LcdOsdSelectFunction(U32 function)
{
if(function==OSD_COLORKEY)
rLCDKEYCON|=(1<<25);
else if(function==OSD_BLENDING)
rLCDKEYCON&=(~(1<<25));
}
void LcdOsdChangeCoordination(U32 topx, U32 topy, U32 botx, U32 boty)
{
rLCDOSD2=(rLCDOSD2&~(0x3fffff))|((0x3ff&topx)<<11)|(0x3ff&topy);
rLCDOSD3=(rLCDOSD3&~(0x3fffff))|((0x3ff&botx)<<11)|(0x3ff&boty);
}
void LcdDitheringEnDisable(U32 endisable)
{
if(endisable==1)
rLCDDITHCON|=1;
else
rLCDDITHCON&=(~1);
}
void LcdBGColorMap(U32 endisable, U32 bgcolor)
{
rLCDBGCON=(rLCDBGCON&~(0xffffff))|(0xffffff&bgcolor);
if(endisable==1)
rLCDBGCON=(1<<24)|(rLCDBGCON&~(0xffffff))|(0xffffff&bgcolor);
else
rLCDBGCON&=(~(1<<24));
}
void LcdFGColorMap(U32 endisable, U32 fgcolor)
{
rLCDFGCON=(rLCDFGCON&~(0xffffff))|(0xffffff&fgcolor);
if(endisable==1)
rLCDFGCON=(1<<24)|(rLCDFGCON&~(0xffffff))|(0xffffff&fgcolor);
else
rLCDFGCON&=(~(1<<24));
}
void LcdColorKeyInit(U32 displaytype)
{
U32 redkey, greenkey, bluekey;
U32 redcol, greencol, bluecol;
U32 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: //18BPP
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(U32 direction, U32 compkey, U32 colval)
{
rLCDKEYCON=(rLCDKEYCON&~(0x1ffffff))|((0x1&direction)<<24)|(0xffffff&compkey);
rLCDKEYVAL=(0xffffff&colval);
}
void MoveViewPort(U32 displaytype, U32 whichframebuffer)
{
U32 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(Uart_Getch()) {
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 '\r':
return;
default:
break;
}
Uart_Printf("vx=%3d,vy=%3d\n",vx,vy);
LcdMoveViewPort(vx,vy, displaytype, whichframebuffer);
}
}
void LcdMoveViewPort(int vx,int vy, U32 displaytype, U32 whichframebuffer)
{
U32 addr;
U32 vframewidth, frameheight;
U32 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 MoveViewPort(void)
{
int vx=0,vy=0,vd;
vd=((DisplayType&0xf)==0x1)*32+((DisplayType&0xf)==0x2)*16+((DisplayType&0xf)==0x4)*8
+((DisplayType&0xf)==0x6)*4+((DisplayType&0xf)==0x8)*4 +((DisplayType&0xf)==0xa)*2+
((DisplayType&0xf)==0xc)*2+((DisplayType&0xf)==0xe)*1;
while(1) {
switch(Uart_Getch()) {
case 'i':
if(vy>=vd)vy-=vd;
break;
case 'j':
if(vx>=vd)vx-=vd;
break;
case 'k':
if(DisplayType&0x100) {
if(vx<=(BG_VXSIZE_176220-BG_XSIZE_176220-vd))vx+=vd;
}
else if(DisplayType&0x200) {
if(vx<=(BG_VXSIZE_240320-BG_XSIZE_240320-vd))vx+=vd;
}
else if(DisplayType&0x400) {
if(vx<=(BG_VXSIZE_640480-BG_XSIZE_640480-vd))vx+=vd;
}
else if(DisplayType&0x800) {
if(vx<=(BG_VXSIZE_800600-BG_XSIZE_800600-vd))vx+=vd;
}
break;
case 'm':
if(DisplayType&0x100) {
if(vy<=(BG_VYSIZE_176220-BG_YSIZE_176220-vd))vy+=vd;
}
else if(DisplayType&0x200) {
if(vy<=(BG_VYSIZE_240320-BG_YSIZE_240320-vd))vy+=vd;
}
else if(DisplayType&0x400) {
if(vy<=(BG_VYSIZE_640480-BG_YSIZE_640480-vd))vy+=vd;
}
else if(DisplayType&0x800) {
if(vy<=(BG_VYSIZE_800600-BG_YSIZE_800600-vd))vy+=vd;
}
break;
case '\r':
return;
default:
break;
}
Uart_Printf("vx=%3d,vy=%3d\n",vx,vy);
LcdMoveViewPort(vx,vy);
}
}
void LcdMoveViewPort(int vx,int vy)
{
U32 addr;
U32 vframewidth, frameheight;
U32 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(U8 type, U8 data)
{
U32 GPDATBuf;
rGPCON_L = (rGPCON_L & ~(0x3f<<8))|(0x15<<8);
switch (type)
{
case nCS:
if(data) GPDATBuf |= (1<<6);
else GPDATBuf &= ~(1<<6);
break;
case SCLK:
if(data) GPDATBuf |= (1<<5);
else GPDATBuf &= ~(1<<5);
break;
case SDI:
if(data) GPDATBuf |= (1<<4);
else GPDATBuf &= ~(1<<4);
break;
case ALL:
if(data) GPDATBuf |= (7<<4);
else GPDATBuf &= ~(7<<4);
break;
default:
break;
}
rGPDAT = GPDATBuf;
}
void SLcdRegSet(U8 IndexReg, U16 Inst)
{
SLcdSpiSet(0, 0, (U16)IndexReg); // Set Index Register
SLcdSpiSet(1, 0, (U16)Inst); // Write Instruction
}
void SLcdSpiSet(U8 RS, U8 RW, U16 data)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -