📄 lcdlin.c
字号:
#else
#define LCD_XSIZE_P LCD_YSIZE
#define LCD_YSIZE_P LCD_XSIZE
#define LCD_VXSIZE_P LCD_VYSIZE
#define LCD_VYSIZE_P LCD_VXSIZE
#endif
#if LCD_BITSPERPIXEL == 1
#define BYTESPERLINE (LCD_VXSIZE_P/8)
#define WORDSPERLINE (LCD_VXSIZE_P/16)
#elif LCD_BITSPERPIXEL == 2
#define BYTESPERLINE (LCD_VXSIZE_P/4)
#define WORDSPERLINE (LCD_VXSIZE_P/8)
#elif LCD_BITSPERPIXEL == 4
#define BYTESPERLINE (LCD_VXSIZE_P/2)
#define WORDSPERLINE (LCD_VXSIZE_P/4)
#elif LCD_BITSPERPIXEL == 8
#define BYTESPERLINE (LCD_VXSIZE_P)
#define WORDSPERLINE (LCD_VXSIZE_P/2)
#elif (LCD_BITSPERPIXEL == 15)
#define BYTESPERLINE (LCD_VXSIZE_P*2)
#define WORDSPERLINE (LCD_VXSIZE_P)
#elif (LCD_BITSPERPIXEL == 16)
#define BYTESPERLINE (LCD_VXSIZE_P*2)
#define WORDSPERLINE (LCD_VXSIZE_P)
#else
#error This colordepth is not supported !!!
#endif
#ifndef LCD_USE_32BIT_OFF
#if ((WORDSPERLINE * LCD_YSIZE) > 0xFFFF)
#define LCD_USE_32BIT_OFF 1
#else
#define LCD_USE_32BIT_OFF 0
#endif
#endif
#if LCD_USE_32BIT_OFF
typedef unsigned long tOff;
#else
typedef unsigned int tOff;
#endif
/*
*********************************************************
* *
* Macros, standard *
* *
*********************************************************
These macros can be found in any LCD-driver as they serve purposes
that can be found in any class of LCD-driver (Like clipping).
*/
#define BKCOLOR LCD_BKCOLORINDEX
#define COLOR LCD_COLORINDEX
/*
*********************************************************
* *
* Configuration switch checking *
* *
*********************************************************
Please be aware that not all configuration errors can be captured !
*/
/* Check number of controllers */
#if ((LCD_NUM_CONTROLLERS >1) || (LCD_NUM_CONTROLLERS <0))
#error "More than 1 controller not supported by this driver"
#endif
#if ((LCD_CONTROLLER == 1356) || (LCD_CONTROLLER == 13806) || (LCD_CONTROLLER == 1304)) && (LCD_BUSWIDTH != 16)
#error This controller does not work with 8-bit bus
#endif
#if (((LCD_CONTROLLER == 1356) || (LCD_CONTROLLER == 13806) || (LCD_CONTROLLER == 1304)) && LCD_USE_BITBLT && ((LCD_BITSPERPIXEL != 8) && (LCD_BITSPERPIXEL != 16)))
#error BitBlt-Access only available for 8bpp and 16bpp mode
#endif
#if (LCD_CONTROLLER==1374)
#if (LCD_BITSPERPIXEL == 8)
#if (LCD_FIXEDPALETTE != 233)
#error This controller supports only 233 palette in 8 bpp mode !
#endif
#endif
#endif
/*
*********************************************************
* *
* Macros for internal use *
* *
*********************************************************
*/
#if !defined (LCD_LUT_COM)
#define LINE2COM(y) y
#else
#define LINE2COM(y) LCD__aLine2Com0[y]
#endif
#if LCD_BUSWIDTH == 16
#if (LCD_BITSPERPIXEL == 16)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+(x))
#elif (LCD_BITSPERPIXEL == 15)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+(x))
#elif (LCD_BITSPERPIXEL == 8)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+(x>>1))
#elif (LCD_BITSPERPIXEL == 4)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+(x>>2))
#elif (LCD_BITSPERPIXEL == 2)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+((x)>>3))
#elif (LCD_BITSPERPIXEL == 1)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+((x)>>4))
#endif
#else
#if (LCD_BITSPERPIXEL == 16)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)<<1))
#elif (LCD_BITSPERPIXEL == 15)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)<<1))
#elif (LCD_BITSPERPIXEL == 8)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+(x))
#elif (LCD_BITSPERPIXEL == 4)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)>>1))
#elif (LCD_BITSPERPIXEL == 2)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)>>2))
#elif (LCD_BITSPERPIXEL == 1)
#define XY2OFF(x,y) (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)>>3))
#endif
#endif
#if ((LCD_SWAP_BYTE_ORDER) && (LCD_BITSPERPIXEL <=8)) | ((LCD_SWAP_BYTE_ORDER==0) && (LCD_BITSPERPIXEL > 8))
#define READ_MEM(Off, Data) Data = LCD_READ_MEM(Off); Data = ((Data & 0xff) << 8) + (Data >> 8)
#define WRITE_MEM(Off, Data) LCD_WRITE_MEM(Off, (U16)(((Data & 0xff) << 8) + ((Data & 0xff00) >> 8)))
#else
#define READ_MEM(Off, Data) Data = LCD_READ_MEM(Off)
#define WRITE_MEM(Off, Data) LCD_WRITE_MEM(Off, Data)
#endif
#if (LCD_SWAP_BYTE_ORDER | (LCD_BUSWIDTH == 8))
#define READ_REG(Off, Data) Data = LCD_READ_REG(Off)
#define WRITE_REG(Off, Data) LCD_WRITE_REG(Off, Data)
#else
#define READ_REG(Off, Data) { Data = SwapBytes(LCD_READ_REG(Off)); }
#define WRITE_REG(Off, Data) { LCD_WRITE_REG(Off, SwapBytes(Data)); }
#endif
/* No use of LCD_WRITE_MEM, LCD_READ_MEM, LCD_WRITE_REG, LCD_READ_REG from this point */
#if defined (LCD_LUT_COM)
#if (LCD_MIRROR_Y)
#error LCD_MIRROR_Y not supported with COMTrans !
#endif
#if (LCD_MIRROR_X)
#error LCD_MIRROR_X not supported with COMTrans !
#endif
#endif
#if (!defined(LCD_LUT_SEG))
#if (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY)
#define PHYS2LOG(x, y) x, y
#elif (!LCD_MIRROR_X && !LCD_MIRROR_Y && LCD_SWAP_XY)
#define PHYS2LOG(x, y) y, x
#elif (!LCD_MIRROR_X && LCD_MIRROR_Y && !LCD_SWAP_XY)
#define PHYS2LOG(x, y) x, LCD_YSIZE - 1 - (y)
#elif (!LCD_MIRROR_X && LCD_MIRROR_Y && LCD_SWAP_XY)
#define PHYS2LOG(x, y) y, LCD_XSIZE - 1 - (x)
#elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY)
#define PHYS2LOG(x, y) LCD_XSIZE - 1 - (x), y
#elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && LCD_SWAP_XY)
#define PHYS2LOG(x, y) LCD_YSIZE - 1 - (y), x
#elif ( LCD_MIRROR_X && LCD_MIRROR_Y && !LCD_SWAP_XY)
#define PHYS2LOG(x, y) LCD_XSIZE - 1 - (x), LCD_YSIZE - 1 - (y)
#elif ( LCD_MIRROR_X && LCD_MIRROR_Y && LCD_SWAP_XY)
#error This combination of mirroring/swapping not yet supported
#endif
#else
#define PHYS2LOG(x, y) LCD__aCol2Seg0[x], y
#endif
#define SETPIXEL(x, y, c) _SetPixel (PHYS2LOG(x, y), c)
#define GETPIXEL(x, y) _GetPixelIndex(PHYS2LOG(x, y))
#define XORPIXEL(x, y) XorPixel (PHYS2LOG(x, y))
/*
*********************************************************
* *
* Register access routines *
* *
*********************************************************
*/
#if (LCD_CONTROLLER == 1374)
#if defined(LCD_READ_REG)
#if (LCD_BUSWIDTH == 8)
#define READ_REG_BYTE(Off) LCD_READ_REG(Off)
#else
#define READ_REG_BYTE(Off) _ReadRegByte(Off)
static U8 _ReadRegByte(int Off) {
U16 Data = LCD_READ_REG((Off>>1));
#if LCD_SWAP_BYTE_ORDER
return (Off&1) ? Data>>8 : Data&255;
#else
return (Off&1) ? Data&255 : Data>>8;
#endif
}
#endif
#endif
#endif
/*********************************************************************
*
* Static routines
*
**********************************************************************
*/
/*********************************************************************
*
* SwapBytes
*
* Changed from static to a non static function to avoid compiler warnings.
*/
U16 SwapBytes(U16 Data);
U16 SwapBytes(U16 Data) {
return (Data<<8) | (Data>>8);
}
#if !defined(LCD_SET_LUT_ENTRY)
#if (LCD_CONTROLLER == 1301) /* Capricorn 2 */
/*********************************************************************
*
* _SetLUTEntry_1301
*/
static void _SetLUTEntry_1301(U8 Pos, LCD_COLOR color) {
U8 r = color & 0xff;
U8 g = (color & 0xff00) >> 8;
U8 b = (color & 0xff0000) >> 16;
U32 LUTEntry = ((r >> 3) << 27) | ((g >> 3) << 22) | ((b >> 2) << 17);
#ifndef WIN32
#if (LCD_DISPLAY_INDEX == 0)
*(U32*)(LCD_LUT_0_VADR + 4 * Pos) = LUTEntry;
#elif (LCD_DISPLAY_INDEX == 1)
*(U32*)(LCD_LUT_1_VADR + 4 * Pos) = LUTEntry;
#elif (LCD_DISPLAY_INDEX == 2)
*(U32*)(LCD_LUT_2_VADR + 4 * Pos) = LUTEntry;
#elif (LCD_DISPLAY_INDEX == 3)
*(U32*)(LCD_LUT_3_VADR + 4 * Pos) = LUTEntry;
#else
#error Illegal Layer!
#endif
#else
LCDSIM_SetLUTEntry(Pos, color, LCD_DISPLAY_INDEX);
#endif
}
#define LCD_SET_LUT_ENTRY(Pos, Color) _SetLUTEntry_1301(Pos, Color)
#elif (LCD_CONTROLLER == 1302) && defined (__WATCOMC__)
/*********************************************************************
*
* _SetLUTEntry_1302
*/
static void _SetLUTEntry_1302(U8 Pos, LCD_COLOR color) {
U8 r = color & 0xff;
U8 g = (color & 0xff00) >> 8;
U8 b = (color & 0xff0000) >> 16;
outp(0x3c8, Pos);
outp(0x3c9, r);
outp(0x3c9, g);
outp(0x3c9, b);
}
#define LCD_SET_LUT_ENTRY(Pos, Color) _SetLUTEntry_1302(Pos, Color)
#elif (LCD_CONTROLLER == 1374)
/*********************************************************************
*
* _SetLUTEntry_1374
*/
static void _SetLUTEntry_1374(U8 Pos, LCD_COLOR color) {
int i;
U16 aColorSep[3];
for (i = 0; i < 3; i++) {
aColorSep[i] = color &0xff;
color >>= 8;
}
/* Convert 8 bit color seperation into index */
for (i = 0; i < 3; i++) {
aColorSep[i] = (U16)(aColorSep[i] + 8) / 17;
}
/* Write into palette register */
LCD_ENABLE_REG_ACCESS();
/* 4 bit palette */
#if (LCD_BUSWIDTH == 16)
WRITE_REG((0x14 >> 1), Pos * 0x101); /* Select position */
for (i = 0; i < 3; i++) {
WRITE_REG((0x16 >> 1), ((U16)aColorSep[i] * 17) << 8); /* 1375 expects high nibble, 1374 low nibble (so this works on both) */
}
#else
WRITE_REG((0x15), Pos); /* Select position */
for (i = 0; i < 3; i++) {
WRITE_REG((0x17), aColorSep[i]);
}
#endif
LCD_ENABLE_MEM_ACCESS();
}
#define LCD_SET_LUT_ENTRY(Pos, Color) _SetLUTEntry_1374(Pos, Color)
#elif (LCD_CONTROLLER == 1375)
/*********************************************************************
*
* _SetLUTEntry_1375
*/
static void _SetLUTEntry_1375(U8 Pos, LCD_COLOR color) {
int i;
U16 aColorSep[3];
for (i = 0; i < 3; i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -