Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Giuliano Pochini <pochini@shiny.it>
To: Thierry Vignaud <tvignaud@mandrakesoft.com>
Cc: tiwai@suse.de, alsa-devel@lists.sourceforge.net
Subject: Re: Error: firmware not found
Date: Sat, 29 Jan 2005 16:46:09 +0100	[thread overview]
Message-ID: <20050129164609.6b904957.pochini@shiny.it> (raw)
In-Reply-To: <m2pszpijzg.fsf@vador.mandrakesoft.com>

On Fri, 28 Jan 2005 17:41:55 +0100
Thierry Vignaud <tvignaud@mandrakesoft.com> wrote:

> Giuliano Pochini <pochini@denise.shiny.it> writes:
> 
> > Ok, but I don't want to keep all that duplicated code loaded when
> > only half of it is needed. I would prefer a tiny "loader" module
> > that does the same work of "modprobe snd-layla3g snd-gina3g". I'll
> > also search for other similar cases to see if someone has a better
> > idea.
> 
> look at the DVB sub-system

Well, I didn't find anything really useful there. They use the module
interface like is was a plugin loader. It does not neither save me work nor
make the driver look very good. I just finished the first attempt to solve
the problem and it works fine here, although I don't have a Layla3G to test.

It changes the Gina3G driver so it works with the Layla3G, too. I'm not very
proud of those #define hacks in gina3g.c and some details are missing, but
it's overall a simple patch. For testing only:



diff -du alsa-driver_orig/pci/echoaudio/echoaudio.c alsa-driver/pci/echoaudio/echoaudio.c
--- alsa-driver_orig/pci/echoaudio/echoaudio.c	Sat Jan 29 16:31:53 2005
+++ alsa-driver/pci/echoaudio/echoaudio.c	Sat Jan 29 16:19:29 2005
@@ -522,6 +522,9 @@
 
 static int pcm_analog_in_hw_params(snd_pcm_substream_t *substream, snd_pcm_hw_params_t *hw_params)
 {
+	echoaudio_t *chip;
+
+	chip = snd_pcm_substream_chip(substream);
 	return init_engine(substream, hw_params, PX_ANALOG_IN + substream->number, params_channels(hw_params));
 }
 
@@ -539,6 +542,9 @@
 
 static int pcm_digital_in_hw_params(snd_pcm_substream_t *substream, snd_pcm_hw_params_t *hw_params)
 {
+	echoaudio_t *chip;
+
+	chip = snd_pcm_substream_chip(substream);
 	return init_engine(substream, hw_params, PX_DIGITAL_IN + substream->number, params_channels(hw_params));
 }
 
@@ -547,6 +553,9 @@
 #ifndef ECHOCARD_HAS_VMIXER	/* See the note in snd_echo_new_pcm() */
 static int pcm_digital_out_hw_params(snd_pcm_substream_t *substream, snd_pcm_hw_params_t *hw_params)
 {
+	echoaudio_t *chip;
+
+	chip = snd_pcm_substream_chip(substream);
 	return init_engine(substream, hw_params, PX_DIGITAL_OUT + substream->number, params_channels(hw_params));
 }
 #endif /* !ECHOCARD_HAS_VMIXER */
@@ -1167,7 +1176,7 @@
 static snd_kcontrol_new_t snd_echo_monitor_mixer __devinitdata = {
 	.name = "Monitor Mixer Volume",
 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-	.count = NUM_BUSSES_IN * NUM_BUSSES_OUT,
+//	.count = NUM_BUSSES_IN * NUM_BUSSES_OUT,
 	.info = snd_echo_mixer_info,
 	.get = snd_echo_mixer_get,
 	.put = snd_echo_mixer_put,
@@ -1879,6 +1888,7 @@
 		goto ctl_error;
 
 #ifdef ECHOCARD_HAS_MONITOR
+	snd_echo_monitor_mixer.count = NUM_BUSSES_IN * NUM_BUSSES_OUT;
 	if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_monitor_mixer, chip))) < 0)
 		goto ctl_error;
 #endif
@@ -1921,8 +1931,9 @@
 #endif
 
 #ifdef ECHOCARD_HAS_PHANTOM_POWER
