Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci add pcHDTV HD-5500 support:
details: https://anonhg.NetBSD.org/src/rev/c834fb067d73
branches: trunk
changeset: 767308:c834fb067d73
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Fri Jul 15 03:35:13 2011 +0000
description:
add pcHDTV HD-5500 support:
cxdtv0 at pci0 dev 14 function 2: pcHDTV HD-5500 HDTV Video Capture (rev. 0x05)
cxdtv0: interrupting at irq 10
cxdtv0: lg3303: found @ 0x59
cxdtv0: tvpll: LG TDVS-H06xF
dtv0 at cxdtv0: CX23880 [ATSC]
diffstat:
sys/dev/pci/cxdtv.c | 51 ++++++++++++++++++++++++++++++---------------------
1 files changed, 30 insertions(+), 21 deletions(-)
diffs (114 lines):
diff -r 0e71722e5d85 -r c834fb067d73 sys/dev/pci/cxdtv.c
--- a/sys/dev/pci/cxdtv.c Fri Jul 15 03:31:37 2011 +0000
+++ b/sys/dev/pci/cxdtv.c Fri Jul 15 03:35:13 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: cxdtv.c,v 1.3 2011/07/15 00:21:26 jmcneill Exp $ */
+/* $NetBSD: cxdtv.c,v 1.4 2011/07/15 03:35:13 jmcneill Exp $ */
/*
* Copyright (c) 2008, 2011 Jonathan A. Kollasch
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cxdtv.c,v 1.3 2011/07/15 00:21:26 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cxdtv.c,v 1.4 2011/07/15 03:35:13 jmcneill Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -61,7 +61,6 @@
#define CXDTV_SRAM_CH_MPEG 0
#define CXDTV_TS_PKTSIZE (188 * 8)
-
static int cxdtv_match(struct device *, struct cfdata *, void *);
static void cxdtv_attach(struct device *, struct device *, void *);
static int cxdtv_detach(struct device *, int);
@@ -860,30 +859,34 @@
cxdtv_sram_ch_setup(sc, ch, CXDTV_TS_PKTSIZE);
/* software reset */
- bus_space_write_4(sc->sc_memt, sc->sc_memh, CXDTV_TS_GEN_CONTROL,
- 0x40);
- mutex_enter(&sc->sc_delaylock);
- cv_timedwait(&sc->sc_delaycv, &sc->sc_delaylock, mstohz(100));
- mutex_exit(&sc->sc_delaylock);
/* serial MPEG port on HD5500 */
switch(sc->sc_vendor) {
case PCI_VENDOR_ATI:
/* both ATI boards with DTV are the same */
+ bus_space_write_4(sc->sc_memt, sc->sc_memh,
+ CXDTV_TS_GEN_CONTROL, 0x40);
+ delay(100);
/* parallel MPEG port */
bus_space_write_4(sc->sc_memt, sc->sc_memh,
CXDTV_PINMUX_IO, 0x80); /* XXX bit defines */
break;
case PCI_VENDOR_PCHDTV:
if (sc->sc_product == PCI_PRODUCT_PCHDTV_HD5500) {
+ bus_space_write_4(sc->sc_memt, sc->sc_memh,
+ CXDTV_TS_GEN_CONTROL, 0x48);
+ delay(100);
/* serial MPEG port */
bus_space_write_4(sc->sc_memt, sc->sc_memh,
CXDTV_PINMUX_IO, 0x00); /* XXX bit defines */
+ /* byte-width start-of-packet */
+ bus_space_write_4(sc->sc_memt, sc->sc_memh,
+ CXDTV_HW_SOP_CONTROL,
+ 0x47 << 16 | 188 << 4 | 1);
+ bus_space_write_4(sc->sc_memt, sc->sc_memh,
+ CXDTV_TS_SOP_STATUS, 1 << 13);
bus_space_write_4(sc->sc_memt, sc->sc_memh,
CXDTV_TS_GEN_CONTROL, 0x08);
- /* byte-width start-of-packet */
- bus_space_write_4(sc->sc_memt, sc->sc_memh,
- CXDTV_TS_SOP_STATUS, 1 << 13);
}
break;
default:
@@ -899,7 +902,7 @@
offset = CXDTV_TS_GEN_CONTROL;
v = bus_space_read_4(sc->sc_memt, sc->sc_memh, offset);
- printf("%06x %08x\n", offset, v);
+ printf("CXDTV_TS_GEN_CONTROL %06x %08x\n", offset, v);
#if 0
bus_space_write_4(sc->sc_memt, sc->sc_memh, CXDTV_TS_GEN_CONTROL, 0x00);
@@ -1139,20 +1142,26 @@
}
/* pcHDTV HD5500 */
+#define cxdtv_write_field(_mask, _shift, _value) \
+ (((_value) & (_mask)) << (_shift))
+
+static void
+cxdtv_write_gpio(struct cxdtv_softc *sc, uint32_t mask, uint32_t value)
+{
+ uint32_t v = 0;
+ v |= cxdtv_write_field(0xff, 16, mask);
+ v |= cxdtv_write_field(0xff, 8, mask);
+ v |= cxdtv_write_field(0xff, 0, (mask & value));
+ bus_space_write_4(sc->sc_memt, sc->sc_memh, CXDTV_GP0_IO, v);
+}
+
static void
cxdtv_card_init_hd5500(struct cxdtv_softc *sc)
{
- uint32_t val;
-
/* hardware (demod) reset */
- val = bus_space_read_4(sc->sc_memt, sc->sc_memh, CXDTV_GP0_IO);
-
- val &= ~1;
- bus_space_write_4(sc->sc_memt, sc->sc_memh, CXDTV_GP0_IO, val);
+ cxdtv_write_gpio(sc, 1, 0);
delay(100000);
-
- val |= 1;
- bus_space_write_4(sc->sc_memt, sc->sc_memh, CXDTV_GP0_IO, val);
+ cxdtv_write_gpio(sc, 1, 1);
delay(200000);
}
Home |
Main Index |
Thread Index |
Old Index