24402410 LCD显示屏驱动程序.docx
- 文档编号:25805302
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:12
- 大小:16.94KB
24402410 LCD显示屏驱动程序.docx
《24402410 LCD显示屏驱动程序.docx》由会员分享,可在线阅读,更多相关《24402410 LCD显示屏驱动程序.docx(12页珍藏版)》请在冰豆网上搜索。
24402410LCD显示屏驱动程序
u-boot早就支持framebuffer了,不光显示图片,还可以把控制台重定向到lcd上,只是24x0部分缺代码罢了,需要填充一个结构体,可以从openmoko那里copy过来。
不过如果只是为了显示一张图片的话……初始化lcd控制器的代码随便放哪里运行都可以的吧!
2440&2410LCD显示屏驱动程序
#include"config.h"
//GPB1/TOUT1forBacklightcontrol(PWM)
#defineGPB1_TO_OUT()(rGPBUP&=0xfffd,rGPBCON&=0xfffffff3,rGPBCON|=0x00000004)
#defineGPB1_TO_1()(rGPBDAT|=0x0002)
#defineGPB1_TO_0()(rGPBDAT&=0xfffd)
//externvoidUart_Printf(char*f,...);
externunsignedchar__CHS[];
externunsignedchar__VGA[];
//volatilestatic
unsignedshortLCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];
staticvoidLcd_PowerEnable(intinvpwren,intpwren);
staticvoidLcd_Init(void)
{
rGPCUP=0x00000000;
rGPCCON=0xaaaa02a9;
//rGPDUP=0xffffffff;//DisablePull-upregister
rGPDUP=0x00000000;
rGPDCON=0xaaaaaaaa;//InitializeVD[15:
8]
rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
//TFTLCDpanel,16bppTFT,ENVID=off
rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
rLCDCON4=(MVAL<<8)|(HSPW);
#if(LCD_TYPE==PT035)
rLCDCON5=(1<<11)|(1<<10)|(0<<9)|(0<<8)|(1<<7)|(1<<6)
|(1<<3)|(BSWP<<1)|(HWSWP);
#elif(LCD_TYPE==WD_F3224)
rLCDCON5=(1<<11)|(1<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)
|(1<<3)|(0<<1)|(HWSWP);
#elif(LCD_TYPE==TX11D)
rLCDCON5=(1<<11)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)
|(1<<3)|(1<<2)|(BSWP<<1)|(HWSWP);
#endif
rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);
rLCDSADDR2=M5D(((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1);
rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
rLCDINTMSK|=(3);//MASKLCDSubInterrupt
rTCONSEL&=(~7);//DisableLPC3480
rTPAL=0;//DisableTempPalette
}
staticvoidLcd_EnvidOnOff(intonoff)
{
if(onoff==1)
rLCDCON1|=1;//ENVID=ON
else
rLCDCON1=rLCDCON1&0x3fffe;//ENVIDOff
}
staticvoidLcd_PowerEnable(intinvpwren,intpwren)
{
//GPG4issettedasLCD_PWREN
rGPGUP=rGPGUP&(~(1<<4))|(1<<4);//Pull-updisable
rGPGCON=rGPGCON&(~(3<<8))|(3<<8);//GPG4=LCD_PWREN
rGPGDAT=rGPGDAT|(1<<4);
//invpwren=pwren;
//EnableLCDPOWERENABLEFunction
rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);//PWREN
rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);//INVPWREN
}
staticvoidLcd_MoveViewPort(intvx,intvy)
{
U32addr;
SET_IF();
#if(LCD_XSIZE_TFT<32)
while((rLCDCON1>>18)<=1);//ifx<32
#else
while((rLCDCON1>>18)==0);//ifx>32
#endif
addr=(U32)LCD_BUFFER+(vx*2)+vy*(SCR_XSIZE_TFT*2);
rLCDSADDR1=((addr>>22)<<21)|M5D(addr>>1);
rLCDSADDR2=M5D(((addr+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1));
CLR_IF();
}
staticvoidMoveViewPort(void)
{
intvx=0,vy=0,vd=1;
Uart_Printf("\n*MovetheLCDviewwindos:
\n");
Uart_Printf("press8isup\n");
Uart_Printf("press2isdown\n");
Uart_Printf("press4isleft\n");
Uart_Printf("press6isright\n");
Uart_Printf("pressEntertoexit!
\n");
while
(1)
{
switch(Uart_GetKey())
{
case'8':
if(vy>=vd)vy-=vd;
Uart_Printf("vx==,vy==\n",vx,vy);
Lcd_MoveViewPort(vx,vy);
break;
case'4':
if(vx>=vd)vx-=vd;
Uart_Printf("vx==,vy==\n",vx,vy);
Lcd_MoveViewPort(vx,vy);
break;
case'6':
if(vx<=(SCR_XSIZE_TFT-LCD_XSIZE_TFT-vd))vx+=vd;
Uart_Printf("vx==,vy==\n",vx,vy);
Lcd_MoveViewPort(vx,vy);
break;
case'2':
if(vy<=(SCR_YSIZE_TFT-LCD_YSIZE_TFT-vd))vy+=vd;
Uart_Printf("vx==,vy==\n",vx,vy);
Lcd_MoveViewPort(vx,vy);
break;
case'\r':
return;
default:
break;
}
//Uart_Printf("vx==,vy==\n",vx,vy);
//Lcd_MoveViewPort(vx,vy);
}
}
voidPutPixel(U32x,U32y,U16c)
{
if((x LCD_BUFFER[(y)][(x)]=c; } voidGUI_Point(U32x,U32y,U16c) { if((x LCD_BUFFER[(y)][(x)]=c; } voidLcd_ClearScr(U16c) { unsignedintx,y; for(y=0;y { for(x=0;x { LCD_BUFFER[y][x]=c; } } } voidGlib_Line(intx1,inty1,intx2,inty2,intcolor) { intdx,dy,e; dx=x2-x1; dy=y2-y1; if(dx>=0) { if(dy>=0)//dy>=0 { if(dx>=dy)//1/8octant { e=dy-dx/2; while(x1<=x2) { PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1+=1; e+=dy; } } else//2/8octant { e=dx-dy/2; while(y1<=y2) { PutPixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1+=1; e+=dx; } } } else//dy<0 { dy=-dy;//dy=abs(dy) if(dx>=dy)//8/8octant { e=dy-dx/2; while(x1<=x2) { PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1+=1; e+=dy; } } else//7/8octant { e=dx-dy/2; while(y1>=y2) { PutPixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1-=1; e+=dx; } } } } else//dx<0 { dx=-dx;//dx=abs(dx) if(dy>=0)//dy>=0 { if(dx>=dy)//4/8octant { e=dy-dx/2; while(x1>=x2) { PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1-=1; e+=dy; } } else//3/8octant { e=dx-dy/2; while(y1<=y2) { PutPixel(x1,y1,color); if(e>0){x1-=1;e-=dy;} y1+=1; e+=dx; } } } else//dy<0 { dy=-dy;//dy=abs(dy) if(dx>=dy)//5/8octant { e=dy-dx/2; while(x1>=x2) { PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1-=1; e+=dy; } } else//6/8octant { e=dx-dy/2; while(y1>=y2) { PutPixel(x1,y1,color); if(e>0){x1-=1;e-=dy;} y1-=1; e+=dx; } } } } } voidGlib_Rectangle(intx1,inty1,intx2,inty2,intcolor) { Glib_Line(x1,y1,x2,y1,color); Glib_Line(x2,y1,x2,y2,color); Glib_Line(x1,y2,x2,y2,color); Glib_Line(x1,y1,x1,y2,color); } voidGlib_FilledRectangle(intx1,inty1,intx2,inty2,intcolor) { inti; for(i=y1;i<=y2;i++) Glib_Line(x1,i,x2,i,color); } voidPaint_Bmp(intx0,inty0,inth,intl,unsignedcharbmp[]) { intx,y; U32c; intp=0; for(y=y0;y { for(x=x0;x { c=bmp[p+1]|(bmp[p]<<8); if(((x0+x) LCD_BUFFER[y0+y][x0+x]=c; p=p+2; } } } #if1 voidLcd_PutASCII(unsignedintx,unsignedinty,unsignedcharch,unsignedintc,unsignedintbk_c,unsignedintst) { unsignedshortinti,j; unsignedchar*pZK,mask,buf; pZK=&__VGA[ch*16]; for(i=0;i<16;i++) { mask=0x80; buf=pZK[i]; for(j=0;j<8;j++) { if(buf&mask) { PutPixel(x+j,y+i,c); } else { if(! st) { PutPixel(x+j,y+i,bk_c); } } mask=mask>>1; } } } voidLcd_PutHZ(unsignedintx,unsignedinty,unsignedshortintQW,unsignedintc,unsignedintbk_c,unsignedintst) { unsignedshortinti,j; unsignedchar*pZK,mask,buf; pZK=&__CHS[(((QW>>8)-1)*94+(QW&0x00FF)-1)*32]; for(i=0;i<16;i++) { //左 mask=0x80; buf=pZK[i*2]; for(j=0;j<8;j++) { if(buf&mask) { PutPixel(x+j,y+i,c); } else { if(! st) { PutPixel(x+j,y+i,bk_c); } } mask=mask>>1; } //右 mask=0x80; buf=pZK[i*2+1]; for(j=0;j<8;j++) { if(buf&mask) { PutPixel(x+j+8,y+i,c); } else { if(! st) { PutPixel(x+j+8,y+i,bk_c); } } mask=mask>>1; } } } //---------------------- voidLcd_printf(unsignedintx,unsignedinty,unsignedintc,unsignedintbk_c,unsignedintst,char*fmt,...) { char__LCD_Printf_Buf[256]; va_listap; unsignedchar*pStr=(unsignedchar*)__LCD_Printf_Buf; unsignedinti=0; va_start(ap,fmt); vsprintf(__LCD_Printf_Buf,fmt,ap); va_end(ap); while(*pStr! =0) { switch(*pStr) { case'\n': { break; } default: { if(*pStr>0xA0&*(pStr+1)>0xA0)//中文输出 { Lcd_PutHZ(x,y,(*pStr-0xA0)*0x0100+*(pStr+1)-0xA0,c,bk_c,st); pStr++; i++; x+=16; } else//英文输出 { Lcd_PutASCII(x,y,*pStr,c,bk_c,st); x+=8; } break; } } pStr++; i++; if(i>256)break; } } #endif voidLcd_Display(void) { Lcd_Init(); Lcd_PowerEnable(0,1); Lcd_EnvidOnOff (1); Lcd_ClearScr((0x00<<11)|(0x00<<5)|(0x00)); #if((LCD_TYPE==PT035)||(LCD_TYPE==WD_F3224)) Paint_Bmp(0,0,320,240,phone); #elif(LCD_TYPE==TX11D) Paint_Bmp(0,0,480,272,LCD43_ucos); #endif }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 24402410 LCD显示屏驱动程序 LCD 显示屏 驱动程序