📄 display.c
字号:
window = GetIntNum();
if( window==(-1) ) return;
else
{
switch(window)
{
case 0:
color_map = 0xffff00;
break;
case 1:
color_map = 0x00ffff;
break;
default:
color_map = 0;
break;
}
LcdWindowOnOff(LCD_WIN_ALL,LCD_OFF);
LcdEnvidOnOff(LCD_OFF);
Basic_Display_Setting(window,LCD_BUF_0,WINCONx_24BPP_888,lcd_horizon_value,lcd_line_value);
LCD_ClearScr(0);
*WINxMAP_Reg_Addr[window] = (1<<24)|(color_map); //color map enable
Display_Start(window);
Display_End(window);
}
}
return;
}
//
//==========================================
//==========================================
// Interrupt Test function(window 1)
//
uint8 int_count=0;
void Test_Interrupt(void)
{
int8 interrupt=-1;
uint8 frame_int_type=0;
while(1)
{
printf("\nSelect Frame-Interrupt or FIFO-Interrupt\n");
printf("(If you want to stop this test, press enter key)\n");
printf(" 1: Frame-Interrupt 2: FIFO-Interrupt\n");
interrupt = GetIntNum();
if( interrupt==(-1) ) return;
else
{
if(interrupt == 1)
{
printf("\nSelect the Frame-Interrupt type which you want to test\n");
printf(" 0: Back Porch 1: VSYNC 2: ACTIVE 3: Front Porch\n");
frame_int_type = GetIntNum();
rVIDINTCON = (frame_int_type<<15)|(1<<12);
int_count = 30;
pISR_LCD = (unsigned)Display_ISR1;
//INT_Enable0(BIT_LCD);
}
else if(interrupt == 2)
{
rVIDINTCON = (1<<6)|(1<<2)|(1<<1); //window 1, fifo level:50%
int_count = 1;
//here some operations are necessary
pISR_LCD = (unsigned)Display_ISR0;
//INT_Enable0(BIT_LCD);
}
else
break;
LcdWindowOnOff(LCD_WIN_ALL,LCD_OFF);
LcdEnvidOnOff(LCD_OFF);
Basic_Display_Setting(LCD_WIN_0,LCD_BUF_0,WINCONx_2BPP_PALLET,lcd_horizon_value,lcd_line_value);
LCD_ClearScr(0);
Prepare_Image(LCD_WIN_0,WINCONx_2BPP_PALLET);
Display_Start(LCD_WIN_0);
rVIDINTCON |= 1; //enable interrupt
while(int_count>0) //wait until interrupt is disposed
{
if(getchar())
break;
}
rVIDINTCON = 0; //disable interrupt
int_count = 0;
//INT_Disable0(BIT_LCD);
//INT_Disable0(BIT_LCD);
Display_End(LCD_WIN_ALL);
}
}
}
void __irq Display_ISR0(void)
{
int_count--;
Uart_putc('.');
ClearPending(BIT_LCD);
if(int_count==0)
{
//INT_Disable0(BIT_LCD);
Uart_putc('\n');
}
//Write_VECTADDR(0x0);
}
void __irq Display_ISR1(void)
{
int_count--;
Uart_putc('.');
ClearPending(BIT_LCD);
if(int_count==0)
{
//INT_Disable0(BIT_LCD);
Uart_putc('\n');
}
//Write_VECTADDR(0x0);
}
//
//==========================================
//==========================================
// Virtual Screen Test Function
//
void Test_Virtual_Screen(void)
{
uint32 i;
uint32 byte_pixel;
LcdWindowOnOff(LCD_WIN_ALL,LCD_OFF);
LcdEnvidOnOff(LCD_OFF);
Basic_Display_Setting(LCD_WIN_0,LCD_BUF_0,WINCONx_24BPP_888,lcd_horizon_value*2,lcd_line_value*2);
LCD_ClearScr(0);
lprintf(0,0,0xffffff,"123456789012345678901234567890123456789012345678901234567890");
lprintf(0,50,0xffffff,"123456789012345678901234567890123456789012345678901234567890");
lprintf(0,100,0xffffff,"123456789012345678901234567890123456789012345678901234567890");
lprintf(0,150,0xffffff,"123456789012345678901234567890123456789012345678901234567890");
Display_Start(LCD_WIN_0);
printf("Press any key to start.\n");
getchar();
byte_pixel = lcd_bit_order[WINCONx_24BPP_888]/8;
for(i=0;i<100;i++) {
*VIDWxADD0_Reg_Addr[LCD_WIN_0][LCD_BUF_0] = (uint32)lcd_framebuffer + i*byte_pixel + i*lcd_horizon_value*2*byte_pixel;
*VIDWxADD1_Reg_Addr[LCD_WIN_0][LCD_BUF_0] = (uint32)lcd_framebuffer + i*byte_pixel + i*lcd_horizon_value*2*byte_pixel + lcd_horizon_value*2*byte_pixel*lcd_line_value;
*VIDWxADD2_Reg_Addr[LCD_WIN_0][LCD_BUF_0] = ((lcd_horizon_value*byte_pixel)<<13)|(lcd_horizon_value*byte_pixel);
delayLoop(1000000);
}
Display_End(LCD_WIN_0);
}
//
//==========================================
// CPU Interface test
void DISP_CMD_OUT(U16 CMD)
{
// U32 data, CMD_UP, CMD_DN;
/*
// CMD = (CMD>>8) + ((0xff & CMD)<<16);
CMD_DN = (CMD>>8);
CMD_UP = ((0xff & CMD)<<16);
rLCD_MAIN_CMD = (CMD_UP + CMD_DN);
// rLCD_MAIN_DATA = CMD_DN;
// data = rLCD_MAIN_DATA;
// UartPrintf(" Reg %x: %x: %x\n", CMD_DN, CMD_UP, data);
*/
// User must be control the CS/WE/OE signal manually in COMMAND mode.
//. it is different with S3CA480
// In DATA mode, cpuif signal generate automatically.
rSIFCCON0 |= (1<<0); // command mode enable
rSIFCCON0 |= (1<<9); // nCS0 enable
Delay(1);
rSIFCCON0 |= (1<<6); // nWE enable
Delay(1);
rSIFCCON1 = CMD;
Delay(1);
rSIFCCON0 |= (1<<6); // nWE disable
Delay(1);
rSIFCCON0 |= (1<<9); // nCS0 disable
rSIFCCON0 |= (1<<0); // command mode disable
// rLCD_MAIN_INDEX = CMD;
// data = rLCD_MAIN_INDEX;
// UartPrintf(" CMD %x: %x\n", CMD, data);
}
void DISP_DATA_OUT(U16 DATA)
{
rSIFCCON1 = DATA;
}
void DisplayOnCpuif(void)
{
int i;
// int x,y,i;
/*Main LCD */
// Power Setting1
DISP_CMD_OUT(0x2201);
Delay(1); //50us 弥家啊 1 捞扼辑....
DISP_CMD_OUT(0x0301);
Delay(42); //5ms
//Initializing Function1
DISP_CMD_OUT(0x00a0);
Delay(1);
DISP_CMD_OUT(0x0110);
Delay(1);
DISP_CMD_OUT(0x0200);
Delay(1);
DISP_CMD_OUT(0x0510);
// DISP_CMD_OUT(0x0500); //boaz.kim, datasheet
Delay(1);
DISP_CMD_OUT(0x0d00);
Delay(400); //boaz.kim // 40 ms 40000us/120us = 333.33 HCLK 20Mhz 扁霖
//Initializing Function2
DISP_CMD_OUT(0x0e00);
Delay(1);
// DISP_CMD_OUT(0x0f00);
DISP_CMD_OUT(0x0f01);
Delay(1);
DISP_CMD_OUT(0x1000);
Delay(1);
DISP_CMD_OUT(0x1100);
Delay(1);
DISP_CMD_OUT(0x1200);
Delay(1);
DISP_CMD_OUT(0x1300);
Delay(1);
DISP_CMD_OUT(0x1400);
Delay(1);
DISP_CMD_OUT(0x1500);
Delay(1);
DISP_CMD_OUT(0x1600);
Delay(1);
DISP_CMD_OUT(0x1700);
Delay(1);
DISP_CMD_OUT(0x3401);
Delay(1);
DISP_CMD_OUT(0x3500);
Delay(400); // 15 ms 15000us/120us = 120 HCLK 20Mhz 扁霖
//Initializing Function3
DISP_CMD_OUT(0x8d01);
Delay(1);
DISP_CMD_OUT(0x8b28);
Delay(1);
DISP_CMD_OUT(0x4b00);
Delay(1);
DISP_CMD_OUT(0x4c00);
Delay(1);
DISP_CMD_OUT(0x4d00);
Delay(1);
DISP_CMD_OUT(0x4e00);
Delay(1);
DISP_CMD_OUT(0x4f00);
Delay(1);
DISP_CMD_OUT(0x5000);
Delay(1);
DISP_CMD_OUT(0x8600);
Delay(1);
DISP_CMD_OUT(0x8726);
Delay(1);
DISP_CMD_OUT(0x8802);
Delay(1);
DISP_CMD_OUT(0x8905);
Delay(1);
DISP_CMD_OUT(0x3301);
Delay(1);
// DISP_CMD_OUT(0x3706);
DISP_CMD_OUT(0x3701); //modified by kwan. letter
Delay(1);
DISP_CMD_OUT(0x7600);
Delay(400); // 15 ms 15000us/120us = 120 HCLK 20Mhz 扁霖
//Initializaing Function4
DISP_CMD_OUT(0x4200);
Delay(1);
DISP_CMD_OUT(0x4300);
Delay(1);
DISP_CMD_OUT(0x4400);
Delay(1);
DISP_CMD_OUT(0x4500);
Delay(1);
DISP_CMD_OUT(0x46ef);
Delay(1);
DISP_CMD_OUT(0x4700);
Delay(1);
DISP_CMD_OUT(0x4800);
Delay(1);
DISP_CMD_OUT(0x4901);
Delay(1);
DISP_CMD_OUT(0x4a3f);
Delay(1);
DISP_CMD_OUT(0x3c00);
Delay(1);
DISP_CMD_OUT(0x3d00);
Delay(1);
DISP_CMD_OUT(0x3e01);
Delay(1);
DISP_CMD_OUT(0x3f3f);
Delay(1);
// DISP_CMD_OUT(0x4001);
DISP_CMD_OUT(0x4003); //modified by kwan. letter
Delay(1);
DISP_CMD_OUT(0x410a);
// Delay(1);
// DISP_CMD_OUT(0x8f05);
Delay(400);
//Initializing funtion5
DISP_CMD_OUT(0x8f00); //?????
Delay(1);
DISP_CMD_OUT(0x903f);
Delay(1);
DISP_CMD_OUT(0x9133);
Delay(1);
DISP_CMD_OUT(0x9277);
Delay(1);
DISP_CMD_OUT(0x9377);
Delay(1);
DISP_CMD_OUT(0x9417);
Delay(1);
DISP_CMD_OUT(0x9500);
Delay(1);
DISP_CMD_OUT(0x9600);
Delay(1);
DISP_CMD_OUT(0x9733);
Delay(1);
DISP_CMD_OUT(0x9877);
Delay(1);
DISP_CMD_OUT(0x9977);
Delay(1);
DISP_CMD_OUT(0x9a17);
Delay(1);
DISP_CMD_OUT(0x9b00);
Delay(1);
DISP_CMD_OUT(0x9c00);
Delay(1);
DISP_CMD_OUT(0x9d80);
Delay(400);
// DISP_CMD_OUT(0x1d0f);
//Power Setting2
DISP_CMD_OUT(0x1d08);
Delay(400);
DISP_CMD_OUT(0x2300);
Delay(5);
DISP_CMD_OUT(0x2494);
Delay(5);
DISP_CMD_OUT(0x256f);
Delay(400); // 40ms
//Power Setting3
// DISP_CMD_OUT(0x281e);
DISP_CMD_OUT(0x2810); //modified by kwan. letter
Delay(1);
DISP_CMD_OUT(0x1a00);
Delay(1);
DISP_CMD_OUT(0x2110);
Delay(1);
DISP_CMD_OUT(0x1825);
Delay(400);
// DISP_CMD_OUT(0x1948);
DISP_CMD_OUT(0x1994); //modified by kwan. letter
Delay(1);
DISP_CMD_OUT(0x18e5);
Delay(334); //5ms
DISP_CMD_OUT(0x18f7);
Delay(400);
// DISP_CMD_OUT(0x1b07);
DISP_CMD_OUT(0x1b09); //modified by kwan. letter
Delay(400); //40ms
// DISP_CMD_OUT(0x1f5a);
// DISP_CMD_OUT(0x2054);
DISP_CMD_OUT(0x1f78); //modified by kwan. letter
Delay(1);
DISP_CMD_OUT(0x2045);
Delay(1);
DISP_CMD_OUT(0x1ec1);
Delay(400);
DISP_CMD_OUT(0x2100);
Delay(1);
DISP_CMD_OUT(0x3b01);
Delay(334); //10ms
DISP_CMD_OUT(0x0020);
// DISP_CMD_OUT(0x0201);
Delay(400); //40ms
//Initialize end
//////// SUB LCD RGB COLOR TEST BAR///////////////////////
/*
for ( y = 0; y < SUBLCD_YDOTS; y++ )
{
for ( x = 0; x < 42; x++ )
{
DISP_DATA_SUB( RED_COLOR );
}
BOOTHW_KICK_WATCHDOG();
for ( x = 0; x < 42; x++ )
{
DISP_DATA_SUB( GREEN_COLOR );
}
BOOTHW_KICK_WATCHDOG();
for ( x = 0; x < 44; x++ )
{
DISP_DATA_SUB( BLUE_COLOR );
}
BOOTHW_KICK_WATCHDOG();
}
*/
}
void DisplayOffCpuif(void)
{
Delay(334); //40ms
DISP_CMD_OUT(0x0000);
Delay(334);
DISP_CMD_OUT(0x3b00);
Delay(334);
DISP_CMD_OUT(0x1f00);
DISP_CMD_OUT(0x2000);
DISP_CMD_OUT(0x1e00);
Delay(334);
DISP_CMD_OUT(0x1b00);
Delay(334);
DISP_CMD_OUT(0x1800);
Delay(334);
DISP_CMD_OUT(0x1900);
Delay(334);
DISP_CMD_OUT(0x2100);
Delay(334);
DISP_CMD_OUT(0x2800);
DISP_CMD_OUT(0x1a00);
}
void StandbyCpuif(void)
{
Delay(334); //40ms
DISP_CMD_OUT(0x0028);
Delay(334);
DISP_CMD_OUT(0x1b06);
Delay(334);
DISP_CMD_OUT(0x1e10);
Delay(334);
DISP_CMD_OUT(0x1800);
Delay(334);
DISP_CMD_OUT(0x0111);
}
void WakeupCpuif(void)
{
Delay(334);
DISP_CMD_OUT(0x0110);
Delay(334);
DisplayOnCpuif();
}
void Test_DisplayFramebufferCpuIf_QVGA(void)
{
U32 i,j,data;
U32 *framebuffer;
printf("CPU I/F Display Controller Test!\n");
//SetMainDisplayBypass();
DisplayOnCpuif();
//SetMainDisplayCpuIf();
framebuffer = (U32 *)LCD_FRAME_BUFFER;
for(i=0; i<240*320*2/4; i++) {
data=cpuiftestimg[i*2+1];
data |= (cpuiftestimg[i*2] <<16);
*framebuffer ++ = data;
}
//MemCopyHostif(0x31000000, A480_LCDFRAMEBUFFER, 240*320*2);
rVIDCON0 =0;
rWINCON0 =0;
rWINCON1 =0;
// rVIDCON0 = (2<<22)|(0<<16)|(0<<2); // VIDOUT = System I/F for Main LDI, output data format = 16bit mode, Video Clock=HCLK
rVIDCON0 = (2<<22)|(0<<16)|(1<<6)|(1<<5)|(1<<4)|(0<<2); // VIDOUT = System I/F for Main LDI, output data format = 16bit mode, Video Clock=HCLK
//rVIDTCON0=(1<<16)|(2<<8)|(1);
//rVIDTCON1=(6<<16)|(2<<8)|(3);
rVIDTCON2 = (319<<11)|(239);
rWINCON1 = (0<<13)|(1<<12)|(2<<9)|(5<<2); // 4word burst, 16bpp,
rVIDOSD1A = (0<<11)|(0);
rVIDOSD1B = (239<<11)|(319);
rVIDW01ADD0 = LCD_FRAME_BUFFER;
rVIDW01ADD1 = LCD_FRAME_BUFFER + 320*240*2;
rVIDW01ADD2 = 240*2;
#if 0 // trigered mode mode
// VCLK = HCLK/2
rSYSIFCON0 = (0x1<<16)|(0x1<<12)|(0x2<<8)|(0x1<<4)|(1<<2)|(0<<1)|(1); // CS_SETUP=0x1, WR_SETUP=0x1, WR_ACT=0x2, WR_HOLD=0x1, RSPOL=HIGH, SUCCEUP=Successive, SYSIFEN=Enable
// VCLk = HCLK
//rSYSIFCON0 = (0x2<<16)|(0x2<<12)|(0x4<<8)|(0x2<<4)|(1<<2)|(0<<1)|(1); // CS_SETUP=0x2, WR_SETUP=0x2, WR_ACT=0x4, WR_HOLD=0x2, RSPOL=HIGH, SUCCEUP=Successive, SYSIFEN=Enable
// VCLK = default
//rSYSIFCON0 = (0xf<<16)|(0xf<<12)|(0xf<<8)|(0xf<<4)|(1<<2)|(0<<1)|(1); // CS_SETUP=0xf, WR_SETUP=0xf, WR_ACT=0xf, WR_HOLD=0xf, RSPOL=HIGH, SUCCEUP=Successive, SYSIFEN=Enable
//rSYSIFCON0 = (0x3<<16)|(0x3<<12)|(0x6<<8)|(0x3<<4)|(1<<2)|(0<<1)|(1); // CS_SETUP=0x2, WR_SETUP=0x2, WR_ACT=0x4, WR_HOLD=0x2, RSPOL=HIGH, SUCCEUP=Successive, SYSIFEN=Enable
#else // Successive mode
// VCLK = HCLK/2
rSYSIFCON0 = (0x1<<16)|(0x1<<12)|(0x2<<8)|(0x1<<4)|(1<<2)|(1<<1)|(1); // CS_SETUP=0x1, WR_SETUP=0x1, WR_ACT=0x2, WR_HOLD=0x1, RSPOL=HIGH, SUCCEUP=Successive, SYSIFEN=Enable
// VCLk = HCLK
//rSYSIFCON0 = (0x2<<16)|(0x2<<12)|(0x4<<8)|(0x2<<4)|(1<<2)|(1<<1)|(1); // CS_SETUP=0x2, WR_SETUP=0x2, WR_ACT=0x4, WR_HOLD=0x2, RSPOL=HIGH, SUCCEUP=Successive, SYSIFEN=Enable
// VCLK = default
//rSYSIFCON0 = (0xf<<16)|(0xf<<12)|(0xf<<8)|(0xf<<4)|(1<<2)|(1<<1)|(1); // CS_SETUP=0xf, WR_SETUP=0xf, WR_ACT=0xf, WR_HOLD=0xf, RSPOL=HIGH, SUCCEUP=Successive, SYSIFEN=Enable
//rSYSIFCON0 = (0x3<<16)|(0x3<<12)|(0x6<<8)|(0x3<<4)|(1<<2)|(1<<1)|(1); // CS_SETUP=0x2, WR_SETUP=0x2, WR_ACT=0x4, WR_HOLD=0x2, RSPOL=HIGH, SUCCEUP=Successive, SYSIFEN=Enable
#endif
rWINCON1 |= 1;
rVIDCON0 |= 3;
printf("If you want to stop, press any key!\n");
printf("rSYSIFCON0:0x%x\n",rSYSIFCON0);
rWINCON1 &= ~1;
rVIDCON0 &= ~3;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -