OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [sound/] [opl3.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 * sound/opl3.c
3
 *
4
 * A low level driver for Yamaha YM3812 and OPL-3 -chips
5
 *
6
 *
7
 * Copyright (C) by Hannu Savolainen 1993-1997
8
 *
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
11
 * for more info.
12
 *
13
 *
14
 * Changes
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.
20
 *
21
 * Status
22
 *      Believed to work. Badly needs rewriting a bit to support multiple
23
 *      OPL3 devices.
24
 */
25
 
26
#include <linux/init.h>
27
#include <linux/module.h>
28
#include <linux/delay.h>
29
 
30
/*
31
 * Major improvements to the FM handling 30AUG92 by Rob Hooft,
32
 * hooft@chem.ruu.nl
33
 */
34
 
35
#include "sound_config.h"
36
 
37
#include "opl3.h"
38
#include "opl3_hw.h"
39
 
40
#define MAX_VOICE       18
41
#define OFFS_4OP        11
42
 
43
struct voice_info
44
{
45
        unsigned char   keyon_byte;
46
        long            bender;
47
        long            bender_range;
48
        unsigned long   orig_freq;
49
        unsigned long   current_freq;
50
        int             volume;
51
        int             mode;
52
        int             panning;        /* 0xffff means not set */
53
};
54
 
55
typedef struct opl_devinfo
56
{
57
        int             base;
58
        int             left_io, right_io;
59
        int             nr_voice;
60
        int             lv_map[MAX_VOICE];
61
 
62
        struct voice_info voc[MAX_VOICE];
63
        struct voice_alloc_info *v_alloc;
64
        struct channel_info *chn_info;
65
 
66
        struct sbi_instrument i_map[SBFM_MAXINSTR];
67
        struct sbi_instrument *act_i[MAX_VOICE];
68
 
69
        struct synth_info fm_info;
70
 
71
        int             busy;
72
        int             model;
73
        unsigned char   cmask;
74
 
75
        int             is_opl4;
76
        int            *osp;
77
} opl_devinfo;
78
 
79
static struct opl_devinfo *devc = NULL;
80
 
81
static int      detected_model;
82
 
83
static int      store_instr(int instr_no, struct sbi_instrument *instr);
84
static void     freq_to_fnum(int freq, int *block, int *fnum);
85
static void     opl3_command(int io_addr, unsigned int addr, unsigned int val);
86
static int      opl3_kill_note(int dev, int voice, int note, int velocity);
87
 
88
static void enter_4op_mode(void)
89
{
90
        int i;
91
        static int v4op[MAX_VOICE] = {
92
                0, 1, 2, 9, 10, 11, 6, 7, 8, 15, 16, 17
93
        };
94
 
95
        devc->cmask = 0x3f;     /* Connect all possible 4 OP voice operators */
96
        opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x3f);
97
 
98
        for (i = 0; i < 3; i++)
99
                pv_map[i].voice_mode = 4;
100
        for (i = 3; i < 6; i++)
101
                pv_map[i].voice_mode = 0;
102
 
103
        for (i = 9; i < 12; i++)
104
                pv_map[i].voice_mode = 4;
105
        for (i = 12; i < 15; i++)
106
                pv_map[i].voice_mode = 0;
107
 
108
        for (i = 0; i < 12; i++)
109
                devc->lv_map[i] = v4op[i];
110
        devc->v_alloc->max_voice = devc->nr_voice = 12;
111
}
112
 
113
static int opl3_ioctl(int dev, unsigned int cmd, caddr_t arg)
114
{
115
        struct sbi_instrument ins;
116
 
117
        switch (cmd) {
118
                case SNDCTL_FM_LOAD_INSTR:
119
                        printk(KERN_WARNING "Warning: Obsolete ioctl(SNDCTL_FM_LOAD_INSTR) used. Fix the program.\n");
120
                        if (copy_from_user(&ins, arg, sizeof(ins)))
121
                                return -EFAULT;
122
                        if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR) {
123
                                printk(KERN_WARNING "FM Error: Invalid instrument number %d\n", ins.channel);
124
                                return -EINVAL;
125
                        }
126
                        return store_instr(ins.channel, &ins);
127
 
128
                case SNDCTL_SYNTH_INFO:
129
                        devc->fm_info.nr_voices = (devc->nr_voice == 12) ? 6 : devc->nr_voice;
130
                        if (copy_to_user(arg, &devc->fm_info, sizeof(devc->fm_info)))
131
                                return -EFAULT;
132
                        return 0;
133
 
134
                case SNDCTL_SYNTH_MEMAVL:
135
                        return 0x7fffffff;
136
 
137
                case SNDCTL_FM_4OP_ENABLE:
138
                        if (devc->model == 2)
139
                                enter_4op_mode();
140
                        return 0;
141
 
142
                default:
143
                        return -EINVAL;
144
        }
145
}
146
 
147
int opl3_detect(int ioaddr, int *osp)
148
{
149
        /*
150
         * This function returns 1 if the FM chip is present at the given I/O port
151
         * The detection algorithm plays with the timer built in the FM chip and
152
         * looks for a change in the status register.
153
         *
154
         * Note! The timers of the FM chip are not connected to AdLib (and compatible)
155
         * boards.
156
         *
157
         * Note2! The chip is initialized if detected.
158
         */
159
 
160
        unsigned char stat1, signature;
161
        int i;
162
 
163
        if (devc != NULL)
164
        {
165
                printk(KERN_ERR "opl3: Only one OPL3 supported.\n");
166
                return 0;
167
        }
168
 
169
        devc = (struct opl_devinfo *)kmalloc(sizeof(*devc), GFP_KERNEL);
170
 
171
        if (devc == NULL)
172
        {
173
                printk(KERN_ERR "opl3: Can't allocate memory for the device control "
174
                        "structure \n ");
175
                return 0;
176
        }
177
 
178
        memset(devc, 0, sizeof(*devc));
179
        strcpy(devc->fm_info.name, "OPL2");
180
 
181
        if (!request_region(ioaddr, 4, devc->fm_info.name)) {
182
                printk(KERN_WARNING "opl3: I/O port 0x%x already in use\n", ioaddr);
183
                goto cleanup_devc;
184
        }
185
 
186
        devc->osp = osp;
187
        devc->base = ioaddr;
188
 
189
        /* Reset timers 1 and 2 */
190
        opl3_command(ioaddr, TIMER_CONTROL_REGISTER, TIMER1_MASK | TIMER2_MASK);
191
 
192
        /* Reset the IRQ of the FM chip */
193
        opl3_command(ioaddr, TIMER_CONTROL_REGISTER, IRQ_RESET);
194
 
195
        signature = stat1 = inb(ioaddr);        /* Status register */
196
 
197
        if (signature != 0x00 && signature != 0x06 && signature != 0x02 &&
198
                signature != 0x0f)
199
        {
200
                MDB(printk(KERN_INFO "OPL3 not detected %x\n", signature));
201
                goto cleanup_region;
202
        }
203
 
204
        if (signature == 0x06)          /* OPL2 */
205
        {
206
                detected_model = 2;
207
        }
208
        else if (signature == 0x00 || signature == 0x0f)        /* OPL3 or OPL4 */
209
        {
210
                unsigned char tmp;
211
 
212
                detected_model = 3;
213
 
214
                /*
215
                 * Detect availability of OPL4 (_experimental_). Works probably
216
                 * only after a cold boot. In addition the OPL4 port
217
                 * of the chip may not be connected to the PC bus at all.
218
                 */
219
 
220
                opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0x00);
221
                opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, OPL3_ENABLE | OPL4_ENABLE);
222
 
223
                if ((tmp = inb(ioaddr)) == 0x02)        /* Have a OPL4 */
224
                {
225
                        detected_model = 4;
226
                }
227
 
228
                if (request_region(ioaddr - 8, 2, "OPL4"))      /* OPL4 port was free */
229
                {
230
                        int tmp;
231
 
232
                        outb((0x02), ioaddr - 8);       /* Select OPL4 ID register */
233
                        udelay(10);
234
                        tmp = inb(ioaddr - 7);          /* Read it */
235
                        udelay(10);
236
 
237
                        if (tmp == 0x20)        /* OPL4 should return 0x20 here */
238
                        {
239
                                detected_model = 4;
240
                                outb((0xF8), ioaddr - 8);       /* Select OPL4 FM mixer control */
241
                                udelay(10);
242
                                outb((0x1B), ioaddr - 7);       /* Write value */
243
                                udelay(10);
244
                        }
245
                        else
246
                        { /* release OPL4 port */
247
                                release_region(ioaddr - 8, 2);
248
                                detected_model = 3;
249
                        }
250
                }
251
                opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0);
252
        }
253
        for (i = 0; i < 9; i++)
254
                opl3_command(ioaddr, KEYON_BLOCK + i, 0);        /*
255
                                                                 * Note off
256
                                                                 */
257
 
258
        opl3_command(ioaddr, TEST_REGISTER, ENABLE_WAVE_SELECT);
259
        opl3_command(ioaddr, PERCOSSION_REGISTER, 0x00);        /*
260
                                                                 * Melodic mode.
261
                                                                 */
262
        return 1;
263
cleanup_region:
264
        release_region(ioaddr, 4);
265
cleanup_devc:
266
        kfree(devc);
267
        devc = NULL;
268
        return 0;
269
}
270
 
271
static int opl3_kill_note  (int devno, int voice, int note, int velocity)
272
{
273
         struct physical_voice_info *map;
274
 
275
         if (voice < 0 || voice >= devc->nr_voice)
276
                 return 0;
277
 
278
         devc->v_alloc->map[voice] = 0;
279
 
280
         map = &pv_map[devc->lv_map[voice]];
281
         DEB(printk("Kill note %d\n", voice));
282
 
283
         if (map->voice_mode == 0)
284
                 return 0;
285
 
286
         opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, devc->voc[voice].keyon_byte & ~0x20);
287
         devc->voc[voice].keyon_byte = 0;
288
         devc->voc[voice].bender = 0;
289
         devc->voc[voice].volume = 64;
290
         devc->voc[voice].panning = 0xffff;     /* Not set */
291
         devc->voc[voice].bender_range = 200;
292
         devc->voc[voice].orig_freq = 0;
293
         devc->voc[voice].current_freq = 0;
294
         devc->voc[voice].mode = 0;
295
         return 0;
296
}
297
 
298
#define HIHAT                   0
299
#define CYMBAL                  1
300
#define TOMTOM                  2
301
#define SNARE                   3
302
#define BDRUM                   4
303
#define UNDEFINED               TOMTOM
304
#define DEFAULT                 TOMTOM
305
 
306
static int store_instr(int instr_no, struct sbi_instrument *instr)
307
{
308
        if (instr->key != FM_PATCH && (instr->key != OPL3_PATCH || devc->model != 2))
309
                printk(KERN_WARNING "FM warning: Invalid patch format field (key) 0x%x\n", instr->key);
310
        memcpy((char *) &(devc->i_map[instr_no]), (char *) instr, sizeof(*instr));
311
        return 0;
312
}
313
 
314
static int opl3_set_instr  (int dev, int voice, int instr_no)
315
{
316
        if (voice < 0 || voice >= devc->nr_voice)
317
                return 0;
318
        if (instr_no < 0 || instr_no >= SBFM_MAXINSTR)
319
                instr_no = 0;    /* Acoustic piano (usually) */
320
 
321
        devc->act_i[voice] = &devc->i_map[instr_no];
322
        return 0;
323
}
324
 
325
/*
326
 * The next table looks magical, but it certainly is not. Its values have
327
 * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception
328
 * for i=0. This log-table converts a linear volume-scaling (0..127) to a
329
 * logarithmic scaling as present in the FM-synthesizer chips. so :    Volume
330
 * 64 =  0 db = relative volume  0 and:    Volume 32 = -6 db = relative
331
 * volume -8 it was implemented as a table because it is only 128 bytes and
332
 * it saves a lot of log() calculations. (RH)
333
 */
334
 
335
static char fm_volume_table[128] =
336
{
337
        -64, -48, -40, -35, -32, -29, -27, -26,
338
        -24, -23, -21, -20, -19, -18, -18, -17,
339
        -16, -15, -15, -14, -13, -13, -12, -12,
340
        -11, -11, -10, -10, -10, -9, -9, -8,
341
        -8, -8, -7, -7, -7, -6, -6, -6,
342
        -5, -5, -5, -5, -4, -4, -4, -4,
343
        -3, -3, -3, -3, -2, -2, -2, -2,
344
        -2, -1, -1, -1, -1, 0, 0, 0,
345
        0, 0, 0, 1, 1, 1, 1, 1,
346
        1, 2, 2, 2, 2, 2, 2, 2,
347
        3, 3, 3, 3, 3, 3, 3, 4,
348
        4, 4, 4, 4, 4, 4, 4, 5,
349
        5, 5, 5, 5, 5, 5, 5, 5,
350
        6, 6, 6, 6, 6, 6, 6, 6,
351
        6, 7, 7, 7, 7, 7, 7, 7,
352
        7, 7, 7, 8, 8, 8, 8, 8
353
};
354
 
355
static void calc_vol(unsigned char *regbyte, int volume, int main_vol)
356
{
357
        int level = (~*regbyte & 0x3f);
358
 
359
        if (main_vol > 127)
360
                main_vol = 127;
361
        volume = (volume * main_vol) / 127;
362
 
363
        if (level)
364
                level += fm_volume_table[volume];
365
 
366
        if (level > 0x3f)
367
                level = 0x3f;
368
        if (level < 0)
369
                level = 0;
370
 
371
        *regbyte = (*regbyte & 0xc0) | (~level & 0x3f);
372
}
373
 
374
static void set_voice_volume(int voice, int volume, int main_vol)
375
{
376
        unsigned char vol1, vol2, vol3, vol4;
377
        struct sbi_instrument *instr;
378
        struct physical_voice_info *map;
379
 
380
        if (voice < 0 || voice >= devc->nr_voice)
381
                return;
382
 
383
        map = &pv_map[devc->lv_map[voice]];
384
        instr = devc->act_i[voice];
385
 
386
        if (!instr)
387
                instr = &devc->i_map[0];
388
 
389
        if (instr->channel < 0)
390
                return;
391
 
392
        if (devc->voc[voice].mode == 0)
393
                return;
394
 
395
        if (devc->voc[voice].mode == 2)
396
        {
397
                vol1 = instr->operators[2];
398
                vol2 = instr->operators[3];
399
                if ((instr->operators[10] & 0x01))
400
                {
401
                        calc_vol(&vol1, volume, main_vol);
402
                        calc_vol(&vol2, volume, main_vol);
403
                }
404
                else
405
                {
406
                        calc_vol(&vol2, volume, main_vol);
407
                }
408
                opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1);
409
                opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2);
410
        }
411
        else
412
        {       /*
413
                 * 4 OP voice
414
                 */
415
                int connection;
416
 
417
                vol1 = instr->operators[2];
418
                vol2 = instr->operators[3];
419
                vol3 = instr->operators[OFFS_4OP + 2];
420
                vol4 = instr->operators[OFFS_4OP + 3];
421
 
422
                /*
423
                 * The connection method for 4 OP devc->voc is defined by the rightmost
424
                 * bits at the offsets 10 and 10+OFFS_4OP
425
                 */
426
 
427
                connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01);
428
 
429
                switch (connection)
430
                {
431
                        case 0:
432
                                calc_vol(&vol4, volume, main_vol);
433
                                break;
434
 
435
                        case 1:
436
                                calc_vol(&vol2, volume, main_vol);
437
                                calc_vol(&vol4, volume, main_vol);
438
                                break;
439
 
440
                        case 2:
441
                                calc_vol(&vol1, volume, main_vol);
442
                                calc_vol(&vol4, volume, main_vol);
443
                                break;
444
 
445
                        case 3:
446
                                calc_vol(&vol1, volume, main_vol);
447
                                calc_vol(&vol3, volume, main_vol);
448
                                calc_vol(&vol4, volume, main_vol);
449
                                break;
450
 
451
                        default:
452
                                ;
453
                }
454
                opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1);
455
                opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2);
456
                opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], vol3);
457
                opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], vol4);
458
        }
459
}
460
 
461
static int opl3_start_note (int dev, int voice, int note, int volume)
462
{
463
        unsigned char data, fpc;
464
        int block, fnum, freq, voice_mode, pan;
465
        struct sbi_instrument *instr;
466
        struct physical_voice_info *map;
467
 
468
        if (voice < 0 || voice >= devc->nr_voice)
469
                return 0;
470
 
471
        map = &pv_map[devc->lv_map[voice]];
472
        pan = devc->voc[voice].panning;
473
 
474
        if (map->voice_mode == 0)
475
                return 0;
476
 
477
        if (note == 255)        /*
478
                                 * Just change the volume
479
                                 */
480
        {
481
                set_voice_volume(voice, volume, devc->voc[voice].volume);
482
                return 0;
483
        }
484
 
485
        /*
486
         * Kill previous note before playing
487
         */
488
 
489
        opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], 0xff);        /*
490
                                                                         * Carrier
491
                                                                         * volume to
492
                                                                         * min
493
                                                                         */
494
        opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], 0xff); /*
495
                                                                         * Modulator
496
                                                                         * volume to
497
                                                                         */
498
 
499
        if (map->voice_mode == 4)
500
        {
501
                opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], 0xff);
502
                opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], 0xff);
503
        }
504
 
505
        opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, 0x00);  /*
506
                                                                         * Note
507
                                                                         * off
508
                                                                         */
509
 
510
        instr = devc->act_i[voice];
511
 
512
        if (!instr)
513
                instr = &devc->i_map[0];
514
 
515
        if (instr->channel < 0)
516
        {
517
                printk(KERN_WARNING "opl3: Initializing voice %d with undefined instrument\n", voice);
518
                return 0;
519
        }
520
 
521
        if (map->voice_mode == 2 && instr->key == OPL3_PATCH)
522
                return 0;        /*
523
                                 * Cannot play
524
                                 */
525
 
526
        voice_mode = map->voice_mode;
527
 
528
        if (voice_mode == 4)
529
        {
530
                int voice_shift;
531
 
532
                voice_shift = (map->ioaddr == devc->left_io) ? 0 : 3;
533
                voice_shift += map->voice_num;
534
 
535
                if (instr->key != OPL3_PATCH)   /*
536
                                                 * Just 2 OP patch
537
                                                 */
538
                {
539
                        voice_mode = 2;
540
                        devc->cmask &= ~(1 << voice_shift);
541
                }
542
                else
543
                {
544
                        devc->cmask |= (1 << voice_shift);
545
                }
546
 
547
                opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask);
548
        }
549
 
550
        /*
551
         * Set Sound Characteristics
552
         */
553
 
554
        opl3_command(map->ioaddr, AM_VIB + map->op[0], instr->operators[0]);
555
        opl3_command(map->ioaddr, AM_VIB + map->op[1], instr->operators[1]);
556
 
557
        /*
558
         * Set Attack/Decay
559
         */
560
 
561
        opl3_command(map->ioaddr, ATTACK_DECAY + map->op[0], instr->operators[4]);
562
        opl3_command(map->ioaddr, ATTACK_DECAY + map->op[1], instr->operators[5]);
563
 
564
        /*
565
         * Set Sustain/Release
566
         */
567
 
568
        opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[0], instr->operators[6]);
569
        opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[1], instr->operators[7]);
570
 
571
        /*
572
         * Set Wave Select
573
         */
574
 
575
        opl3_command(map->ioaddr, WAVE_SELECT + map->op[0], instr->operators[8]);
576
        opl3_command(map->ioaddr, WAVE_SELECT + map->op[1], instr->operators[9]);
577
 
578
        /*
579
         * Set Feedback/Connection
580
         */
581
 
582
        fpc = instr->operators[10];
583
 
584
        if (pan != 0xffff)
585
        {
586
                fpc &= ~STEREO_BITS;
587
                if (pan < -64)
588
                        fpc |= VOICE_TO_LEFT;
589
                else
590
                        if (pan > 64)
591
                                fpc |= VOICE_TO_RIGHT;
592
                        else
593
                                fpc |= (VOICE_TO_LEFT | VOICE_TO_RIGHT);
594
        }
595
 
596
        if (!(fpc & 0x30))
597
                fpc |= 0x30;    /*
598
                                 * Ensure that at least one chn is enabled
599
                                 */
600
        opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num, fpc);
601
 
602
        /*
603
         * If the voice is a 4 OP one, initialize the operators 3 and 4 also
604
         */
605
 
606
        if (voice_mode == 4)
607
        {
608
                /*
609
                 * Set Sound Characteristics
610
                 */
611
 
612
                opl3_command(map->ioaddr, AM_VIB + map->op[2], instr->operators[OFFS_4OP + 0]);
613
                opl3_command(map->ioaddr, AM_VIB + map->op[3], instr->operators[OFFS_4OP + 1]);
614
 
615
                /*
616
                 * Set Attack/Decay
617
                 */
618
 
619
                opl3_command(map->ioaddr, ATTACK_DECAY + map->op[2], instr->operators[OFFS_4OP + 4]);
620
                opl3_command(map->ioaddr, ATTACK_DECAY + map->op[3], instr->operators[OFFS_4OP + 5]);
621
 
622
                /*
623
                 * Set Sustain/Release
624
                 */
625
 
626
                opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[2], instr->operators[OFFS_4OP + 6]);
627
                opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[3], instr->operators[OFFS_4OP + 7]);
628
 
629
                /*
630
                 * Set Wave Select
631
                 */
632
 
633
                opl3_command(map->ioaddr, WAVE_SELECT + map->op[2], instr->operators[OFFS_4OP + 8]);
634
                opl3_command(map->ioaddr, WAVE_SELECT + map->op[3], instr->operators[OFFS_4OP + 9]);
635
 
636
                /*
637
                 * Set Feedback/Connection
638
                 */
639
 
640
                fpc = instr->operators[OFFS_4OP + 10];
641
                if (!(fpc & 0x30))
642
                         fpc |= 0x30;   /*
643
                                         * Ensure that at least one chn is enabled
644
                                         */
645
                opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num + 3, fpc);
646
        }
647
 
648
        devc->voc[voice].mode = voice_mode;
649
        set_voice_volume(voice, volume, devc->voc[voice].volume);
650
 
651
        freq = devc->voc[voice].orig_freq = note_to_freq(note) / 1000;
652
 
653
        /*
654
         * Since the pitch bender may have been set before playing the note, we
655
         * have to calculate the bending now.
656
         */
657
 
658
        freq = compute_finetune(devc->voc[voice].orig_freq, devc->voc[voice].bender, devc->voc[voice].bender_range, 0);
659
        devc->voc[voice].current_freq = freq;
660
 
661
        freq_to_fnum(freq, &block, &fnum);
662
 
663
        /*
664
         * Play note
665
         */
666
 
667
        data = fnum & 0xff;     /*
668
                                 * Least significant bits of fnumber
669
                                 */
670
        opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data);
671
 
672
        data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3);
673
                 devc->voc[voice].keyon_byte = data;
674
        opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data);
675
        if (voice_mode == 4)
676
                opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num + 3, data);
677
 
678
        return 0;
679
}
680
 
681
static void freq_to_fnum    (int freq, int *block, int *fnum)
682
{
683
        int f, octave;
684
 
685
        /*
686
         * Converts the note frequency to block and fnum values for the FM chip
687
         */
688
        /*
689
         * First try to compute the block -value (octave) where the note belongs
690
         */
691
 
692
        f = freq;
693
 
694
        octave = 5;
695
 
696
        if (f == 0)
697
                octave = 0;
698
        else if (f < 261)
699
        {
700
                while (f < 261)
701
                {
702
                        octave--;
703
                        f <<= 1;
704
                }
705
        }
706
        else if (f > 493)
707
        {
708
                while (f > 493)
709
                {
710
                         octave++;
711
                         f >>= 1;
712
                }
713
        }
714
 
715
        if (octave > 7)
716
                octave = 7;
717
 
718
        *fnum = freq * (1 << (20 - octave)) / 49716;
719
        *block = octave;
720
}
721
 
722
static void opl3_command    (int io_addr, unsigned int addr, unsigned int val)
723
{
724
         int i;
725
 
726
        /*
727
         * The original 2-OP synth requires a quite long delay after writing to a
728
         * register. The OPL-3 survives with just two INBs
729
         */
730
 
731
        outb(((unsigned char) (addr & 0xff)), io_addr);
732
 
733
        if (devc->model != 2)
734
                udelay(10);
735
        else
736
                for (i = 0; i < 2; i++)
737
                        inb(io_addr);
738
 
739
        outb(((unsigned char) (val & 0xff)), io_addr + 1);
740
 
741
        if (devc->model != 2)
742
                udelay(30);
743
        else
744
                for (i = 0; i < 2; i++)
745
                        inb(io_addr);
746
}
747
 
748
static void opl3_reset(int devno)
749
{
750
        int i;
751
 
752
        for (i = 0; i < 18; i++)
753
                devc->lv_map[i] = i;
754
 
755
        for (i = 0; i < devc->nr_voice; i++)
756
        {
757
                opl3_command(pv_map[devc->lv_map[i]].ioaddr,
758
                        KSL_LEVEL + pv_map[devc->lv_map[i]].op[0], 0xff);
759
 
760
                opl3_command(pv_map[devc->lv_map[i]].ioaddr,
761
                        KSL_LEVEL + pv_map[devc->lv_map[i]].op[1], 0xff);
762
 
763
                if (pv_map[devc->lv_map[i]].voice_mode == 4)
764
                {
765
                        opl3_command(pv_map[devc->lv_map[i]].ioaddr,
766
                                KSL_LEVEL + pv_map[devc->lv_map[i]].op[2], 0xff);
767
 
768
                        opl3_command(pv_map[devc->lv_map[i]].ioaddr,
769
                                KSL_LEVEL + pv_map[devc->lv_map[i]].op[3], 0xff);
770
                }
771
 
772
                opl3_kill_note(devno, i, 0, 64);
773
        }
774
 
775
        if (devc->model == 2)
776
        {
777
                devc->v_alloc->max_voice = devc->nr_voice = 18;
778
 
779
                for (i = 0; i < 18; i++)
780
                        pv_map[i].voice_mode = 2;
781
 
782
        }
783
}
784
 
785
static int opl3_open(int dev, int mode)
786
{
787
        int i;
788
 
789
        if (devc->busy)
790
                return -EBUSY;
791
        devc->busy = 1;
792
 
793
        devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9;
794
        devc->v_alloc->timestamp = 0;
795
 
796
        for (i = 0; i < 18; i++)
797
        {
798
                devc->v_alloc->map[i] = 0;
799
                devc->v_alloc->alloc_times[i] = 0;
800
        }
801
 
802
        devc->cmask = 0x00;     /*
803
                                 * Just 2 OP mode
804
                                 */
805
        if (devc->model == 2)
806
                opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask);
807
        return 0;
808
}
809
 
810
static void opl3_close(int dev)
811
{
812
        devc->busy = 0;
813
        devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9;
814
 
815
        devc->fm_info.nr_drums = 0;
816
        devc->fm_info.perc_mode = 0;
817
 
818
        opl3_reset(dev);
819
}
820
 
821
static void opl3_hw_control(int dev, unsigned char *event)
822
{
823
}
824
 
825
static int opl3_load_patch(int dev, int format, const char *addr,
826
                int offs, int count, int pmgr_flag)
827
{
828
        struct sbi_instrument ins;
829
 
830
        if (count <sizeof(ins))
831
        {
832
                printk(KERN_WARNING "FM Error: Patch record too short\n");
833
                return -EINVAL;
834
        }
835
 
836
        if(copy_from_user(&((char *) &ins)[offs], &(addr)[offs], sizeof(ins) - offs))
837
                return -EFAULT;
838
 
839
        if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR)
840
        {
841
                printk(KERN_WARNING "FM Error: Invalid instrument number %d\n", ins.channel);
842
                return -EINVAL;
843
        }
844
        ins.key = format;
845
 
846
        return store_instr(ins.channel, &ins);
847
}
848
 
849
static void opl3_panning(int dev, int voice, int value)
850
{
851
        devc->voc[voice].panning = value;
852
}
853
 
854
static void opl3_volume_method(int dev, int mode)
855
{
856
}
857
 
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);}
863
 
864
static void opl3_aftertouch(int dev, int voice, int pressure)
865
{
866
        int tmp;
867
        struct sbi_instrument *instr;
868
        struct physical_voice_info *map;
869
 
870
        if (voice < 0 || voice >= devc->nr_voice)
871
                return;
872
 
873
        map = &pv_map[devc->lv_map[voice]];
874
 
875
        DEB(printk("Aftertouch %d\n", voice));
876
 
877
        if (map->voice_mode == 0)
878
                return;
879
 
880
        /*
881
         * Adjust the amount of vibrato depending the pressure
882
         */
883
 
884
        instr = devc->act_i[voice];
885
 
886
        if (!instr)
887
                instr = &devc->i_map[0];
888
 
889
        if (devc->voc[voice].mode == 4)
890
        {
891
                int connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01);
892
 
893
                switch (connection)
894
                {
895
                        case 0:
896
                                SET_VIBRATO(4);
897
                                break;
898
 
899
                        case 1:
900
                                SET_VIBRATO(2);
901
                                SET_VIBRATO(4);
902
                                break;
903
 
904
                        case 2:
905
                                SET_VIBRATO(1);
906
                                SET_VIBRATO(4);
907
                                break;
908
 
909
                        case 3:
910
                                SET_VIBRATO(1);
911
                                SET_VIBRATO(3);
912
                                SET_VIBRATO(4);
913
                                break;
914
 
915
                }
916
                /*
917
                 * Not implemented yet
918
                 */
919
        }
920
        else
921
        {
922
                SET_VIBRATO(1);
923
 
924
                if ((instr->operators[10] & 0x01))      /*
925
                                                         * Additive synthesis
926
                                                         */
927
                        SET_VIBRATO(2);
928
        }
929
}
930
 
931
#undef SET_VIBRATO
932
 
933
static void bend_pitch(int dev, int voice, int value)
934
{
935
        unsigned char data;
936
        int block, fnum, freq;
937
        struct physical_voice_info *map;
938
 
939
        map = &pv_map[devc->lv_map[voice]];
940
 
941
        if (map->voice_mode == 0)
942
                return;
943
 
944
        devc->voc[voice].bender = value;
945
        if (!value)
946
                return;
947
        if (!(devc->voc[voice].keyon_byte & 0x20))
948
                return; /*
949
                         * Not keyed on
950
                         */
951
 
952
        freq = compute_finetune(devc->voc[voice].orig_freq, devc->voc[voice].bender, devc->voc[voice].bender_range, 0);
953
        devc->voc[voice].current_freq = freq;
954
 
955
        freq_to_fnum(freq, &block, &fnum);
956
 
957
        data = fnum & 0xff;     /*
958
                                 * Least significant bits of fnumber
959
                                 */
960
        opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data);
961
 
962
        data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3);
963
        devc->voc[voice].keyon_byte = data;
964
        opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data);
965
}
966
 
967
static void opl3_controller (int dev, int voice, int ctrl_num, int value)
968
{
969
        if (voice < 0 || voice >= devc->nr_voice)
970
                return;
971
 
972
        switch (ctrl_num)
973
        {
974
                case CTRL_PITCH_BENDER:
975
                        bend_pitch(dev, voice, value);
976
                        break;
977
 
978
                case CTRL_PITCH_BENDER_RANGE:
979
                        devc->voc[voice].bender_range = value;
980
                        break;
981
 
982
                case CTL_MAIN_VOLUME:
983
                        devc->voc[voice].volume = value / 128;
984
                        break;
985
 
986
                case CTL_PAN:
987
                        devc->voc[voice].panning = (value * 2) - 128;
988
                        break;
989
        }
990
}
991
 
992
static void opl3_bender(int dev, int voice, int value)
993
{
994
        if (voice < 0 || voice >= devc->nr_voice)
995
                return;
996
 
997
        bend_pitch(dev, voice, value - 8192);
998
}
999
 
1000
static int opl3_alloc_voice(int dev, int chn, int note, struct voice_alloc_info *alloc)
1001
{
1002
        int i, p, best, first, avail, best_time = 0x7fffffff;
1003
        struct sbi_instrument *instr;
1004
        int is4op;
1005
        int instr_no;
1006
 
1007
        if (chn < 0 || chn > 15)
1008
                instr_no = 0;
1009
        else
1010
                instr_no = devc->chn_info[chn].pgm_num;
1011
 
1012
        instr = &devc->i_map[instr_no];
1013
        if (instr->channel < 0 ||        /* Instrument not loaded */
1014
                devc->nr_voice != 12)   /* Not in 4 OP mode */
1015
                is4op = 0;
1016
        else if (devc->nr_voice == 12)  /* 4 OP mode */
1017
                is4op = (instr->key == OPL3_PATCH);
1018
        else
1019
                is4op = 0;
1020
 
1021
        if (is4op)
1022
        {
1023
                first = p = 0;
1024
                avail = 6;
1025
        }
1026
        else
1027
        {
1028
                if (devc->nr_voice == 12)       /* 4 OP mode. Use the '2 OP only' operators first */
1029
                        first = p = 6;
1030
                else
1031
                        first = p = 0;
1032
                avail = devc->nr_voice;
1033
        }
1034
 
1035
        /*
1036
         *    Now try to find a free voice
1037
         */
1038
        best = first;
1039
 
1040
        for (i = 0; i < avail; i++)
1041
        {
1042
                if (alloc->map[p] == 0)
1043
                {
1044
                        return p;
1045
                }
1046
                if (alloc->alloc_times[p] < best_time)          /* Find oldest playing note */
1047
                {
1048
                        best_time = alloc->alloc_times[p];
1049
                        best = p;
1050
                }
1051
                p = (p + 1) % avail;
1052
        }
1053
 
1054
        /*
1055
         *    Insert some kind of priority mechanism here.
1056
         */
1057
 
1058
        if (best < 0)
1059
                best = 0;
1060
        if (best > devc->nr_voice)
1061
                best -= devc->nr_voice;
1062
 
1063
        return best;    /* All devc->voc in use. Select the first one. */
1064
}
1065
 
1066
static void opl3_setup_voice(int dev, int voice, int chn)
1067
{
1068
        struct channel_info *info =
1069
        &synth_devs[dev]->chn_info[chn];
1070
 
1071
        opl3_set_instr(dev, voice, info->pgm_num);
1072
 
1073
        devc->voc[voice].bender = 0;
1074
        devc->voc[voice].bender_range = info->bender_range;
1075
        devc->voc[voice].volume = info->controllers[CTL_MAIN_VOLUME];
1076
        devc->voc[voice].panning = (info->controllers[CTL_PAN] * 2) - 128;
1077
}
1078
 
1079
static struct synth_operations opl3_operations =
1080
{
1081
        owner:          THIS_MODULE,
1082
        id:             "OPL",
1083
        info:           NULL,
1084
        midi_dev:       0,
1085
        synth_type:     SYNTH_TYPE_FM,
1086
        synth_subtype:  FM_TYPE_ADLIB,
1087
        open:           opl3_open,
1088
        close:          opl3_close,
1089
        ioctl:          opl3_ioctl,
1090
        kill_note:      opl3_kill_note,
1091
        start_note:     opl3_start_note,
1092
        set_instr:      opl3_set_instr,
1093
        reset:          opl3_reset,
1094
        hw_control:     opl3_hw_control,
1095
        load_patch:     opl3_load_patch,
1096
        aftertouch:     opl3_aftertouch,
1097
        controller:     opl3_controller,
1098
        panning:        opl3_panning,
1099
        volume_method:  opl3_volume_method,
1100
        bender:         opl3_bender,
1101
        alloc_voice:    opl3_alloc_voice,
1102
        setup_voice:    opl3_setup_voice
1103
};
1104
 
1105
int opl3_init(int ioaddr, int *osp, struct module *owner)
1106
{
1107
        int i;
1108
        int me;
1109
 
1110
        if (devc == NULL)
1111
        {
1112
                printk(KERN_ERR "opl3: Device control structure not initialized.\n");
1113
                return -1;
1114
        }
1115
 
1116
        if ((me = sound_alloc_synthdev()) == -1)
1117
        {
1118
                printk(KERN_WARNING "opl3: Too many synthesizers\n");
1119
                return -1;
1120
        }
1121
 
1122
        devc->nr_voice = 9;
1123
 
1124
        devc->fm_info.device = 0;
1125
        devc->fm_info.synth_type = SYNTH_TYPE_FM;
1126
        devc->fm_info.synth_subtype = FM_TYPE_ADLIB;
1127
        devc->fm_info.perc_mode = 0;
1128
        devc->fm_info.nr_voices = 9;
1129
        devc->fm_info.nr_drums = 0;
1130
        devc->fm_info.instr_bank_size = SBFM_MAXINSTR;
1131
        devc->fm_info.capabilities = 0;
1132
        devc->left_io = ioaddr;
1133
        devc->right_io = ioaddr + 2;
1134
 
1135
        if (detected_model <= 2)
1136
                devc->model = 1;
1137
        else
1138
        {
1139
                devc->model = 2;
1140
                if (detected_model == 4)
1141
                        devc->is_opl4 = 1;
1142
        }
1143
 
1144
        opl3_operations.info = &devc->fm_info;
1145
 
1146
        synth_devs[me] = &opl3_operations;
1147
 
1148
        if (owner)
1149
                synth_devs[me]->owner = owner;
1150
 
1151
        sequencer_init();
1152
        devc->v_alloc = &opl3_operations.alloc;
1153
        devc->chn_info = &opl3_operations.chn_info[0];
1154
 
1155
        if (devc->model == 2)
1156
        {
1157
                if (devc->is_opl4)
1158
                        strcpy(devc->fm_info.name, "Yamaha OPL4/OPL3 FM");
1159
                else
1160
                        strcpy(devc->fm_info.name, "Yamaha OPL3");
1161
 
1162
                devc->v_alloc->max_voice = devc->nr_voice = 18;
1163
                devc->fm_info.nr_drums = 0;
1164
                devc->fm_info.synth_subtype = FM_TYPE_OPL3;
1165
                devc->fm_info.capabilities |= SYNTH_CAP_OPL3;
1166
 
1167
                for (i = 0; i < 18; i++)
1168
                {
1169
                        if (pv_map[i].ioaddr == USE_LEFT)
1170
                                pv_map[i].ioaddr = devc->left_io;
1171
                        else
1172
                                pv_map[i].ioaddr = devc->right_io;
1173
                }
1174
                opl3_command(devc->right_io, OPL3_MODE_REGISTER, OPL3_ENABLE);
1175
                opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x00);
1176
        }
1177
        else
1178
        {
1179
                strcpy(devc->fm_info.name, "Yamaha OPL2");
1180
                devc->v_alloc->max_voice = devc->nr_voice = 9;
1181
                devc->fm_info.nr_drums = 0;
1182
 
1183
                for (i = 0; i < 18; i++)
1184
                        pv_map[i].ioaddr = devc->left_io;
1185
        };
1186
        conf_printf2(devc->fm_info.name, ioaddr, 0, -1, -1);
1187
 
1188
        for (i = 0; i < SBFM_MAXINSTR; i++)
1189
                devc->i_map[i].channel = -1;
1190
 
1191
        return me;
1192
}
1193
 
1194
EXPORT_SYMBOL(opl3_init);
1195
EXPORT_SYMBOL(opl3_detect);
1196
 
1197
static int me;
1198
 
1199
static int io = -1;
1200
 
1201
MODULE_PARM(io, "i");
1202
 
1203
static int __init init_opl3 (void)
1204
{
1205
        printk(KERN_INFO "YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1996\n");
1206
 
1207
        if (io != -1)   /* User loading pure OPL3 module */
1208
        {
1209
                if (!opl3_detect(io, NULL))
1210
                {
1211
                        return -ENODEV;
1212
                }
1213
 
1214
                me = opl3_init(io, NULL, THIS_MODULE);
1215
        }
1216
 
1217
        return 0;
1218
}
1219
 
1220
static void __exit cleanup_opl3(void)
1221
{
1222
        if (devc && io != -1)
1223
        {
1224
                if (devc->base) {
1225
                        release_region(devc->base,4);
1226
                        if (devc->is_opl4)
1227
                                release_region(devc->base - 8, 2);
1228
                }
1229
                kfree(devc);
1230
                devc = NULL;
1231
                sound_unload_synthdev(me);
1232
        }
1233
}
1234
 
1235
module_init(init_opl3);
1236
module_exit(cleanup_opl3);
1237
 
1238
#ifndef MODULE
1239
static int __init setup_opl3(char *str)
1240
{
1241
        /* io  */
1242
        int ints[2];
1243
 
1244
        str = get_options(str, ARRAY_SIZE(ints), ints);
1245
 
1246
        io = ints[1];
1247
 
1248
        return 1;
1249
}
1250
 
1251
__setup("opl3=", setup_opl3);
1252
#endif
1253
MODULE_LICENSE("GPL");

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.