Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/macppc/dev - don't call ki2c private functions anym...
details: https://anonhg.NetBSD.org/src/rev/70b192121dd9
branches: trunk
changeset: 583533:70b192121dd9
user: macallan <macallan%NetBSD.org@localhost>
date: Wed Aug 10 14:32:08 2005 +0000
description:
- don't call ki2c private functions anymore, use iic_exec() to be a good i2c citizen
- use the deq driver to find the mixer device
- add controls for bass and treble
diffstat:
sys/arch/macppc/dev/snapper.c | 247 ++++++++++++++++++++++++++++++++++++++---
1 files changed, 229 insertions(+), 18 deletions(-)
diffs (truncated from 393 to 300 lines):
diff -r 8e0a1e99d045 -r 70b192121dd9 sys/arch/macppc/dev/snapper.c
--- a/sys/arch/macppc/dev/snapper.c Wed Aug 10 14:30:15 2005 +0000
+++ b/sys/arch/macppc/dev/snapper.c Wed Aug 10 14:32:08 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: snapper.c,v 1.5 2005/01/25 19:05:22 briggs Exp $ */
+/* $NetBSD: snapper.c,v 1.6 2005/08/10 14:32:08 macallan Exp $ */
/* Id: snapper.c,v 1.11 2002/10/31 17:42:13 tsubai Exp */
/*-
@@ -44,10 +44,13 @@
#include <macppc/dev/dbdma.h>
#include <uvm/uvm_extern.h>
+#include <dev/i2c/i2cvar.h>
#include <machine/autoconf.h>
#include <machine/pio.h>
+#include <macppc/dev/deqvar.h>
+
#ifdef SNAPPER_DEBUG
# define DPRINTF printf
#else
@@ -70,10 +73,14 @@
u_int sc_output_mask; /* output source mask */
u_char *sc_reg;
- struct device *sc_i2c;
+ i2c_addr_t sc_deqaddr;
+ i2c_tag_t sc_i2c;
u_int sc_vol_l;
u_int sc_vol_r;
+ u_int sc_treble;
+ u_int sc_bass;
+ u_int mixer[6]; /* s1_l, s2_l, an_l, s1_r, s2_r, an_r */
dbdma_regmap_t *sc_odma;
dbdma_regmap_t *sc_idma;
@@ -106,6 +113,9 @@
void *, const audio_params_t *);
void snapper_set_volume(struct snapper_softc *, int, int);
int snapper_set_rate(struct snapper_softc *, u_int);
+void snapper_set_treble(struct snapper_softc *, int);
+void snapper_set_bass(struct snapper_softc *, int);
+void snapper_write_mixers(struct snapper_softc *);
int tas3004_write(struct snapper_softc *, u_int, const void *);
static int gpio_read(char *);
@@ -116,12 +126,6 @@
int tas3004_init(struct snapper_softc *);
void snapper_init(struct snapper_softc *, int);
-/* XXX */
-int ki2c_setmode(struct device *, int);
-int ki2c_write(struct device *, int, int, const void *, int);
-void ki2c_writereg(struct device *, int, u_int);
-
-
struct cfattach snapper_ca = {
"snapper", {}, sizeof(struct snapper_softc),
snapper_match, snapper_attach
@@ -163,6 +167,46 @@
"snapper"
};
+const uint8_t snapper_basstab[] = {
+ 0x96, /* -18dB */
+ 0x94, /* -17dB */
+ 0x92, /* -16dB */
+ 0x90, /* -15dB */
+ 0x8e, /* -14dB */
+ 0x8c, /* -13dB */
+ 0x8a, /* -12dB */
+ 0x88, /* -11dB */
+ 0x86, /* -10dB */
+ 0x84, /* -9dB */
+ 0x82, /* -8dB */
+ 0x80, /* -7dB */
+ 0x7e, /* -6dB */
+ 0x7c, /* -5dB */
+ 0x7a, /* -4dB */
+ 0x78, /* -3dB */
+ 0x76, /* -2dB */
+ 0x74, /* -1dB */
+ 0x72, /* 0dB */
+ 0x6f, /* 1dB */
+ 0x6d, /* 2dB */
+ 0x6a, /* 3dB */
+ 0x67, /* 4dB */
+ 0x65, /* 5dB */
+ 0x62, /* 6dB */
+ 0x5f, /* 7dB */
+ 0x5b, /* 8dB */
+ 0x55, /* 9dB */
+ 0x4f, /* 10dB */
+ 0x49, /* 11dB */
+ 0x43, /* 12dB */
+ 0x3b, /* 13dB */
+ 0x33, /* 14dB */
+ 0x29, /* 15dB */
+ 0x1e, /* 16dB */
+ 0x11, /* 17dB */
+ 0x01, /* 18dB */
+};
+
#define SNAPPER_NFORMATS 1
static const struct audio_format snapper_formats[SNAPPER_NFORMATS] = {
{NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_BE, 16, 16,
@@ -366,12 +410,23 @@
{
struct snapper_softc *sc;
struct device *dv;
-
+ struct deq_softc *deq;
+
sc = (struct snapper_softc *)dev;
+ /*
for (dv = alldevs.tqh_first; dv; dv=dv->dv_list.tqe_next)
if (strncmp(dv->dv_xname, "ki2c", 4) == 0 &&
strncmp(dv->dv_parent->dv_xname, "obio", 4) == 0)
sc->sc_i2c = dv;
+ */
+ for (dv = alldevs.tqh_first; dv; dv=dv->dv_list.tqe_next)
+ if (strncmp(dv->dv_xname, "deq", 3) == 0 &&
+ strncmp(dv->dv_parent->dv_xname, "ki2c", 4) == 0) {
+ deq=(struct deq_softc *)dv;
+ sc->sc_i2c = deq->sc_i2c;
+ sc->sc_deqaddr=deq->sc_address;
+ }
+
if (sc->sc_i2c == NULL) {
printf("%s: unable to find i2c\n", sc->sc_dev.dv_xname);
return;
@@ -573,8 +628,13 @@
SNAPPER_RECORD_CLASS,
SNAPPER_OUTPUT_SELECT,
SNAPPER_VOL_OUTPUT,
+ SNAPPER_DIGI1,
+ SNAPPER_DIGI2,
+ SNAPPER_ANALOG,
SNAPPER_INPUT_SELECT,
SNAPPER_VOL_INPUT,
+ SNAPPER_TREBLE,
+ SNAPPER_BASS,
SNAPPER_ENUM_LAST
};
@@ -628,8 +688,29 @@
case SNAPPER_VOL_INPUT:
/* XXX TO BE DONE */
return 0;
- }
+ case SNAPPER_BASS:
+ snapper_set_bass(sc,l);
+ return 0;
+ case SNAPPER_TREBLE:
+ snapper_set_treble(sc,l);
+ return 0;
+ case SNAPPER_DIGI1:
+ sc->mixer[0]=l;
+ sc->mixer[3]=r;
+ snapper_write_mixers(sc);
+ return 0;
+ case SNAPPER_DIGI2:
+ sc->mixer[1]=l;
+ sc->mixer[4]=r;
+ snapper_write_mixers(sc);
+ return 0;
+ case SNAPPER_ANALOG:
+ sc->mixer[2]=l;
+ sc->mixer[5]=r;
+ snapper_write_mixers(sc);
+ return 0;
+ }
return ENXIO;
}
@@ -659,7 +740,24 @@
mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = 0;
mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = 0;
return 0;
-
+ case SNAPPER_TREBLE:
+ mc->un.value.level[AUDIO_MIXER_LEVEL_MONO]=sc->sc_treble;
+ return 0;
+ case SNAPPER_BASS:
+ mc->un.value.level[AUDIO_MIXER_LEVEL_MONO]=sc->sc_bass;
+ return 0;
+ case SNAPPER_DIGI1:
+ mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = sc->mixer[0];
+ mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = sc->mixer[3];
+ return 0;
+ case SNAPPER_DIGI2:
+ mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = sc->mixer[1];
+ mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = sc->mixer[4];
+ return 0;
+ case SNAPPER_ANALOG:
+ mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = sc->mixer[2];
+ mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = sc->mixer[5];
+ return 0;
default:
return ENXIO;
}
@@ -736,6 +834,44 @@
dip->type = AUDIO_MIXER_CLASS;
dip->next = dip->prev = AUDIO_MIXER_LAST;
return 0;
+
+ case SNAPPER_TREBLE:
+ dip->mixer_class = SNAPPER_MONITOR_CLASS;
+ strcpy(dip->label.name, AudioNtreble);
+ dip->type = AUDIO_MIXER_VALUE;
+ dip->prev = dip->next = AUDIO_MIXER_LAST;
+ dip->un.v.num_channels = 1;
+ return 0;
+
+ case SNAPPER_BASS:
+ dip->mixer_class = SNAPPER_MONITOR_CLASS;
+ strcpy(dip->label.name, AudioNbass);
+ dip->type = AUDIO_MIXER_VALUE;
+ dip->prev = dip->next = AUDIO_MIXER_LAST;
+ dip->un.v.num_channels = 1;
+ return 0;
+
+ case SNAPPER_DIGI1:
+ dip->mixer_class = SNAPPER_MONITOR_CLASS;
+ strcpy(dip->label.name, AudioNdac);
+ dip->type = AUDIO_MIXER_VALUE;
+ dip->prev = dip->next = AUDIO_MIXER_LAST;
+ dip->un.v.num_channels = 2;
+ return 0;
+ case SNAPPER_DIGI2:
+ dip->mixer_class = SNAPPER_MONITOR_CLASS;
+ strcpy(dip->label.name, "Digi2");
+ dip->type = AUDIO_MIXER_VALUE;
+ dip->prev = dip->next = AUDIO_MIXER_LAST;
+ dip->un.v.num_channels = 2;
+ return 0;
+ case SNAPPER_ANALOG:
+ dip->mixer_class = SNAPPER_MONITOR_CLASS;
+ strcpy(dip->label.name, "Analog");
+ dip->type = AUDIO_MIXER_VALUE;
+ dip->prev = dip->next = AUDIO_MIXER_LAST;
+ dip->un.v.num_channels = 2;
+ return 0;
}
return ENXIO;
@@ -833,6 +969,7 @@
sc->sc_vol_l = left;
sc->sc_vol_r = right;
+#if 0
left <<= 8; /* XXX for now */
right <<= 8;
@@ -842,8 +979,55 @@
vol[3] = right >> 16;
vol[4] = right >> 8;
vol[5] = right;
+#else
+ /* 0x07ffff is LOUD, 0x000000 is mute */
+ vol[0]=0/*(left>>5)&0xff*/; /* upper 3 bits */
+ vol[1]=(left/*<<3*/)&0xff; /* lower 5 bits */
+ vol[2]=0;
+ vol[3]=0/*(right>>5)&0xff*/; /* upper 3 bits */
+ vol[4]=(right/*<<3*/)&0xff; /* lower 5 bits */
+ vol[5]=0;
+#endif
+ tas3004_write(sc, DEQ_VOLUME, vol);
+}
- tas3004_write(sc, DEQ_VOLUME, vol);
+void snapper_set_treble(struct snapper_softc *sc, int stuff)
+{
+ uint8_t reg;
+ if((stuff>=0) && (stuff<=255) && (sc->sc_treble!=stuff)) {
+ reg=snapper_basstab[(stuff>>3)+2];
+ sc->sc_treble=stuff;
+ tas3004_write(sc, DEQ_TREBLE,®);
+ }
+}
+
+void snapper_set_bass(struct snapper_softc *sc, int stuff)
+{
+ uint8_t reg;
+ if((stuff>=0) && (stuff<=255) && (stuff!=sc->sc_bass)) {
+ reg=snapper_basstab[(stuff>>3)+2];
+ sc->sc_bass=stuff;
+ tas3004_write(sc, DEQ_BASS,®);
+ }
+}
+
+void snapper_write_mixers(struct snapper_softc *sc)
+{
+ uint8_t regs[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
+ regs[0] = (sc->mixer[0] >> 4) & 0xff;
+ regs[1] = (sc->mixer[0] << 4) & 0xff;
Home |
Main Index |
Thread Index |
Old Index