4 * A low level driver for Yamaha YM3812 and OPL-3 -chips
7 * Copyright (C) by Hannu Savolainen 1993-1997
9 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
10 * Version 2 (June 1991). See the "COPYING" file distributed with this software
15 * Thomas Sailer ioctl code reworked (vmalloc/vfree removed)
16 * Alan Cox modularisation, fixed sound_mem allocs.
17 * Christoph Hellwig Adapted to module_init/module_exit
18 * Arnaldo C. de Melo get rid of check_region, use request_region for
19 * OPL4, release it on exit, some cleanups.
22 * Believed to work. Badly needs rewriting a bit to support multiple
26 #include <linux/init.h>
27 #include <linux/slab.h>
28 #include <linux/module.h>
29 #include <linux/delay.h>
32 * Major improvements to the FM handling 30AUG92 by Rob Hooft,
36 #include "sound_config.h"
45 unsigned char keyon_byte
;
48 unsigned long orig_freq
;
49 unsigned long current_freq
;
52 int panning
; /* 0xffff means not set */
58 int left_io
, right_io
;
60 int lv_map
[MAX_VOICE
];
62 struct voice_info voc
[MAX_VOICE
];
63 struct voice_alloc_info
*v_alloc
;
64 struct channel_info
*chn_info
;
66 struct sbi_instrument i_map
[SBFM_MAXINSTR
];
67 struct sbi_instrument
*act_i
[MAX_VOICE
];
69 struct synth_info fm_info
;
78 static struct opl_devinfo
*devc
= NULL
;
80 static int detected_model
;
82 static int store_instr(int instr_no
, struct sbi_instrument
*instr
);
83 static void freq_to_fnum(int freq
, int *block
, int *fnum
);
84 static void opl3_command(int io_addr
, unsigned int addr
, unsigned int val
);
85 static int opl3_kill_note(int dev
, int voice
, int note
, int velocity
);
87 static void enter_4op_mode(void)
90 static int v4op
[MAX_VOICE
] = {
91 0, 1, 2, 9, 10, 11, 6, 7, 8, 15, 16, 17
94 devc
->cmask
= 0x3f; /* Connect all possible 4 OP voice operators */
95 opl3_command(devc
->right_io
, CONNECTION_SELECT_REGISTER
, 0x3f);
97 for (i
= 0; i
< 3; i
++)
98 pv_map
[i
].voice_mode
= 4;
99 for (i
= 3; i
< 6; i
++)
100 pv_map
[i
].voice_mode
= 0;
102 for (i
= 9; i
< 12; i
++)
103 pv_map
[i
].voice_mode
= 4;
104 for (i
= 12; i
< 15; i
++)
105 pv_map
[i
].voice_mode
= 0;
107 for (i
= 0; i
< 12; i
++)
108 devc
->lv_map
[i
] = v4op
[i
];
109 devc
->v_alloc
->max_voice
= devc
->nr_voice
= 12;
112 static int opl3_ioctl(int dev
, unsigned int cmd
, void __user
* arg
)
114 struct sbi_instrument ins
;
117 case SNDCTL_FM_LOAD_INSTR
:
118 printk(KERN_WARNING
"Warning: Obsolete ioctl(SNDCTL_FM_LOAD_INSTR) used. Fix the program.\n");
119 if (copy_from_user(&ins
, arg
, sizeof(ins
)))
121 if (ins
.channel
< 0 || ins
.channel
>= SBFM_MAXINSTR
) {
122 printk(KERN_WARNING
"FM Error: Invalid instrument number %d\n", ins
.channel
);
125 return store_instr(ins
.channel
, &ins
);
127 case SNDCTL_SYNTH_INFO
:
128 devc
->fm_info
.nr_voices
= (devc
->nr_voice
== 12) ? 6 : devc
->nr_voice
;
129 if (copy_to_user(arg
, &devc
->fm_info
, sizeof(devc
->fm_info
)))
133 case SNDCTL_SYNTH_MEMAVL
:
136 case SNDCTL_FM_4OP_ENABLE
:
137 if (devc
->model
== 2)
146 static int opl3_detect(int ioaddr
)
149 * This function returns 1 if the FM chip is present at the given I/O port
150 * The detection algorithm plays with the timer built in the FM chip and
151 * looks for a change in the status register.
153 * Note! The timers of the FM chip are not connected to AdLib (and compatible)
156 * Note2! The chip is initialized if detected.
159 unsigned char stat1
, signature
;
164 printk(KERN_ERR
"opl3: Only one OPL3 supported.\n");
168 devc
= kzalloc(sizeof(*devc
), GFP_KERNEL
);
172 printk(KERN_ERR
"opl3: Can't allocate memory for the device control "
177 strcpy(devc
->fm_info
.name
, "OPL2");
179 if (!request_region(ioaddr
, 4, devc
->fm_info
.name
)) {
180 printk(KERN_WARNING
"opl3: I/O port 0x%x already in use\n", ioaddr
);
186 /* Reset timers 1 and 2 */
187 opl3_command(ioaddr
, TIMER_CONTROL_REGISTER
, TIMER1_MASK
| TIMER2_MASK
);
189 /* Reset the IRQ of the FM chip */
190 opl3_command(ioaddr
, TIMER_CONTROL_REGISTER
, IRQ_RESET
);
192 signature
= stat1
= inb(ioaddr
); /* Status register */
194 if (signature
!= 0x00 && signature
!= 0x06 && signature
!= 0x02 &&
197 MDB(printk(KERN_INFO
"OPL3 not detected %x\n", signature
));
201 if (signature
== 0x06) /* OPL2 */
205 else if (signature
== 0x00 || signature
== 0x0f) /* OPL3 or OPL4 */
212 * Detect availability of OPL4 (_experimental_). Works probably
213 * only after a cold boot. In addition the OPL4 port
214 * of the chip may not be connected to the PC bus at all.
217 opl3_command(ioaddr
+ 2, OPL3_MODE_REGISTER
, 0x00);
218 opl3_command(ioaddr
+ 2, OPL3_MODE_REGISTER
, OPL3_ENABLE
| OPL4_ENABLE
);
220 if ((tmp
= inb(ioaddr
)) == 0x02) /* Have a OPL4 */
225 if (request_region(ioaddr
- 8, 2, "OPL4")) /* OPL4 port was free */
229 outb((0x02), ioaddr
- 8); /* Select OPL4 ID register */
231 tmp
= inb(ioaddr
- 7); /* Read it */
234 if (tmp
== 0x20) /* OPL4 should return 0x20 here */
237 outb((0xF8), ioaddr
- 8); /* Select OPL4 FM mixer control */
239 outb((0x1B), ioaddr
- 7); /* Write value */
243 { /* release OPL4 port */
244 release_region(ioaddr
- 8, 2);
248 opl3_command(ioaddr
+ 2, OPL3_MODE_REGISTER
, 0);
250 for (i
= 0; i
< 9; i
++)
251 opl3_command(ioaddr
, KEYON_BLOCK
+ i
, 0); /*
255 opl3_command(ioaddr
, TEST_REGISTER
, ENABLE_WAVE_SELECT
);
256 opl3_command(ioaddr
, PERCOSSION_REGISTER
, 0x00); /*
261 release_region(ioaddr
, 4);
268 static int opl3_kill_note (int devno
, int voice
, int note
, int velocity
)
270 struct physical_voice_info
*map
;
272 if (voice
< 0 || voice
>= devc
->nr_voice
)
275 devc
->v_alloc
->map
[voice
] = 0;
277 map
= &pv_map
[devc
->lv_map
[voice
]];
279 if (map
->voice_mode
== 0)
282 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
, devc
->voc
[voice
].keyon_byte
& ~0x20);
283 devc
->voc
[voice
].keyon_byte
= 0;
284 devc
->voc
[voice
].bender
= 0;
285 devc
->voc
[voice
].volume
= 64;
286 devc
->voc
[voice
].panning
= 0xffff; /* Not set */
287 devc
->voc
[voice
].bender_range
= 200;
288 devc
->voc
[voice
].orig_freq
= 0;
289 devc
->voc
[voice
].current_freq
= 0;
290 devc
->voc
[voice
].mode
= 0;
299 #define UNDEFINED TOMTOM
300 #define DEFAULT TOMTOM
302 static int store_instr(int instr_no
, struct sbi_instrument
*instr
)
304 if (instr
->key
!= FM_PATCH
&& (instr
->key
!= OPL3_PATCH
|| devc
->model
!= 2))
305 printk(KERN_WARNING
"FM warning: Invalid patch format field (key) 0x%x\n", instr
->key
);
306 memcpy((char *) &(devc
->i_map
[instr_no
]), (char *) instr
, sizeof(*instr
));
310 static int opl3_set_instr (int dev
, int voice
, int instr_no
)
312 if (voice
< 0 || voice
>= devc
->nr_voice
)
314 if (instr_no
< 0 || instr_no
>= SBFM_MAXINSTR
)
315 instr_no
= 0; /* Acoustic piano (usually) */
317 devc
->act_i
[voice
] = &devc
->i_map
[instr_no
];
322 * The next table looks magical, but it certainly is not. Its values have
323 * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception
324 * for i=0. This log-table converts a linear volume-scaling (0..127) to a
325 * logarithmic scaling as present in the FM-synthesizer chips. so : Volume
326 * 64 = 0 db = relative volume 0 and: Volume 32 = -6 db = relative
327 * volume -8 it was implemented as a table because it is only 128 bytes and
328 * it saves a lot of log() calculations. (RH)
331 static char fm_volume_table
[128] =
333 -64, -48, -40, -35, -32, -29, -27, -26,
334 -24, -23, -21, -20, -19, -18, -18, -17,
335 -16, -15, -15, -14, -13, -13, -12, -12,
336 -11, -11, -10, -10, -10, -9, -9, -8,
337 -8, -8, -7, -7, -7, -6, -6, -6,
338 -5, -5, -5, -5, -4, -4, -4, -4,
339 -3, -3, -3, -3, -2, -2, -2, -2,
340 -2, -1, -1, -1, -1, 0, 0, 0,
341 0, 0, 0, 1, 1, 1, 1, 1,
342 1, 2, 2, 2, 2, 2, 2, 2,
343 3, 3, 3, 3, 3, 3, 3, 4,
344 4, 4, 4, 4, 4, 4, 4, 5,
345 5, 5, 5, 5, 5, 5, 5, 5,
346 6, 6, 6, 6, 6, 6, 6, 6,
347 6, 7, 7, 7, 7, 7, 7, 7,
348 7, 7, 7, 8, 8, 8, 8, 8
351 static void calc_vol(unsigned char *regbyte
, int volume
, int main_vol
)
353 int level
= (~*regbyte
& 0x3f);
357 volume
= (volume
* main_vol
) / 127;
360 level
+= fm_volume_table
[volume
];
367 *regbyte
= (*regbyte
& 0xc0) | (~level
& 0x3f);
370 static void set_voice_volume(int voice
, int volume
, int main_vol
)
372 unsigned char vol1
, vol2
, vol3
, vol4
;
373 struct sbi_instrument
*instr
;
374 struct physical_voice_info
*map
;
376 if (voice
< 0 || voice
>= devc
->nr_voice
)
379 map
= &pv_map
[devc
->lv_map
[voice
]];
380 instr
= devc
->act_i
[voice
];
383 instr
= &devc
->i_map
[0];
385 if (instr
->channel
< 0)
388 if (devc
->voc
[voice
].mode
== 0)
391 if (devc
->voc
[voice
].mode
== 2)
393 vol1
= instr
->operators
[2];
394 vol2
= instr
->operators
[3];
395 if ((instr
->operators
[10] & 0x01))
397 calc_vol(&vol1
, volume
, main_vol
);
398 calc_vol(&vol2
, volume
, main_vol
);
402 calc_vol(&vol2
, volume
, main_vol
);
404 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[0], vol1
);
405 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[1], vol2
);
413 vol1
= instr
->operators
[2];
414 vol2
= instr
->operators
[3];
415 vol3
= instr
->operators
[OFFS_4OP
+ 2];
416 vol4
= instr
->operators
[OFFS_4OP
+ 3];
419 * The connection method for 4 OP devc->voc is defined by the rightmost
420 * bits at the offsets 10 and 10+OFFS_4OP
423 connection
= ((instr
->operators
[10] & 0x01) << 1) | (instr
->operators
[10 + OFFS_4OP
] & 0x01);
428 calc_vol(&vol4
, volume
, main_vol
);
432 calc_vol(&vol2
, volume
, main_vol
);
433 calc_vol(&vol4
, volume
, main_vol
);
437 calc_vol(&vol1
, volume
, main_vol
);
438 calc_vol(&vol4
, volume
, main_vol
);
442 calc_vol(&vol1
, volume
, main_vol
);
443 calc_vol(&vol3
, volume
, main_vol
);
444 calc_vol(&vol4
, volume
, main_vol
);
450 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[0], vol1
);
451 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[1], vol2
);
452 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[2], vol3
);
453 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[3], vol4
);
457 static int opl3_start_note (int dev
, int voice
, int note
, int volume
)
459 unsigned char data
, fpc
;
460 int block
, fnum
, freq
, voice_mode
, pan
;
461 struct sbi_instrument
*instr
;
462 struct physical_voice_info
*map
;
464 if (voice
< 0 || voice
>= devc
->nr_voice
)
467 map
= &pv_map
[devc
->lv_map
[voice
]];
468 pan
= devc
->voc
[voice
].panning
;
470 if (map
->voice_mode
== 0)
474 * Just change the volume
477 set_voice_volume(voice
, volume
, devc
->voc
[voice
].volume
);
482 * Kill previous note before playing
485 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[1], 0xff); /*
490 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[0], 0xff); /*
495 if (map
->voice_mode
== 4)
497 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[2], 0xff);
498 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[3], 0xff);
501 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
, 0x00); /*
506 instr
= devc
->act_i
[voice
];
509 instr
= &devc
->i_map
[0];
511 if (instr
->channel
< 0)
513 printk(KERN_WARNING
"opl3: Initializing voice %d with undefined instrument\n", voice
);
517 if (map
->voice_mode
== 2 && instr
->key
== OPL3_PATCH
)
522 voice_mode
= map
->voice_mode
;
528 voice_shift
= (map
->ioaddr
== devc
->left_io
) ? 0 : 3;
529 voice_shift
+= map
->voice_num
;
531 if (instr
->key
!= OPL3_PATCH
) /*
536 devc
->cmask
&= ~(1 << voice_shift
);
540 devc
->cmask
|= (1 << voice_shift
);
543 opl3_command(devc
->right_io
, CONNECTION_SELECT_REGISTER
, devc
->cmask
);
547 * Set Sound Characteristics
550 opl3_command(map
->ioaddr
, AM_VIB
+ map
->op
[0], instr
->operators
[0]);
551 opl3_command(map
->ioaddr
, AM_VIB
+ map
->op
[1], instr
->operators
[1]);
557 opl3_command(map
->ioaddr
, ATTACK_DECAY
+ map
->op
[0], instr
->operators
[4]);
558 opl3_command(map
->ioaddr
, ATTACK_DECAY
+ map
->op
[1], instr
->operators
[5]);
561 * Set Sustain/Release
564 opl3_command(map
->ioaddr
, SUSTAIN_RELEASE
+ map
->op
[0], instr
->operators
[6]);
565 opl3_command(map
->ioaddr
, SUSTAIN_RELEASE
+ map
->op
[1], instr
->operators
[7]);
571 opl3_command(map
->ioaddr
, WAVE_SELECT
+ map
->op
[0], instr
->operators
[8]);
572 opl3_command(map
->ioaddr
, WAVE_SELECT
+ map
->op
[1], instr
->operators
[9]);
575 * Set Feedback/Connection
578 fpc
= instr
->operators
[10];
584 fpc
|= VOICE_TO_LEFT
;
587 fpc
|= VOICE_TO_RIGHT
;
589 fpc
|= (VOICE_TO_LEFT
| VOICE_TO_RIGHT
);
594 * Ensure that at least one chn is enabled
596 opl3_command(map
->ioaddr
, FEEDBACK_CONNECTION
+ map
->voice_num
, fpc
);
599 * If the voice is a 4 OP one, initialize the operators 3 and 4 also
605 * Set Sound Characteristics
608 opl3_command(map
->ioaddr
, AM_VIB
+ map
->op
[2], instr
->operators
[OFFS_4OP
+ 0]);
609 opl3_command(map
->ioaddr
, AM_VIB
+ map
->op
[3], instr
->operators
[OFFS_4OP
+ 1]);
615 opl3_command(map
->ioaddr
, ATTACK_DECAY
+ map
->op
[2], instr
->operators
[OFFS_4OP
+ 4]);
616 opl3_command(map
->ioaddr
, ATTACK_DECAY
+ map
->op
[3], instr
->operators
[OFFS_4OP
+ 5]);
619 * Set Sustain/Release
622 opl3_command(map
->ioaddr
, SUSTAIN_RELEASE
+ map
->op
[2], instr
->operators
[OFFS_4OP
+ 6]);
623 opl3_command(map
->ioaddr
, SUSTAIN_RELEASE
+ map
->op
[3], instr
->operators
[OFFS_4OP
+ 7]);
629 opl3_command(map
->ioaddr
, WAVE_SELECT
+ map
->op
[2], instr
->operators
[OFFS_4OP
+ 8]);
630 opl3_command(map
->ioaddr
, WAVE_SELECT
+ map
->op
[3], instr
->operators
[OFFS_4OP
+ 9]);
633 * Set Feedback/Connection
636 fpc
= instr
->operators
[OFFS_4OP
+ 10];
639 * Ensure that at least one chn is enabled
641 opl3_command(map
->ioaddr
, FEEDBACK_CONNECTION
+ map
->voice_num
+ 3, fpc
);
644 devc
->voc
[voice
].mode
= voice_mode
;
645 set_voice_volume(voice
, volume
, devc
->voc
[voice
].volume
);
647 freq
= devc
->voc
[voice
].orig_freq
= note_to_freq(note
) / 1000;
650 * Since the pitch bender may have been set before playing the note, we
651 * have to calculate the bending now.
654 freq
= compute_finetune(devc
->voc
[voice
].orig_freq
, devc
->voc
[voice
].bender
, devc
->voc
[voice
].bender_range
, 0);
655 devc
->voc
[voice
].current_freq
= freq
;
657 freq_to_fnum(freq
, &block
, &fnum
);
663 data
= fnum
& 0xff; /*
664 * Least significant bits of fnumber
666 opl3_command(map
->ioaddr
, FNUM_LOW
+ map
->voice_num
, data
);
668 data
= 0x20 | ((block
& 0x7) << 2) | ((fnum
>> 8) & 0x3);
669 devc
->voc
[voice
].keyon_byte
= data
;
670 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
, data
);
672 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
+ 3, data
);
677 static void freq_to_fnum (int freq
, int *block
, int *fnum
)
682 * Converts the note frequency to block and fnum values for the FM chip
685 * First try to compute the block -value (octave) where the note belongs
714 *fnum
= freq
* (1 << (20 - octave
)) / 49716;
718 static void opl3_command (int io_addr
, unsigned int addr
, unsigned int val
)
723 * The original 2-OP synth requires a quite long delay after writing to a
724 * register. The OPL-3 survives with just two INBs
727 outb(((unsigned char) (addr
& 0xff)), io_addr
);
729 if (devc
->model
!= 2)
732 for (i
= 0; i
< 2; i
++)
735 outb(((unsigned char) (val
& 0xff)), io_addr
+ 1);
737 if (devc
->model
!= 2)
740 for (i
= 0; i
< 2; i
++)
744 static void opl3_reset(int devno
)
748 for (i
= 0; i
< 18; i
++)
751 for (i
= 0; i
< devc
->nr_voice
; i
++)
753 opl3_command(pv_map
[devc
->lv_map
[i
]].ioaddr
,
754 KSL_LEVEL
+ pv_map
[devc
->lv_map
[i
]].op
[0], 0xff);
756 opl3_command(pv_map
[devc
->lv_map
[i
]].ioaddr
,
757 KSL_LEVEL
+ pv_map
[devc
->lv_map
[i
]].op
[1], 0xff);
759 if (pv_map
[devc
->lv_map
[i
]].voice_mode
== 4)
761 opl3_command(pv_map
[devc
->lv_map
[i
]].ioaddr
,
762 KSL_LEVEL
+ pv_map
[devc
->lv_map
[i
]].op
[2], 0xff);
764 opl3_command(pv_map
[devc
->lv_map
[i
]].ioaddr
,
765 KSL_LEVEL
+ pv_map
[devc
->lv_map
[i
]].op
[3], 0xff);
768 opl3_kill_note(devno
, i
, 0, 64);
771 if (devc
->model
== 2)
773 devc
->v_alloc
->max_voice
= devc
->nr_voice
= 18;
775 for (i
= 0; i
< 18; i
++)
776 pv_map
[i
].voice_mode
= 2;
781 static int opl3_open(int dev
, int mode
)
789 devc
->v_alloc
->max_voice
= devc
->nr_voice
= (devc
->model
== 2) ? 18 : 9;
790 devc
->v_alloc
->timestamp
= 0;
792 for (i
= 0; i
< 18; i
++)
794 devc
->v_alloc
->map
[i
] = 0;
795 devc
->v_alloc
->alloc_times
[i
] = 0;
798 devc
->cmask
= 0x00; /*
801 if (devc
->model
== 2)
802 opl3_command(devc
->right_io
, CONNECTION_SELECT_REGISTER
, devc
->cmask
);
806 static void opl3_close(int dev
)
809 devc
->v_alloc
->max_voice
= devc
->nr_voice
= (devc
->model
== 2) ? 18 : 9;
811 devc
->fm_info
.nr_drums
= 0;
812 devc
->fm_info
.perc_mode
= 0;
817 static void opl3_hw_control(int dev
, unsigned char *event
)
821 static int opl3_load_patch(int dev
, int format
, const char __user
*addr
,
822 int count
, int pmgr_flag
)
824 struct sbi_instrument ins
;
826 if (count
<sizeof(ins
))
828 printk(KERN_WARNING
"FM Error: Patch record too short\n");
832 if (copy_from_user(&ins
, addr
, sizeof(ins
)))
835 if (ins
.channel
< 0 || ins
.channel
>= SBFM_MAXINSTR
)
837 printk(KERN_WARNING
"FM Error: Invalid instrument number %d\n", ins
.channel
);
842 return store_instr(ins
.channel
, &ins
);
845 static void opl3_panning(int dev
, int voice
, int value
)
848 if (voice
< 0 || voice
>= devc
->nr_voice
)
851 devc
->voc
[voice
].panning
= value
;
854 static void opl3_volume_method(int dev
, int mode
)
858 #define SET_VIBRATO(cell) { \
859 tmp = instr->operators[(cell-1)+(((cell-1)/2)*OFFS_4OP)]; \
860 if (pressure > 110) \
861 tmp |= 0x40; /* Vibrato on */ \
862 opl3_command (map->ioaddr, AM_VIB + map->op[cell-1], tmp);}
864 static void opl3_aftertouch(int dev
, int voice
, int pressure
)
867 struct sbi_instrument
*instr
;
868 struct physical_voice_info
*map
;
870 if (voice
< 0 || voice
>= devc
->nr_voice
)
873 map
= &pv_map
[devc
->lv_map
[voice
]];
875 if (map
->voice_mode
== 0)
879 * Adjust the amount of vibrato depending the pressure
882 instr
= devc
->act_i
[voice
];
885 instr
= &devc
->i_map
[0];
887 if (devc
->voc
[voice
].mode
== 4)
889 int connection
= ((instr
->operators
[10] & 0x01) << 1) | (instr
->operators
[10 + OFFS_4OP
] & 0x01);
915 * Not implemented yet
922 if ((instr
->operators
[10] & 0x01)) /*
931 static void bend_pitch(int dev
, int voice
, int value
)
934 int block
, fnum
, freq
;
935 struct physical_voice_info
*map
;
937 map
= &pv_map
[devc
->lv_map
[voice
]];
939 if (map
->voice_mode
== 0)
942 devc
->voc
[voice
].bender
= value
;
945 if (!(devc
->voc
[voice
].keyon_byte
& 0x20))
950 freq
= compute_finetune(devc
->voc
[voice
].orig_freq
, devc
->voc
[voice
].bender
, devc
->voc
[voice
].bender_range
, 0);
951 devc
->voc
[voice
].current_freq
= freq
;
953 freq_to_fnum(freq
, &block
, &fnum
);
955 data
= fnum
& 0xff; /*
956 * Least significant bits of fnumber
958 opl3_command(map
->ioaddr
, FNUM_LOW
+ map
->voice_num
, data
);
960 data
= 0x20 | ((block
& 0x7) << 2) | ((fnum
>> 8) & 0x3);
961 devc
->voc
[voice
].keyon_byte
= data
;
962 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
, data
);
965 static void opl3_controller (int dev
, int voice
, int ctrl_num
, int value
)
967 if (voice
< 0 || voice
>= devc
->nr_voice
)
972 case CTRL_PITCH_BENDER
:
973 bend_pitch(dev
, voice
, value
);
976 case CTRL_PITCH_BENDER_RANGE
:
977 devc
->voc
[voice
].bender_range
= value
;
980 case CTL_MAIN_VOLUME
:
981 devc
->voc
[voice
].volume
= value
/ 128;
985 devc
->voc
[voice
].panning
= (value
* 2) - 128;
990 static void opl3_bender(int dev
, int voice
, int value
)
992 if (voice
< 0 || voice
>= devc
->nr_voice
)
995 bend_pitch(dev
, voice
, value
- 8192);
998 static int opl3_alloc_voice(int dev
, int chn
, int note
, struct voice_alloc_info
*alloc
)
1000 int i
, p
, best
, first
, avail
, best_time
= 0x7fffffff;
1001 struct sbi_instrument
*instr
;
1005 if (chn
< 0 || chn
> 15)
1008 instr_no
= devc
->chn_info
[chn
].pgm_num
;
1010 instr
= &devc
->i_map
[instr_no
];
1011 if (instr
->channel
< 0 || /* Instrument not loaded */
1012 devc
->nr_voice
!= 12) /* Not in 4 OP mode */
1014 else if (devc
->nr_voice
== 12) /* 4 OP mode */
1015 is4op
= (instr
->key
== OPL3_PATCH
);
1026 if (devc
->nr_voice
== 12) /* 4 OP mode. Use the '2 OP only' operators first */
1030 avail
= devc
->nr_voice
;
1034 * Now try to find a free voice
1038 for (i
= 0; i
< avail
; i
++)
1040 if (alloc
->map
[p
] == 0)
1044 if (alloc
->alloc_times
[p
] < best_time
) /* Find oldest playing note */
1046 best_time
= alloc
->alloc_times
[p
];
1049 p
= (p
+ 1) % avail
;
1053 * Insert some kind of priority mechanism here.
1058 if (best
> devc
->nr_voice
)
1059 best
-= devc
->nr_voice
;
1061 return best
; /* All devc->voc in use. Select the first one. */
1064 static void opl3_setup_voice(int dev
, int voice
, int chn
)
1066 struct channel_info
*info
;
1068 if (voice
< 0 || voice
>= devc
->nr_voice
)
1071 if (chn
< 0 || chn
> 15)
1074 info
= &synth_devs
[dev
]->chn_info
[chn
];
1076 opl3_set_instr(dev
, voice
, info
->pgm_num
);
1078 devc
->voc
[voice
].bender
= 0;
1079 devc
->voc
[voice
].bender_range
= info
->bender_range
;
1080 devc
->voc
[voice
].volume
= info
->controllers
[CTL_MAIN_VOLUME
];
1081 devc
->voc
[voice
].panning
= (info
->controllers
[CTL_PAN
] * 2) - 128;
1084 static struct synth_operations opl3_operations
=
1086 .owner
= THIS_MODULE
,
1090 .synth_type
= SYNTH_TYPE_FM
,
1091 .synth_subtype
= FM_TYPE_ADLIB
,
1093 .close
= opl3_close
,
1094 .ioctl
= opl3_ioctl
,
1095 .kill_note
= opl3_kill_note
,
1096 .start_note
= opl3_start_note
,
1097 .set_instr
= opl3_set_instr
,
1098 .reset
= opl3_reset
,
1099 .hw_control
= opl3_hw_control
,
1100 .load_patch
= opl3_load_patch
,
1101 .aftertouch
= opl3_aftertouch
,
1102 .controller
= opl3_controller
,
1103 .panning
= opl3_panning
,
1104 .volume_method
= opl3_volume_method
,
1105 .bender
= opl3_bender
,
1106 .alloc_voice
= opl3_alloc_voice
,
1107 .setup_voice
= opl3_setup_voice
1110 static int opl3_init(int ioaddr
, struct module
*owner
)
1117 printk(KERN_ERR
"opl3: Device control structure not initialized.\n");
1121 if ((me
= sound_alloc_synthdev()) == -1)
1123 printk(KERN_WARNING
"opl3: Too many synthesizers\n");
1129 devc
->fm_info
.device
= 0;
1130 devc
->fm_info
.synth_type
= SYNTH_TYPE_FM
;
1131 devc
->fm_info
.synth_subtype
= FM_TYPE_ADLIB
;
1132 devc
->fm_info
.perc_mode
= 0;
1133 devc
->fm_info
.nr_voices
= 9;
1134 devc
->fm_info
.nr_drums
= 0;
1135 devc
->fm_info
.instr_bank_size
= SBFM_MAXINSTR
;
1136 devc
->fm_info
.capabilities
= 0;
1137 devc
->left_io
= ioaddr
;
1138 devc
->right_io
= ioaddr
+ 2;
1140 if (detected_model
<= 2)
1145 if (detected_model
== 4)
1149 opl3_operations
.info
= &devc
->fm_info
;
1151 synth_devs
[me
] = &opl3_operations
;
1154 synth_devs
[me
]->owner
= owner
;
1157 devc
->v_alloc
= &opl3_operations
.alloc
;
1158 devc
->chn_info
= &opl3_operations
.chn_info
[0];
1160 if (devc
->model
== 2)
1163 strcpy(devc
->fm_info
.name
, "Yamaha OPL4/OPL3 FM");
1165 strcpy(devc
->fm_info
.name
, "Yamaha OPL3");
1167 devc
->v_alloc
->max_voice
= devc
->nr_voice
= 18;
1168 devc
->fm_info
.nr_drums
= 0;
1169 devc
->fm_info
.synth_subtype
= FM_TYPE_OPL3
;
1170 devc
->fm_info
.capabilities
|= SYNTH_CAP_OPL3
;
1172 for (i
= 0; i
< 18; i
++)
1174 if (pv_map
[i
].ioaddr
== USE_LEFT
)
1175 pv_map
[i
].ioaddr
= devc
->left_io
;
1177 pv_map
[i
].ioaddr
= devc
->right_io
;
1179 opl3_command(devc
->right_io
, OPL3_MODE_REGISTER
, OPL3_ENABLE
);
1180 opl3_command(devc
->right_io
, CONNECTION_SELECT_REGISTER
, 0x00);
1184 strcpy(devc
->fm_info
.name
, "Yamaha OPL2");
1185 devc
->v_alloc
->max_voice
= devc
->nr_voice
= 9;
1186 devc
->fm_info
.nr_drums
= 0;
1188 for (i
= 0; i
< 18; i
++)
1189 pv_map
[i
].ioaddr
= devc
->left_io
;
1191 conf_printf2(devc
->fm_info
.name
, ioaddr
, 0, -1, -1);
1193 for (i
= 0; i
< SBFM_MAXINSTR
; i
++)
1194 devc
->i_map
[i
].channel
= -1;
1203 module_param(io
, int, 0);
1205 static int __init
init_opl3 (void)
1207 printk(KERN_INFO
"YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1996\n");
1209 if (io
!= -1) /* User loading pure OPL3 module */
1211 if (!opl3_detect(io
))
1216 me
= opl3_init(io
, THIS_MODULE
);
1222 static void __exit
cleanup_opl3(void)
1224 if (devc
&& io
!= -1)
1227 release_region(devc
->base
,4);
1229 release_region(devc
->base
- 8, 2);
1233 sound_unload_synthdev(me
);
1237 module_init(init_opl3
);
1238 module_exit(cleanup_opl3
);
1241 static int __init
setup_opl3(char *str
)
1246 str
= get_options(str
, ARRAY_SIZE(ints
), ints
);
1253 __setup("opl3=", setup_opl3
);
1255 MODULE_LICENSE("GPL");