-	if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_phantom_power_switch, chip))) < 0)
-		goto ctl_error;
+	if (chip->has_phantom_power)
+		if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_phantom_power_switch, chip))) < 0)
+			goto ctl_error;
 #endif
 
 	if ((err = snd_card_register(card)) < 0) {
diff -du alsa-driver_orig/pci/echoaudio/echoaudio.h alsa-driver/pci/echoaudio/echoaudio.h
--- alsa-driver_orig/pci/echoaudio/echoaudio.h	Sat Jan 29 16:31:53 2005
+++ alsa-driver/pci/echoaudio/echoaudio.h	Sat Jan 29 16:14:33 2005
@@ -356,6 +356,7 @@
 	struct resource *iores;
 	struct snd_dma_buffer commpage_dma_buf;
 	int irq;
+	u8 px_digital_out, px_analog_in, px_digital_in, px_num;
 #ifdef ECHOCARD_HAS_MIDI
 	snd_rawmidi_t *rmidi;
 	snd_rawmidi_substream_t *midi_in, *midi_out;
@@ -376,6 +377,7 @@
 	u8 clock_state;				/* Gina20, Darla20, Darla24 - only */
 	u8 input_clock;				/* Currently selected sample clock source */
 	u8 output_clock;			/* Layla20 only */
+	u8 e3g_box_type;			/* The loaded fw supports this box type */
 
 	unsigned int meters_enabled : 1;	/* VU-meters status */
 	unsigned int asic_loaded : 1;		/* Set TRUE when ASIC loaded */
@@ -386,6 +388,7 @@
 	unsigned int phantom_power : 1;		/* Gina3G - only */
 	unsigned int has_midi : 1;
 	unsigned int midi_input_enabled : 1;
+	unsigned int has_phantom_power : 1;
 
 	char nominal_level[ECHO_MAXAUDIOPIPES];	/* True == -10dBV  False == +4dBu */
 	s8 input_gain[ECHO_MAXAUDIOINPUTS];	/* Input level -50..+50 unit is 0.5dB */
diff -du alsa-driver_orig/pci/echoaudio/echoaudio_3g.c alsa-driver/pci/echoaudio/echoaudio_3g.c
--- alsa-driver_orig/pci/echoaudio/echoaudio_3g.c	Sat Jan 29 16:31:53 2005
+++ alsa-driver/pci/echoaudio/echoaudio_3g.c	Sat Jan 29 16:21:05 2005
@@ -31,7 +31,11 @@
 
 /* These functions are common for all "3G" cards */
 
-
+/* Check if the card is alive. Returns
+-Esomething	if it's not
+0		if it is working fine
+box_type+1	if it's ok, but we must replace the firmware
+*/
 static int check_asic_status(echoaudio_t *chip)
 {
 	u32 box_status;
@@ -58,10 +62,10 @@
 		return -ENODEV;
 	}
 
-	box_type = box_status & E3G_BOX_TYPE_MASK;
-	if (box_type != ECHOCARD_BOX) {
+	box_type = (box_status & E3G_BOX_TYPE_MASK) + 1;
+	if (box_type != chip->e3g_box_type) {
 		DE_INIT(("check_asic_status: wrong box type: %x\n", box_type));
-		return -ENODEV;
+		return box_type;
 	}
 
 	chip->asic_loaded = TRUE;
diff -du alsa-driver_orig/pci/echoaudio/echoaudio_dsp.c alsa-driver/pci/echoaudio/echoaudio_dsp.c
--- alsa-driver_orig/pci/echoaudio/echoaudio_dsp.c	Sat Jan 29 16:31:53 2005
+++ alsa-driver/pci/echoaudio/echoaudio_dsp.c	Sat Jan 29 15:37:38 2005
@@ -545,8 +545,9 @@
 	if (err < 0)
 		return err;
 
-	/* Load the ASIC if the DSP load succeeded */
-	if ((err = load_asic(chip)) < 0)
+	/* Load the ASIC if the DSP load succeeded. >0 means it did not fail
+	but we cannot continue (eg. we loaded the wrong firmware) */
+	if ((err = load_asic(chip)) != 0)
 		return err;
 
 	return restore_dsp_rettings(chip);
diff -du alsa-driver_orig/pci/echoaudio/echoaudio_dsp.h alsa-driver/pci/echoaudio/echoaudio_dsp.h
--- alsa-driver_orig/pci/echoaudio/echoaudio_dsp.h	Sat Jan 29 16:31:53 2005
+++ alsa-driver/pci/echoaudio/echoaudio_dsp.h	Sat Jan 29 15:37:38 2005
@@ -560,8 +560,8 @@
 #define E3G_FREQ_REG_MAX		0xffff
 
 // 3G external box types
-#define E3G_GINA3G			0x00
-#define E3G_LAYLA3G			0x10
+#define E3G_GINA3G_BOX_TYPE		0x00
+#define E3G_LAYLA3G_BOX_TYPE		0x10
 #define E3G_ASIC_NOT_LOADED		0xffff
 #define E3G_BOX_TYPE_MASK		0xf0
 
diff -du alsa-driver_orig/pci/echoaudio/gina3g.c alsa-driver/pci/echoaudio/gina3g.c
--- alsa-driver_orig/pci/echoaudio/gina3g.c	Sat Jan 29 16:31:53 2005
+++ alsa-driver/pci/echoaudio/gina3g.c	Sat Jan 29 16:14:34 2005
@@ -18,7 +18,7 @@
 
 #define ECHO3G_FAMILY
 #define ECHOCARD_GINA3G
-#define ECHOCARD_NAME "Gina3G"
+#define ECHOCARD_NAME "Echo3G"
 #define ECHOCARD_HAS_MONITOR
 #define ECHOCARD_HAS_ASIC
 #define ECHOCARD_HAS_INPUT_NOMINAL_LEVEL
@@ -34,19 +34,18 @@
 #define ECHOCARD_BOX	E3G_GINA3G
 
 /* Pipe indexes */
-#define PX_ANALOG_OUT	0	/* 6 */
-#define PX_DIGITAL_OUT	6	/* 8 */
-#define PX_ANALOG_IN	14	/* 2 */
-#define PX_DIGITAL_IN	16	/* 8 */
-#define PX_NUM		24
+#define PX_ANALOG_OUT	0
+#define PX_DIGITAL_OUT	(chip->px_digital_out)
+#define PX_ANALOG_IN	(chip->px_analog_in)
+#define PX_DIGITAL_IN	(chip->px_digital_in)
+#define PX_NUM		(chip->px_num)
 
 /* Bus indexes */
-#define BX_ANALOG_OUT	0	/* 6 */
-#define BX_DIGITAL_OUT	6	/* 8 */
-#define BX_ANALOG_IN	14	/* 2 */
-#define BX_DIGITAL_IN	16	/* 8 */
-#define BX_NUM		24
-
+#define BX_ANALOG_OUT	PX_ANALOG_OUT
+#define BX_DIGITAL_OUT	PX_DIGITAL_OUT
+#define BX_ANALOG_IN	PX_ANALOG_IN
+#define BX_DIGITAL_IN	PX_DIGITAL_IN
+#define BX_NUM		PX_NUM
 
 /* Number of channels */
 #define NUM_PIPES		PX_NUM
@@ -82,11 +81,13 @@
 
 #define FW_361_LOADER	0
 #define FW_GINA3G_DSP	1
-#define FW_3G_ASIC	2
+#define FW_ECHO3G_DSP	2
+#define FW_3G_ASIC	3
 
 static const struct firmware card_fw[] = {
 	{0, "loader_dsp.fw"},
 	{0, "gina3g_dsp.fw"},
+	{0, "echo3g_dsp.fw"},
 	{0, "3g_asic.fw"}
 };
 
diff -du alsa-driver_orig/pci/echoaudio/gina3g_dsp.c alsa-driver/pci/echoaudio/gina3g_dsp.c
--- alsa-driver_orig/pci/echoaudio/gina3g_dsp.c	Sat Jan 29 16:31:53 2005
+++ alsa-driver/pci/echoaudio/gina3g_dsp.c	Sat Jan 29 16:23:01 2005
@@ -57,20 +57,52 @@
 	chip->subdevice_id = subdevice_id;
 	chip->bad_board = TRUE;
 	chip->has_midi = TRUE;
-	chip->dsp_code_to_load = &card_fw[FW_GINA3G_DSP];
+	chip->dsp_code_to_load = &card_fw[FW_ECHO3G_DSP];
 	chip->input_clock_types =	ECHO_CLOCK_BIT_INTERNAL |
 					ECHO_CLOCK_BIT_SPDIF |
-					ECHO_CLOCK_BIT_ADAT;
+					ECHO_CLOCK_BIT_ADAT |
+					ECHO_CLOCK_BIT_WORD;
 	chip->digital_modes =	ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
 				ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
 				ECHOCAPS_HAS_DIGITAL_MODE_ADAT;
+	chip->e3g_box_type = E3G_LAYLA3G_BOX_TYPE + 1;
+	chip->px_digital_out = 8;
+	chip->px_analog_in = 16;
+	chip->px_digital_in = 24;
+	chip->px_num = 32;
+	chip->has_phantom_power = 1;
 	chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
 	chip->professional_spdif = FALSE;
 	chip->non_audio_spdif = FALSE;
 
 	/* Load the DSP and the ASIC on the PCI card */
-	if ((err = load_firmware(chip)) < 0)
-		return err;
+	err = load_firmware(chip);
+
+	if (err < 0) {
+		return err;		/* Something went wrong */
+	} else if (err == E3G_GINA3G_BOX_TYPE + 1) {
+		/* The card was initialized successfully, but we loaded the
+		wrong firmware because this is not a Layla3G. Let's load
+		the right one. */
+
+		chip->dsp_code_to_load = &card_fw[FW_GINA3G_DSP];
+		chip->input_clock_types =	ECHO_CLOCK_BIT_INTERNAL |
+						ECHO_CLOCK_BIT_SPDIF |
+						ECHO_CLOCK_BIT_ADAT;
+		chip->e3g_box_type = E3G_GINA3G_BOX_TYPE + 1;
+		chip->px_digital_out = 6;
+		chip->px_analog_in = 14;
+		chip->px_digital_in = 16;
+		chip->px_num = 24;
+		chip->has_phantom_power = 0;
+
+		/* Re-load the DSP and the ASIC codes */
+		chip->dsp_code = 0;
+		if ((err = load_firmware(chip))
+			return err;		/* Something went wrong */
+	} else if (err > 0) {
+		return -ENODEV;			/* Unknown external box */
+	}
 
 	chip->bad_board = FALSE;
 



--
Giuliano.


-------------------------------------------------------
This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting
Tool for open source databases. Create drag-&-drop reports. Save time
by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc.
Download a FREE copy at http://www.intelliview.com/go/osdn_nl

      parent reply	other threads:[~2005-01-29 15:46 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-01-22 10:37 Error: firmware not found Giuliano Pochini
2005-01-23  2:37 ` Fernando Lopez-Lezcano
2005-01-24  8:41   ` Giuliano Pochini
2005-01-24 10:06   ` Takashi Iwai
2005-01-24 21:55     ` Fernando Lopez-Lezcano
2005-01-24 11:43 ` Thierry Vignaud
2005-01-24 11:44   ` Thierry Vignaud
2005-01-25  8:15     ` Giuliano Pochini
2005-01-25  8:22   ` Giuliano Pochini
2005-01-24 11:52 ` Thierry Vignaud
2005-01-25  8:32   ` Giuliano Pochini
2005-01-25 13:19     ` Thierry Vignaud
2005-01-25 13:57       ` Giuliano Pochini
2005-01-25 15:06     ` Takashi Iwai
2005-01-25 15:35       ` Giuliano Pochini
2005-01-25 15:39         ` Takashi Iwai
2005-01-26 17:29           ` Giuliano Pochini
2005-01-27 10:10             ` Takashi Iwai
2005-01-28 16:34               ` Giuliano Pochini
2005-01-28 16:41                 ` Thierry Vignaud
2005-01-28 16:43                   ` Giuliano Pochini
2005-01-29 15:46                   ` Giuliano Pochini [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050129164609.6b904957.pochini@shiny.it \
    --to=pochini@shiny.it \
    --cc=alsa-devel@lists.sourceforge.net \
    --cc=tiwai@suse.de \
    --cc=tvignaud@mandrakesoft.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox