Status of VIA Envy24 audio controller
Pyun YongHyeon
pyunyh at gmail.com
Tue Oct 31 08:30:20 UTC 2006
On Tue, Oct 31, 2006 at 08:09:41AM +0200, Konstantin Dimitrov wrote:
> On 10/31/06, Pyun YongHyeon <pyunyh at gmail.com> wrote:
> >
> >On Sun, Oct 29, 2006 at 09:01:30PM +0200, Konstantin Dimitrov wrote:
> >> sorry for my late answer, i'm too busy, but today i had some free time
> >to
> >> look at the problems. the two described problems are different and not
> >> related. here is the new working code:
> >>
> >> for Envy24 (fix mutex problems on current and panic on verbose boot) :
> >> http://envy24.svobodno.com/driver/envy24/current/envy24.c
> >>
> >> for Envy24HT(fix mutex problems on current and panic on verbose boot,
> >enable
> >> vchans):
> >> http://envy24.svobodno.com/driver/envy24ht/current/envy24ht.c
> >> http://envy24.svobodno.com/driver/envy24ht/current/envy24ht.h
> >>
> >> vchans support is now enabled in the Envy24HT code and hope it's working
> >ok.
> >>
> >
> >Thanks. It now loads ok on CURRENT but I can't hear anything.
> >I can't sure but I have to make a cfg_table for
> >"ONKYO SE-150PCI PLUS". ATM it seems that it uses generic
> >configuration for the hardware. I'll let you if I mananged to
> >make it work.
>
>
> you can't hear anything, because DAC on your ONKYO SE-150PCI PLUS is not
> initialized.
>
> Laurent Courty (lrntct at gmail.com) has ONKYO SE-90PCI and I have been
> trying to get it running for more than 2 weeks now, but without success and
> filling the cfg_table is not so easy at all, because it involves knowing the
> hardware specific design of the board, so the process on adding support for
> new unsupported card can be summarized in the following steps:
>
> 0) examine the board to see what ICs they use for DACs, ADCs, DITs, etc.
> 1) make EEPROM dump (i wrote small kernel module that do the job:
> http://www.nbritton.org/uploads/envy24/envy24_dump_v01.tar)
> 2) find the hardware specific design of the board (wiring between Envy24
> chip and other important chips on the board like DACs)
> 3) fill the cfg_table and if needed write the necessary card specific code
> (codec init code, etc.)
>
> on the table here: http://envy24.svobodno.com , you can see all the above
> info for supported boards till now - ICs, EEPROM dumps, wiring info, etc.
>
> so do the steps 0) and 1) and mail me that info, then i will try to help you
> with 2) and 3).
>
Thanks a lot. I've checked the hardware but I can't sure what ICs
are used for DAC/ADC etc. The information I can get from the vendor's
site and checking the hardware indicates the following.
2ch only DAC : WM8716SEDS
CODEC : WM8776S
6ch DAC : WM8766G
See http://onkyo.jp/wavio/150pci/03_03.htm for their description
for the hardware.
I've attached EEPROM dump and patch for the dump program. Personally
I think it should be included in envy24ht(4) and users can extract
that information with sysctl(8) interface. You can add that information
with SYSCTL_ADD_PROC.
BTW, if we need EEPROM information to initialize the hardware why
hardcode cfg_table for each hardware model?
> >On 10/28/06, Pyun YongHyeon <pyunyh at gmail.com> wrote:
> >> >
> >> >On Sat, Oct 28, 2006 at 02:43:53AM -0500, Nikolas Britton wrote:
> >> >> Hey Konstantin, I think I found a bug in the code. If I boot FreeBSD
> >> >> with verbose logging the envy24 driver will panic the system during
> >> >> the boot process. fatal trap 12, page fault, and something about
> >> >> "envy24(play): setmap; xxxxx", I'd have to build a debug kernel etc.
> >> >> if you want the full message and backtrace but this should be easy to
> >> >> reproduce. I'm using envy24 sources from -CURRENT that I manually
> >> >> MFC'd to FreeBSD 6.2-PRERELEASE. Oh... I'm using an M Audio
> >Audiophile
> >> >> 2496.
> >> >>
> >> >
> >> >I saw the panic on envy24ht(4) too and sent a mail to Konstantin but
> >> >got no reply yet. With WITNESS enabled kernel it shows several LORs
> >> >and panicked due to use of recursed mutex(channel lock can't be
> >> >acquired recursively). I guess correct fix could be done by moving
> >> >buffer resizing code to channel_setblocksize method instead of
> >> >channel_setformat method. Unfortunately I haven't have free time
> >> >to investiage further due to msk(4) work and still have little time.
> >:-(
> >> >
> >> >--
> >> >Regards,
> >> >Pyun YongHyeon
> >> >
> >
> >--
> >Regards,
> >Pyun YongHyeon
> >
--
Regards,
Pyun YongHyeon
-------------- next part --------------
envy24_dump0: <Envy24HT> port 0xdf00-0xdf1f,0xde00-0xde7f irq 17 at device 7.0 on pci1
envy24_dump0: E2PROM DUMP:
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C OD 0E 0F
----+-------------------------------------------------
00 | 00 01 16 0b 1c 01 42 80 30 c3 ff 00 00 ff 00 00
01 | ff 00 00 00 0c 0d 0d 0d 0c 08 00 00 00 01 02 00
-------------- next part --------------
--- envy24_dump.c.orig Tue Oct 31 16:08:59 2006
+++ envy24_dump.c Tue Oct 31 17:01:25 2006
@@ -24,25 +24,23 @@
* SUCH DAMAGE.
*/
-#include <sys/types.h>
-#include <sys/module.h>
-#include <sys/systm.h>
-#include <sys/errno.h>
#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
#include <sys/kernel.h>
-#include <sys/conf.h>
-#include <sys/uio.h>
#include <sys/malloc.h>
-#include <sys/bus.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-#include <machine/pci_cfgreg.h>
+#include <sys/module.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
#include <sys/rman.h>
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+
#include <dev/sound/pci/envy24_dump.h>
-struct envy24_dump_softc
-{
+struct envy24_dump_softc {
bus_space_tag_t bst;
bus_space_handle_t bsh;
device_t dev;
@@ -50,6 +48,18 @@
int rid;
};
+static struct envy24_product {
+ uint16_t devid;
+ const char *envy24_name;
+} envy24_products[] = {
+ { 0x1712, "Envy24" },
+ { 0x1720, "Envy24PT" },
+ { 0x1721, "Envy24HT-S" },
+ { 0x1722, "Envy24GT" },
+ { 0x1723, "Tremor" },
+ { 0x1724, "Envy24HT" }
+};
+
static u_int32_t
xrd(struct envy24_dump_softc *sc, int reg, int size)
{
@@ -87,42 +97,50 @@
u_int32_t data;
int i;
- for (i = 0; i < 1000; i++) {
+ for (i = 0; i < ENVY24_I2C_TIMEOUT; i++) {
data = xrd(sc, ENVY24_CCS13, 1);
- if ((data & 0x01) == 0)
+ if ((data & ENVY24_I2C_BUSY) == 0)
break;
DELAY(32); /* 31.25kHz */
}
- if (i == 1000) {
+ if (i == ENVY24_I2C_TIMEOUT) {
+ device_printf(sc->dev, "E2PROM read timeout\n");
return -1;
}
xwr(sc, ENVY24_CCS11, addr, 1);
xwr(sc, ENVY24_CCS10, (dev & 0xfe) | 0x00, 1);
- for (i = 0; i < 1000; i++) {
+ for (i = 0; i < ENVY24_I2C_TIMEOUT; i++) {
data = xrd(sc, ENVY24_CCS13, 1);
- if ((data & 0x01) == 0)
+ if ((data & ENVY24_I2C_BUSY) == 0)
break;
DELAY(32); /* 31.25kHz */
}
- if (i == 1000) {
+ if (i == ENVY24_I2C_TIMEOUT) {
+ device_printf(sc->dev, "E2PROM read timeout\n");
return -1;
}
data = xrd(sc, ENVY24_CCS12, 1);
-
+
return (int) data;
}
static int
envy24_dump_probe(device_t dev)
{
- char *s = NULL;
-
- if (pci_get_device(dev) == ENVY24_PCI_ID)
- s = "ENVY24";
+ struct envy24_product *ep;
+ uint16_t devid;
+ int i;
- if (s)
- device_set_desc(dev, s);
- return s? 0 : ENXIO;
+ devid = pci_get_device(dev);
+ ep = envy24_products;
+ for (i = 0; i < sizeof(envy24_products)/sizeof(envy24_products[0]);
+ i++, ep++) {
+ if (devid == ep->devid) {
+ device_set_desc(dev, ep->envy24_name);
+ return (BUS_PROBE_DEFAULT);
+ }
+ }
+ return (ENXIO);
}
static int
@@ -134,11 +152,6 @@
int k;
sc = (struct envy24_dump_softc *) device_get_softc(dev);
-
- /*if ((sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO)) == NULL) {
- device_printf(dev, "cannot allocate softc\n");
- return ENXIO;
- }*/
sc->dev = dev;
@@ -148,63 +161,31 @@
pci_write_config(dev, PCIR_COMMAND, data, 2);
sc->rid = PCIR_CCS;
- sc->res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->rid, 0, ~0, 1,
- RF_ACTIVE);
+ sc->res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &sc->rid,
+ RF_ACTIVE);
if (sc->res == NULL)
- return ENXIO;
+ return (ENXIO);
sc->bst = rman_get_bustag(sc->res);
sc->bsh = rman_get_bushandle(sc->res);
e2prom = xrd(sc, ENVY24_CCS13, 1);
- if ((e2prom & 0x80) == 0) {
+ if ((e2prom & 0x80) == 0)
device_printf(sc->dev, "E2PROM not presented\n");
- }
else {
- device_printf(sc->dev, "E2PROM DUMP:\n");
- printf(" | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C OD 0E 0F \n");
- printf("----+-------------------------------------------------\n");
- for (k = 0; k < 32; k++) {
- e2prom = envy24_dump_rdi2c(sc, 0xa0, k);
- //device_printf(sc->dev, "0x%x\n", e2prom);
- if (k == 0) printf(" 00 |");
- if (k == 16) printf("\n 01 |");
- switch (e2prom) {
- case 0:
- printf(" 00");
- break;
- case 1:
- printf(" 01");
- break;
- case 2:
- printf(" 02");
- break;
- case 3:
- printf(" 03");
- break;
- case 4:
- printf(" 04");
- break;
- case 5:
- printf(" 05");
- break;
- case 6:
- printf(" 06");
- break;
- case 7:
- printf(" 07");
- break;
- case 8:
- printf(" 08");
- break;
- case 9:
- printf(" 09");
- break;
- default:
- printf(" %x", e2prom);
- }
-
+ device_printf(sc->dev, "E2PROM DUMP:\n");
+ printf(" | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C OD 0E 0F \n");
+ printf("----+-------------------------------------------------\n");
+ for (k = 0; k < 32; k++) {
+ e2prom = envy24_dump_rdi2c(sc, 0xa0, k);
+ if (k == 0)
+ printf(" 00 |");
+ if (k == 16)
+ printf("\n 01 |");
+ printf(" %02x", e2prom);
+ }
+ printf("\n");
}
- }
- return 0;
+
+ return (0);
}
static int
@@ -214,7 +195,8 @@
sc = (struct envy24_dump_softc *) device_get_softc(dev);
bus_release_resource(dev, SYS_RES_IOPORT, sc->rid, sc->res);
- return 0;
+
+ return (0);
}
static device_method_t envy24_dump_methods[] = {
@@ -223,13 +205,13 @@
DEVMETHOD(device_attach, envy24_dump_attach),
DEVMETHOD(device_detach, envy24_dump_detach),
- {0,0}
+ {0, 0}
};
static driver_t envy24_dump_driver = {
-"envy24_dump",
-envy24_dump_methods,
-sizeof(struct envy24_dump_softc),
+ "envy24_dump",
+ envy24_dump_methods,
+ sizeof(struct envy24_dump_softc),
};
static devclass_t envy24_dump_devclass;
--- envy24_dump.h.orig Tue Oct 31 16:08:59 2006
+++ envy24_dump.h Tue Oct 31 16:53:28 2006
@@ -45,3 +45,6 @@
#define ENVY24_CCS13 0x13
#define CCS_INDEX 0x03
#define CCS_DATA 0x04
+
+#define ENVY24_I2C_TIMEOUT 1000
+#define ENVY24_I2C_BUSY 0x01
More information about the freebsd-multimedia
mailing list