📄 hal_misc.c
字号:
/*
**===========================================================================
** HAL_MISC.C
**---------------------------------------------------------------------------
** Copyright (c) 1997, 1998 Epson Research and Development, Inc.
** All Rights Reserved.
**===========================================================================
*/
#ifdef INTEL
#include <stdio.h>
#include <time.h>
#endif
#include "hal.h"
#include "assert.h"
#include "nonsefns.h"
/*-------------------------------------------------------------------------*/
static const char Revision[] = "HAL_MISC.C=$Revision: 4 $";
extern LPHAL_STRUCT HalInfoArray[MAX_DEVICE];
/*
** Note that only the upper four bits of the LUT are actually used.
*/
BYTE LUT1[2*3] =
{
0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0
};
BYTE LUT2_Color[4*3] =
{
0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0
};
BYTE LUT2_Mono[4*3] =
{
0x00, 0x00, 0x00, 0x50, 0x50, 0x50, 0xA0, 0xA0, 0xA0, 0xF0, 0xF0, 0xF0
};
BYTE LUT4_Color[16*3] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0xA0,
0xA0, 0x00, 0x00, 0xA0, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0xA0, 0xA0, 0xA0,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0xF0,
0xF0, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0xF0, 0xF0, 0xF0
};
BYTE LUT8_Color[256*3] =
{
/* Primary and secondary colors */
0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0xA0,
0xA0, 0x00, 0x00, 0xA0, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0xA0, 0xA0, 0xA0,
0x50, 0x50, 0x50, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0xF0,
0xF0, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0xF0, 0xF0, 0xF0,
/* Gray shades */
0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x30, 0x30, 0x30,
0x40, 0x40, 0x40, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60, 0x70, 0x70, 0x70,
0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xA0, 0xA0, 0xA0, 0xB0, 0xB0, 0xB0,
0xC0, 0xC0, 0xC0, 0xD0, 0xD0, 0xD0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0,
/* Black to red */
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00,
0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00,
0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xB0, 0x00, 0x00,
0xC0, 0x00, 0x00, 0xD0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00,
/* Black to green */
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00,
0x00, 0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00,
0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xB0, 0x00,
0x00, 0xC0, 0x00, 0x00, 0xD0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x00,
/* Black to blue */
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30,
0x00, 0x00, 0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70,
0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xB0,
0x00, 0x00, 0xC0, 0x00, 0x00, 0xD0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF0,
/* Blue to cyan (blue and green) */
0x00, 0x00, 0xF0, 0x00, 0x10, 0xF0, 0x00, 0x20, 0xF0, 0x00, 0x30, 0xF0,
0x00, 0x40, 0xF0, 0x00, 0x50, 0xF0, 0x00, 0x60, 0xF0, 0x00, 0x70, 0xF0,
0x00, 0x80, 0xF0, 0x00, 0x90, 0xF0, 0x00, 0xA0, 0xF0, 0x00, 0xB0, 0xF0,
0x00, 0xC0, 0xF0, 0x00, 0xD0, 0xF0, 0x00, 0xE0, 0xF0, 0x00, 0xF0, 0xF0,
/* Cyan (blue and green) to green */
0x00, 0xF0, 0xF0, 0x00, 0xF0, 0xE0, 0x00, 0xF0, 0xD0, 0x00, 0xF0, 0xC0,
0x00, 0xF0, 0xB0, 0x00, 0xF0, 0xA0, 0x00, 0xF0, 0x90, 0x00, 0xF0, 0x80,
0x00, 0xF0, 0x70, 0x00, 0xF0, 0x60, 0x00, 0xF0, 0x50, 0x00, 0xF0, 0x40,
0x00, 0xF0, 0x30, 0x00, 0xF0, 0x20, 0x00, 0xF0, 0x10, 0x00, 0xF0, 0x00,
/* Green to yellow (red and green) */
0x00, 0xF0, 0x00, 0x10, 0xF0, 0x00, 0x20, 0xF0, 0x00, 0x30, 0xF0, 0x00,
0x40, 0xF0, 0x00, 0x50, 0xF0, 0x00, 0x60, 0xF0, 0x00, 0x70, 0xF0, 0x00,
0x80, 0xF0, 0x00, 0x90, 0xF0, 0x00, 0xA0, 0xF0, 0x00, 0xB0, 0xF0, 0x00,
0xC0, 0xF0, 0x00, 0xD0, 0xF0, 0x00, 0xE0, 0xF0, 0x00, 0xF0, 0xF0, 0x00,
/* Yellow (red and green) to red */
0xF0, 0xF0, 0x00, 0xF0, 0xE0, 0x00, 0xF0, 0xD0, 0x00, 0xF0, 0xC0, 0x00,
0xF0, 0xB0, 0x00, 0xF0, 0xA0, 0x00, 0xF0, 0x90, 0x00, 0xF0, 0x80, 0x00,
0xF0, 0x70, 0x00, 0xF0, 0x60, 0x00, 0xF0, 0x50, 0x00, 0xF0, 0x40, 0x00,
0xF0, 0x30, 0x00, 0xF0, 0x20, 0x00, 0xF0, 0x10, 0x00, 0xF0, 0x00, 0x00,
/* Red to magenta (blue and red) */
0xF0, 0x00, 0x00, 0xF0, 0x00, 0x10, 0xF0, 0x00, 0x20, 0xF0, 0x00, 0x30,
0xF0, 0x00, 0x40, 0xF0, 0x00, 0x50, 0xF0, 0x00, 0x60, 0xF0, 0x00, 0x70,
0xF0, 0x00, 0x80, 0xF0, 0x00, 0x90, 0xF0, 0x00, 0xA0, 0xF0, 0x00, 0xB0,
0xF0, 0x00, 0xC0, 0xF0, 0x00, 0xD0, 0xF0, 0x00, 0xE0, 0xF0, 0x00, 0xF0,
/* Magenta (blue and red) to blue */
0xF0, 0x00, 0xF0, 0xE0, 0x00, 0xF0, 0xD0, 0x00, 0xF0, 0xC0, 0x00, 0xF0,
0xB0, 0x00, 0xF0, 0xA0, 0x00, 0xF0, 0x90, 0x00, 0xF0, 0x80, 0x00, 0xF0,
0x70, 0x00, 0xF0, 0x60, 0x00, 0xF0, 0x50, 0x00, 0xF0, 0x40, 0x00, 0xF0,
0x30, 0x00, 0xF0, 0x20, 0x00, 0xF0, 0x10, 0x00, 0xF0, 0x00, 0x00, 0xF0,
/* Black to magenta (blue and red) */
0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x20, 0x00, 0x20, 0x30, 0x00, 0x30,
0x40, 0x00, 0x40, 0x50, 0x00, 0x50, 0x60, 0x00, 0x60, 0x70, 0x00, 0x70,
0x80, 0x00, 0x80, 0x90, 0x00, 0x90, 0xA0, 0x00, 0xA0, 0xB0, 0x00, 0xB0,
0xC0, 0x00, 0xC0, 0xD0, 0x00, 0xD0, 0xE0, 0x00, 0xE0, 0xF0, 0x00, 0xF0,
/* Black to cyan (blue and green) */
0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x20, 0x20, 0x00, 0x30, 0x30,
0x00, 0x40, 0x40, 0x00, 0x50, 0x50, 0x00, 0x60, 0x60, 0x00, 0x70, 0x70,
0x00, 0x80, 0x80, 0x00, 0x90, 0x90, 0x00, 0xA0, 0xA0, 0x00, 0xB0, 0xB0,
0x00, 0xC0, 0xC0, 0x00, 0xD0, 0xD0, 0x00, 0xE0, 0xE0, 0x00, 0xF0, 0xF0,
/* Red to white */
0xF0, 0x00, 0x00, 0xF0, 0x10, 0x10, 0xF0, 0x20, 0x20, 0xF0, 0x30, 0x30,
0xF0, 0x40, 0x40, 0xF0, 0x50, 0x50, 0xF0, 0x60, 0x60, 0xF0, 0x70, 0x70,
0xF0, 0x80, 0x80, 0xF0, 0x90, 0x90, 0xF0, 0xA0, 0xA0, 0xF0, 0xB0, 0xB0,
0xF0, 0xC0, 0xC0, 0xF0, 0xD0, 0xD0, 0xF0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0,
/* Green to white */
0x00, 0xF0, 0x00, 0x10, 0xF0, 0x10, 0x20, 0xF0, 0x20, 0x30, 0xF0, 0x30,
0x40, 0xF0, 0x40, 0x50, 0xF0, 0x50, 0x60, 0xF0, 0x60, 0x70, 0xF0, 0x70,
0x80, 0xF0, 0x80, 0x90, 0xF0, 0x90, 0xA0, 0xF0, 0xA0, 0xB0, 0xF0, 0xB0,
0xC0, 0xF0, 0xC0, 0xD0, 0xF0, 0xD0, 0xE0, 0xF0, 0xE0, 0xF0, 0xF0, 0xF0,
/* Blue to white */
0x00, 0x00, 0xF0, 0x10, 0x10, 0xF0, 0x20, 0x20, 0xF0, 0x30, 0x30, 0xF0,
0x40, 0x40, 0xF0, 0x50, 0x50, 0xF0, 0x60, 0x60, 0xF0, 0x70, 0x70, 0xF0,
0x80, 0x80, 0xF0, 0x90, 0x90, 0xF0, 0xA0, 0xA0, 0xF0, 0xB0, 0xB0, 0xF0,
0xC0, 0xC0, 0xF0, 0xD0, 0xD0, 0xF0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0
};
/*-------------------------------------------------------------------------*/
int seSetBitsPerPixel( int seReserved1, UINT nBitsPerPixel )
{
BYTE RegDisplayMode = ReadRegister( seReserved1, REG_DISPLAY_MODE );
BYTE RegPerfEnhan1 = ReadRegister( seReserved1, REG_PERF_ENHANCEMENT1 );
BYTE RegPanelType = ReadRegister( seReserved1, REG_PANEL_TYPE );
BYTE SaveRegPerfEnhan1;
UINT BPP = 0;
LPBYTE pMem = (LPBYTE)HalInfoArray[seReserved1]->dwDispMemAddr;
UINT nHeight, nWidth;
DWORD lLength;
UINT nPelsPerWord;
DWORD MemAddrOffset;
BYTE RegClockConfig;
int ratio;
int i;
BYTE color[3];
SaveRegPerfEnhan1 = RegPerfEnhan1;
if (nBitsPerPixel == 15) /* 15 and 16 bpp are treated the same */
nPelsPerWord = 1;
else
nPelsPerWord = 16 / nBitsPerPixel;
ASSERT( 0 == seReserved1 );
ASSERT((1 == nBitsPerPixel) || (2 == nBitsPerPixel) ||
(4 == nBitsPerPixel) || (8 == nBitsPerPixel) ||
(15 == nBitsPerPixel) || (16 == nBitsPerPixel));
DPF( In seSetBitsPerPixel() );
/*
** If in portrait mode, only support 8/15/16 bpp
*/
if ((RegDisplayMode & 0x80) &&
(nBitsPerPixel != 8) && (nBitsPerPixel != 15) && (nBitsPerPixel != 16))
return ERR_FAILED;
/*
** Calculate the register BPP value.
*/
switch (nBitsPerPixel)
{
case 1:
BPP = 0x00;
break;
case 2:
BPP = 0x01;
break;
case 4:
BPP = 0x02;
break;
case 8:
BPP = 0x03;
break;
case 15:
BPP = 0x04;
break;
case 16:
default: /* This default case should not be necessary. */
BPP = 0x05;
break;
}
RegDisplayMode &= ~0x1c; /* Clear bits for BPP */
RegDisplayMode |= BPP << 2;
/*
** Turn off the display by turning off the FIFO
*/
RegPerfEnhan1 |= 0x80;
WriteRegister( seReserved1, REG_PERF_ENHANCEMENT1, RegPerfEnhan1 );
/*
** Change bit-per-pixel
*/
WriteRegister( seReserved1, REG_DISPLAY_MODE, RegDisplayMode );
/*
** Show all of screen 1
*/
WriteRegister( seReserved1, REG_SCRN1_LINE_COMPARE0, 0xff );
WriteRegister( seReserved1, REG_SCRN1_LINE_COMPARE1, 0x03 );
/*
** Zero the start address registers
*/
WriteRegister( seReserved1, REG_SCRN1_DISP_START_ADDR0, 0 );
WriteRegister( seReserved1, REG_SCRN1_DISP_START_ADDR1, 0 );
WriteRegister( seReserved1, REG_SCRN1_DISP_START_ADDR2, 0 );
WriteRegister( seReserved1, REG_SCRN2_DISP_START_ADDR0, 0 );
WriteRegister( seReserved1, REG_SCRN2_DISP_START_ADDR1, 0 );
WriteRegister( seReserved1, REG_SCRN2_DISP_START_ADDR2, 0 );
/*
** Set up new Memory Address Offset
*/
seGetScreenSize( seReserved1, &nWidth, &nHeight );
/*
** Memory Address Offset = width / # pixels per word
*/
/*
** If portrait mode, the virtual width is always 1024.
** If landscape mode and the horizontal width > 767 and bpp=15 or 16,
** then the virtual width must be 1024.
*/
seGetScreenSize( seReserved1, &nWidth, &nHeight );
if ( (RegDisplayMode & 0x80) ||
((nWidth > 767) && ((nBitsPerPixel == 15) || (nBitsPerPixel == 16))) )
{
MemAddrOffset = 1024/nPelsPerWord;
nWidth = 1024;
}
else
MemAddrOffset = nWidth / nPelsPerWord;
WriteRegister( seReserved1, REG_MEM_ADDR_OFFSET0, (BYTE) (MemAddrOffset & 0xff));
WriteRegister( seReserved1, REG_MEM_ADDR_OFFSET1, (BYTE) ((MemAddrOffset >> 8) & 0xff));
/*
** Clear all visible display memory.
*/
lLength = nWidth * nHeight * nPelsPerWord / 2; /* length in dwords */
seWriteDisplayDwords(seReserved1, 0, 0, lLength);
/*
** Set the LUT to default values.
*/
if (RegPanelType & 0x04) /* color */
{
switch (nBitsPerPixel)
{
case 1:
seSetLut( seReserved1, LUT1, 2 );
break;
case 2:
seSetLut( seReserved1, LUT2_Color, 4 );
break;
case 4:
seSetLut( seReserved1, LUT4_Color, 16 );
break;
case 8:
seSetLut( seReserved1, LUT8_Color, 256 );
break;
default:
break;
}
}
else switch (nBitsPerPixel) /* mono */
{
case 1:
seSetLut( seReserved1, LUT1, 2 );
break;
case 2:
seSetLut( seReserved1, LUT2_Mono, 4 );
break;
case 4:
for (i = 0; i < 16; ++i)
{
color[RED] = (BYTE) (i << 4);
color[GREEN] = (BYTE) (i << 4);
color[BLUE] = (BYTE) (i << 4);
seSetLutEntry( seReserved1, i, color );
}
break;
case 8:
for (i = 0; i < 256; ++i)
{
color[RED] = (BYTE) (i << 4);
color[GREEN] = (BYTE) (i << 4);
color[BLUE] = (BYTE) (i << 4);
seSetLutEntry( seReserved1, i, color );
}
break;
default:
break;
}
/*
** If PCLK == MCLK, and 15/16 bpp, then FIFO threshold must be 0x1b
** Otherwise FIFO threshold must be 0.
*/
if ((nBitsPerPixel == 15) || (nBitsPerPixel == 16))
{
RegClockConfig = ReadRegister( seReserved1, REG_CLOCK_CONFIG );
RegPerfEnhan1 &= ~0x1f;
if ((RegClockConfig & 0x03) == 0) /* PCLK == MCLK */
RegPerfEnhan1 |= 0x1b;
WriteRegister( seReserved1, REG_PERF_ENHANCEMENT1, RegPerfEnhan1 );
}
/*
** Restore original FIFO state (to turn display on or off).
*/
if ((SaveRegPerfEnhan1 & 0x80) == 0)
{
RegPerfEnhan1 &= ~0x80;
WriteRegister( seReserved1, REG_PERF_ENHANCEMENT1, RegPerfEnhan1 );
}
return CheckMaxPClkRatio(seReserved1, &ratio);
}
/*-------------------------------------------------------------------------*/
int seGetBitsPerPixel( int seReserved1, UINT *pBitsPerPixel )
{
ASSERT( 0 == seReserved1 );
switch ((ReadRegister(seReserved1, REG_DISPLAY_MODE) >> 2) & 0x07)
{
case 0x00:
*pBitsPerPixel = 1;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -