linux/arch/m68k/atari/atasound.c
<<
>>
Prefs
   1/*
   2 * linux/arch/m68k/atari/atasound.c
   3 *
   4 * ++Geert: Moved almost all stuff to linux/drivers/sound/
   5 *
   6 * The author of atari_nosound, atari_mksound and atari_microwire_cmd is
   7 * unknown. (++roman: That's me... :-)
   8 *
   9 * This file is subject to the terms and conditions of the GNU General Public
  10 * License.  See the file COPYING in the main directory of this archive
  11 * for more details.
  12 *
  13 * 1998-05-31 ++andreas: atari_mksound rewritten to always use the envelope,
  14 *                       no timer, atari_nosound removed.
  15 *
  16 */
  17
  18
  19#include <linux/sched.h>
  20#include <linux/timer.h>
  21#include <linux/major.h>
  22#include <linux/fcntl.h>
  23#include <linux/errno.h>
  24#include <linux/mm.h>
  25#include <linux/module.h>
  26
  27#include <asm/atarihw.h>
  28#include <asm/irq.h>
  29#include <asm/atariints.h>
  30
  31
  32/*
  33 * stuff from the old atasound.c
  34 */
  35
  36void atari_microwire_cmd (int cmd)
  37{
  38        tt_microwire.mask = 0x7ff;
  39        tt_microwire.data = MW_LM1992_ADDR | cmd;
  40
  41        /* Busy wait for data being completely sent :-( */
  42        while( tt_microwire.mask != 0x7ff)
  43                ;
  44}
  45EXPORT_SYMBOL(atari_microwire_cmd);
  46
  47
  48/* PSG base frequency */
  49#define PSG_FREQ        125000
  50/* PSG envelope base frequency times 10 */
  51#define PSG_ENV_FREQ_10 78125
  52
  53void atari_mksound (unsigned int hz, unsigned int ticks)
  54{
  55        /* Generates sound of some frequency for some number of clock
  56           ticks.  */
  57        unsigned long flags;
  58        unsigned char tmp;
  59        int period;
  60
  61        local_irq_save(flags);
  62
  63
  64        /* Disable generator A in mixer control.  */
  65        sound_ym.rd_data_reg_sel = 7;
  66        tmp = sound_ym.rd_data_reg_sel;
  67        tmp |= 011;
  68        sound_ym.wd_data = tmp;
  69
  70        if (hz) {
  71            /* Convert from frequency value to PSG period value (base
  72               frequency 125 kHz).  */
  73
  74            period = PSG_FREQ / hz;
  75
  76            if (period > 0xfff) period = 0xfff;
  77
  78        /* Set generator A frequency to hz.  */
  79        sound_ym.rd_data_reg_sel = 0;
  80        sound_ym.wd_data = period & 0xff;
  81        sound_ym.rd_data_reg_sel = 1;
  82        sound_ym.wd_data = (period >> 8) & 0xf;
  83        if (ticks) {
  84                /* Set length of envelope (max 8 sec).  */
  85                int length = (ticks * PSG_ENV_FREQ_10) / HZ / 10;
  86
  87                if (length > 0xffff) length = 0xffff;
  88                sound_ym.rd_data_reg_sel = 11;
  89                sound_ym.wd_data = length & 0xff;
  90                sound_ym.rd_data_reg_sel = 12;
  91                sound_ym.wd_data = length >> 8;
  92                /* Envelope form: max -> min single.  */
  93                sound_ym.rd_data_reg_sel = 13;
  94                sound_ym.wd_data = 0;
  95                /* Use envelope for generator A.  */
  96                sound_ym.rd_data_reg_sel = 8;
  97                sound_ym.wd_data = 0x10;
  98        } else {
  99                /* Set generator A level to maximum, no envelope.  */
 100                sound_ym.rd_data_reg_sel = 8;
 101                sound_ym.wd_data = 15;
 102        }
 103        /* Turn on generator A in mixer control.  */
 104        sound_ym.rd_data_reg_sel = 7;
 105        tmp &= ~1;
 106        sound_ym.wd_data = tmp;
 107        }
 108        local_irq_restore(flags);
 109}
 110