[PATCH] Minimal Display driver for OMAP3
Syed Mohammed Khasim
khasim at ti.com
Fri Jan 8 16:31:44 CET 2010
Supports dynamic configuration of Panel and Video Encoder
Supports Background color on DVID
Supports Color bar on S-Video
Signed-off-by: Syed Mohammed Khasim <khasim at ti.com>
---
board/ti/beagle/beagle.c | 13 +++
board/ti/beagle/beagle.h | 73 ++++++++++++++
drivers/video/Makefile | 1 +
drivers/video/omap3_dss.c | 128 +++++++++++++++++++++++++
include/asm-arm/arch-omap3/dss.h | 193 ++++++++++++++++++++++++++++++++++++++
include/configs/omap3_beagle.h | 1 +
6 files changed, 409 insertions(+), 0 deletions(-)
create mode 100644 drivers/video/omap3_dss.c
create mode 100644 include/asm-arm/arch-omap3/dss.h
diff --git a/board/ti/beagle/beagle.c b/board/ti/beagle/beagle.c
index 7985ee9..29e47c8 100644
--- a/board/ti/beagle/beagle.c
+++ b/board/ti/beagle/beagle.c
@@ -114,6 +114,17 @@ void beagle_identify(void)
}
/*
+ * Configure DSS to display background color on DVID
+ * Configure VENC to display color bar on S-Video
+ */
+void display_init(void)
+{
+ omap3_dss_venc_config(&venc_config_std_tv);
+ omap3_dss_panel_config(&dvid_cfg);
+ omap3_dss_set_background_col(DVI_BEAGLE_ORANGE_COL);
+}
+
+/*
* Routine: misc_init_r
* Description: Configure board specific parts
*/
@@ -122,6 +133,7 @@ int misc_init_r(void)
struct gpio *gpio5_base = (struct gpio *)OMAP34XX_GPIO5_BASE;
struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE;
+ display_init();
beagle_identify();
twl4030_power_init();
@@ -154,6 +166,7 @@ int misc_init_r(void)
writel(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 |
GPIO15 | GPIO14 | GPIO13 | GPIO12, &gpio5_base->setdataout);
+ omap3_dss_enable();
dieid_num_r();
return 0;
diff --git a/board/ti/beagle/beagle.h b/board/ti/beagle/beagle.h
index b1720c9..7f6769f 100644
--- a/board/ti/beagle/beagle.h
+++ b/board/ti/beagle/beagle.h
@@ -23,6 +23,8 @@
#ifndef _BEAGLE_H_
#define _BEAGLE_H_
+#include <asm/arch/dss.h>
+
const omap3_sysinfo sysinfo = {
DDR_STACKED,
"OMAP3 Beagle board",
@@ -385,4 +387,75 @@ const omap3_sysinfo sysinfo = {
MUX_VAL(CP(UART2_RTS), (IDIS | PTD | DIS | M0)) /*UART2_RTS*/\
MUX_VAL(CP(UART2_TX), (IDIS | PTD | DIS | M0)) /*UART2_TX*/
+/*
+ * Display Configuration
+ */
+
+#define DVI_BEAGLE_ORANGE_COL 0x00FF8000
+
+/*
+ * Configure VENC in DSS for Beagle to generate Color Bar
+ *
+ * Kindly refer to OMAP TRM for definition of these values.
+ */
+static const struct venc_config venc_config_std_tv = {
+ .status = 0x0000001B,
+ .f_control = 0x00000040,
+ .vidout_ctrl = 0x00000000,
+ .sync_ctrl = 0x00008000,
+ .llen = 0x00008359,
+ .flens = 0x0000020C,
+ .hfltr_ctrl = 0x00000000,
+ .cc_carr_wss_carr = 0x043F2631,
+ .c_phase = 0x00000024,
+ .gain_u = 0x00000130,
+ .gain_v = 0x00000198,
+ .gain_y = 0x000001C0,
+ .black_level = 0x0000006A,
+ .blank_level = 0x0000005C,
+ .x_color = 0x00000000,
+ .m_control = 0x00000001,
+ .bstamp_wss_data = 0x0000003F,
+ .s_carr = 0x21F07C1F,
+ .line21 = 0x00000000,
+ .ln_sel = 0x00000015,
+ .l21__wc_ctl = 0x00001400,
+ .htrigger_vtrigger = 0x00000000,
+ .savid__eavid = 0x069300F4,
+ .flen__fal = 0x0016020C,
+ .lal__phase_reset = 0x00060107,
+ .hs_int_start_stop_x = 0x008D034E,
+ .hs_ext_start_stop_x = 0x000F0359,
+ .vs_int_start_x = 0x01A00000,
+ .vs_int_stop_x__vs_int_start_y = 0x020501A0,
+ .vs_int_stop_y__vs_ext_start_x = 0x01AC0024,
+ .vs_ext_stop_x__vs_ext_start_y = 0x020D01AC,
+ .vs_ext_stop_y = 0x00000006,
+ .avid_start_stop_x = 0x03480079,
+ .avid_start_stop_y = 0x02040024,
+ .fid_int_start_x__fid_int_start_y = 0x0001008A,
+ .fid_int_offset_y__fid_ext_start_x = 0x01AC0106,
+ .fid_ext_start_y__fid_ext_offset_y = 0x01060006,
+ .tvdetgp_int_start_stop_x = 0x00140001,
+ .tvdetgp_int_start_stop_y = 0x00010001,
+ .gen_ctrl = 0x00FF0000,
+ .output_control = 0x0000000D,
+ .dac_b__dac_c = 0x00000000,
+ .height_width = 0x00ef027f
+};
+
+/*
+ * Configure Timings for DVI D
+ */
+static const struct panel_config dvid_cfg = {
+ .timing_h = 0x0ff03f31, /* Horizantal timing */
+ .timing_v = 0x01400504, /* Vertical timing */
+ .pol_freq = 0x00007028, /* Pol Freq */
+ .divisor = 0x00010006, /* 72Mhz Pixel Clock */
+ .lcd_size = 0x02ff03ff, /* 1024x768 */
+ .panel_type = 0x01, /* TFT */
+ .data_lines = 0x03, /* 24 Bit RGB */
+ .load_mode = 0x02 /* Frame Mode */
+};
+
#endif
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index bb6b5a0..cb15dc2 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -37,6 +37,7 @@ COBJS-$(CONFIG_SED156X) += sed156x.o
COBJS-$(CONFIG_VIDEO_SM501) += sm501.o
COBJS-$(CONFIG_VIDEO_SMI_LYNXEM) += smiLynxEM.o
COBJS-$(CONFIG_VIDEO_VCXK) += bus_vcxk.o
+COBJS-$(CONFIG_VIDEO_OMAP3) += omap3_dss.o
COBJS-y += videomodes.o
COBJS := $(COBJS-y)
diff --git a/drivers/video/omap3_dss.c b/drivers/video/omap3_dss.c
new file mode 100644
index 0000000..2ead7b9
--- /dev/null
+++ b/drivers/video/omap3_dss.c
@@ -0,0 +1,128 @@
+/*
+ * (C) Copyright 2010
+ * Texas Instruments, <www.ti.com>
+ * Syed Mohammed Khasim <khasim at ti.com>
+ *
+ * Referred to Linux DSS driver files for OMAP3
+ *
+ * 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's version 2 of
+ * the License.
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/dss.h>
+
+/*
+ * VENC configuration
+ */
+void omap3_dss_venc_config(const struct venc_config *venc_cfg)
+{
+ dss_write_reg(VENC_STATUS, venc_cfg->status);
+ dss_write_reg(VENC_F_CONTROL, venc_cfg->f_control);
+ dss_write_reg(VENC_VIDOUT_CTRL, venc_cfg->vidout_ctrl);
+ dss_write_reg(VENC_SYNC_CTRL, venc_cfg->sync_ctrl);
+ dss_write_reg(VENC_LLEN, venc_cfg->llen);
+ dss_write_reg(VENC_FLENS, venc_cfg->flens);
+ dss_write_reg(VENC_HFLTR_CTRL, venc_cfg->hfltr_ctrl);
+ dss_write_reg(VENC_CC_CARR_WSS_CARR, venc_cfg->cc_carr_wss_carr);
+ dss_write_reg(VENC_C_PHASE, venc_cfg->c_phase);
+ dss_write_reg(VENC_GAIN_U, venc_cfg->gain_u);
+ dss_write_reg(VENC_GAIN_V, venc_cfg->gain_v);
+ dss_write_reg(VENC_GAIN_Y, venc_cfg->gain_y);
+ dss_write_reg(VENC_BLACK_LEVEL, venc_cfg->black_level);
+ dss_write_reg(VENC_BLANK_LEVEL, venc_cfg->blank_level);
+ dss_write_reg(VENC_X_COLOR, venc_cfg->x_color);
+ dss_write_reg(VENC_M_CONTROL, venc_cfg->m_control);
+ dss_write_reg(VENC_BSTAMP_WSS_DATA, venc_cfg->bstamp_wss_data);
+ dss_write_reg(VENC_S_CARR, venc_cfg->s_carr);
+ dss_write_reg(VENC_LINE21, venc_cfg->line21);
+ dss_write_reg(VENC_LN_SEL, venc_cfg->ln_sel);
+ dss_write_reg(VENC_L21__WC_CTL, venc_cfg->l21__wc_ctl);
+ dss_write_reg(VENC_HTRIGGER_VTRIGGER, venc_cfg->htrigger_vtrigger);
+ dss_write_reg(VENC_SAVID__EAVID, venc_cfg->savid__eavid);
+ dss_write_reg(VENC_FLEN__FAL, venc_cfg->flen__fal);
+ dss_write_reg(VENC_LAL__PHASE_RESET, venc_cfg->lal__phase_reset);
+ dss_write_reg(VENC_HS_INT_START_STOP_X,
+ venc_cfg->hs_int_start_stop_x);
+ dss_write_reg(VENC_HS_EXT_START_STOP_X,
+ venc_cfg->hs_ext_start_stop_x);
+ dss_write_reg(VENC_VS_INT_START_X, venc_cfg->vs_int_start_x);
+ dss_write_reg(VENC_VS_INT_STOP_X__VS_INT_START_Y,
+ venc_cfg->vs_int_stop_x__vs_int_start_y);
+ dss_write_reg(VENC_VS_INT_STOP_Y__VS_EXT_START_X,
+ venc_cfg->vs_int_stop_y__vs_ext_start_x);
+ dss_write_reg(VENC_VS_EXT_STOP_X__VS_EXT_START_Y,
+ venc_cfg->vs_ext_stop_x__vs_ext_start_y);
+ dss_write_reg(VENC_VS_EXT_STOP_Y, venc_cfg->vs_ext_stop_y);
+ dss_write_reg(VENC_AVID_START_STOP_X, venc_cfg->avid_start_stop_x);
+ dss_write_reg(VENC_AVID_START_STOP_Y, venc_cfg->avid_start_stop_y);
+ dss_write_reg(VENC_FID_INT_START_X__FID_INT_START_Y,
+ venc_cfg->fid_int_start_x__fid_int_start_y);
+ dss_write_reg(VENC_FID_INT_OFFSET_Y__FID_EXT_START_X,
+ venc_cfg->fid_int_offset_y__fid_ext_start_x);
+ dss_write_reg(VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y,
+ venc_cfg->fid_ext_start_y__fid_ext_offset_y);
+ dss_write_reg(VENC_TVDETGP_INT_START_STOP_X,
+ venc_cfg->tvdetgp_int_start_stop_x);
+ dss_write_reg(VENC_TVDETGP_INT_START_STOP_Y,
+ venc_cfg->tvdetgp_int_start_stop_y);
+ dss_write_reg(VENC_GEN_CTRL, venc_cfg->gen_ctrl);
+ dss_write_reg(VENC_OUTPUT_CONTROL, venc_cfg->output_control);
+ dss_write_reg(VENC_DAC_B__DAC_C, venc_cfg->dac_b__dac_c);
+ dss_write_reg(DISPC_SIZE_DIG, venc_cfg->height_width);
+ dss_write_reg(DSS_CONTROL, VENC_DSS_CONFIG);
+}
+
+/*
+ * Configure Panel Specific parameters
+ */
+void omap3_dss_panel_config(const struct panel_config *panel_cfg)
+{
+ dss_write_reg(DISPC_TIMING_H, panel_cfg->timing_h);
+ dss_write_reg(DISPC_TIMING_V, panel_cfg->timing_v);
+ dss_write_reg(DISPC_POL_FREQ, panel_cfg->pol_freq);
+ dss_write_reg(DISPC_DIVISOR, panel_cfg->divisor);
+ dss_write_reg(DISPC_SIZE_LCD, panel_cfg->lcd_size);
+ dss_write_reg(DISPC_CONFIG,
+ (panel_cfg->load_mode << FRAME_MODE_OFFSET));
+ dss_write_reg(DISPC_CONTROL,
+ ((panel_cfg->panel_type << TFTSTN_OFFSET) |
+ (panel_cfg->data_lines << DATALINES_OFFSET)));
+}
+
+/*
+ * Enable LCD and DIGITAL OUT in DSS
+ */
+void omap3_dss_enable(void)
+{
+ u32 l = 0;
+
+ l = dss_read_reg(DISPC_CONTROL);
+ l |= DISPC_ENABLE;
+
+ dss_write_reg(DISPC_CONTROL, l);
+}
+
+/*
+ * Set Background Color in DISPC
+ */
+void omap3_dss_set_background_col(u32 color)
+{
+ dss_write_reg(DISPC_DEFAULT_COLOR0, color);
+}
diff --git a/include/asm-arm/arch-omap3/dss.h b/include/asm-arm/arch-omap3/dss.h
new file mode 100644
index 0000000..08c7d8d
--- /dev/null
+++ b/include/asm-arm/arch-omap3/dss.h
@@ -0,0 +1,193 @@
+/*
+ * (C) Copyright 2010
+ * Texas Instruments, <www.ti.com>
+ * Syed Mohammed Khasim <khasim at ti.com>
+ *
+ * Referred to Linux DSS driver files for OMAP3
+ *
+ * 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's version 2 of
+ * the License.
+ *
+ * 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
+ */
+
+#ifndef DSS_H
+#define DSS_H
+
+/* VENC Register address */
+#define VENC_REV_ID 0x48050C00
+#define VENC_STATUS 0x48050C04
+#define VENC_F_CONTROL 0x48050C08
+#define VENC_VIDOUT_CTRL 0x48050C10
+#define VENC_SYNC_CTRL 0x48050C14
+#define VENC_LLEN 0x48050C1C
+#define VENC_FLENS 0x48050C20
+#define VENC_HFLTR_CTRL 0x48050C24
+#define VENC_CC_CARR_WSS_CARR 0x48050C28
+#define VENC_C_PHASE 0x48050C2C
+#define VENC_GAIN_U 0x48050C30
+#define VENC_GAIN_V 0x48050C34
+#define VENC_GAIN_Y 0x48050C38
+#define VENC_BLACK_LEVEL 0x48050C3C
+#define VENC_BLANK_LEVEL 0x48050C40
+#define VENC_X_COLOR 0x48050C44
+#define VENC_M_CONTROL 0x48050C48
+#define VENC_BSTAMP_WSS_DATA 0x48050C4C
+#define VENC_S_CARR 0x48050C50
+#define VENC_LINE21 0x48050C54
+#define VENC_LN_SEL 0x48050C58
+#define VENC_L21__WC_CTL 0x48050C5C
+#define VENC_HTRIGGER_VTRIGGER 0x48050C60
+#define VENC_SAVID__EAVID 0x48050C64
+#define VENC_FLEN__FAL 0x48050C68
+#define VENC_LAL__PHASE_RESET 0x48050C6C
+#define VENC_HS_INT_START_STOP_X 0x48050C70
+#define VENC_HS_EXT_START_STOP_X 0x48050C74
+#define VENC_VS_INT_START_X 0x48050C78
+#define VENC_VS_INT_STOP_X__VS_INT_START_Y 0x48050C7C
+#define VENC_VS_INT_STOP_Y__VS_EXT_START_X 0x48050C80
+#define VENC_VS_EXT_STOP_X__VS_EXT_START_Y 0x48050C84
+#define VENC_VS_EXT_STOP_Y 0x48050C88
+#define VENC_AVID_START_STOP_X 0x48050C90
+#define VENC_AVID_START_STOP_Y 0x48050C94
+#define VENC_FID_INT_START_X__FID_INT_START_Y 0x48050CA0
+#define VENC_FID_INT_OFFSET_Y__FID_EXT_START_X 0x48050CA4
+#define VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y 0x48050CA8
+#define VENC_TVDETGP_INT_START_STOP_X 0x48050CB0
+#define VENC_TVDETGP_INT_START_STOP_Y 0x48050CB4
+#define VENC_GEN_CTRL 0x48050CB8
+#define VENC_OUTPUT_CONTROL 0x48050CC4
+#define VENC_DAC_B__DAC_C 0x48050CC8
+
+/* DSS register addresses */
+#define DSS_SYSCONFIG 0x48050010
+#define DSS_CONTROL 0x48050040
+
+/* DISPC register addresses */
+#define DISPC_SYSCONFIG 0x48050410
+#define DISPC_SYSSTATUS 0x48050414
+#define DISPC_CONTROL 0x48050440
+#define DISPC_CONFIG 0x48050444
+#define DISPC_DEFAULT_COLOR0 0x4805044c
+#define DISPC_DEFAULT_COLOR1 0x48050450
+#define DISPC_TRANS_COLOR0 0x48050454
+#define DISPC_TRANS_COLOR1 0x48050458
+#define DISPC_TIMING_H 0x48050464
+#define DISPC_TIMING_V 0x48050468
+#define DISPC_POL_FREQ 0x4805046c
+#define DISPC_DIVISOR 0x48050470
+#define DISPC_SIZE_DIG 0x48050478
+#define DISPC_SIZE_LCD 0x4805047c
+
+/* Few Register Offsets */
+#define FRAME_MODE_OFFSET 1
+#define TFTSTN_OFFSET 3
+#define DATALINES_OFFSET 8
+
+/* Enabling Display controller */
+#define LCD_ENABLE 1
+#define DIG_ENABLE (1 << 1)
+#define GO_LCD (1 << 5)
+#define GO_DIG (1 << 6)
+#define GP_OUT0 (1 << 15)
+#define GP_OUT1 (1 << 16)
+
+#define DISPC_ENABLE (LCD_ENABLE | \
+ DIG_ENABLE | \
+ GO_LCD | \
+ GO_DIG | \
+ GP_OUT0| \
+ GP_OUT1)
+/* Configure VENC DSS Params */
+#define VENC_CLK_ENABLE (1 << 3)
+#define DAC_DEMEN (1 << 4)
+#define DAC_POWERDN (1 << 5)
+#define VENC_OUT_SEL (1 << 6)
+
+#define VENC_DSS_CONFIG (VENC_CLK_ENABLE | \
+ DAC_DEMEN | \
+ DAC_POWERDN | \
+ VENC_OUT_SEL)
+
+struct venc_config {
+ u32 status;
+ u32 f_control;
+ u32 vidout_ctrl;
+ u32 sync_ctrl;
+ u32 llen;
+ u32 flens;
+ u32 hfltr_ctrl;
+ u32 cc_carr_wss_carr;
+ u32 c_phase;
+ u32 gain_u;
+ u32 gain_v;
+ u32 gain_y;
+ u32 black_level;
+ u32 blank_level;
+ u32 x_color;
+ u32 m_control;
+ u32 bstamp_wss_data;
+ u32 s_carr;
+ u32 line21;
+ u32 ln_sel;
+ u32 l21__wc_ctl;
+ u32 htrigger_vtrigger;
+ u32 savid__eavid;
+ u32 flen__fal;
+ u32 lal__phase_reset;
+ u32 hs_int_start_stop_x;
+ u32 hs_ext_start_stop_x;
+ u32 vs_int_start_x;
+ u32 vs_int_stop_x__vs_int_start_y;
+ u32 vs_int_stop_y__vs_ext_start_x;
+ u32 vs_ext_stop_x__vs_ext_start_y;
+ u32 vs_ext_stop_y;
+ u32 avid_start_stop_x;
+ u32 avid_start_stop_y;
+ u32 fid_int_start_x__fid_int_start_y;
+ u32 fid_int_offset_y__fid_ext_start_x;
+ u32 fid_ext_start_y__fid_ext_offset_y;
+ u32 tvdetgp_int_start_stop_x;
+ u32 tvdetgp_int_start_stop_y;
+ u32 gen_ctrl;
+ u32 output_control;
+ u32 dac_b__dac_c;
+ u32 height_width;
+};
+
+struct panel_config {
+ u32 timing_h;
+ u32 timing_v;
+ u32 pol_freq;
+ u32 divisor;
+ u32 lcd_size;
+ u32 panel_type;
+ u32 data_lines;
+ u32 load_mode;
+};
+
+static inline void dss_write_reg(int reg, u32 val)
+{
+ __raw_writel(val, reg);
+}
+
+static inline u32 dss_read_reg(int reg)
+{
+ u32 l = __raw_readl(reg);
+ return l;
+}
+
+#endif /* DSS_H */
diff --git a/include/configs/omap3_beagle.h b/include/configs/omap3_beagle.h
index ff6d432..2c15df9 100644
--- a/include/configs/omap3_beagle.h
+++ b/include/configs/omap3_beagle.h
@@ -120,6 +120,7 @@
#define CONFIG_CMD_I2C /* I2C serial bus support */
#define CONFIG_CMD_MMC /* MMC support */
#define CONFIG_CMD_NAND /* NAND support */
+#define CONFIG_VIDEO_OMAP3 /* DSS Support */
#undef CONFIG_CMD_FLASH /* flinfo, erase, protect */
#undef CONFIG_CMD_FPGA /* FPGA configuration Support */
--
1.5.6.3
More information about the U-Boot
mailing list