summaryrefslogtreecommitdiff
path: root/src/panel/cen9211.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/panel/cen9211.c')
-rw-r--r--src/panel/cen9211.c866
1 files changed, 866 insertions, 0 deletions
diff --git a/src/panel/cen9211.c b/src/panel/cen9211.c
new file mode 100644
index 0000000..3abc7d5
--- /dev/null
+++ b/src/panel/cen9211.c
@@ -0,0 +1,866 @@
+/* Copyright (c) 2005 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Neither the name of the Advanced Micro Devices, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ * */
+
+/*
+ * File Contents: This file contains panel functions to interface with
+ * the centaraus platform.
+ *
+ * SubModule: Geode FlatPanel library
+ * */
+
+#include "cen9211.h"
+
+static unsigned char sioc2_orig_val;
+static unsigned char must_restore_97317 = FALSE;
+
+/********************************************************************
+ *
+ * PASS_FAIL init_GPIO(void);
+ * Initializes the GPIO pins in the Cx5530 or the National PC97317
+ * for use with a 9211 on a Marmot or Centaurus board. Uses
+ * the global variables RdPCIVal and sioc2_orig_val.
+ *
+ *********************************************************************/
+
+unsigned char
+init_Centaurus_GPIO(void)
+{
+ unsigned char reg_val;
+ static unsigned char first_time = TRUE;
+
+ /* The Centaurus board uses ports 1 and 2 of the 97317 for GPIO.
+ * These ports require bank 0 to be active. The first thing we will
+ * do is verify that bank 0 is active and set it if it is not.
+ */
+
+ /* set the index for access to the configuration register */
+ gfx_outb(CENT_CONFIG_INDEX, CENT_SIOC2);
+ reg_val = gfx_inb(CENT_CONFIG_DATA);
+
+ /* set to bank 0 */
+ if (reg_val & CENT_GPIO_BANK_SELECT) {
+ gfx_outb(CENT_CONFIG_DATA,
+ (unsigned char)(reg_val & ~CENT_GPIO_BANK_SELECT));
+ }
+
+ /* If this is the first time we have modified sioc2, we must
+ * save the current value (set by the BIOS) for restoration by
+ * the calling program, set the global flag must_restore_97317, and set
+ * first_time to FALSE.
+ */
+
+ if (first_time == TRUE) {
+ sioc2_orig_val = reg_val;
+ must_restore_97317 = TRUE;
+ first_time = FALSE;
+ }
+
+ /* set port 1 direction */
+ reg_val = gfx_inb(CENT_PORT1_DIRECTION);
+
+ /* make GPIO 14 and 17 outputs */
+ reg_val |= CENT_97317_CLOCK_MASK | CENT_97317_DATA_OUT_MASK;
+ gfx_outb(CENT_PORT1_DIRECTION, reg_val);
+
+ /* set port 2 direction */
+ reg_val = gfx_inb(CENT_PORT2_DIRECTION);
+
+ /* make GPIO 20 an output */
+
+ reg_val |= CENT_97317_CHIP_SEL_MASK;
+
+ /* make GPIO 21 an input */
+
+ reg_val &= ~CENT_97317_DATA_IN_MASK;
+ gfx_outb(CENT_PORT2_DIRECTION, reg_val);
+
+ /* make GPIO 14 and 17 push-pull */
+
+ reg_val = gfx_inb(CENT_PORT1_OUTPUT_TYPE);
+ reg_val |= CENT_97317_CLOCK_MASK | CENT_97317_DATA_OUT_MASK;
+ gfx_outb(CENT_PORT1_OUTPUT_TYPE, reg_val);
+
+ /* make GPIO 20 and 21 push-pull */
+ reg_val = gfx_inb(CENT_PORT2_OUTPUT_TYPE);
+ reg_val |= CENT_97317_CHIP_SEL_MASK | CENT_97317_DATA_IN_MASK;
+ gfx_outb(CENT_PORT2_OUTPUT_TYPE, reg_val);
+ return CENT_PASS;
+
+} /* end init_GPIO() */
+
+/*********************************************************************
+ *
+ * PASS_FAIL init_9211(void);
+ * Initializes (sets to 0) the clock, chip select, and data pins
+ * of the Cx9211 on a Marmot or Centaurus board.
+ *
+ **********************************************************************/
+
+unsigned char
+init_Centaurus_9211(void)
+{
+ unsigned char ReadData;
+
+ /* Uses the 97317 for GPIO.
+ * we will use the clock port define for port 1
+ */
+ ReadData = gfx_inb(CENT_97317_CLOCK_PORT);
+ ReadData &= ~CENT_97317_CLOCK_MASK & ~CENT_97317_DATA_OUT_MASK;
+ gfx_outb(CENT_97317_CLOCK_PORT, ReadData);
+ /* we will use the chip select port define for port 2 */
+ ReadData = gfx_inb(CENT_97317_CHIP_SELECT);
+ ReadData &= ~CENT_97317_CHIP_SEL_MASK & ~CENT_97317_DATA_IN_MASK;
+ gfx_outb(CENT_97317_CHIP_SELECT, ReadData);
+ return (CENT_PASS);
+
+} /*end init_9211() */
+
+/******************************************************************
+ *
+ * PASS_FAIL restore_97317_SIOC2(void);
+ * Restores the original value to the 97317 SIOC2 register using
+ * the global variable sioc2_orig_val. Returns PASS if the value
+ * was written, FAIL if not.
+ *
+ *******************************************************************/
+
+unsigned char
+restore_Centaurus_97317_SIOC2(void)
+{
+ /* set the global flag */
+ if (must_restore_97317 == TRUE) {
+ unsigned char cfg;
+
+ /* set the index for access to the configuration register */
+ gfx_outb(CENT_CONFIG_INDEX, CENT_SIOC2);
+
+ /* restore the value */
+ gfx_outb(CENT_CONFIG_DATA, sioc2_orig_val);
+
+ /* now read and verify */
+ cfg = gfx_inb(CENT_CONFIG_DATA);
+ if (cfg == sioc2_orig_val)
+ return (CENT_PASS);
+ else
+ return (CENT_FAIL);
+
+ } /* end if() */
+ return (CENT_FAIL);
+
+} /* end restore_97317_SIOC2bank() */
+
+/* -----------------------------------------------------------------------
+ *
+ * SET_FLAT_PANEL_MODE
+ *
+ * This routine sets the specified flat panel moden parameters in
+ * the 9211.
+ * Returns PASS if successful, FAIL if the mode parameters could
+ * not be set.
+ *
+ *------------------------------------------------------------------------*/
+
+unsigned char
+set_Centaurus_92xx_mode(Pnl_PanelStat * pstat)
+{
+ int mode;
+
+ /* LOOP THROUGH THE AVAILABLE MODES TO FIND A MATCH */
+
+ for (mode = 0; mode < NUM_92XX_MODES; mode++) {
+ if ((FPModeParams[mode].xres == pstat->XRes) &&
+ (FPModeParams[mode].yres == pstat->YRes) &&
+ (FPModeParams[mode].bpp == pstat->Depth) &&
+ (FPModeParams[mode].panel_type == pstat->Type) &&
+ (FPModeParams[mode].color_type == pstat->MonoColor)) {
+
+ /* SET THE 92xx FOR THE SELECTED MODE */
+ set_Centaurus_92xx_mode_params(mode);
+ return (CENT_PASS);
+ } /* end if() */
+ } /* end for() */
+ return (CENT_FAIL);
+
+} /* end set_Centaurus_92xx_mode() */
+
+/*-------------------------------------------------------------------
+ *
+ * SET_92XX_MODE_PARAMS
+ * This routine sets the 9211 mode parameters.
+ *
+ *-------------------------------------------------------------------*/
+
+void
+set_Centaurus_92xx_mode_params(int mode)
+{
+ CS92xx_MODE *pMode = &FPModeParams[mode];
+ unsigned long off_data = 0;
+
+ /* Turn the 92xx power off before setting any new parameters.
+ * Since we are going to reset all the power bit positions, we will
+ * force the power register to 0.
+ */
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_PWR_MAN, off_data);
+
+ /* set 9211 registers using the desired panel settings */
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_PAN_TIMING1, pMode->panel_timing1);
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_PAN_TIMING2, pMode->panel_timing2);
+
+ if (Pnl_Rev_ID == PNL_9211_C) {
+
+ /* load the LSFR seeds */
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_DITH_FR_CNTRL, pMode->rev_C_dither_frc);
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_BLUE_LSFR_SEED, pMode->blue_lsfr_seed);
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_RED_GREEN_LSFR_SEED, pMode->red_green_lsfr_seed);
+ } else {
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_DITH_FR_CNTRL, pMode->pre_C_dither_frc);
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_BLOCK_SEL1, pMode->block_select1);
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_BLOCK_SEL2, pMode->block_select2);
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_DISPER1, pMode->dispersion1);
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_DISPER2, pMode->dispersion2);
+
+ CentaurusProgramFRMload();
+ }
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_MEM_CNTRL,
+ pMode->memory_control);
+
+ /* Set the power register last. This will turn the panel on at the 9211. */
+
+ Centaurus_write_gpio(FOUR_BYTES,
+ CS92xx_LCD_PWR_MAN, pMode->power_management);
+
+} /* end set_Centaurus_92xx_mode_params() */
+
+void
+Centaurus_write_gpio(int width, ULONG address, unsigned long data)
+{
+ int num_clock_toggles;
+ int count;
+ unsigned long Addr = address;
+
+ enable_Centaurus_9211_chip_select();
+
+ /* Write 1 Clock period of no valid transfer */
+ write_Centaurus_CX9211_GPIO(CENT_NO_DATA);
+
+ /* Write 1 control bit (the data book calls this the control bar write) */
+ write_Centaurus_CX9211_GPIO(0x1);
+
+ /* Write the 12-bit address */
+ for (count = 0; count < 12; count++) {
+ write_Centaurus_CX9211_GPIO((unsigned char)(Addr & 0x01));
+ /*the 9211 expects data LSB->MSB */
+ Addr = Addr >> 1;
+ }
+
+ /* write */
+ write_Centaurus_CX9211_DWdata(data);
+
+ /* a write will require four toggles after disabling CS */
+ num_clock_toggles = CENT_NUM_WRITE_CLOCK_TOGGLES;
+ disable_Centaurus_9211_chip_select();
+
+ /* now toggle the clock */
+ for (count = 0; count < num_clock_toggles; count++) {
+ toggle_Centaurus_9211_clock();
+ }
+ return;
+
+} /* end Centaurus_write_gpio() */
+
+unsigned long
+Centaurus_read_gpio(int width, unsigned long address)
+{
+ int num_clock_toggles;
+ int count;
+ unsigned long Addr = address;
+ unsigned long data;
+
+ enable_Centaurus_9211_chip_select();
+
+ /* Write 1 Clock period of no valid transfer */
+ write_Centaurus_CX9211_GPIO(CENT_NO_DATA);
+
+ /* Write 1 control bit (the data book calls this the control bar write) */
+ write_Centaurus_CX9211_GPIO(0x1);
+
+ /* Write the 12-bit address */
+ for (count = 0; count < 12; count++) {
+ write_Centaurus_CX9211_GPIO((unsigned char)(Addr & 0x01));
+
+ /*the 9211 expects data LSB->MSB */
+ Addr = Addr >> 1;
+ }
+
+ data = read_Centaurus_CX9211_DWdata();
+
+ /* a read will require one toggle after disabling CS */
+ num_clock_toggles = CENT_NUM_READ_CLOCK_TOGGLES;
+ disable_Centaurus_9211_chip_select();
+
+ /* now toggle the clock */
+ for (count = 0; count < num_clock_toggles; count++) {
+ toggle_Centaurus_9211_clock();
+ }
+ return data;
+
+} /* end Centaurus_read_gpio() */
+
+/*******************************************************************
+ *
+ * void enable_Centaurus_9211_chip_select(void);
+ * Enables the chip select of the CX9211 using the National 97317
+ * on a Centaurus board.
+ *
+ *******************************************************************/
+
+void
+enable_Centaurus_9211_chip_select(void)
+{
+ unsigned char cs_port_val;
+
+ /* Set the chip select (GPIO20) high */
+ cs_port_val = gfx_inb(CENT_97317_CHIP_SELECT);
+ gfx_outb(CENT_97317_CHIP_SELECT,
+ (unsigned char)(cs_port_val | CENT_97317_CHIP_SEL_MASK));
+ return;
+} /* end enable_Centaurus_9211_chip_select() */
+
+/********************************************************************
+ *
+ * void disable_Centaurus_9211_chip_select(void);
+ * Disables the chip select of the CX9211 using the National 97317
+ * on a Centaurus board.
+ *
+ *******************************************************************/
+
+void
+disable_Centaurus_9211_chip_select(void)
+{
+ unsigned char cs_port_val;
+
+ /* Set the chip select (GPIO20) low */
+ cs_port_val = gfx_inb(CENT_97317_CHIP_SELECT);
+ gfx_outb(CENT_97317_CHIP_SELECT,
+ (unsigned char)(cs_port_val & ~CENT_97317_CHIP_SEL_MASK));
+ return;
+
+} /* end disable_Centaurus_9211_chip_select() */
+
+/**********************************************************************
+ *
+ * void toggle_Centaurus_9211_clock(void);
+ * Toggles the clock bit of the CX9211 using the National 97317 on a
+ * Centaurus board. Assumes the 9211 clock bit has previously been
+ * initialized to 0 (this way we do not have to waste GPIO cycles
+ * windowing the clock pulse).
+ *
+ **********************************************************************/
+
+void
+toggle_Centaurus_9211_clock(void)
+{
+ unsigned char port_val;
+
+ /* get the 97317 GPIO port contents for the 9211 clock */
+
+ port_val = gfx_inb(CENT_97317_CLOCK_PORT);
+ /* set the clock bit high */
+ gfx_outb(CENT_97317_CLOCK_PORT,
+ (unsigned char)(port_val | CENT_97317_CLOCK_MASK));
+
+ /* set the clock bit low */
+ gfx_outb(CENT_97317_CLOCK_PORT,
+ (unsigned char)(port_val & ~CENT_97317_CLOCK_MASK));
+
+} /* end toggle_Centaurus_9211_clock() */
+
+/********************************************************************
+ *
+ * void write_Centaurus_CX9211_GPIO(unsigned char databit);
+ * Writes the value in bit 0 of the value passed in databit to
+ * the 9211 through the GPIO interface of the National 97317 on a
+ * Centaurus board.
+ * NOTE: This function does not set or reset the chip select line!
+ *
+ *******************************************************************/
+
+void
+write_Centaurus_CX9211_GPIO(unsigned char databit)
+{
+ unsigned char data_port_val;
+
+ /* Set the data bit for (GPIO17) */
+ databit <<= 7;
+
+ /* read the value of the other bits in the 97317 data port */
+ data_port_val = gfx_inb(CENT_97317_DATA_OUTPORT);
+
+ /* set the bit accordingly */
+ data_port_val &= ~CENT_97317_DATA_OUT_MASK;
+ data_port_val |= databit;
+ gfx_outb(CENT_97317_DATA_OUTPORT, data_port_val);
+
+ /* clock the data */
+ toggle_Centaurus_9211_clock();
+ return;
+
+} /* end write_Centaurus_CX9211_GPIO() */
+
+/*****************************************************************
+ *
+ * void write_Centaurus_CX9211_DWdata(unsigned long data);
+ * Writes the doubleword value passed in data to the CX9211
+ * using GPIO Pins of the National 97317 on a Centaurus board.
+ * This function assumes the Direction register of the 97317
+ * and the address register of the CX9211 have been previously set.
+ * Uses the global variable count.
+ * NOTE: This function does not set or reset the chip select line!
+ *
+ ******************************************************************/
+
+void
+write_Centaurus_CX9211_DWdata(unsigned long data)
+{
+ int count;
+
+ /* Send the read/write command to the 9211 first. */
+
+ write_Centaurus_CX9211_GPIO(CENT_WRITE);
+
+ /* Now write the 32-bit Data */
+ for (count = 0; count < 32; count++) {
+ write_Centaurus_CX9211_GPIO((unsigned char)(data & 0x01));
+
+ /* the 9211 expects the data LSB->MSB */
+ data >>= 1;
+ }
+ return;
+
+} /* end write_Centaurus_CX9211_DWdata() */
+
+/*********************************************************************
+ *
+ * unsigned char read_Centaurus_CX9211_GPIO(void);
+ * Returns the current value of the databit of the 9211 in bit 0
+ * using the GPIO interface of the National 97317 on a Centaurus board.
+ * NOTE: This function does not set or reset the chip select line!
+ *
+ *********************************************************************/
+
+unsigned char
+read_Centaurus_CX9211_GPIO(void)
+{
+ unsigned char data_port_val;
+
+ toggle_Centaurus_9211_clock();
+
+ /* read the data */
+ data_port_val = gfx_inb(CENT_97317_DATA_INPORT);
+
+ /* Save the data from (GPIO21) as bit 0 */
+ data_port_val >>= 1;
+ return (data_port_val & 0x1);
+
+} /* end read_Centaurus_CX9211_GPIO() */
+
+/**********************************************************************
+ *
+ * void read_Centaurus_CX9211_DWdata(unsigned long *data);
+ * Reads a doubleword value from the CX9211 using GPIO Pins of
+ * the National 97317 on a Centaurus board.
+ * This function assumes the Direction register of the 97317 and
+ * the address register of the CX9211 have been previously set.
+ * NOTE: This function does not set or reset the chip select line!
+ *
+ ***********************************************************************/
+
+unsigned long
+read_Centaurus_CX9211_DWdata(void)
+{
+ unsigned char ReadData;
+ int count;
+ unsigned long Data;
+
+ /* Send read/write command word to the 9211 first. */
+ write_Centaurus_CX9211_GPIO(CENT_READ);
+
+ /* The data book (revision 0.1) states 8 clock periods of no valid data.
+ * However, the data becomes valid on the eighth clock, making the eighth
+ * clock valid. Since read_Centaurus_GPIO() toggles the clock before
+ * reading, we will only toggle the clock 7 times here.
+ */
+ for (count = 0; count < 7; count++) /* works */
+ toggle_Centaurus_9211_clock();
+
+ /* Now read the 32-bit Data, bit by bit in a single loop. */
+ Data = 0;
+ for (count = 0; count < 32; count++) {
+ ReadData = read_Centaurus_CX9211_GPIO();
+ /* 9211 sends data LSB->MSB */
+ Data = Data | (((unsigned long)ReadData) << count);
+ } /* end for() */
+
+ return Data;
+
+} /* end read_Centaurus_CX9211_DWdata() */
+
+void
+Centaurus_Get_9211_Details(unsigned long flags, Pnl_PanelParams * pParam)
+{
+ unsigned long PanelType;
+ int i;
+
+ for (i = 0; i < 0x7fff; i++) {
+ }
+
+ init_Centaurus_GPIO();
+
+ for (i = 0; i < 5; i++)
+ toggle_Centaurus_9211_clock();
+
+ if (flags & PNL_PANELCHIP) {
+
+ PanelType = Centaurus_read_gpio(FOUR_BYTES, 0x430);
+ PanelType = Centaurus_read_gpio(FOUR_BYTES, 0x430);
+ if ((PanelType & 0xFFFF0000) == 0x92110000) {
+
+ /* found 9211 */
+ /* check the values for revision ID */
+ if (PanelType >= 0x92110301)
+ pParam->PanelChip = PNL_9211_C;
+ else if ((PanelType >= 0x92110101) && (PanelType < 0x92110301))
+ pParam->PanelChip = PNL_9211_A;
+ else
+ pParam->PanelChip = PNL_UNKNOWN_CHIP;
+ } else { /* no 9211 present */
+ pParam->PanelChip = PNL_UNKNOWN_CHIP;
+ }
+ Pnl_Rev_ID = pParam->PanelChip;
+ }
+ /* if end */
+ if ((pParam->PanelChip != PNL_UNKNOWN_CHIP) && (flags & PNL_PANELSTAT)) {
+ PanelType = Centaurus_read_gpio(FOUR_BYTES, 0x438);
+ PanelType &= 0x00f8f8f8;
+ PanelType |= 0x00070000;
+ Centaurus_write_gpio(FOUR_BYTES, 0x438, PanelType);
+ PanelType = 0;
+ PanelType = Centaurus_read_gpio(FOUR_BYTES, 0x434);
+ PanelType = (PanelType >> 8);
+ PanelType &= 0x7;
+
+ switch (PanelType) {
+ case 0:
+ pParam->PanelStat.XRes = 800;
+ pParam->PanelStat.YRes = 600;
+ pParam->PanelStat.Depth = 18;
+ pParam->PanelStat.MonoColor = PNL_COLOR_PANEL;
+ pParam->PanelStat.Type = PNL_TFT;
+ break;
+ case 1:
+ pParam->PanelStat.XRes = 640;
+ pParam->PanelStat.YRes = 480;
+ pParam->PanelStat.Depth = 8;
+ pParam->PanelStat.MonoColor = PNL_COLOR_PANEL;
+ pParam->PanelStat.Type = PNL_SSTN;
+ break;
+ case 2:
+ pParam->PanelStat.XRes = 1024;
+ pParam->PanelStat.YRes = 768;
+ pParam->PanelStat.Depth = 18;
+ pParam->PanelStat.MonoColor = PNL_COLOR_PANEL;
+ pParam->PanelStat.Type = PNL_TFT;
+ break;
+ case 3:
+ pParam->PanelStat.XRes = 640;
+ pParam->PanelStat.YRes = 480;
+ pParam->PanelStat.Depth = 16;
+ pParam->PanelStat.MonoColor = PNL_COLOR_PANEL;
+ pParam->PanelStat.Type = PNL_DSTN;
+ break;
+ case 4:
+ pParam->PanelStat.XRes = 640;
+ pParam->PanelStat.YRes = 480;
+ pParam->PanelStat.Depth = 18;
+ pParam->PanelStat.MonoColor = PNL_COLOR_PANEL;
+ pParam->PanelStat.Type = PNL_TFT;
+ break;
+ case 5:
+ pParam->PanelStat.XRes = 1024;
+ pParam->PanelStat.YRes = 768;
+ pParam->PanelStat.Depth = 24;
+ pParam->PanelStat.MonoColor = PNL_COLOR_PANEL;
+ pParam->PanelStat.Type = PNL_DSTN;
+ break;
+ case 6:
+ pParam->PanelStat.XRes = 640;
+ pParam->PanelStat.YRes = 480;
+ pParam->PanelStat.Depth = 8;
+ pParam->PanelStat.MonoColor = PNL_MONO_PANEL;
+ pParam->PanelStat.Type = PNL_DSTN;
+ break;
+ case 7:
+ pParam->PanelStat.XRes = 800;
+ pParam->PanelStat.YRes = 600;
+ pParam->PanelStat.Depth = 16;
+ pParam->PanelStat.MonoColor = PNL_COLOR_PANEL;
+ pParam->PanelStat.Type = PNL_DSTN;
+ break;
+ default:
+ break;
+ }
+ }
+
+}
+
+void
+CentaurusProgramFRMload(void)
+{
+ unsigned long CentaurusFRMtable[] = {
+ 0x00000000,
+ 0x00000000,
+ 0x01000100,
+ 0x01000100,
+ 0x01010101,
+ 0x01010101,
+ 0x02081041,
+ 0x02081041,
+ 0x10111111,
+ 0x11111101,
+ 0x49249241,
+ 0x12412492,
+ 0x92244891,
+ 0x92244891,
+ 0x22252525,
+ 0x22252525,
+ 0x528294a5,
+ 0x2528494a,
+ 0x294a5295,
+ 0x294a5295,
+ 0x54a54a95,
+ 0x2952a52a,
+ 0x2a552a55,
+ 0x2a552a55,
+ 0x554aa955,
+ 0x2a9552aa,
+ 0x2aaa5555,
+ 0x2aaa5555,
+ 0x55555555,
+ 0x2aaaaaaa,
+ 0x55555555,
+ 0x55555555,
+ 0xaaaaaaab,
+ 0x55555555,
+ 0x5555aaab,
+ 0x5555aaab,
+ 0xaab556ab,
+ 0x556aad55,
+ 0x55ab55ab,
+ 0x55ab55ab,
+ 0xab5ab56b,
+ 0x56ad5ad5,
+ 0x56b5ad6b,
+ 0x56b5ad6b,
+ 0xad6d6b5b,
+ 0x5ad6b6b6,
+ 0x5b5b5b5b,
+ 0x5b5b5b5b,
+ 0x5F6db6db,
+ 0x5F6db6db,
+ 0xF776F776,
+ 0xF776F776,
+ 0xFBDEFBDE,
+ 0xFBDEFBDE,
+ 0x7eFFBFF7,
+ 0x7eFFBFF7,
+ 0xFF7FF7F7,
+ 0xFF7FF7F7,
+ 0xFF7FFF7F,
+ 0xFF7FFF7F,
+ 0xFFF7FFFF,
+ 0xFFF7FFFF,
+ 0xFFFFFFFF,
+ 0xFFFFFFFF,
+ };
+
+ unsigned char i;
+ unsigned short index;
+ unsigned long data;
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_FRM_MEMORY_INDEX, 0);
+ index = CS92xx_FRM_MEMORY_DATA;
+ for (i = 0; i < 64; i += 2) {
+ data = CentaurusFRMtable[i];
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_FRM_MEMORY_DATA, data);
+ data = CentaurusFRMtable[i + 1];
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_FRM_MEMORY_DATA, data);
+ }
+
+ /*
+ * The first FRM location (64 bits) does not program correctly.
+ * This location always reads back with the last value programmed.
+ * ie. If 32 64-bit values are programmed, location 0 reads
+ * back as the 32nd If 30 locations are programmed, location 0
+ * reads back as the 30th, etc.
+ * Fix this by re-writing location 0 after programming all 64 in
+ * the writeFRM loop in RevCFrmload() in CS9211.
+ */
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_FRM_MEMORY_INDEX, 0);
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_FRM_MEMORY_DATA, 0);
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_FRM_MEMORY_DATA, 0);
+}
+
+/********************************************************************
+ *
+ * void Centaurus_Enable_Power((void);
+ * Enables the power of the CX9211 using the National 97317 on
+ * a Centaurus board.
+ *
+ ********************************************************************/
+
+void
+Centaurus_Power_Up(void)
+{
+ unsigned long off_data = 0x01000000;
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_PWR_MAN, off_data);
+ return;
+
+} /* Centaurus_Disable_Power */
+
+/***********************************************************************
+ *
+ * void Centaurus_Disable_Power((void);
+ * Disables the power of the CX9211 using the National 97317
+ * on a Centaurus board.
+ *
+ **********************************************************************/
+
+void
+Centaurus_Power_Down(void)
+{
+ unsigned long off_data = 0;
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_PWR_MAN, off_data);
+ return;
+
+} /* Centaurus_Disable_Power */
+
+void
+Centaurus_9211init(Pnl_PanelStat * pstat)
+{
+ init_Centaurus_GPIO();
+ init_Centaurus_9211();
+ set_Centaurus_92xx_mode(pstat);
+ restore_Centaurus_97317_SIOC2();
+}
+
+void
+Centaurus_Save_Panel_State(void)
+{
+ /* set 9211 registers using the desired panel settings */
+
+ cs9211_regs.panel_timing1 =
+ Centaurus_read_gpio(FOUR_BYTES, CS92xx_LCD_PAN_TIMING1);
+ cs9211_regs.panel_timing2 =
+ Centaurus_read_gpio(FOUR_BYTES, CS92xx_LCD_PAN_TIMING2);
+ cs9211_regs.dither_frc_ctrl =
+ Centaurus_read_gpio(FOUR_BYTES, CS92xx_LCD_DITH_FR_CNTRL);
+ cs9211_regs.blue_lsfr_seed =
+ Centaurus_read_gpio(FOUR_BYTES, CS92xx_BLUE_LSFR_SEED);
+
+ cs9211_regs.red_green_lsfr_seed =
+ Centaurus_read_gpio(FOUR_BYTES, CS92xx_RED_GREEN_LSFR_SEED);
+ /* CentaurusProgramFRMload(); */
+
+ cs9211_regs.memory_control =
+ Centaurus_read_gpio(FOUR_BYTES, CS92xx_LCD_MEM_CNTRL);
+
+ /* Set the power register last.
+ * This will turn the panel on at the 9211.
+ */
+ cs9211_regs.power_management =
+ Centaurus_read_gpio(FOUR_BYTES, CS92xx_LCD_PWR_MAN);
+}
+
+void
+Centaurus_Restore_Panel_State(void)
+{
+
+ unsigned long off_data = 0;
+
+ /* Before restoring the 9211 registers, power off the 9211. */
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_PWR_MAN, off_data);
+
+ /* set 9211 registers using the desired panel settings */
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_PAN_TIMING1,
+ cs9211_regs.panel_timing1);
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_PAN_TIMING2,
+ cs9211_regs.panel_timing2);
+
+ /* load the LSFR seeds */
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_DITH_FR_CNTRL,
+ cs9211_regs.dither_frc_ctrl);
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_BLUE_LSFR_SEED,
+ cs9211_regs.blue_lsfr_seed);
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_RED_GREEN_LSFR_SEED,
+ cs9211_regs.red_green_lsfr_seed);
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_MEM_CNTRL,
+ cs9211_regs.memory_control);
+
+ /* Set the power register last. This will turn the panel on at the 9211 */
+
+ Centaurus_write_gpio(FOUR_BYTES, CS92xx_LCD_PWR_MAN,
+ cs9211_regs.power_management);
+
+}