📄 lcd.c
字号:
/****************************************************************************
* *
* Copyright (c) 2004 - 2006 Winbond Electronics Corp. All rights reserved. *
* *
*****************************************************************************/
/****************************************************************************
* FILENAME
* lcd_test.c
*
* VERSION
* 1.0
*
* DESCRIPTION
* The LCD test program
*
* DATA STRUCTURES
* None
*
* FUNCTIONS
* LCD_BuildInTest
* LCD_Item
* LCD_MediaShowTest
* LCD_Test
*
* HISTORY
* 2006-02-22 Ver 1.0 Modified from LCD NON-OS Library test program by NS21 WTLiu
*
* REMARK
* None
****************************************************************************/
#include <string.h>
#include <stdio.h>
//System Library
#include "wblib.h"
//NON OS Library
#include "w90p710_lcd.h"
#include "wbfat.h"
#include "kpi.h"
//Application layer head file
#include "lcd_pattern.h"
#include "wbfat_test.h"
//#include "ebi_led.h"
//Definition
#define RX_FIFO_DATA_READY 0x1
#ifdef DEBUG_TEST_MODE
#define LCD_SHOW_DELAY 1000000
#else
#define LCD_SHOW_DELAY 10000000
#endif
//Function Definition
extern VOID SD_Init(VOID);
extern VOID Hub_CheckIrqEvent(VOID);
VOID LCD_Test(VOID);
VOID LCD_MediaShowTest(UINT32 uDiskType);
VOID LCD_BuildInTest(VOID);
static VOID LCD_Item(VOID);
/****************************************************************************
* FUNCTION
* LCD_Test
*
* DESCRIPTION
* The main function of LCD test program
*
* CALLED BY
* main
*
* INPUTS
* None
*
* OUTPUTS
* None
*
* HISTORY
* NAME DATE REMARKS
* NS21 WTLiu 2006-03-21 Created initial version
*
* REMARK
* None
****************************************************************************/
VOID LCD_Test(VOID)
{
CHAR cUserSelect;
do
{
LCD_Item();// Show menu
cUserSelect = sysGetChar();// Get user select
switch(cUserSelect)
{
case '1':
{
LCD_BuildInTest();
break;
}
//case '2': LCD_MediaShowTest(USB_DISK); break;
//case '3': LCD_MediaShowTest(SD_DISK); break;
default: break;
}
}while(cUserSelect != 27);// Do until user press ESC
}
/****************************************************************************
* FUNCTION
* LCD_MediaShowTest
*
* DESCRIPTION
* The test function of LCD test program(pattern in SD card or USB disk)
*
* CALLED BY
* LCD_Test
*
* INPUTS
* None
*
* OUTPUTS
* None
*
* HISTORY
* NAME DATE REMARKS
* NS22 CCWang 2006-03-21 Modified from LCD NON-OS Library test program
*
* REMARK
* None
****************************************************************************/
#ifdef DEMO_MODE
VOID LCD_MediaShowTest(UINT32 uDiskType)
{
INT nStatus;
KPISTATUS_union kpikey;
LCD_LOCATION_T location;
LCD_IMAGE_T image;
PUINT8 puLcdBuffer;
CHAR cAsciiFileName[40];
CHAR cUnicodeFileName[40];
UINT32 uPatternSize;
INT nFileHandle;
INT nReadBytes;
UINT uLoop, uDelay;
CHAR cCurrentDrive;
CHAR cUserInput = 0;
BOOL bIsExit = FALSE;
INT8 PixelSEQ = 1; //r1g2b3r4g5b6
kpikey.value = 0;
// re-init SD card
if(uDiskType == SD_DISK)
{
Action_RelessDisk(SD_DISK);
SD_Init();
}
else if(uDiskType == USB_DISK)
{
Hub_CheckIrqEvent();
}
// Get Disk driver number(C: D: ....etc)
cCurrentDrive = Action_GetDriverNo(uDiskType);
if(cCurrentDrive == 0) // Disk not found
{
if(uDiskType == SD_DISK)
{
sysPrintf("SD card not found!\n");
}
else
{
sysPrintf("USB disk not found!\n");
}
sysPrintf("\nLCD test finish!\n");
return;
}
memset(&image, 0, sizeof(LCD_IMAGE_T));
memset(&location, 0, sizeof(LCD_LOCATION_T));
sysPrintf("======================================\n");
sysPrintf("= LCD Playing =\n");
sysPrintf("======================================\n");
sysPrintf("= Next [N] =\n");
sysPrintf("= Previous [R] =\n");
sysPrintf("= Quit [Esc] =\n");
sysPrintf("======================================\n");
// window location
location.x = 0;
location.y = 0;
// window size
image.width = 480;
image.height = 240;
lcdInit(VIDEO_DEVICE);
lcdOpen(VIDEO_DEVICE);
puLcdBuffer = lcdMmap(VIDEO_DEVICE, image.width * image.height * 2);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_SET_IMAGE_SIZE, (UINT32)&image);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_SET_WINDOW, (UINT32)&location);
lcdIoctl(VIDEO_DEVICE,LCD_IOC_PIXELSEQ,(UINT32) &PixelSEQ);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_LCD_ENABLE, 0);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_LCD_DISABLE, 0);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_LCD_ENABLE, 0);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_DISPLAY_ON, 0);
uPatternSize = image.width * image.height * 2;
for(uLoop = 1; uLoop <= 10; uLoop++)
{
Set_EBILED(uLoop);
bIsExit = FALSE;
sysPrintf("Load Pattern %02d ", uLoop);
sprintf(cAsciiFileName, "%c:\\480x240_16bpp_%03d.dat", cCurrentDrive, uLoop);
fsAsciiToUnicode(cAsciiFileName, cUnicodeFileName, TRUE);
nFileHandle = fsOpenFile(cUnicodeFileName, NULL, OP_READ);
if(nFileHandle < 0)
{
sysPrintf("\nCan't open file! Error code:%x!\n", nFileHandle);
fsCloseFile(nFileHandle);
goto quit;
return;
}
fsReadFile(nFileHandle, (PUINT8)puLcdBuffer, uPatternSize, &nReadBytes);
fsCloseFile(nFileHandle);
for(uDelay = 0; uDelay < 2000000; uDelay++)
{
if(uDelay%200000 == 0)
{
sysPrintf(".");
}
if( inpb(REG_UART0_LSR) & RX_FIFO_DATA_READY )
{
cUserInput = sysGetChar();
if(cUserInput == 'n' || cUserInput == 'N')//press space
{
break;
}
else if(cUserInput == 'r' || cUserInput == 'R')
{
if( (uLoop -1) == 0)
{
uLoop = 9;
}
else
{
uLoop -= 3;
}
break;
}
else if(cUserInput == 27) // press ESC
{
bIsExit = TRUE;
break;
}
}
nStatus = kpiRead(KPI, (PUCHAR)&kpikey, NONBLOCK_MODE);
if(_1KEY)
{
if(KEY0R == 0 && KEY0C == 0)
{
if(uLoop == 1)
{
uLoop = 9;
}
else if(uLoop != 1)
{
uLoop -= 2;
}
else
{
uLoop--;
}
break;
}
else if(KEY0R == 0 && KEY0C == 1)
{
break;
}
else if(KEY0R == 0 && KEY0C == 3)
{
bIsExit = TRUE;
break;
}
}
if(bIsExit == TRUE)
{
break;
}
}
sysPrintf("\n");
if(bIsExit == TRUE)
{
break;
}
if(uLoop == 10)
{
uLoop = 0;
}
}
quit:
memset(puLcdBuffer, 0, image.width * image.height * 2);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_DISPLAY_OFF, 0);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_LCD_DISABLE, 0);
lcdClose();
if(uDiskType == SD_DISK)
{
Action_RelessDisk(SD_DISK);
}
sysPrintf("\nLCD test finish!\n");
}
#endif
/****************************************************************************
* FUNCTION
* LCD_BuildIn_Test
*
* DESCRIPTION
* The test function of LCD test program(Build in pattern)
*
* CALLED BY
* LCD_Test
*
* INPUTS
* None
*
* OUTPUTS
* None
*
* HISTORY
* NAME DATE REMARKS
* NS21 WTLiu 2006-02-22 Modified from LCD NON-OS Library test program
*
* REMARK
* None
****************************************************************************/
VOID LCD_BuildInTest(VOID)
{
extern UINT8 image_480x240_16bpp[LCD_PATTERN_SIZE];
INT nLoop;
INT nLEDLoop = 0;
LCD_LOCATION_T location;
LCD_IMAGE_T image;
PUCHAR puLcdBuffer;
INT8 PixelSEQ = 1; //r1g2b3r4g5b6
// Set_EBILED(0x00);
memset(&image, 0, sizeof(LCD_IMAGE_T));
memset(&location, 0, sizeof(LCD_LOCATION_T));
sysPrintf("\nStart LCD test:\n");
// window location
location.x = 0;
location.y = 0;
// window size
image.width = 240;
image.height = 120;
lcdInit(VIDEO_DEVICE);
lcdOpen(VIDEO_DEVICE);
puLcdBuffer = lcdMmap(VIDEO_DEVICE, image.width * image.height * 2);
memcpy(puLcdBuffer, image_480x240_16bpp, image.width * image.height * 2);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_SET_IMAGE_SIZE, (UINT32)&image);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_SET_WINDOW, (UINT32)&location);
lcdIoctl(VIDEO_DEVICE,LCD_IOC_PIXELSEQ,(UINT32) &PixelSEQ);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_LCD_ENABLE, 0);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_LCD_DISABLE, 0);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_LCD_ENABLE, 0);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_DISPLAY_ON, 0);
for(nLoop = 0; nLoop < LCD_SHOW_DELAY; nLoop++)
{
if((nLoop%1000000) == 0)
{
sysPrintf(".");
// Set_EBILED(1<<nLEDLoop++);
// if(nLEDLoop == 8)
//{
nLEDLoop = 0;
// }
}
if(inpb(REG_UART0_LSR) & 0x01)
{
sysGetChar();
break;
}
}
memset(puLcdBuffer, 0, image.width * image.height * 2);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_DISPLAY_OFF, 0);
lcdIoctl(VIDEO_DEVICE, LCD_IOC_LCD_DISABLE, 0);
lcdClose();
// Set_EBILED(0x00);
sysPrintf("\nLCD test finish!\n");
}
/****************************************************************************
* FUNCTION
* LCD_Item
*
* DESCRIPTION
* The test menu of LCD test program
*
* CALLED BY
* LCD_Test
*
* INPUTS
* None
*
* OUTPUTS
* None
*
* HISTORY
* NAME DATE REMARKS
* NS21 WTLiu 2006-03-21 Created initial version
*
* REMARK
* None
****************************************************************************/
static VOID LCD_Item(VOID)
{
sysPrintf("\n\n\n");
sysPrintf("+------------------------------------------------------+\n");
sysPrintf("| Winbond LCD Diagnostic Code |\n");
sysPrintf("+------------------------------------------------------+\n");
sysPrintf("| LCD test(Build in pattern) - [1] |\n");
//sysPrintf("| LCD test(Pattern in USB disk) - [2] |\n");
//sysPrintf("| LCD test(Pattern in SD card) - [3] |\n");
sysPrintf("| Quit - [ESC] |\n");
sysPrintf("+------------------------------------------------------+\n");
sysPrintf("Please Select : \r\n");
}
int main(void)
{
LCD_Test();
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -