Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/amlogic Support interlaced modes.
details: https://anonhg.NetBSD.org/src/rev/4be9e7990c05
branches: trunk
changeset: 336829:4be9e7990c05
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Sun Mar 22 16:23:26 2015 +0000
description:
Support interlaced modes.
diffstat:
sys/arch/arm/amlogic/amlogic_genfb.c | 45 ++++++++++++++++++++++++------------
1 files changed, 30 insertions(+), 15 deletions(-)
diffs (141 lines):
diff -r 1a3369a7374d -r 4be9e7990c05 sys/arch/arm/amlogic/amlogic_genfb.c
--- a/sys/arch/arm/amlogic/amlogic_genfb.c Sun Mar 22 14:02:15 2015 +0000
+++ b/sys/arch/arm/amlogic/amlogic_genfb.c Sun Mar 22 16:23:26 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_genfb.c,v 1.2 2015/03/22 13:53:33 jmcneill Exp $ */
+/* $NetBSD: amlogic_genfb.c,v 1.3 2015/03/22 16:23:26 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amlogic_genfb.c,v 1.2 2015/03/22 13:53:33 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amlogic_genfb.c,v 1.3 2015/03/22 16:23:26 jmcneill Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -55,26 +55,29 @@
u_int vic;
u_int width;
u_int height;
+ u_int flags;
+#define INTERLACE __BIT(0)
+#define DBLSCAN __BIT(1)
} amlogic_genfb_modes[] = {
{ 1, 640, 480 },
{ 2, 720, 480 },
{ 3, 720, 480 },
{ 4, 1280, 720 },
- { 5, 1920, 1080 },
- { 6, 720, 480 },
- { 7, 720, 480 },
- { 8, 720, 240 },
- { 9, 720, 240 },
+ { 5, 1920, 1080, INTERLACE },
+ { 6, 720, 480, DBLSCAN | INTERLACE },
+ { 7, 720, 480, DBLSCAN | INTERLACE },
+ { 8, 720, 240, DBLSCAN },
+ { 9, 720, 240, DBLSCAN },
{ 16, 1920, 1080 },
{ 17, 720, 576 },
{ 18, 720, 576 },
{ 19, 1280, 720 },
- { 20, 1920, 1080 },
+ { 20, 1920, 1080, INTERLACE },
{ 31, 1920, 1080 },
{ 32, 1920, 1080 },
{ 33, 1920, 1080 },
{ 34, 1920, 1080 },
- { 39, 1920, 1080 },
+ { 39, 1920, 1080, INTERLACE },
};
struct amlogic_genfb_softc {
@@ -302,16 +305,23 @@
prop_dictionary_t cfg = device_properties(sc->sc_gen.sc_dev);
uint32_t w0, w1, w2, w3, w4;
u_int width, height;
+ bool interlace_p;
prop_dictionary_get_uint32(cfg, "width", &width);
prop_dictionary_get_uint32(cfg, "height", &height);
+ prop_dictionary_get_bool(cfg, "interlace", &interlace_p);
w0 = VPU_READ(sc, VIU_OSD2_BLK0_CFG_W0_REG);
w0 &= ~VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE;
w0 |= __SHIFTIN(7, VIU_OSD_BLK_CFG_W0_OSD_BLK_MODE);
w0 |= VIU_OSD_BLK_CFG_W0_LITTLE_ENDIAN;
+ w0 &= ~VIU_OSD_BLK_CFG_W0_RPT_Y;
w0 &= ~VIU_OSD_BLK_CFG_W0_INTERP_CTRL;
- w0 &= ~VIU_OSD_BLK_CFG_W0_INTERLACE_EN;
+ if (interlace_p) {
+ w0 |= VIU_OSD_BLK_CFG_W0_INTERLACE_EN;
+ } else {
+ w0 &= ~VIU_OSD_BLK_CFG_W0_INTERLACE_EN;
+ }
w0 |= VIU_OSD_BLK_CFG_W0_RGB_EN;
w0 &= ~VIU_OSD_BLK_CFG_W0_COLOR_MATRIX;
VPU_WRITE(sc, VIU_OSD2_BLK0_CFG_W0_REG, w0);
@@ -337,16 +347,17 @@
prop_dictionary_t cfg = device_properties(sc->sc_gen.sc_dev);
uint32_t scctl, sci_wh, sco_h, sco_v, hsc, vsc, hps, vps, hip, vip;
u_int width, height;
+ bool interlace_p;
prop_dictionary_get_uint32(cfg, "width", &width);
prop_dictionary_get_uint32(cfg, "height", &height);
+ prop_dictionary_get_bool(cfg, "interlace", &interlace_p);
const u_int scale = sc->sc_scale;
const u_int dst_w = (width * scale) / 100;
const u_int dst_h = (height * scale) / 100;
const u_int margin_w = (width - dst_w) / 2;
const u_int margin_h = (height - dst_h) / 2;
- const bool interlace_p = false; /* TODO */
const bool scale_p = scale != 100;
VPU_WRITE(sc, VPP_OSD_SC_DUMMY_DATA_REG, 0x00808000);
@@ -360,11 +371,12 @@
VPU_WRITE(sc, VPP_OSD_SC_CTRL0_REG, scctl);
sci_wh = __SHIFTIN(width - 1, VPP_OSD_SCI_WH_M1_WIDTH) |
- __SHIFTIN(height - 1, VPP_OSD_SCI_WH_M1_HEIGHT);
+ __SHIFTIN((height >> interlace_p) - 1, VPP_OSD_SCI_WH_M1_HEIGHT);
sco_h = __SHIFTIN(margin_w, VPP_OSD_SCO_H_START) |
__SHIFTIN(width - margin_w - 1, VPP_OSD_SCO_H_END);
- sco_v = __SHIFTIN(margin_h, VPP_OSD_SCO_V_START) |
- __SHIFTIN(height - margin_h - 1, VPP_OSD_SCO_V_END);
+ sco_v = __SHIFTIN(margin_h >> interlace_p, VPP_OSD_SCO_V_START) |
+ __SHIFTIN(((height - margin_h) >> interlace_p) - 1,
+ VPP_OSD_SCO_V_END);
VPU_WRITE(sc, VPP_OSD_SCI_WH_M1_REG, sci_wh);
VPU_WRITE(sc, VPP_OSD_SCO_H_REG, sco_h);
@@ -444,7 +456,7 @@
{
prop_dictionary_t cfg = device_properties(sc->sc_gen.sc_dev);
const struct sysctlnode *node, *devnode;
- u_int width = 0, height = 0, i, scale = 100;
+ u_int width = 0, height = 0, flags, i, scale = 100;
int error;
/*
@@ -458,6 +470,7 @@
aprint_debug(" [HDMI VIC %d]", vic);
width = amlogic_genfb_modes[i].width;
height = amlogic_genfb_modes[i].height;
+ flags = amlogic_genfb_modes[i].flags;
break;
}
}
@@ -487,6 +500,8 @@
prop_dictionary_set_uint32(cfg, "width", width);
prop_dictionary_set_uint32(cfg, "height", height);
+ prop_dictionary_set_bool(cfg, "dblscan", !!(flags & DBLSCAN));
+ prop_dictionary_set_bool(cfg, "interlace", !!(flags & INTERLACE));
prop_dictionary_set_uint8(cfg, "depth", 24);
prop_dictionary_set_uint16(cfg, "linebytes", width * 3);
prop_dictionary_set_uint32(cfg, "address", 0);
Home |
Main Index |
Thread Index |
Old Index