📄 testlcd.c
字号:
// set pon direction
LOAD_FIELD(GPIO_GPDR1_ADDR, 0x3f, GXXR_GPIO58_OFS, 6); //GPIO pin 58~63(6 pins) as output
LOAD_FIELD(GPIO_GPDR2_ADDR, 0x3fff, GXXR_GPIO64_OFS, 14); //GPIO pin 64~77(14 pins) as output
//set alternative function
LOAD_FIELD(GPIO_GAFR1_U_ADDR, 0xaaa, GAFR_AF58_OFS, 12); //GPIO pin 58~63
LOAD_FIELD(GPIO_GAFR2_L_ADDR, 0xaaaaaaa, GAFR_AF64_OFS, 28);//GPIO pin 64~77
//print message
PrintfUartDef("Screen width:%d\r\n", Toshiba_LTM04C380K.panelWidth);
PrintfUartDef("Screen height:%d\r\n",Toshiba_LTM04C380K.panelHeight);
//setup lcd register
setupLcd(&Toshiba_LTM04C380K);
//enable LCD clock
CLKMGR_ENABLE_CLK(CKEN_CK_LCD_OFS);
// pcd = (LCLK / 2 / PixelClock) - 1, where LCLK = 100MHz, PixelClock = 25MHz
IOW_REG_FIELD(struct lccr3Bits, &lcdP->lccr3, pcd, 1);
allocateFrameBuffer();//16 bpp
clearStatusReg();
//InitPWM();
XsPwmDrv_InitPWM0();
//enable device power and periphery device
SET_BIT(BRD_PCR_ADDR, PCR_PER_ON_OFS);
SET_BIT(BRD_PCR_ADDR, PCR_LCD_ON_OFS); // lcd power on
SET_BIT(BRD_PCR_ADDR, PCR_LIGHT_ON_OFS); // backlight poweron
Util_DelayUs(2000);
//set to almost full duty
PWM_WRITE_DUTY(0, 1000); //
Util_DelayMs(20);
///////////////////////////////
//finally enable LCD controller
IOW_REG_FIELD(struct lccr0Bits,&lcdP->lccr0, len, 1);//onlcd
//PrintfUartDef("Dumping LCD config register\r\n");
//Dump_Bin((UINT)0x44000000,10);
}
void InitLcdAndDiplayPicAtAddr(unsigned int Addr, unsigned int Offset, unsigned int Flag)
{
unsigned short fg;
int i,j;
int h,v ;
int r,g,b;
int error;
DM_FrameBuffer_T *fbP;
struct lcdregs * lcdP = (struct lcdregs *) LCD_BASE_PHYSICAL;
unsigned short *pPic = (unsigned short*)Addr;
//init UART device
BRD_UartInitDefaultFF();
BRD_UartInitDefaultBT();
XsUartDrv_SetDefaultUartDevice(UART_BT);
//init LCD controller, must turn off firstly
off();
IOW_REG_FIELD(struct lccr0Bits,&lcdP->lccr0, len, 0);//off lcd
InitLcdGraphics ();
fbP = (DM_FrameBuffer_T *)Frame_Buffer_P;
h = 640;
v = 480;
if( ((unsigned int*)pPic)[Offset/4] == Flag)
{
// display the picture
for(i = 0; i < h; i++)
for(j = 0; j < v; j++)
fbP->pixelP[i+j*h] = pPic[i+j*h];
}
else
{
// display three color band
fg = (unsigned short)RGB565(31,0,0);
for (i = 0;i<h;i++)
for (j = 0; j<160;j++)
fbP->pixelP[i+j*h]=fg;
fg = (unsigned short)RGB565(0,63,0);
for (i = 0;i<h;i++)
for (j = 160; j<320;j++)
fbP->pixelP[i+j*h]=fg;
fg = (unsigned short)RGB565(0,0,31);
for (i = 0;i<h;i++)
for (j = 320; j<v;j++)
fbP->pixelP[i+j*h]=fg;
}
}
void SwitchTo(unsigned * addr)
{
LCDFrameDescriptorT *pFD;
pFD = (LCDFrameDescriptorT *)0xa2000000;
pFD->FSADR = (UINT32)addr;
return;
}
int CEntry_TestLcd()
{
unsigned short fg;
int i,j;
int h,v ;
int r,g,b;
int max ;
int DisplayDrawing;
int error;
DM_FrameBuffer_T *fbP;
struct lcdregs * lcdP = (struct lcdregs *) LCD_BASE_PHYSICAL;
LCDFrameDescriptorT *pFD = (LCDFrameDescriptorT *)Frame_Descriptor_Addr;
//init UART device
BRD_UartInitDefaultFF();
BRD_UartInitDefaultBT();
#ifndef AUTO_TEST
XsUartDrv_SetDefaultUartDevice(UART_FF);
PrintfUartDef("Begin LCD 16bpp display test!\r\n");
PrintfUartDef("MMU config : 0x%x\r\n",GetMMUConf());
//init LCD controller
InitLcdGraphics ();
PrintfUartDef("After init\r\n");
PrintfUartDef("FDADR0=0x%X, 0x%X, 0x%X, 0x%X\r\n", lcdP->FDADR0, lcdP->FSADR0, lcdP->FIDR0, lcdP->LDCMD0);
PrintfUartDef("Mem_FDADR0=0x%X, 0x%X, 0x%X, 0x%X\r\n", pFD->FDADR, pFD->FSADR, pFD->FIDR, pFD->LDCMD);
fbP = (DM_FrameBuffer_T *)Frame_Buffer_P;
h = 640;
v = 480;
DisplayDrawing = 0;
if(DisplayDrawing == 0)
{
// display three color band
fg = (unsigned short)RGB565(31,0,0);
for (i = 0;i<h;i++)
for (j = 0; j<160;j++)
fbP->pixelP[i+j*h]=fg;
fg = (unsigned short)RGB565(0,63,0);
for (i = 0;i<h;i++)
for (j = 160; j<320;j++)
fbP->pixelP[i+j*h]=fg;
fg = (unsigned short)RGB565(0,0,31);
for (i = 0;i<h;i++)
for (j = 320; j<v;j++)
fbP->pixelP[i+j*h]=fg;
}
else if(DisplayDrawing == 1)
{
//display a color triangle with 16 bit color mode
for (i=0; i< v; i++)
for (j=0; j<v-i; j++)
{
max = Maximum(Maximum(i,j),(v-i-j));
r = i * 31 /max;
g = j * 62 /max;
b = (v-i-j) * 31 /max;
fg = (unsigned short)RGB565(r,g,b);
fbP->pixelP[i+j*h] = fg;
}
}
else if(DisplayDrawing == 2)
{
//display a red screen
for(i=0; i<v*h; i++)
fbP->pixelP[i] = 0xf800;
}
else if(DisplayDrawing == 3)
{
//display a random screen
for(i=0; i<v*h; i++)
//fbP->pixelP[i] = (unsigned short)RGB565(rand(), rand(), rand());
fbP->pixelP[i] = (unsigned short)rand();
}
PrintfUartDef("Copying picture 1\r\n");
memcpy((void*)PIC1_RAM_BASE,(void*)PIC1_SRC_BASE,640*480*2);
PrintfUartDef("Copying picture 2\r\n");
memcpy((void*)PIC2_RAM_BASE,(void*)PIC2_SRC_BASE,640*480*2);
PrintfUartDef("Copy finished, waiting to press key...\r\n");
PrintfUartDef("Reg_FDADR0=0x%X, 0x%X, 0x%X, 0x%X", lcdP->FDADR0, lcdP->FSADR0, lcdP->FIDR0, lcdP->LDCMD0);
PrintfUartDef("Mem_FDADR0=0x%X, 0x%X, 0x%X, 0x%X\r\n", pFD->FDADR, pFD->FSADR, pFD->FIDR, pFD->LDCMD);
while(1)
{
PrintfUartDef("Press button S3 to switch to another brightness...\r\n");
while(!GET_FIELD(BRD_JSSR_ADDR, 0, 7)) {} //any bit between bit0 and bit6
//SwitchTo((unsigned*)PIC1_RAM_BASE);
Util_DelayS(1);
//PWM_WRITE_DUTY(0, 512); //set PWM0 duty to 50%(512/1024), that is change the brightness of LCD
PWM_WRITE_DUTY(0, 250);
PrintfUartDef("Press button S3 to switch to another brightness...\r\n");
while(!GET_FIELD(BRD_JSSR_ADDR, 0, 7)) {} //any bit between bit0 and bit6
//SwitchTo((unsigned*)PIC2_RAM_BASE);
Util_DelayS(1);
PWM_WRITE_DUTY(0, 1023); //set PWM duty to 100%(1023/1024), that will change the brightness of LCD
PrintfUartDef("Reg_FDADR0=0x%X, 0x%X, 0x%X, 0x%X", lcdP->FDADR0, lcdP->FSADR0, lcdP->FIDR0, lcdP->LDCMD0);
PrintfUartDef("Mem_FDADR0=0x%X, 0x%X, 0x%X, 0x%X\r\n", pFD->FDADR, pFD->FSADR, pFD->FIDR, pFD->LDCMD);
}
//close LCD controller
PWM_WRITE_DUTY(0, 0);
off();
#else //AUTO_TEST
XsUartDrv_SetDefaultUartDevice(UART_BT);
FormatNormalMessage("Begin LCD 16bpp display test!");
//init LCD controller, must turn off firstly
PWM_WRITE_DUTY(0, 0);
off();
IOW_REG_FIELD(struct lccr0Bits,&lcdP->lccr0, len, 0);//off lcd
InitLcdGraphics ();
fbP = (DM_FrameBuffer_T *)Frame_Buffer_P;
h = 640;
v = 480;
FormatNormalMessage("LCD initialized...");
//FormatNormalMessage("Reg_FDADR0=0x%X, 0x%X, 0x%X, 0x%X", lcdP->FDADR0, lcdP->FSADR0, lcdP->FIDR0, lcdP->LDCMD0);
//FormatNormalMessage("Mem_FDADR0=0x%X, 0x%X, 0x%X, 0x%X", pFD->FDADR, pFD->FSADR, pFD->FIDR, pFD->LDCMD);
// display three color band
fg = (unsigned short)RGB565(31,0,0);
for (i = 0;i<h;i++)
for (j = 0; j<160;j++)
fbP->pixelP[i+j*h]=fg;
fg = (unsigned short)RGB565(0,63,0);
for (i = 0;i<h;i++)
for (j = 160; j<320;j++)
fbP->pixelP[i+j*h]=fg;
fg = (unsigned short)RGB565(0,0,31);
for (i = 0;i<h;i++)
for (j = 320; j<v;j++)
fbP->pixelP[i+j*h]=fg;
SendQuestion("Did you see the three colors band(blue and green and red)?", QUESTION_TIME_OUT_SHORT);
error = 0;
if(G_Parameter1 == QST_YES)
{
FormatNormalMessage("LCD display test OK!");
}
else if(G_Parameter1 == QST_NO)
{
error++;
FormatErrorMessage("LCD display test failed!");
}
else if(G_Parameter1 == QST_NO_RESPONSE)
{
FormatWarningMessage("LCD display test no feed back!");
}
//set PWM0 duty to 50%(512/1024), that will change the brightness of LCD
Util_DelayS(1);
PWM_WRITE_DUTY(0, 512);
SendQuestion("Did you see the brightness changed?", QUESTION_TIME_OUT_SHORT);
if(G_Parameter1 == QST_YES)
{
FormatNormalMessage("LCD brightness test OK!");
}
else if(G_Parameter1 == QST_NO)
{
error++;
FormatErrorMessage("LCD brightness test failed!");
}
else if(G_Parameter1 == QST_NO_RESPONSE)
{
FormatWarningMessage("LCD brightness test no feed back!");
}
//FormatNormalMessage("Reg_FDADR0=0x%X, 0x%X, 0x%X, 0x%X", lcdP->FDADR0, lcdP->FSADR0, lcdP->FIDR0, lcdP->LDCMD0);
//FormatNormalMessage("Mem_FDADR0=0x%X, 0x%X, 0x%X, 0x%X", pFD->FDADR, pFD->FSADR, pFD->FIDR, pFD->LDCMD);
//dont' close LCD controller
//off();
//IOW_REG_FIELD(struct lccr0Bits,&lcdP->lccr0, len, 0);//off lcd
/////////////////////
//display result
if(error)
FormatErrorMessage("Test LCD failed, total error count %d.", error);
else
FormatNormalMessage("Test LCD OK, no error found.");
return (error == 0);
#endif //AUTO_TEST
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -