Update of /cvsroot/alsa/alsa-driver/drivers
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23586/drivers

Modified Files:
        serialmidi.c 
Log Message:
- clean up module options with the new style.
- added devices option to assign multiple serial devices.
- added handshake option to enable/disable handshaking.
- reflect id to the rawmidi name.


Index: serialmidi.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/drivers/serialmidi.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- serialmidi.c        21 Jan 2004 18:24:57 -0000      1.10
+++ serialmidi.c        1 May 2004 12:11:30 -0000       1.11
@@ -27,10 +27,10 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/tty.h>
+#include <linux/moduleparam.h>
 #include <asm/uaccess.h>
 #include <sound/core.h>
 #include <sound/rawmidi.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <linux/delay.h>
 
@@ -57,28 +57,35 @@
 static int speed[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 38400}; /* 
9600,19200,38400,57600,115200 */
 static int adaptor[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 
SERIAL_ADAPTOR_SOUNDCANVAS};
 static int outs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};     /* 1 to 16 */
+static int devices[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};     /* 1 to 8 */
+static int handshake[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};     /* bool */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for serial device.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for serial device.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable serial device.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(sdev, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(sdev, charp, boot_devs, 0444);
 MODULE_PARM_DESC(sdev, "Device file string for serial device.");
 MODULE_PARM_SYNTAX(sdev, SNDRV_ID_DESC);
-MODULE_PARM(speed, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(speed, int, boot_devs, 0444);
 MODULE_PARM_DESC(speed, "Speed in bauds.");
 MODULE_PARM_SYNTAX(speed, SNDRV_ENABLED 
",allows:{9600,19200,38400,57600,115200},dialog:list");
-MODULE_PARM(adaptor, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(adaptor, int, boot_devs, 0444);
 MODULE_PARM_DESC(adaptor, "Type of adaptor.");
 MODULE_PARM_SYNTAX(adaptor, SNDRV_ENABLED 
",allows:{{0=Soundcanvas,1=MS-124T,2=MS-124W S/A,3=MS-124W M/B}},dialog:list");
-MODULE_PARM(outs, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(outs, int, boot_devs, 0444);
 MODULE_PARM_DESC(outs, "Number of MIDI outputs.");
 MODULE_PARM_SYNTAX(outs, SNDRV_ENABLED ",allows:{{1,16}},dialog:list");
+module_param_array(devices, int, boot_devs, 0444);
+MODULE_PARM_DESC(devices, "Number of devices to attach to the card.");
+module_param_array(handshake, int, boot_devs, 0444);
+MODULE_PARM_DESC(handshake, "Do handshaking.");
 
 #define SERIAL_MODE_NOT_OPENED         (0)
 #define SERIAL_MODE_BIT_INPUT          (0)
@@ -89,6 +96,7 @@
 typedef struct _snd_serialmidi {
        snd_card_t *card;
        char *sdev;                     /* serial device name (e.g. /dev/ttyS0) */
+       int dev_idx;
        unsigned int speed;             /* speed in bauds */
        unsigned int adaptor;           /* see SERIAL_ADAPTOR_ */
        unsigned long mode;             /* see SERIAL_MODE_* */
@@ -104,6 +112,7 @@
        void (*old_write_wakeup)(struct tty_struct *);
        int old_exclusive;
        int old_low_latency;
+       int handshake;
        unsigned char tx_buf[TX_BUF_SIZE];
 } serialmidi_t;
 
@@ -203,14 +212,16 @@
                break;
        }
 
-       cflag = speed | CREAD | CSIZE | CS8 | CRTSCTS | HUPCL;
-       // cflag = speed | CREAD | CSIZE | CS8 | HUPCL;
+       if (serial->handshake)
+               cflag = speed | CREAD | CSIZE | CS8 | CRTSCTS | HUPCL;
+       else
+               cflag = speed | CREAD | CSIZE | CS8 | HUPCL;
 
        switch (serial->adaptor) {
        case SERIAL_ADAPTOR_MS124W_SA:
        case SERIAL_ADAPTOR_MS124W_MB:
        case SERIAL_ADAPTOR_MS124T:
-               
+               /* TODO */
                break;
        }
        
@@ -435,11 +446,11 @@
         snd_rawmidi_t *rrawmidi;
         int err;
 
-        if ((err = snd_rawmidi_new(serial->card, "UART Serial MIDI", 0, serial->outs, 
1, &rrawmidi)) < 0)
+        if ((err = snd_rawmidi_new(serial->card, "UART Serial MIDI", serial->dev_idx, 
serial->outs, 1, &rrawmidi)) < 0)
                 return err;
         snd_rawmidi_set_ops(rrawmidi, SNDRV_RAWMIDI_STREAM_INPUT, 
&snd_serialmidi_input);
         snd_rawmidi_set_ops(rrawmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, 
&snd_serialmidi_output);
-        sprintf(rrawmidi->name, "Serial MIDI #0");
+       snprintf(rrawmidi->name, sizeof(rrawmidi->name), "%s %d", 
serial->card->shortname, serial->dev_idx);
         rrawmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT |
                                SNDRV_RAWMIDI_INFO_INPUT |
                                SNDRV_RAWMIDI_INFO_DUPLEX;
@@ -450,7 +461,8 @@
 
 static int __init snd_serialmidi_create(snd_card_t *card, const char *sdev,
                                        unsigned int speed, unsigned int adaptor,
-                                       unsigned int outs, serialmidi_t **rserial)
+                                       unsigned int outs, int idx, int hshake,
+                                       serialmidi_t **rserial)
 {
        static snd_device_ops_t ops = {
                .dev_free =     snd_serialmidi_dev_free,
@@ -483,6 +495,7 @@
 
        init_MUTEX(&serial->open_lock);
        serial->card = card;
+       serial->dev_idx = idx;
        serial->sdev = snd_kmalloc_strdup(sdev, GFP_KERNEL);
        if (serial->sdev == NULL) {
                snd_serialmidi_free(serial);
@@ -491,6 +504,7 @@
        serial->adaptor = adaptor;
        serial->speed = speed;
        serial->outs = outs;
+       serial->handshake = hshake;
        memset(serial->prev_status, 0x80, sizeof(unsigned char) * 
SNDRV_SERIAL_MAX_OUTS);
        
        /* Register device */
@@ -519,16 +533,52 @@
        if (card == NULL)
                return -ENOMEM;
        strcpy(card->driver, "Serial MIDI");
-       strcpy(card->shortname, card->driver);
-
-       if ((err = snd_serialmidi_create(card,
-                                        sdev[dev],
-                                        speed[dev],
-                                        adaptor[dev],
-                                        outs[dev],
-                                        &serial)) < 0) {
-               snd_card_free(card);
-               return err;
+       if (id[dev] && *id[dev])
+               snprintf(card->shortname, sizeof(card->shortname), "Serial MIDI %s", 
card->id);
+       else
+               strcpy(card->shortname, card->driver);
+
+       if (devices[dev] > 1) {
+               int i, start_dev;
+               char devname[32];
+               /* assign multiple devices to a single card */
+               if (devices[dev] > 8) {
+                       printk(KERN_ERR "serialmidi: invalid devices %d\n", 
devices[dev]);
+                       snd_card_free(card);
+                       return -EINVAL;
+               }
+               /* device name mangling */
+               strncpy(devname, sdev[dev], sizeof(devname));
+               devname[31] = 0;
+               i = strlen(devname);
+               if (i > 0) i--;
+               if (devname[i] >= '0' && devname[i] <= '9') {
+                       for (; i > 0; i--)
+                               if (devname[i] < '0' || devname[i] > '9') {
+                                       i++;
+                                       break;
+                               }
+                       start_dev = simple_strtol(devname + i, NULL, 0);
+                       devname[i] = 0;
+               } else
+                       start_dev = 0;
+               for (i = 0; i < devices[dev]; i++) {
+                       char devname2[33];
+                       sprintf(devname2, "%s%d", devname, start_dev + i);
+                       if ((err = snd_serialmidi_create(card, devname2, speed[dev],
+                                                        adaptor[dev], outs[dev], i,
+                                                        handshake[dev], &serial)) < 
0) {
+                               snd_card_free(card);
+                               return err;
+                       }
+               }
+       } else {
+               if ((err = snd_serialmidi_create(card, sdev[dev], speed[dev],
+                                                adaptor[dev], outs[dev], 0,
+                                                handshake[dev], &serial)) < 0) {
+                       snd_card_free(card);
+                       return err;
+               }
        }
 
        sprintf(card->longname, "%s at %s", card->shortname, sdev[dev]);
@@ -569,29 +619,3 @@
 
 module_init(alsa_card_serialmidi_init)
 module_exit(alsa_card_serialmidi_exit)
-
-#ifndef MODULE
-
-/* format is: snd-serialmidi=enable,index,id,
-                            sdev,speed,adaptor,outs */
-
-static int __init alsa_card_serialmidi_setup(char *str)
-{
-       static unsigned __initdata nr_dev = 0;
-
-       if (nr_dev >= SNDRV_CARDS)
-               return 0;
-       (void)(get_option(&str,&enable[nr_dev]) == 2 &&
-              get_option(&str,&index[nr_dev]) == 2 &&
-              get_id(&str,&id[nr_dev]) == 2 &&
-              get_id(&str,&sdev[nr_dev]) == 2 &&
-              get_option(&str,&speed[nr_dev]) == 2 &&
-              get_option(&str,&adaptor[nr_dev]) == 2 &&
-              get_option(&str,&outs[nr_dev]) == 2);
-       nr_dev++;
-       return 1;
-}
-
-__setup("snd-serialmidi=", alsa_card_serialmidi_setup);
-
-#endif /* ifndef MODULE */



-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to