summaryrefslogtreecommitdiffstats
path: root/bsps/arm/csb337/include/sed1356_16bit.h
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2017-12-23 18:18:56 +1100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-01-25 08:45:26 +0100
commit2afb22b7e1ebcbe40373ff7e0efae7d207c655a9 (patch)
tree44759efe9374f13200a97e96d91bd9a2b7e5ce2a /bsps/arm/csb337/include/sed1356_16bit.h
parentMAINTAINERS: Add myself to Write After Approval. (diff)
downloadrtems-2afb22b7e1ebcbe40373ff7e0efae7d207c655a9.tar.bz2
Remove make preinstall
A speciality of the RTEMS build system was the make preinstall step. It copied header files from arbitrary locations into the build tree. The header files were included via the -Bsome/build/tree/path GCC command line option. This has at least seven problems: * The make preinstall step itself needs time and disk space. * Errors in header files show up in the build tree copy. This makes it hard for editors to open the right file to fix the error. * There is no clear relationship between source and build tree header files. This makes an audit of the build process difficult. * The visibility of all header files in the build tree makes it difficult to enforce API barriers. For example it is discouraged to use BSP-specifics in the cpukit. * An introduction of a new build system is difficult. * Include paths specified by the -B option are system headers. This may suppress warnings. * The parallel build had sporadic failures on some hosts. This patch removes the make preinstall step. All installed header files are moved to dedicated include directories in the source tree. Let @RTEMS_CPU@ be the target architecture, e.g. arm, powerpc, sparc, etc. Let @RTEMS_BSP_FAMILIY@ be a BSP family base directory, e.g. erc32, imx, qoriq, etc. The new cpukit include directories are: * cpukit/include * cpukit/score/cpu/@RTEMS_CPU@/include * cpukit/libnetworking The new BSP include directories are: * bsps/include * bsps/@RTEMS_CPU@/include * bsps/@RTEMS_CPU@/@RTEMS_BSP_FAMILIY@/include There are build tree include directories for generated files. The include directory order favours the most general header file, e.g. it is not possible to override general header files via the include path order. The "bootstrap -p" option was removed. The new "bootstrap -H" option should be used to regenerate the "headers.am" files. Update #3254.
Diffstat (limited to 'bsps/arm/csb337/include/sed1356_16bit.h')
-rw-r--r--bsps/arm/csb337/include/sed1356_16bit.h566
1 files changed, 566 insertions, 0 deletions
diff --git a/bsps/arm/csb337/include/sed1356_16bit.h b/bsps/arm/csb337/include/sed1356_16bit.h
new file mode 100644
index 0000000000..5ccf85d01c
--- /dev/null
+++ b/bsps/arm/csb337/include/sed1356_16bit.h
@@ -0,0 +1,566 @@
+/**
+ * @file
+ *
+ * @ingroup arm_csb337
+ *
+ * @brief SED1356 LCD/CRT Controllers for KIT637_V6 (CSB637)
+ * 16-Bit access mode
+ */
+
+/**
+ * @defgroup csb337_sed1356 SED Video Controller.
+ *
+ * @ingroup arm_csb337
+ *
+ * @brief SED1356 LCD/CRT Controllers for KIT637_V6 (CSB637)
+ * 16-Bit access mode
+ */
+
+/*
+ * sed1356.h: SED1356 LCD/CRT Controllers for KIT637_V6 (CSB637)
+ * 16-Bit access mode
+ *
+ * Based upon code from MicroMonitor 1.17 from http://www.umonfw.com/
+ * which includes this notice:
+ *
+ **************************************************************************
+ * General notice:
+ * This code is part of a boot-monitor package developed as a generic base
+ * platform for embedded system designs. As such, it is likely to be
+ * distributed to various projects beyond the control of the original
+ * author. Please notify the author of any enhancements made or bugs found
+ * so that all may benefit from the changes. In addition, notification back
+ * to the author will allow the new user to pick up changes that may have
+ * been made by other users after this version of the code was distributed.
+ *
+ * Note1: the majority of this code was edited with 4-space tabs.
+ * Note2: as more and more contributions are accepted, the term "author"
+ * is becoming a mis-representation of credit.
+ *
+ * Original author: Ed Sutter
+ * Email: esutter@alcatel-lucent.com
+ * Phone: 908-582-2351
+ **************************************************************************
+ *
+ * Ed Sutter has been informed that this code is being used in RTEMS.
+ *
+ * The code has been reformatted by Joel Sherrill from OAR Corporation and
+ * Fernando Nicodemos <fgnicodemos@terra.com.br> from NCB - Sistemas
+ * Embarcados Ltda. (Brazil) to be more compliant with RTEMS coding standards
+ * and to eliminate C++ style comments.
+ */
+
+#ifndef __sed1356_16bit_h
+#define __sed1356_16bit_h
+
+#include "bits.h"
+/*------------------------------------------------------------------------
+ * cpu specific code must define the following board specific macros.
+ * in cpuio.h. These examples assume the SED135x has been placed in
+ * the correct endian mode via hardware.
+ * #define SED_MEM_BASE 0xf0600000 <-- just example addresses,
+ * #define SED_REG_BASE 0xf0400000 <-- define for each board
+ * #define SED_STEP 1 <-- 1 = device is on 16-bit boundry, 2 = 32-bit boundry, 4 = 64-bit boundry
+ * #define SED_REG16(_x_) *(vushortr *)(SED_REG_BASE + (_x_ * SED_STEP)) // Control/Status Registers
+ * #define RD_FB16(_reg_,_val_) ((_val_) = *((vushort *)((SED_MEM_BASE + (_reg_ * SED_STEP)))))
+ * #define WR_FB16(_reg_,_val_) (*((vushort *)((SED_MEM_BASE + (_reg_ * 2)))) = (_val_))
+ * Big endian processors
+ * #define H2SED(_x_) ((((x) & 0xff00U) >> 8) | (((x) & 0x00ffU) << 8))
+ * Little endian
+ * #define H2SED(_x_) (_x_)
+ *
+ */
+
+/*
+ * SED1356 registers - 16-Bit Access Mode. The first register
+ * referenced is the even addressed register. The byte offsets
+ * of the odd registers are shown in the comments
+ */
+#define SED1356_REG_REV_and_MISC SED_REG16(0x00)
+#define SED1356_REG_GPIO_CFG SED_REG16(0x04)
+#define SED1356_REG_GPIO_CTL SED_REG16(0x08)
+#define SED1356_REG_MD_CFG_RD_LO_and_HI SED_REG16(0x0c)
+#define SED1356_REG_MCLK_CFG SED_REG16(0x10)
+#define SED1356_REG_LCD_PCLK_CFG SED_REG16(0x14)
+#define SED1356_REG_CRT_PCLK_CFG SED_REG16(0x18)
+#define SED1356_REG_MEDIA_PCLK_CFG SED_REG16(0x1c)
+#define SED1356_REG_WAIT_STATE SED_REG16(0x1e)
+#define SED1356_REG_MEM_CFG_and_REF_RATE SED_REG16(0x20)
+#define SED1356_REG_MEM_TMG0_and_1 SED_REG16(0x2a)
+#define SED1356_REG_PANEL_TYPE_and_MOD_RATE SED_REG16(0x30)
+/* LCD Control registers */
+#define SED1356_REG_LCD_HOR_DISP SED_REG16(0x32)
+#define SED1356_REG_LCD_HOR_NONDISP_and_START SED_REG16(0x34)
+#define SED1356_REG_LCD_HOR_PULSE SED_REG16(0x36)
+#define SED1356_REG_LCD_VER_DISP_HT_LO_and_HI SED_REG16(0x38)
+#define SED1356_REG_LCD_VER_NONDISP_and_START SED_REG16(0x3a)
+#define SED1356_REG_LCD_VER_PULSE SED_REG16(0x3c)
+#define SED1356_REG_LCD_DISP_MODE_and_MISC SED_REG16(0x40)
+#define SED1356_REG_LCD_DISP_START_LO_and_MID SED_REG16(0x42)
+#define SED1356_REG_LCD_DISP_START_HI SED_REG16(0x44)
+#define SED1356_REG_LCD_ADD_OFFSET_LO_and_HI SED_REG16(0x46)
+#define SED1356_REG_LCD_PIXEL_PAN SED_REG16(0x48)
+#define SED1356_REG_LCD_FIFO_THRESH_LO_and_HI SED_REG16(0x4a)
+/* CRT/TV Control registers */
+#define SED1356_REG_CRT_HOR_DISP SED_REG16(0x50)
+#define SED1356_REG_CRT_HOR_NONDISP_and_START SED_REG16(0x52)
+#define SED1356_REG_CRT_HOR_PULSE SED_REG16(0x54)
+#define SED1356_REG_CRT_VER_DISP_HT_LO_and_HI SED_REG16(0x56)
+#define SED1356_REG_CRT_VER_NONDISP_and_START SED_REG16(0x58)
+#define SED1356_REG_CRT_VER_PULSE_and_OUT_CTL SED_REG16(0x5a)
+#define SED1356_REG_CRT_DISP_MODE SED_REG16(0x60)
+#define SED1356_REG_CRT_DISP_START_LO_and_MID SED_REG16(0x62)
+#define SED1356_REG_CRT_DISP_START_HI SED_REG16(0x64)
+#define SED1356_REG_CRT_ADD_OFFSET_LO_and_HI SED_REG16(0x66)
+#define SED1356_REG_CRT_PIXEL_PAN SED_REG16(0x68)
+#define SED1356_REG_CRT_FIFO_THRESH_LO_and_HI SED_REG16(0x6a)
+/* LCD Cursor Control Registers */
+#define SED1356_REG_LCD_CURSOR_CTL_and_START_ADD SED_REG16(0x70)
+#define SED1356_REG_LCD_CURSOR_X_POS_LO_and_HI SED_REG16(0x72)
+#define SED1356_REG_LCD_CURSOR_Y_POS_LO_and_HI SED_REG16(0x74)
+#define SED1356_REG_LCD_CURSOR_BLUE_and_GREEN_CLR_0 SED_REG16(0x76)
+#define SED1356_REG_LCD_CURSOR_RED_CLR_0 SED_REG16(0x78)
+#define SED1356_REG_LCD_CURSOR_BLUE_and_GREEN_CLR_1 SED_REG16(0x7a)
+#define SED1356_REG_LCD_CURSOR_RED_CLR_1 SED_REG16(0x7c)
+#define SED1356_REG_LCD_CURSOR_FIFO_THRESH SED_REG16(0x7e)
+/* CRT Cursor Control Registers */
+#define SED1356_REG_CRT_CURSOR_CTL_and_START_ADD SED_REG16(0x80)
+#define SED1356_REG_CRT_CURSOR_X_POS_LO_and_HI SED_REG16(0x82)
+#define SED1356_REG_CRT_CURSOR_Y_POS_LO_and_HI SED_REG16(0x84)
+#define SED1356_REG_CRT_CURSOR_BLUE_and_GREEN_CLR_0 SED_REG16(0x86)
+#define SED1356_REG_CRT_CURSOR_RED_CLR_0 SED_REG16(0x88)
+#define SED1356_REG_CRT_CURSOR_BLUE_and_GREEN_CLR_1 SED_REG16(0x8a)
+#define SED1356_REG_CRT_CURSOR_RED_CLR_1 SED_REG16(0x8c)
+#define SED1356_REG_CRT_CURSOR_FIFO_THRESH SED_REG16(0x8e)
+/* BitBlt Control Registers */
+#define SED1356_REG_BLT_CTL_0_and_1 SED_REG16(0x100)
+#define SED1356_REG_BLT_ROP_CODE_and_BLT_OP SED_REG16(0x102)
+#define SED1356_REG_BLT_SRC_START_LO_and_MID SED_REG16(0x104)
+#define SED1356_REG_BLT_SRC_START_HI SED_REG16(0x106)
+#define SED1356_REG_BLT_DEST_START_LO_and_MID SED_REG16(0x108)
+#define SED1356_REG_BLT_DEST_START_HI SED_REG16(0x10a)
+#define SED1356_REG_BLT_ADD_OFFSET_LO_and_HI SED_REG16(0x10c)
+#define SED1356_REG_BLT_WID_LO_and_HI SED_REG16(0x110)
+#define SED1356_REG_BLT_HGT_LO_and_HI SED_REG16(0x112)
+#define SED1356_REG_BLT_BG_CLR_LO_and_HI SED_REG16(0x114)
+#define SED1356_REG_BLT_FG_CLR_LO_and_HI SED_REG16(0x118)
+/* Look-Up Table Control Registers */
+#define SED1356_REG_LUT_MODE SED_REG16(0x1e0)
+#define SED1356_REG_LUT_ADD SED_REG16(0x1e2)
+#define SED1356_REG_LUT_DATA SED_REG16(0x1e4)
+/* Power and Miscellaneous Control Registers */
+#define SED1356_REG_PWR_CFG_and_STAT SED_REG16(0x1f0)
+#define SED1356_REG_WATCHDOG_CTL SED_REG16(0x1f4)
+#define SED1356_REG_DISP_MODE SED_REG16(0x1fc)
+
+/*
+ * Bit Assignments - Little Endian, Use H2SED() macro to access
+ *
+ * SED1356_REG_REV_and_MISC - even
+ */
+#define SED1356_REV_ID_MASK 0xfc /* ID bits - masks off the rev bits */
+#define SED1356_REV_ID_1356 BIT4
+#define SED1356_REV_ID_1355 BIT3
+
+/* SED1356_REG_REV_and_MISC - odd */
+#define SED1356_MISC_HOST_DIS BIT7 << 8 /* 0 = enable host access, 1 = disable */
+
+/* SED1356_REG_GPIO_CFG and SED1356_REG_GPIO_STAT */
+#define SED1356_GPIO_GPIO3 BIT3 /* 0 = input, 1 = output, if configured as GPIO */
+#define SED1356_GPIO_GPIO2 BIT2
+#define SED1356_GPIO_GPIO1 BIT1
+
+/* SED1356_REG_MCLK_CFG */
+#define SED1356_MCLK_DIV2 BIT4
+#define SED1356_MCLK_SRC_BCLK BIT0
+#define SED1356_MCLK_SRC_CLKI 0x00
+
+/* SED1356_REG_LCD_PCLK_CFG, SED1356_REG_CRT_PCLK_CFG
+ * and SED1356_REG_MEDIA_PCLK_CFG
+ */
+#define SED1356_PCLK_X2 BIT7 /* SED1356_REG_CRT_PCLK_CFG only */
+#define SED1356_PCLK_DIV1 0x00 << 4
+#define SED1356_PCLK_DIV2 0x01 << 4
+#define SED1356_PCLK_DIV3 0x02 << 4
+#define SED1356_PCLK_DIV4 0x03 << 4
+#define SED1356_PCLK_SRC_CLKI 0x00
+#define SED1356_PCLK_SRC_BCLK 0x01
+#define SED1356_PCLK_SRC_CLKI2 0x02
+#define SED1356_PCLK_SRC_MCLK 0x03
+
+/* SED1356_REG_MEM_CFG_and_REF_RATE - even */
+#define SED1356_MEM_CFG_2CAS_EDO 0x00
+#define SED1356_MEM_CFG_2CAS_FPM 0x01
+#define SED1356_MEM_CFG_2WE_EDO 0x02
+#define SED1356_MEM_CFG_2WE_FPM 0x03
+#define SED1356_MEM_CFG_MASK 0x03
+
+/* SED1356_REG_MEM_CFG_and_REF_RATE - odd */
+#define SED1356_REF_TYPE_CBR 0x00 << 6 << 8
+#define SED1356_REF_TYPE_SELF 0x01 << 6 << 8
+#define SED1356_REF_TYPE_NONE 0x02 << 6 << 8
+#define SED1356_REF_TYPE_MASK 0x03 << 6 << 8
+#define SED1356_REF_RATE_64 0x00 << 0 << 8 /* MCLK / 64 */
+#define SED1356_REF_RATE_128 0x01 << 0 << 8 /* MCLK / 128 */
+#define SED1356_REF_RATE_256 0x02 << 0 << 8 /* MCLK / 256 */
+#define SED1356_REF_RATE_512 0x03 << 0 << 8 /* MCLK / 512 */
+#define SED1356_REF_RATE_1024 0x04 << 0 << 8 /* MCLK / 1024 */
+#define SED1356_REF_RATE_2048 0x05 << 0 << 8 /* MCLK / 2048 */
+#define SED1356_REF_RATE_4096 0x06 << 0 << 8 /* MCLK / 4096 */
+#define SED1356_REF_RATE_8192 0x07 << 0 << 8 /* MCLK / 8192 */
+#define SED1356_REF_RATE_MASK 0x07 << 0 << 8 /* MCLK / 8192 */
+
+/* SED1356_REG_MEM_TMG0_and_1 - even */
+#define SED1356_MEM_TMG0_EDO50_MCLK40 0x01
+#define SED1356_MEM_TMG0_EDO50_MCLK33 0x01
+#define SED1356_MEM_TMG0_EDO60_MCLK33 0x01
+#define SED1356_MEM_TMG0_EDO50_MCLK30 0x12
+#define SED1356_MEM_TMG0_EDO60_MCLK30 0x01
+#define SED1356_MEM_TMG0_EDO70_MCLK30 0x00
+#define SED1356_MEM_TMG0_EDO50_MCLK25 0x12
+#define SED1356_MEM_TMG0_EDO60_MCLK25 0x12
+#define SED1356_MEM_TMG0_EDO70_MCLK25 0x01
+#define SED1356_MEM_TMG0_EDO80_MCLK25 0x00
+#define SED1356_MEM_TMG0_EDO50_MCLK20 0x12
+#define SED1356_MEM_TMG0_EDO60_MCLK20 0x12
+#define SED1356_MEM_TMG0_EDO70_MCLK20 0x12
+#define SED1356_MEM_TMG0_EDO80_MCLK20 0x01
+#define SED1356_MEM_TMG0_FPM50_MCLK25 0x12
+#define SED1356_MEM_TMG0_FPM60_MCLK25 0x01
+#define SED1356_MEM_TMG0_FPM50_MCLK20 0x12
+#define SED1356_MEM_TMG0_FPM60_MCLK20 0x12
+#define SED1356_MEM_TMG0_FPM70_MCLK20 0x11
+#define SED1356_MEM_TMG0_FPM80_MCLK20 0x01
+
+/* SED1356_REG_MEM_TMG0_and_1 - odd */
+#define SED1356_MEM_TMG1_EDO50_MCLK40 0x01 << 8
+#define SED1356_MEM_TMG1_EDO50_MCLK33 0x01 << 8
+#define SED1356_MEM_TMG1_EDO60_MCLK33 0x01 << 8
+#define SED1356_MEM_TMG1_EDO50_MCLK30 0x02 << 8
+#define SED1356_MEM_TMG1_EDO60_MCLK30 0x01 << 8
+#define SED1356_MEM_TMG1_EDO70_MCLK30 0x00 << 8
+#define SED1356_MEM_TMG1_EDO50_MCLK25 0x02 << 8
+#define SED1356_MEM_TMG1_EDO60_MCLK25 0x02 << 8
+#define SED1356_MEM_TMG1_EDO70_MCLK25 0x01 << 8
+#define SED1356_MEM_TMG1_EDO80_MCLK25 0x01 << 8
+#define SED1356_MEM_TMG1_EDO50_MCLK20 0x02 << 8
+#define SED1356_MEM_TMG1_EDO60_MCLK20 0x02 << 8
+#define SED1356_MEM_TMG1_EDO70_MCLK20 0x02 << 8
+#define SED1356_MEM_TMG1_EDO80_MCLK20 0x01 << 8
+#define SED1356_MEM_TMG1_FPM50_MCLK25 0x02 << 8
+#define SED1356_MEM_TMG1_FPM60_MCLK25 0x01 << 8
+#define SED1356_MEM_TMG1_FPM50_MCLK20 0x02 << 8
+#define SED1356_MEM_TMG1_FPM60_MCLK20 0x02 << 8
+#define SED1356_MEM_TMG1_FPM70_MCLK20 0x02 << 8
+#define SED1356_MEM_TMG1_FPM80_MCLK20 0x01 << 8
+
+
+/* Bit definitions
+ *
+ * SED1356_REG_PANEL_TYPE_AND_MOD_RATE - even
+ */
+#define SED1356_PANEL_TYPE_EL BIT7
+#define SED1356_PANEL_TYPE_4_9 (0x00 << 4) /* Passive 4-Bit, TFT 9-Bit */
+#define SED1356_PANEL_TYPE_8_12 (0x01 << 4) /* Passive 8-Bit, TFT 12-Bit */
+#define SED1356_PANEL_TYPE_16 (0x02 << 4) /* Passive 16-Bit, or TFT 18-Bit */
+#define SED1356_PANEL_TYPE_MASK (0x03 << 4)
+#define SED1356_PANEL_TYPE_FMT BIT3 /* 0 = Passive Format 1, 1 = Passive Format 2 */
+#define SED1356_PANEL_TYPE_CLR BIT2 /* 0 = Passive Mono, 1 = Passive Color */
+#define SED1356_PANEL_TYPE_DUAL BIT1 /* 0 = Passive Single, 1 = Passive Dual */
+#define SED1356_PANEL_TYPE_TFT BIT0 /* 0 = Passive, 1 = TFT (DUAL, FMT & CLR are don't cares) */
+
+/* SED1356_REG_CRT_HOR_PULSE, SED1356_REG_CRT_VER_PULSE,
+ * SED1356_REG_LCD_HOR_PULSE and SED1356_REG_LCD_VER_PULSE
+ */
+#define SED1356_PULSE_POL_HIGH BIT7 /* 0 = CRT/TFT Pulse is Low, Passive is High, 1 = CRT/TFT Pulse is High, Passive is Low */
+#define SED1356_PULSE_POL_LOW 0x00 /* 0 = CRT/TFT Pulse is Low, Passive is High, 1 = CRT/TFT Pulse is High, Passive is Low */
+#define SED1356_PULSE_WID(_x_) (_x_ & 0x0f) /* Pulse Width in Pixels */
+
+/* SED1356_LCD_DISP_MODE_and_MISC - even */
+#define SED1356_LCD_DISP_BLANK BIT7 /* 1 = Blank LCD Display */
+#define SED1356_LCD_DISP_SWIV_NORM (0x00 << 4) /* Used with SED1356_REG_DISP_MODE Bit 6 */
+#define SED1356_LCD_DISP_SWIV_90 (0x00 << 4)
+#define SED1356_LCD_DISP_SWIV_180 (0x01 << 4)
+#define SED1356_LCD_DISP_SWIV_270 (0x01 << 4)
+#define SED1356_LCD_DISP_SWIV_MASK (0x01 << 4)
+#define SED1356_LCD_DISP_16BPP 0x05 /* Bit Per Pixel Selection */
+#define SED1356_LCD_DISP_15BPP 0x04
+#define SED1356_LCD_DISP_8BPP 0x03
+#define SED1356_LCD_DISP_4BPP 0x02
+#define SED1356_LCD_DISP_BPP_MASK 0x07
+
+/* SED1356_LCD_DISP_MODE_and_MISC - odd */
+#define SED1356_LCD_MISC_DITH BIT1 << 8 /* 1 = Dither Disable, Passive Panel Only */
+#define SED1356_LCD_MISC_DUAL BIT0 << 8 /* 1 = Dual Panel Disable, Passive Panel Only */
+
+/* SED1356_REG_CRT_VER_PULSE_and_OUT_CTL - odd */
+#define SED1356_CRT_OUT_CHROM BIT5 << 8 /* 1 = TV Chrominance Filter Enable */
+#define SED1356_CRT_OUT_LUM BIT4 << 8 /* 1 = TV Luminance Filter Enable */
+#define SED1356_CRT_OUT_DAC_LVL BIT3 << 8 /* 1 = 4.6ma IREF, 0 = 9.2 IREF */
+#define SED1356_CRT_OUT_SVIDEO BIT1 << 8 /* 1 = S-Video Output, 0 = Composite Video Output */
+#define SED1356_CRT_OUT_PAL BIT0 << 8 /* 1 = PAL Format Output, 0 = NTSC Format Output */
+
+/* SED1356_REG_CRT_DISP_MODE */
+#define SED1356_CRT_DISP_BLANK BIT7 /* 1 = Blank CRT Display */
+#define SED1356_CRT_DISP_16BPP 0x05 /* Bit Per Pixel Selection */
+#define SED1356_CRT_DISP_15BPP 0x04
+#define SED1356_CRT_DISP_8BPP 0x03
+#define SED1356_CRT_DISP_4BPP 0x02
+#define SED1356_CRT_DISP_BPP_MASK 0x07
+
+/* SED1356_DISP_MODE */
+#define SED1356_DISP_SWIV_NORM (0x00 << 6) /* Used with SED1356_LCD_DISP_MODE Bit 4 */
+#define SED1356_DISP_SWIV_90 (0x01 << 6)
+#define SED1356_DISP_SWIV_180 (0x00 << 6)
+#define SED1356_DISP_SWIV_270 (0x01 << 6)
+#define SED1356_DISP_MODE_OFF 0x00 /* All Displays Off */
+#define SED1356_DISP_MODE_LCD 0x01 /* LCD Only */
+#define SED1356_DISP_MODE_CRT 0x02 /* CRT Only */
+#define SED1356_DISP_MODE_LCD_CRT 0x03 /* Simultaneous LCD and CRT */
+#define SED1356_DISP_MODE_TV 0x04 /* TV Only, Flicker Filter Off */
+#define SED1356_DISP_MODE_TV_LCD 0x05 /* Simultaneous LCD and TV, Flicker Filter Off */
+#define SED1356_DISP_MODE_TV_FLICK 0x06 /* TV Only, Flicker Filter On */
+#define SED1356_DISP_MODE_TV_LCD_FLICK 0x07 /* Simultaneous LCD and TV, Flicker Filter On */
+
+/* SED1356_REG_PWR_CFG and SED1356_REG_PWR_STAT */
+#define SED1356_PWR_PCLK BIT1 /* SED1356_REG_PWR_STAT only */
+#define SED1356_PWR_MCLK BIT0
+
+/* SED1356_REG_VER_NONDISP */
+#define SED1356_VER_NONDISP BIT7 /* vertical retrace status 1 = in retrace */
+
+/* Display size defines */
+extern long PIXELS_PER_ROW;
+extern long PIXELS_PER_COL;
+#define BYTES_PER_PIXEL 2
+extern long COLS_PER_SCREEN;
+extern long ROWS_PER_SCREEN;
+
+/* 16-bit pixels are RGB 565 - LSB of RED and BLUE are tied low at the */
+/* LCD Interface, while the LSB of GREEN is loaded as 0 */
+#define RED_SUBPIXEL(n) ((n & 0x1f) << 11)
+#define GREEN_SUBPIXEL(n) ((n & 0x1f) << 5)
+#define BLUE_SUBPIXEL(n) ((n & 0x1f) << 0)
+
+/* define a simple VGA style 16-color pallette */
+#if 0
+#define LU_BLACK (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
+#define LU_BLUE (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x0f))
+#define LU_GREEN (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x00))
+#define LU_CYAN (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x0f))
+#define LU_RED (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
+#define LU_VIOLET (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x0f))
+#define LU_YELLOW (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x00))
+#define LU_GREY (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x0f))
+#define LU_WHITE (RED_SUBPIXEL(0x17) | GREEN_SUBPIXEL(0x17) | BLUE_SUBPIXEL(0x17))
+#define LU_BRT_BLUE (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x1f))
+#define LU_BRT_GREEN (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x00))
+#define LU_BRT_CYAN (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x1f))
+#define LU_BRT_RED (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
+#define LU_BRT_VIOLET (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x1f))
+#define LU_BRT_YELLOW (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x00))
+#define LU_BRT_WHITE (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x1f))
+/* RED, GREEN, BLUE Entry */
+ { 0x00, 0x00, 0x00, }, /* LU_BLACK */
+ { 0x00, 0x00, 0xA0, }, /* LU_BLUE */
+ { 0x00, 0xA0, 0x00, }, /* LU_GREEN */
+ { 0x00, 0xA0, 0xA0, }, /* LU_CYAN */
+ { 0xA0, 0x00, 0x00, }, /* LU_RED */
+ { 0xA0, 0x00, 0xA0, }, /* LU_VIOLET */
+ { 0xA0, 0xA0, 0x00, }, /* LU_YELLOW */
+ { 0xA0, 0xA0, 0xA0, }, /* LU_WHITE */
+ { 0x50, 0x50, 0x50, }, /* LU_GREY */
+ { 0x50, 0x50, 0xF0, }, /* LU_BRT_BLUE */
+ { 0x50, 0xF0, 0x50, }, /* LU_BRT_GREEN */
+ { 0x50, 0xF0, 0xF0, }, /* LU_BRT_CYAN */
+ { 0xF0, 0x50, 0x50, }, /* LU_BRT_RED */
+ { 0xF0, 0x50, 0xF0, }, /* LU_BRT_VIOLET */
+ { 0xF0, 0xF0, 0x50, }, /* LU_BRT_YELLOW */
+ { 0xF0, 0xF0, 0xF0, }, /* LU_BRT_WHITE */
+#endif
+
+#define BLUE (0x14 << 0)
+#define GREEN (0x14 << 6)
+#define RED (0x14 << 11)
+
+#define HALF_BLUE (0x0a << 0)
+#define HALF_GREEN (0x0a << 6)
+#define HALF_RED (0x0a << 11)
+
+
+#define BRT_BLUE (0x1e << 0)
+#define BRT_GREEN (0x1e << 6)
+#define BRT_RED (0x1e << 11)
+
+#define LU_BLACK 0
+#define LU_BLUE (BLUE)
+#define LU_GREEN (GREEN)
+#define LU_CYAN (GREEN | BLUE)
+#define LU_RED (RED)
+#define LU_VIOLET (RED | BLUE)
+#define LU_YELLOW (RED | GREEN)
+#define LU_WHITE (RED | GREEN | BLUE)
+#define LU_GREY (HALF_RED | HALF_GREEN | HALF_BLUE)
+#define LU_BRT_BLUE (HALF_RED | HALF_GREEN | BRT_BLUE)
+#define LU_BRT_GREEN (HALF_RED | BRT_GREEN | HALF_BLUE)
+#define LU_BRT_CYAN (HALF_RED | BRT_GREEN | BRT_BLUE)
+#define LU_BRT_RED (BRT_RED | HALF_GREEN | HALF_BLUE)
+#define LU_BRT_VIOLET (BRT_RED | HALF_GREEN | BRT_BLUE)
+#define LU_BRT_YELLOW (BRT_RED | BRT_GREEN | HALF_BLUE)
+#define LU_BRT_WHITE (BRT_RED | BRT_GREEN | BRT_BLUE)
+
+const ushort vga_lookup[] = {
+LU_BLACK, /* 0 */
+LU_BLUE, /* 1 */
+LU_GREEN, /* 2 */
+LU_CYAN, /* 3 */
+LU_RED, /* 4 */
+LU_VIOLET, /* 5 */
+LU_YELLOW, /* 6 */
+LU_WHITE, /* 7 */
+LU_GREY, /* 8 */
+LU_BRT_BLUE, /* 9 */
+LU_BRT_GREEN, /* 10 */
+LU_BRT_CYAN, /* 11 */
+LU_BRT_RED, /* 12 */
+LU_BRT_VIOLET, /* 13 */
+LU_BRT_YELLOW, /* 14 */
+LU_BRT_WHITE /* 15 */
+};
+
+/* default foreground and background colors */
+#define SED_BG_DEF 1
+#define SED_FG_DEF 14
+
+/* Draw defines */
+#define TOP 0
+#define BOTTOM (PIXELS_PER_COL-1)
+#define LEFT 0
+#define RIGHT (PIXELS_PER_ROW-1)
+#define CENTER_X (PIXELS_PER_ROW/2)
+#define CENTER_Y (PIXELS_PER_COL/2)
+
+
+/* Vertical and Horizontal Pulse, Start and Non-Display values vary depending
+ * upon the mode. The following section gives some insight into how the
+ * values are arrived at.
+ * ms = milliseconds, us = microseconds, ns = nanoseconds
+ * Mhz = Megaherz, Khz = Kiloherz, Hz = Herz
+ *
+ * ***************************************************************************************************
+ * CRT Mode is 640x480 @ 72Hz VESA compatible timing. PCLK = 31.5Mhz (31.75ns)
+ * ***************************************************************************************************
+ *
+ * CRT MODE HORIZONTAL TIMING PARAMETERS
+ *
+ * |<-------Tha------->|
+ * |___________________| ______
+ * Display Enable _____________________| |____________________|
+ * | |
+ * Horizontal Pulse __ ________|___________________|________ __________
+ * |_________| | | |________|
+ * |<- Thp ->| | | |
+ * | |<-Thbp->| | |
+ * | |<-Thfp->|
+ * |<----------------------Tht-------------------->|
+ *
+ * Tha - Active Display Time = 640 pixels
+ * Thp - Horizontal Pulse = 1.27us/31.75ns = 40 pixels
+ * Thbp - Horizontal Front Porch = 1.016us/31.75ns = 32 pixels
+ * Thfp - Horizontal Back Porch = 3.8us/31.75ns = 120 pixels
+ * Tht - Total Horizontal Time = 832 pixels x 32.75ns/pixel = 26.416us or 38.785Khz
+ *
+ * Correlation between horizontal timing parameters and SED registers
+ */
+#define SED_HOR_PULSE_WIDTH_CRT 0x07 /* Horizontal Pulse Width Register = (Thp/8) - 1 */
+#define SED_HOR_PULSE_START_CRT 0x02 /* Horizontal Pulse Start Position Register = ((Thfp + 2)/8) - 1 */
+#define SED_HOR_NONDISP_CRT 0x17 /* Horizontal Non-Display Period Register = ((Thp + Thfp + Thbp)/8) - 1 */
+/*
+ * CRT MODE VERTICAL TIMING PARAMTERS
+ *
+ * |<-------Tva------->|
+ * |___________________| ______
+ * Display Enable _____________________| |_____________________|
+ * | |
+ * Vertical Pulse __ ________|___________________|________ __________
+ * |_________| | | |________|
+ * |<- Tvp ->| | | |
+ * | |<-Tvbp->| | |
+ * | |<-Tvfp->|
+ * |<----------------------Tvt-------------------->|
+ *
+ * Tva - Active Display Time = 480 lines
+ * Tvp - Vertical Pulse = 3 lines
+ * Tvfp - Vertical Front Porch = 9 lines
+ * Tvbp - Vertical Back Porch = 28 lines
+ * Tvt - Total Horizontal Time = 520 lines x 26.416us/line = 13.73632ms or 72.8Hz
+ *
+ * Correlation between vertical timing parameters and SED registers
+ */
+#define SED_VER_PULSE_WIDTH_CRT 0x02 // VRTC/FPFRAME Pulse Width Register = Tvp - 1
+#define SED_VER_PULSE_START_CRT 0x08 // VRTC/FPFRAME Start Position Register = Tvfp - 1
+#define SED_VER_NONDISP_CRT 0x27 // Vertical Non-Display Period Register = (Tvp + Tvfp + Tvbp) - 1
+/*
+ *****************************************************************************************************
+ * DUAL LCD Mode is 640x480 @ 60Hz VGA compatible timing. PCLK = 25.175Mhz (39.722ns)
+ *****************************************************************************************************
+ *
+ * LCD MODE HORIZONTAL TIMING PARAMTERS
+ *
+ * |<-------Tha------->|
+ * |___________________| ______
+ * Display Enable _____________________| |____________________|
+ * | |
+ * Horizontal Pulse __ ________|___________________|________ __________
+ * |_________| | | |________|
+ * |<- Thp ->| | | |
+ * | |<-Thbp->| | |
+ * | |<-Thfp->|
+ * |<----------------------Tht-------------------->|
+ *
+ * Tha - Active Display Time = 640 pixels
+ * Thp - Horizontal Pulse = 3.8us/39.72ns = 96 pixels
+ * Thfp - Horizontal Front Porch = .595us/39.72ns = 16 pixels
+ * Thbp - Horizontal Backporch = 1.9us/39.72ns = 48 pixels
+ * Tht - Total Horizontal Time = = 800 pixels @ 39.72ns/pixel = 31.776us or 31.47Khz
+ *
+ * Correlation between horizontal timing parameters and SED registers
+ *#define SED_HOR_PULSE_WIDTH_LCD 0x0b // HRTC/FPLINE Pulse Width Register = (Thp/8) - 1
+ *#define SED_HOR_PULSE_START_LCD 0x02 // HRTC/FPLINE Start Position Register = (Thfp/8) - 2
+ *#define SED_HOR_NONDISP_LCD 0x13 // Horizontal Non-Display Period Register = ((Thp + Thfp + Thbp)/8) - 1
+ */
+extern long SED_HOR_PULSE_WIDTH_LCD;
+extern long SED_HOR_PULSE_START_LCD;
+extern long SED_HOR_NONDISP_LCD;
+
+/*
+ *
+ * LCD MODE VERTICAL TIMING PARAMTERS
+ *
+ * |<-------Tva------->|
+ * |___________________| ______
+ * Display Enable _____________________| |_____________________|
+ * | |
+ * Vertical Pulse __ ________|___________________|________ __________
+ * |_________| | | |________|
+ * |<- Tvp ->| | | |
+ * | |<-Tvbp->| | |
+ * | |<-Tvfp->|
+ * |<----------------------Tvt-------------------->|
+ *
+ * Tva - Active Display Time = 480 lines
+ * Tvp - Vertical Pulse = 2 lines
+ * Tvfp - Vertical Front Porch = 10 lines
+ * Tvbp - Vertical Backporch = 33 lines
+ * Tvt - Total Horizontal Time = 525 lines @ 31.776us/line = 16.682ms or 60Hz
+ *
+ * Correlation between vertical timing parameters and SED registers
+ *#define SED_VER_PULSE_WIDTH_LCD 0x01 // VRTC/FPFRAME Pulse Width Register = Tvp - 1
+ *#define SED_VER_PULSE_START_LCD 0x09 // VRTC/FPFRAME Start Position Register = Tvfp - 1
+ *#define SED_VER_NONDISP_LCD 0x2c // Vertical Non-Display Period Register = (Tvp + Tvfp + Tvbp) - 1
+ */
+extern long SED_VER_PULSE_WIDTH_LCD;
+extern long SED_VER_PULSE_START_LCD;
+extern long SED_VER_NONDISP_LCD;
+
+#endif