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