⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testlcd.c

📁 lcd 测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	// 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 + -