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

📄 hal_misc.c

📁 一个图形显示芯片s1d13505的应用程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
**===========================================================================
** 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 + -