📄 smilynxem.c
字号:
/* * (C) Copyright 1997-2002 ELTEC Elektronik AG * Frank Gottschling <fgottschling@eltec.de> * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA *//* * smiLynxEM.c * * Silicon Motion graphic interface for sm810/sm710/sm712 accelerator * * modification history * -------------------- * 04-18-2002 Rewritten for PPCBoot <fgottschling@eltec.de>. * */#include <common.h>#if defined(CONFIG_VIDEO_SMI_LYNXEM)#include <pci.h>#include <video_fb.h>/* * Export Graphic Device */GraphicDevice smi;/* * SMI 710/712 have 4MB internal RAM; SMI 810 2MB internal + 2MB external */#define VIDEO_MEM_SIZE 0x400000/* * Supported video modes for SMI Lynx E/EM/EM+ */#define VIDEO_MODES 7#define DUAL_800_600 0 /* SMI710:VGA1:75Hz (pitch=1600) */ /* VGA2:60/120Hz (pitch=1600) */ /* SMI810:VGA1:75Hz (pitch=1600) */ /* VGA2:75Hz (pitch=1600) */#define DUAL_1024_768 1 /* VGA1:75Hz VGA2:73Hz (pitch=2048) */#define SINGLE_800_600 2 /* VGA1:75Hz (pitch=800) */#define SINGLE_1024_768 3 /* VGA1:75Hz (pitch=1024) */#define SINGLE_1280_1024 4 /* VGA1:75Hz (pitch=1280) */#define TV_MODE_CCIR 5 /* VGA1:50Hz (h=720;v=576;pitch=720) */#define TV_MODE_EIA 6 /* VGA1:60Hz (h=720;v=484;pitch=720) *//* * ISA mapped regs */#define SMI_INDX_C4 (pGD->isaBase + 0x03c4) /* index reg */#define SMI_DATA_C5 (pGD->isaBase + 0x03c5) /* data reg */#define SMI_INDX_D4 (pGD->isaBase + 0x03d4) /* index reg */#define SMI_DATA_D5 (pGD->isaBase + 0x03d5) /* data reg */#define SMI_INDX_CE (pGD->isaBase + 0x03ce) /* index reg */#define SMI_DATA_CF (pGD->isaBase + 0x03cf) /* data reg */#define SMI_LOCK_REG (pGD->isaBase + 0x03c3) /* unlock/lock ext crt reg */#define SMI_MISC_REG (pGD->isaBase + 0x03c2) /* misc reg */#define SMI_LUT_MASK (pGD->isaBase + 0x03c6) /* lut mask reg */#define SMI_LUT_START (pGD->isaBase + 0x03c8) /* lut start index */#define SMI_LUT_RGB (pGD->isaBase + 0x03c9) /* lut colors auto incr.*//* * Video processor control*/typedef struct { unsigned int control; unsigned int colorKey; unsigned int colorKeyMask; unsigned int start; unsigned short offset; unsigned short width; unsigned int fifoPrio; unsigned int fifoERL; unsigned int YUVtoRGB;} SmiVideoProc;/* * Video window control */typedef struct { unsigned short top; unsigned short left; unsigned short bottom; unsigned short right; unsigned int srcStart; unsigned short width; unsigned short offset; unsigned char hStretch; unsigned char vStretch;} SmiVideoWin;/* * Capture port control */typedef struct { unsigned int control; unsigned short topClip; unsigned short leftClip; unsigned short srcHeight; unsigned short srcWidth; unsigned int srcBufStart1; unsigned int srcBufStart2; unsigned short srcOffset; unsigned short fifoControl;} SmiCapturePort;/* * Register values for common video modes */static char SMI_SCR[22] = { /* all modes */ 0x10, 0xff, 0x11, 0xff, 0x12, 0xff, 0x13, 0xff, 0x14, 0x00, 0x15, 0x90, 0x16, 0x10, 0x17, 0x2c, 0x18, 0xb1, 0x19, 0x20, 0x1a, 0x01};static char SMI_EXT_CRT[VIDEO_MODES][24] = { { /* DUAL_800_600_8 */ 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00 }, { /* DUAL_1024_768_8 */ 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00 }, { /* SINGLE_800_600_8 */ 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00 }, { /* SINGLE_1024_768_8 */ 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00 }, { /* SINGLE_1280_1024_8 */ 0x30, 0x09, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00 }, { /* TV_MODE_CCIR */ 0x30, 0x80, 0x31, 0x2b, 0x32, 0x06, 0x33, 0x01, 0x34, 0x26, 0x35, 0x88, 0x36, 0x02, 0x38, 0x11, 0x39, 0x11, 0x3a, 0x20, 0x3e, 0xa3, 0x3f, 0x00 }, { /* TV_MODE_EIA */ 0x30, 0x80, 0x31, 0x2b, 0x32, 0x06, 0x33, 0x00, 0x34, 0xf8, 0x35, 0x88, 0x36, 0x02, 0x38, 0x11, 0x39, 0x11, 0x3a, 0x20, 0x3e, 0xa3, 0x3f, 0x00 },};static char SMI_CRTCR[VIDEO_MODES][50] = { { /* DUAL_800_600_8 */ 0x00, 0x7f, 0x01, 0x63, 0x02, 0x63, 0x03, 0x00, 0x04, 0x68, 0x05, 0x12, 0x06, 0x6f, 0x07, 0xf0, 0x08, 0x00, 0x09, 0x60, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x59, 0x11, 0x2c, 0x12, 0x57, 0x13, 0x64, 0x14, 0x40, 0x15, 0x57, 0x16, 0x00, 0x17, 0xe3, 0x18, 0xff }, { /* DUAL_1024_768_8 */ 0x00, 0x9f, 0x01, 0x7f, 0x02, 0x7f, 0x03, 0x00, 0x04, 0x82, 0x05, 0x0e, 0x06, 0x1e, 0x07, 0xf5, 0x08, 0x00, 0x09, 0x60, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x11, 0x24, 0x12, 0xff, 0x13, 0x80, 0x14, 0x40, 0x15, 0xff, 0x16, 0x00, 0x17, 0xe3, 0x18, 0xff }, { /* SINGLE_800_600_8 */ 0x00, 0x7f, 0x01, 0x63, 0x02, 0x63, 0x03, 0x00, 0x04, 0x68, 0x05, 0x12, 0x06, 0x6f, 0x07, 0xf0, 0x08, 0x00, 0x09, 0x60, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x59, 0x11, 0x2c, 0x12, 0x57, 0x13, 0x32, 0x14, 0x40, 0x15, 0x57, 0x16, 0x00, 0x17, 0xe3, 0x18, 0xff }, { /* SINGLE_1024_768_8 */ 0x00, 0x9f, 0x01, 0x7f, 0x02, 0x7f, 0x03, 0x00, 0x04, 0x82, 0x05, 0x0e, 0x06, 0x1e, 0x07, 0xf5, 0x08, 0x00, 0x09, 0x60, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x11, 0x24, 0x12, 0xff, 0x13, 0x40, 0x14, 0x40, 0x15, 0xff, 0x16, 0x00, 0x17, 0xe3, 0x18, 0xff }, { /* SINGLE_1280_1024_8 */ 0x00, 0xce, 0x01, 0x9f, 0x02, 0x9f, 0x03, 0x00, 0x04, 0xa2, 0x05, 0x12, 0x06, 0x2a, 0x07, 0x5a, 0x08, 0x00, 0x09, 0x60, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x11, 0x23, 0x12, 0xff, 0x13, 0x50, 0x14, 0x40, 0x15, 0xff, 0x16, 0x00, 0x17, 0xe3, 0x18, 0xff }, { /* TV_MODE_CCIR */ 0x00, 0x00, 0x01, 0x59, 0x02, 0x63, 0x03, 0x00, 0x04, 0x69, 0x05, 0x10, 0x06, 0x72, 0x07, 0xf0, 0x08, 0x00, 0x09, 0x60, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x58, 0x11, 0x2c, 0x12, 0x57, 0x13, 0x2d, 0x14, 0x40, 0x15, 0x57, 0x16, 0x00, 0x17, 0xe3, 0x18, 0xff }, { /* TV_MODE_EIA */ 0x00, 0x00, 0x01, 0x59, 0x02, 0x63, 0x03, 0x00, 0x04, 0x69, 0x05, 0x10, 0x06, 0x72, 0x07, 0xf0, 0x08, 0x00, 0x09, 0x60, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x58, 0x11, 0x2c, 0x12, 0x57, 0x13, 0x2d, 0x14, 0x40, 0x15, 0x57, 0x16, 0x00, 0x17, 0xe3, 0x18, 0xff },};static char SMI_SEQR[10] = { 0x00, 0x03, 0x01, 0x01, 0x02, 0x0f, 0x03, 0x03, 0x04, 0x0e};static char SMI_PCR[VIDEO_MODES][8] = { { /* DUAL_800_600_8 */ 0x20, 0x04, 0x21, 0x20, 0x22, 0x00, 0x23, 0x00 }, { /* DUAL_1024_768_8 */ 0x20, 0x04, 0x21, 0x20, 0x22, 0x00, 0x23, 0x00 }, { /* SINGLE_800_600_8 */ 0x20, 0x04, 0x21, 0x30, 0x22, 0x02, 0x23, 0x00 }, { /* SINGLE_1024_768_8 */ 0x20, 0x04, 0x21, 0x30, 0x22, 0x02, 0x23, 0x00 }, { /* SINGLE_1280_1024_8 */ 0x20, 0x04, 0x21, 0x30, 0x22, 0x02, 0x23, 0x00 }, { /* TV_MODE_CCIR */ 0x20, 0x04, 0x21, 0x30, 0x22, 0x02, 0x23, 0x00 }, { /* TV_MODE_EIA */ 0x20, 0x04, 0x21, 0x30, 0x22, 0x02, 0x23, 0x00 },};static char SMI_MCR[VIDEO_MODES][6] = { { /* DUAL_800_600_8 */ 0x60, 0x01, 0x61, 0x00, 0x62, 0x7a }, { /* DUAL_1024_768_8 */ 0x60, 0x01, 0x61, 0x00, 0x62, 0x7a }, { /* SINGLE_800_600_8 */ 0x60, 0x00, 0x61, 0x00, 0x62, 0x34 }, { /* SINGLE_1024_768_8 */ 0x60, 0x00, 0x61, 0x00, 0x62, 0xfe }, { /* SINGLE_1280_1024_8 */ 0x60, 0x00, 0x61, 0x00, 0x62, 0xfe }, { /* TV_MODE_CCIR */ 0x60, 0x00, 0x61, 0x00, 0x62, 0x34 }, { /* TV_MODE_EIA */ 0x60, 0x00, 0x61, 0x00, 0x62, 0x34 },};static char SMI_CCR[VIDEO_MODES][18] = { { /* DUAL_800_600_8 */ 0x65, 0x34, 0x68, 0x50, 0x69, 0x05, 0x6a, 0x53, 0x6b, 0x15, 0x6c, 0x15, 0x6d, 0x06, 0x6e, 0x3d, 0x6f, 0x12 }, { /* DUAL_1024_768_8 */ 0x65, 0x00, 0x68, 0x50, 0x69, 0x06, 0x6a, 0x53, 0x6b, 0x15, 0x6c, 0x0b, 0x6d, 0x02, 0x6e, 0x0b, 0x6f, 0x02 }, { /* SINGLE_800_600_8 */ 0x65, 0x34, 0x68, 0x40, 0x69, 0x03, 0x6a, 0x53, 0x6b, 0x15, 0x6c, 0x15, 0x6d, 0x06, 0x6e, 0x3d, 0x6f, 0x12 }, { /* SINGLE_1024_768_8 */ 0x65, 0x00, 0x68, 0x50, 0x69, 0x03, 0x6a, 0x53, 0x6b, 0x15, 0x6c, 0x0b, 0x6d, 0x02, 0x6e, 0x0b, 0x6f, 0x02 }, { /* SINGLE_1280_1024_8 */ 0x65, 0x00, 0x68, 0x50, 0x69, 0x03, 0x6a, 0x53, 0x6b, 0x15, 0x6c, 0xd9, 0x6d, 0x17, 0x6e, 0xd9, 0x6f, 0x17 }, { /* TV_MODE_CCIR */ 0x65, 0x07, 0x68, 0xc0, 0x69, 0x81, 0x6a, 0x53, 0x6b, 0x15, 0x6c, 0x15, 0x6d, 0x06, 0x6e, 0x3d, 0x6f, 0x12 }, { /* TV_MODE_EIA */ 0x65, 0x07, 0x68, 0xc0, 0x69, 0x81, 0x6a, 0x53, 0x6b, 0x15, 0x6c, 0x15, 0x6d, 0x06, 0x6e, 0x3d, 0x6f, 0x12 },};static char SMI_SHVGA[VIDEO_MODES][24] = { { /* DUAL_800_600_8 */ 0x40, 0x7f, 0x41, 0x63, 0x42, 0x00, 0x43, 0x68, 0x44, 0x12, 0x45, 0x6f, 0x46, 0x57, 0x47, 0x00, 0x48, 0x59, 0x49, 0x0c, 0x4a, 0xa0, 0x4b, 0x20, }, { /* DUAL_1024_768_8 */ 0x40, 0x9f, 0x41, 0x7f, 0x42, 0x00, 0x43, 0x82, 0x44, 0x0e, 0x45, 0x1e, 0x46, 0xff, 0x47, 0x00, 0x48, 0x00, 0x49, 0x03, 0x4a, 0xe5, 0x4b, 0x20, }, { /* SINGLE_800_600_8 */ 0x40, 0x7f, 0x41, 0x63, 0x42, 0x00, 0x43, 0x68, 0x44, 0x12, 0x45, 0x6f, 0x46, 0x57, 0x47, 0x00, 0x48, 0x59, 0x49, 0x0c, 0x4a, 0xa0, 0x4b, 0x20, }, { /* SINGLE_1024_768_8 */ 0x40, 0x9f, 0x41, 0x7f, 0x42, 0x00, 0x43, 0x82, 0x44, 0x0e, 0x45, 0x1e, 0x46, 0xff, 0x47, 0x00, 0x48, 0x01, 0x49, 0x04, 0x4a, 0xa5, 0x4b, 0x20, }, { /* SINGLE_1280_1024_8 */ 0x40, 0xce, 0x41, 0x9f, 0x42, 0x00, 0x43, 0xa2, 0x44, 0x12, 0x45, 0x2a, 0x46, 0xff, 0x47, 0x00, 0x48, 0x01, 0x49, 0x03, 0x4a, 0x4a, 0x4b, 0x20, }, { /* TV_MODE_CCIR */ 0x40, 0x6d, 0x41, 0x59, 0x42, 0x00, 0x43, 0x60, 0x44, 0x09, 0x45, 0x38, 0x46, 0x25, 0x47, 0x05, 0x48, 0x2a, 0x49, 0x00, 0x4a, 0x4d, 0x4b, 0x00, }, { /* TV_MODE_EIA */ 0x40, 0x6d, 0x41, 0x59, 0x42, 0x00, 0x43, 0x60, 0x44, 0x09, 0x45, 0x06, 0x46, 0xf7, 0x47, 0x05, 0x48, 0xfa, 0x49, 0x00, 0x4a, 0x41, 0x4b, 0x00, },};static char SMI_GPR[VIDEO_MODES][12] = { { /* DUAL_800_600_8 */ 0x70, 0x00, 0x71, 0xa2, 0x72, 0x0f, 0x73, 0x30, 0x74, 0x40, 0x75, 0x00 }, { /* DUAL_1024_768_8 */ 0x70, 0x00, 0x71, 0xa2, 0x72, 0x0f, 0x73, 0x30, 0x74, 0x40, 0x75, 0x00 }, { /* SINGLE_800_600_8 */ 0x70, 0x00, 0x71, 0xa2, 0x72, 0x0f, 0x73, 0x30, 0x74, 0x40, 0x75, 0x00 }, { /* SINGLE_1024_768_8 */ 0x70, 0x00, 0x71, 0xa2, 0x72, 0x0f, 0x73, 0x30, 0x74, 0x40, 0x75, 0x00 }, { /* SINGLE_1280_1024_8 */ 0x70, 0x00, 0x71, 0xa2, 0x72, 0x0f, 0x73, 0x30, 0x74, 0x40, 0x75, 0x00 }, { /* TV_MODE_CCIR */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -