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

📄 lcd.c

📁 在开发板的显示器上以480x240的分辨率显示给定图片
💻 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 + -