HelenOS sources

root/uspace/drv/audio/sb16/dsp_commands.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. mode_to_str

/*
 * Copyright (c) 2011 Jan Vesely
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - The name of the author may not be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/** @addtogroup drvaudiosb16
 * @{
 */
/** @file
 * @brief SB16 DSP Command constants
 */
#ifndef DRV_AUDIO_SB16_DSP_COMMANDS_H
#define DRV_AUDIO_SB16_DSP_COMMANDS_H

/** See Sound Blaster Series HW programming Guide Chapter 6. */
typedef enum dsp_command {
        /*
         * Followed by unsigned byte of digital data,
         * software controls sampling rate
         */
        DIRECT_8B_OUTPUT = 0x10,
        /* Same as DIRECT_8B_OUTPUT but for input */
        DIRECT_8B_INPUT = 0x20,

        /*
         * Followed by time constant.
         * TC = 65536 - (256 000 000 /
         *   (channels * sampling rate))
         * Send only high byte
         */
        TRANSFER_TIME_CONSTANT = 0x40,

        /*
         * Followed by length.high and length.low
         * starts single-cycle DMA, length is -1
         */
        SINGLE_DMA_8B_OUTPUT = 0x14,
        /*
         * Same as SINGLE_DMA_8B_OUTPUT, but for
         * input
         */
        SINGLE_DMA_8B_INPUT = 0x24,
        /*
         * Starts single-cycle DMA using
         * Creative ADPSM 8->2 bit compressed
         * data, Followed by length.low
         * and length.high. Length is -1
         */
        SINGLE_DMA_8B_ADPCM_2B_OUT = 0x16,
        /*
         * Starts single-cycle DMA using
         * DPSM 8->2 bit compressed data
         * with reference byte.
         * Followed by length.low and
         * length.high. Length is -1
         */
        SINGLE_DMA_8B_ADPCM_2B_OUT_REF = 0x17,
        /*
         * Same as
         * SINGLE_DMA_8B_ADPCM_2B_OUT
         */
        SINGLE_DMA_8B_ADPCM_4B_OUT = 0x74,
        /*
         * Same as
         * SINGLE_DMA_8B_ADPCM_2B_OUT_REF
         */
        SINGLE_DMA_8B_ADPCM_4B_OUT_REF = 0x75,
        /*
         * Same as
         * SINGLE_DMA_8B_ADPCM_2B_OUT
         */
        SINGLE_DMA_8B_ADPCM_3B_OUT = 0x76,
        /*
         * Same as
         * SINGLE_DMA_8B_ADPCM_2B_OUT_REF
         */
        SINGLE_DMA_8B_ADPCM_3B_OUT_REF = 0x77,
        /*
         * Stop sending DMA request,
         * works for SINGLE and AUTO
         */
        DMA_8B_PAUSE = 0xd0,
        /* Resume transfers paused by DMA_8B_PAUSE */
        DMA_8B_CONTINUE = 0xd4,

        /*
         * Connect speaker via internal amplifier,
         * has no effect on 4.xx
         */
        SPEAKER_ON = 0xd1,
        /*
         * Disconnect output from the amplifier,
         * has no effect on 4.xx
         */
        SPEAKER_OFF = 0xd3,

        /* Read DSP for MIDI data */
        MIDI_POLLING = 0x30,
        /*
         * Start interrupt mode, interrupt will be
         * generated when there is in-bound data.
         * To exit send again
         */
        MIDI_INTERRUPT = 0x31,
        /* Followed by midi_data */
        MIDI_OUTPUT = 0x38,

        /*
         * Followed by duration.low, duration.high. Duration is -1
         * In the units of sampling period. Generates interrupt
         * at the end of period
         */
        PAUSE = 0x80,
        /* Read 2 bytes, major and minor number */
        DSP_VERSION = 0xe1,

        /*
         * Starts auto-init DMA mode using 8-bit
         * Interrupt after every block.
         * To terminate, switch to single or use
         * EXIT command
         */
        AUTO_DMA_8B_OUTPUT = 0x1c,
        /* Same as AUTO_DMA_8B_OUTPUT, but for input */
        AUTO_DMA_8B_INPUT = 0x2c,
        /*
         * Same as AUTO_DMA_8B_OUTPUT, but use
         * 8->2bit ADPCM audio format
         */
        AUTO_DMA_8B_ADPCM_2B_REF = 0x1f,
        /* Same as AUTO_DMA_8B_ADPCM_2B_REF */
        AUTO_DMA_8B_ADPCM_4B_REF = 0x7d,
        /* Same as AUTO_DMA_8B_ADPCM_2B_REF */
        AUTO_DMA_8B_ADPCM_3B_REF = 0x7f,

        /* Ends DMA transfer and terminates I/O process */
        DMA_8B_EXIT = 0xda,

        /*
         * Followed by size.low, size.high
         * Used with HIGH_SPEED AUTO_DMA
         */
        BLOCK_TRANSFER_SIZE = 0x48,
        /*
         * Start UART MIDI polling mode, read and
         * write from/to DSP is interpreted as
         * read/write from/to MIDI.
         * To exit use reset signal. Note that reset
         * will restore previous state and won't do
         * complete reset
         */
        UART_MIDI_POLLING = 0x34,
        /*
         * Same as UART_MIDI_POLLING, but use
         * interrupts instead of polling.
         */
        UART_MIDI_INTERRUPT = 0x35,
        /*
         * Add time stamp to inbound data, the
         * order is time.low time.mid time.high
         * data
         */
        UART_MIDI_POLLING_TS = 0x36,
        /*
         * Same as UART_MIDI_POLLING_TS, but use
         * interrupts instead of polling
         */
        UART_MIDI_INTERRUPT_TS = 0x37,

        /* 0xff means amp is on, 0x00 means it's off */
        SPEAKER_STATUS = 0xd8,

        /*
         * DSP will generate interrupt after
         * every block. No other commands are
         * accepted in this mode. To exit
         * the mode send RESET command.
         * Note that reset will restore
         * previous state.
         */
        AUTO_DMA_8B_HIGH_OUTPUT = 0x90,
        /* Same as AUTO_DMA_8B_HIGH_OUTPUT */
        AUTO_DMA_8B_HIGH_INPUT = 0x98,
        /*
         * Transfer one block and exit,
         * generates interrupt
         */
        SINGLE_DMA_8B_HIGH_OUTPUT = 0x91,
        /* Same as SINGLE_DMA_8B_HIGH_OUTPUT */
        SINGLE_DMA_8B_HIGH_INPUT = 0x99,

        /* Mono mode is the default, only on 3.xx */
        SET_MONO_INPUT = 0xa0,
        /* Switch to stereo recording, only on 3.xx */
        SET_STEREO_INPUT = 0xa8,

        /*
         * Followed by sapling rate
         * 5000 to 45000 Hz, inclusive
         */
        SET_SAMPLING_RATE_OUTPUT = 0x41,
        /* Same as SET_SAMPLING_RATE_OUTPUT */
        SET_SAMPLING_RATE_INPUT = 0x42,

        /*
         * Followed by mode, size.low, size.high
         * mode format is:
         *    0x00 - unsigned mono
         *    0x10 - signed mono
         *    0x20 - unsigned stereo
         *    0x30 - signed stereo
         * Size is -1. Terminate AUTO_DMA by EXIT
         * or switch to SINGLE_DMA
         */
        SINGLE_DMA_16B_DA = 0xb0,
        SINGLE_DMA_16B_DA_FIFO = 0xb2,
        AUTO_DMA_16B_DA = 0xb4,
        AUTO_DMA_16B_DA_FIFO = 0xb6,
        SINGLE_DMA_16B_AD = 0xb8,
        SINGLE_DMA_16B_AD_FIFO = 0xba,
        AUTO_DMA_16B_AD = 0xbc,
        AUTO_DMA_16B_AD_FIFO = 0xbe,

        /*
         * Followed by mode, size.low, size.high
         * mode format is:
         *    0x00 - unsigned mono
         *    0x10 - signed mono
         *    0x20 - unsigned stereo
         *    0x30 - signed stereo
         * Size is -1. Terminate AUTO_DMA by EXIT
         * or switch to SINGLE_DMA
         */
        SINGLE_DMA_8B_DA = 0xc0,
        SINGLE_DMA_8B_DA_FIFO = 0xc2,
        AUTO_DMA_8B_DA = 0xc4,
        AUTO_DMA_8B_DA_FIFO = 0xc6,
        SINGLE_DMA_8B_AD = 0xc8,
        SINGLE_DMA_8B_AD_FIFO = 0xca,
        AUTO_DMA_8B_AD = 0xcc,
        AUTO_DMA_8B_AD_FIFO = 0xce,

        /* Stop sending DMA request, both SINGLE and AUTO */
        DMA_16B_PAUSE = 0xd5,
        /* Resume requests paused by DMA_16B_PAUSE */
        DMA_16B_CONTINUE = 0xd6,
        /* Ends DMA transfer and terminates I/O process */
        DMA_16B_EXIT = 0xd9,
} dsp_command_t;

#define DSP_MODE_SIGNED 0x10
#define DSP_MODE_STEREO 0x20

static inline const char *mode_to_str(uint8_t mode)
{
        if (mode & 0xcf)
                return "unknown";
        static const char *names[] = {
                "unsigned mono (8bit)",
                "signed mono (16bit)",
                "unsigned stereo (8bit)",
                "signed stereo (16bit)",
        };
        return names[mode >> 4];
}

#endif
/**
 * @}
 */

/* [<][>][^][v][top][bottom][index][help] */
HelenOS homepage, sources at GitHub