This set of patches:

     * fixes a problem with initialization when firmware was
         already loaded (we ended up with random channel counts)
     * adds the snd_line_outs_monitor option
          - if enabled, all input and playback streams are
            routed with unity gain to the line outs
     * adds the snd_force_firmware option
          - if enabled, I/O box firmware is reloaded whether
            its already loaded or not

There are also a couple of minor corrections.

The driver/hardware still suffers from a problem that requires 1 warm
reboot (or PCMCIA card eject/reinsert) after a cold boot to get output
working. I am continuing to work on a solution to the problem.

--p

Index: digiface_firmware.dat
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/rme9652/digiface_firmware.dat,v
retrieving revision 1.3
diff -u -u -r1.3 digiface_firmware.dat
--- digiface_firmware.dat       24 May 2002 16:29:20 -0000      1.3
+++ digiface_firmware.dat       13 Jul 2002 16:54:22 -0000
@@ -1,5 +1,5 @@
 /* stored in little-endian */
-static u32 digiface_firmware[97652] __devinitdata = {
+static u32 digiface_firmware[24413] __devinitdata = {
 0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000,
 0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000,
 0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a,
Index: hdsp.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/rme9652/hdsp.c,v
retrieving revision 1.7
diff -u -u -r1.7 hdsp.c
--- hdsp.c      19 Jun 2002 14:21:52 -0000      1.7
+++ hdsp.c      13 Jul 2002 16:54:29 -0000
@@ -42,6 +42,8 @@
 static char *snd_id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;  /* ID for this card */
 static int snd_enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
 static int snd_precise_ptr[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* Enable 
precise pointer */
+static int snd_line_outs_monitor[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0}; /* 
+Send all inputs/playback to line outs */
+static int snd_force_firmware[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0}; /* Force 
+firmware reload */
 
 MODULE_PARM(snd_index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(snd_index, "Index value for RME Hammerfall DSP interface.");
@@ -55,8 +57,14 @@
 MODULE_PARM(snd_precise_ptr, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(snd_precise_ptr, "Enable precise pointer (doesn't work reliably).");
 MODULE_PARM_SYNTAX(snd_precise_ptr, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
+MODULE_PARM(snd_line_outs_monitor,"1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(snd_line_outs_monitor, "Send all input and playback streams to line 
+outs by default.");
+MODULE_PARM_SYNTAX(snd_line_outs_monitor, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
+MODULE_PARM(snd_force_firmware,"1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(snd_force_firmware, "Force a reload of the I/O box firmware");
+MODULE_PARM_SYNTAX(snd_force_firmware, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 MODULE_AUTHOR("Paul Davis <[EMAIL PROTECTED]>");
-MODULE_DESCRIPTION("RME Hammerfall DDSP");
+MODULE_DESCRIPTION("RME Hammerfall DSP");
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
 MODULE_DEVICES("{{RME,Hammerfall-DSP},");
@@ -2190,6 +2198,25 @@
        for (i = 0; i < 2048; i++)
                hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN);
 
+       if (snd_line_outs_monitor[hdsp->dev]) {
+               
+               snd_printk ("sending all inputs and playback streams to line outs.\n");
+
+               /* route all inputs to the line outs for easy monitoring. send
+                  odd numbered channels to right, even to left.
+               */
+               
+               for (i = 0; i < HDSP_MAX_CHANNELS; i++) {
+                       if (i & 1) { 
+                               hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY (i, 26), 
+UNITY_GAIN);
+                               hdsp_write_gain (hdsp, PLAYBACK_TO_OUTPUT_KEY (i, 26), 
+UNITY_GAIN);
+                       } else {
+                               hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY (i, 27), 
+UNITY_GAIN);
+                               hdsp_write_gain (hdsp, PLAYBACK_TO_OUTPUT_KEY (i, 27), 
+UNITY_GAIN);
+                       }
+               }
+       }
+
        hdsp->passthru = 0;
 
        /* set a default rate so that the channel map is set up.
@@ -2812,7 +2839,6 @@
 static int __devinit snd_hdsp_initialize_firmware (hdsp_t *hdsp)
 {
        int i;
-       int status_reg;
        u32 *firmware_ptr;
 
        if (hdsp_check_for_iobox (hdsp)) {
@@ -2830,52 +2856,33 @@
                hdsp_write (hdsp, HDSP_outputEnable + (4 * i), 1);
        }
 
-       status_reg = hdsp_read (hdsp, HDSP_statusRegister);
+       if (snd_force_firmware[hdsp->dev] || (hdsp_read (hdsp, HDSP_statusRegister) & 
+HDSP_DllError) != 0) {
 
-       if ((status_reg & HDSP_DllError) == 0) {
-
-               /* i/o box is connected, firmware already loaded */
-
-               if (hdsp_read (hdsp, HDSP_status2Register) & HDSP_version1) {
-                       hdsp->type = Multiface;
-                       hdsp->card_name = "RME Hammerfall DSP (Multiface)";
-                       hdsp->ss_channels = MULTIFACE_SS_CHANNELS;
-                       hdsp->ds_channels = MULTIFACE_DS_CHANNELS;
-               } else {
-                       hdsp->type = Digiface;
-                       hdsp->card_name = "RME Hammerfall DSP (Digiface)";
-                       hdsp->ss_channels = DIGIFACE_SS_CHANNELS;
-                       hdsp->ds_channels = DIGIFACE_DS_CHANNELS;
-               }
-
-       } else {
+               snd_printk ("loading firmware\n");
 
-               /* firmware not loaded, but i/o box is connected */
-               
                hdsp_write (hdsp, HDSP_jtagReg, HDSP_PROGRAM);
                hdsp_write (hdsp, HDSP_fifoData, 0);
-               hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT);
+               if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) {
+                       snd_printk ("timeout waiting for firmware setup\n");
+                       return -EIO;
+               }
 
                hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
                hdsp_write (hdsp, HDSP_fifoData, 0);
 
-               if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) {
-                       printk ("looks like a multiface\n");
+               if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT)) {
                        hdsp->type = Multiface;
-                       hdsp->card_name = "RME Hammerfall DSP (Multiface)";
                        hdsp_write (hdsp, HDSP_jtagReg, HDSP_VERSION_BIT);
                        hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
                        hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT);
                } else {
-                       printk ("looks like a digiface\n");
                        hdsp->type = Digiface;
-                       hdsp->card_name = "RME Hammerfall DSP (Digiface)";
                } 
 
                hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_PROGRAM);
                hdsp_write (hdsp, HDSP_fifoData, 0);
                
-               if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT) < 0) {
+               if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
                        snd_printk ("timeout waiting for download preparation\n");
                        return -EIO;
                }
@@ -2883,9 +2890,9 @@
                hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
                
                if (hdsp->type == Digiface) {
-                       firmware_ptr = digiface_firmware;
+                       firmware_ptr = (u32 *) digiface_firmware;
                } else {
-                       firmware_ptr = multiface_firmware;
+                       firmware_ptr = (u32 *) multiface_firmware;
                }
                
                for (i = 0; i < 24413; ++i) {
@@ -2901,8 +2908,30 @@
                        return -EIO;
                }
 
+       } else {
+
+               /* firmware already loaded, but we need to know what type
+                  of I/O box is connected.
+               */
+
+               if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) {
+                       hdsp->type = Multiface;
+               } else {
+                       hdsp->type = Digiface;
+               }
        }
 
+       if (hdsp->type == Digiface) {
+               snd_printk ("I/O Box is a Digiface\n");
+               hdsp->card_name = "RME Hammerfall DSP (Digiface)";
+               hdsp->ss_channels = DIGIFACE_SS_CHANNELS;
+               hdsp->ds_channels = DIGIFACE_DS_CHANNELS;
+       } else {
+               snd_printk ("I/O Box is a Multiface\n");
+               hdsp->card_name = "RME Hammerfall DSP (Multiface)";
+               hdsp->ss_channels = MULTIFACE_SS_CHANNELS;
+               hdsp->ds_channels = MULTIFACE_DS_CHANNELS;
+       }
        
        snd_hdsp_flush_midi_input (hdsp, 0);
        snd_hdsp_flush_midi_input (hdsp, 1);
Index: multiface_firmware.dat
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/rme9652/multiface_firmware.dat,v
retrieving revision 1.2
diff -u -u -r1.2 multiface_firmware.dat
--- multiface_firmware.dat      24 May 2002 16:29:20 -0000      1.2
+++ multiface_firmware.dat      13 Jul 2002 16:55:05 -0000
@@ -1,5 +1,5 @@
 /* stored in little-endian */
-static u32 multiface_firmware[97652] __devinitdata = {
+static u32 multiface_firmware[24413] __devinitdata = {
 0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000,
 0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000,
 0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a,


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to