Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Aug 2000 08:48:27 +0900
From:      haro@tk.kubota.co.jp (Munehiro Matsuda)
To:        joseph.scott@owp.csus.edu, taku@cent.saitama-u.ac.jp
Cc:        julian@elischer.org, abc@bsdi.com, abial@webgiro.com, gandalf@vilnya.demon.co.uk, freebsd-hackers@FreeBSD.ORG
Subject:   Maestro2E patch (Was: US$100 prize for adding ESS Audiodrive support to pcm)
Message-ID:  <20000811084827Y.haro@tk.kubota.co.jp>
In-Reply-To: <39902AC7.CB39BCD8@owp.csus.edu>
References:  <20000805155806.A94702@diskfarm.firehouse.net> <398F3081.167EB0E7@elischer.org> <39902AC7.CB39BCD8@owp.csus.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
----Next_Part(Fri_Aug_11_08:47:09_2000_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi all, 

From: Joseph Scott <joseph.scott@owp.csus.edu>
Date: Tue, 08 Aug 2000 08:44:08 -0700
::> > > On a simmilar note: what about a driver for ESS Maestro 2E? I'm certainly
::> [...]
::> > Add $100 from me.  There is one that works for some folks out there
::> > by <taku@cent.saitama-u.ac.jp>, but it does not work for me.
::> 
::> where do you find this?
::
::	I'm not sure about Alan, but I got it from an email from Taku
::YAMAMOTO <taku@cent.saitama-u.ac.jp>.  I've included the email below. 
::One thing to note, myself and a few others have only been able to get
::sound to work out of the audio out jack.  For some reason the internal
::speakers just don't work.  I've played with the settings on the
::notebook quite a bit, and they do still work when I boot into
::Windows.  However, sound, even without the internal speakers, is
::better than no sound at all :-)

I have created a patch that trys to enable internal speakers.

It worked for me (NEC VersaProNX VA26D), but I'm not sure if it works
for everybody. Patch is based on Linux driver, but simplified.

If it does not work, 1) try setting GPIO values to what your PC is at
when rebooting from Windows, 2) try original way the Linux driver do.
Let me know, if you want to know what Linux driver does.

The patch is based on Taku YAMAMOTO's maestro driver found at:
http://access.cent.saitama-u.ac.jp/~taku/freebsd/maestro/releng4-20000725.tar.gz

FYI, I also was writing Maestro2E driver myself, but I stopped. 
Because YAMAMOTO-san's driver works better than mine. :-)

Thank you,
 Haro
=------------------------------------------------------------------------------
           _ _    Munehiro (haro) Matsuda
 -|- /_\  |_|_|   Business Incubation Dept., Kubota Corp.
 /|\ |_|  |_|_|   1-3 Nihonbashi-Muromachi 3-Chome
                  Chuo-ku Tokyo 103-8310, Japan
                  Tel: +81-3-3245-3318  Fax: +81-3-3245-3315
                  Email: haro@kubota.co.jp

----Next_Part(Fri_Aug_11_08:47:09_2000_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="mstr2_spr.patch"

--- maestro.c.org	Fri Aug 11 08:23:46 2000
+++ maestro.c	Fri Aug 11 08:27:06 2000
@@ -50,6 +50,9 @@
 #define MAESTRO_2_PCI_ID	0x1968125d
 #define MAESTRO_2E_PCI_ID	0x1978125d
 
+#define NEC_SUBID1	0x80581033	/* Taken from Linux driver */
+#define NEC_SUBID2	0x803c1033	/* NEC VersaProNX VA26D    */
+
 #define AGG_MAXPLAYCH	4
 #define AGG_BUFSIZ	(8 << 10)
 
@@ -87,6 +90,8 @@
 	unsigned		playchns, active;
 	struct agg_chinfo	pch[AGG_MAXPLAYCH];
 	struct agg_chinfo	rch;
+
+	u_int32_t		subid;
 };
 
 
@@ -95,8 +100,8 @@
 
 static void	 set_timer(struct agg_info*);
 
-static u_int32_t agg_rdcodec(struct agg_info*, int);
-static void	 agg_wrcodec(struct agg_info*, int, u_int32_t);
+static u_int32_t agg_rdcodec(void *, int);
+static void	 agg_wrcodec(void *, int, u_int32_t);
 
 static inline void	 ringbus_setdest(struct agg_info*, int, int);
 
@@ -117,9 +122,9 @@
 
 static void	 agg_init(struct agg_info*);
 static void	 agg_deinit(struct agg_info*);
-static u_int32_t agg_ac97_init(struct agg_info*);
+static u_int32_t agg_ac97_init(void *);
 
-static void			agg_intr(struct agg_info*);
+static void			agg_intr(void *);
 static pcmchan_init_t		aggch_init;
 static pcmchan_setdir_t		aggch_setdir;
 static pcmchan_setformat_t	aggch_setplayformat;
@@ -143,8 +148,9 @@
 /* Codec/Ringbus */
 
 static u_int32_t
-agg_rdcodec(struct agg_info *ess, int regno)
+agg_rdcodec(void *s, int regno)
 {
+	struct agg_info *ess = (struct agg_info *)s;
 	unsigned t;
 
 	/* We have to wait for a SAFE time to write addr/data */
@@ -178,8 +184,9 @@
 }
 
 static void
-agg_wrcodec(struct agg_info *ess, int regno, u_int32_t data)
+agg_wrcodec(void *s, int regno, u_int32_t data)
 {
+	struct agg_info *ess = (struct agg_info *)s;
 	unsigned t;
 
 	/* We have to wait for a SAFE time to write addr/data */
@@ -351,6 +358,32 @@
 	    | WAVCACHE_WAVETABLE_SIZE_2MB);
 	wp_wrreg(ess, WPREG_BASE, 0x8500);
 	wp_wrreg(ess, WPREG_TIMER_ENABLE, 1);
+
+        /*
+         * Setup GPIO.
+         * There seems to be speciality with NEC systems.
+         */
+	switch (ess->subid) {
+        case NEC_SUBID1:
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_MASK, 0x09ff);
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_DIR,
+		    bus_space_read_2(ess->st, ess->sh, PORT_GPIO_DIR)| 0x600);
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_DATA, 0x0209);
+		break;
+	case NEC_SUBID2:
+		/* For VersaProNX VA26D */
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_MASK, 0x09e4);
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_DIR, 0x061b);
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_DATA, 0x03ef);
+		break;
+	default:
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_MASK,
+		   bus_space_read_2(ess->st, ess->sh, PORT_GPIO_MASK) & 0xfffe);
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_DIR,
+		   bus_space_read_2(ess->st, ess->sh, PORT_GPIO_DIR) | 0x11);
+		bus_space_write_2(ess->st, ess->sh, PORT_GPIO_DATA,
+		   bus_space_read_2(ess->st, ess->sh, PORT_GPIO_DATA) | 0x01);
+	}
 }
 
 static void
@@ -371,8 +404,9 @@
 }
 
 static u_int32_t
-agg_ac97_init(struct agg_info *ess)
+agg_ac97_init(void *s)
 {
+	struct agg_info *ess = (struct agg_info *)s;
 	u_int32_t	data;
 
 	data = bus_space_read_4(ess->st, ess->sh, PORT_RINGBUS_CTRL);
@@ -391,8 +425,9 @@
 }
 
 static void
-agg_intr(struct agg_info* ess)
+agg_intr(void *s)
 {
+	struct agg_info *ess = (struct agg_info *)s;
 	u_int16_t status;
 	int i;
 
@@ -745,7 +780,7 @@
 	struct agg_info	*ess = NULL;
 	u_int32_t	data;
 	int	mapped = 0;
-	int	regid = PCI_MAP_REG_START;
+	int	regid = PCIR_MAPS;
 	struct resource	*reg = NULL;
 	struct ac97_info	*codec = NULL;
 	int	irqid = 0;
@@ -793,6 +828,8 @@
 		device_printf(dev, "unable to map register space\n");
 		goto bad;
 	}
+
+        ess->subid = pci_read_config(dev, PCIR_SUBVEND_0, 4);
 
 	agg_init(ess);
 	codec = ac97_create(dev, ess, agg_ac97_init, agg_rdcodec, agg_wrcodec);
--- maestro_reg.h.org	Fri Aug 11 08:23:58 2000
+++ maestro_reg.h	Fri Aug 11 08:23:15 2000
@@ -144,6 +144,11 @@
 #define RINGBUS_DEST_DSOUND_IN	4
 #define RINGBUS_DEST_ASSP_IN	5
 
+/* GPIO control */
+#define PORT_GPIO_DATA		0x60	/* WORD RW */
+#define PORT_GPIO_MASK		0x64	/* WORD RW */
+#define PORT_GPIO_DIR		0x68	/* WORD RW */
+
 
 /* -----------------------------
  * Wave Processor Indexed Data Registers.

----Next_Part(Fri_Aug_11_08:47:09_2000_809)----


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000811084827Y.haro>