/*
* 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
/**
* @}
*/