diff options
Diffstat (limited to 'nuttx/include')
-rw-r--r-- | nuttx/include/debug.h | 32 | ||||
-rw-r--r-- | nuttx/include/nuttx/audio.h | 462 | ||||
-rw-r--r-- | nuttx/include/nuttx/fs/ioctl.h | 7 |
3 files changed, 501 insertions, 0 deletions
diff --git a/nuttx/include/debug.h b/nuttx/include/debug.h index 70ae2ee18..97b7ed798 100644 --- a/nuttx/include/debug.h +++ b/nuttx/include/debug.h @@ -284,6 +284,18 @@ # define lllvdbg(x...) #endif +#ifdef CONFIG_DEBUG_AUDIO +# define auddbg(format, arg...) dbg(format, ##arg) +# define audlldbg(format, arg...) lldbg(format, ##arg) +# define audvdbg(format, arg...) vdbg(format, ##arg) +# define audllvdbg(format, arg...) llvdbg(format, ##arg) +#else +# define auddbg(x...) +# define audlldbg(x...) +# define audvdbg(x...) +# define audllvdbg(x...) +#endif + #else /* CONFIG_CPP_HAVE_VARARGS */ /* Variable argument macros NOT supported */ @@ -453,6 +465,18 @@ # define lllvdbg (void) #endif +#ifdef CONFIG_DEBUG_AUDIO +# define auddbg dbg +# define audlldbg lldbg +# define audvdbg vdbg +# define audllvdbg llvdbg +#else +# define auddbg (void) +# define audlldbg (void) +# define audvdbg (void) +# define audllvdbg (void) +#endif + #endif /* CONFIG_CPP_HAVE_VARARGS */ /* Buffer dumping macros do not depend on varargs */ @@ -559,6 +583,14 @@ # define lvdbgdumpbuffer(m,b,n) #endif +#ifdef CONFIG_DEBUG_AUDIO +# define auddbgdumpbuffer(m,b,n) dbgdumpbuffer(m,b,n) +# define audvdbgdumpbuffer(m,b,n) vdbgdumpbuffer(m,b,n) +#else +# define auddbgdumpbuffer(m,b,n) +# define audvdbgdumpbuffer(m,b,n) +#endif + /**************************************************************************** * Public Type Declarations ****************************************************************************/ diff --git a/nuttx/include/nuttx/audio.h b/nuttx/include/nuttx/audio.h new file mode 100644 index 000000000..1e6464adc --- /dev/null +++ b/nuttx/include/nuttx/audio.h @@ -0,0 +1,462 @@ +/**************************************************************************** + * include/nuttx/audio.h + * + * Copyright (C) 2013 Ken Pettit. All rights reserved. + * Author: Ken Pettit <pettitkd@gmail.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 + * COPYRIGHT OWNER OR CONTRIBUTORS 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. + * + ****************************************************************************/ + +#ifndef __INCLUDE_NUTTX_AUDIO_H +#define __INCLUDE_NUTTX_AUDIO_H + +/* For the purposes of this driver, an Audio device is any device that + * generates, records, mixes, or otherwise modifies audio data in any format, + * such as PCM, MP3, AAC, etc. + * + * The Audio driver is split into two parts: + * + * 1) An "upper half", generic driver that provides the comman Audio interface + * to application level code, and + * 2) A "lower half", platform-specific driver that implements the low-level + * controls to configure and communicate with the audio device(s). + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <nuttx/compiler.h> + +#include <nuttx/fs/ioctl.h> + +#ifdef CONFIG_AUDIO + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ +/* Configuration ************************************************************/ +/* CONFIG_AUDIO - Enables Audio driver support + * CONFIG_DEBUG_AUDIO - If enabled (with CONFIG_DEBUG and, optionally, + * CONFIG_DEBUG_VERBOSE), this will generate output that can be used to + * debug Audio drivers. + */ + +/* IOCTL Commands ***********************************************************/ +/* The Audio module uses a standard character driver framework. However, a + * lot of the Audio driver functionality is configured via a device control + * interface, such as sampling rate, volume, data format, etc. + * The Audio ioctl commands are lised below: + * + * AUDIOIOC_GETCAPS - Get the Audio Device Capabilities + * + * ioctl argument: Pointer to the audio_caps_s structure to receive the + * capabilities info. The "len" and "type" fields should + * be filled in prior to calling this ioctl. To get + * overall capabilities, specify the type as + * AUDIO_TYPE_QUERY, otherwise specify any type that was + * reported by the device during the QUERY. + * + * AUDIOIOC_CONFIGURE - Configure device for the specified mode + * + * ioctl argument: Pointer to the audio_caps_s structure which identifies + * the capabilities to configure for. + * + * AUDIOIOC_SHUTDOWN - Shutdown the device. + * + * ioctl argument: None + * + * AUDIOIOC_START - Start Audio streaming + * + * ioctl argument: None + * + * AUDIOIOC_STOP - Stop Audio streaming + * + * ioctl argument: None + */ + +#define AUDIOIOC_GETCAPS _AUDIOIOC(1) +#define AUDIOIOC_CONFIGURE _AUDIOIOC(2) +#define AUDIOIOC_SHUTDOWN _AUDIOIOC(3) +#define AUDIOIOC_START _AUDIOIOC(4) +#define AUDIOIOC_STOP _AUDIOIOC(5) + +/* Audio Device Types *******************************************************/ +/* The NuttX audio interface support different types of audio devices for + * input, output, synthesis, and manupulation of audio data. A given driver/ + * device could support a combination of these device type. The following + * is a list of bit-field definitons for defining the device type. + */ + +#define AUDIO_TYPE_QUERY 0x0000 +#define AUDIO_TYPE_INPUT 0x0002 +#define AUDIO_TYPE_OUTPUT 0x0004 +#define AUDIO_TYPE_MIXER 0x0008 +#define AUDIO_TYPE_SELECTOR 0x0010 +#define AUDIO_TYPE_FEATURE 0x0020 +#define AUDIO_TYPE_EFFECT 0x0040 +#define AUDIO_TYPE_PROCESSING 0x0080 +#define AUDIO_TYPE_EXTENSION 0x0100 + +/* Audio Format Types *******************************************************/ +/* The following defines the audio data format types in NuttX. */ + +#define AUDIO_FMT_UNDEF 0x00 +#define AUDIO_FMT_OTHER 0x01 +#define AUDIO_FMT_MPEG 0x02 +#define AUDIO_FMT_AC3 0x03 +#define AUDIO_FMT_WMA 0x04 +#define AUDIO_FMT_DTS 0x05 +#define AUDIO_FMT_PCM 0x06 +#define AUDIO_FMT_MP3 0x07 +#define AUDIO_FMT_MIDI 0x08 +#define AUDIO_FMT_OGG_VORBIS 0x09 + +/* Audio Sub-Format Types ***************************************************/ + +#define AUDIO_SUBFMT_PCM_MP1 0x01 +#define AUDIO_SUBFMT_PCM_MP2 0x02 +#define AUDIO_SUBFMT_PCM_MP3 0x03 +#define AUDIO_SUBFMT_PCM_MU_LAW 0x04 +#define AUDIO_SUBFMT_PCM_A_LAW 0x05 +#define AUDIO_SUBFMT_PCM_U8 0x06 +#define AUDIO_SUBFMT_PCM_S8 0x07 +#define AUDIO_SUBFMT_PCM_U16_LE 0x08 +#define AUDIO_SUBFMT_PCM_S16_BE 0x09 +#define AUDIO_SUBFMT_PCM_S16_LE 0x0A +#define AUDIO_SUBFMT_PCM_U16_BE 0x0B + +/* Supported Sampling Rates *************************************************/ + +#define AUDIO_RATE_22K 0x01 +#define AUDIO_RATE_44K 0x02 +#define AUDIO_RATE_48K 0x03 +#define AUDIO_RATE_96K 0x04 +#define AUDIO_RATE_128K 0x05 +#define AUDIO_RATE_160K 0x06 +#define AUDIO_RATE_172K 0x07 +#define AUDIO_RATE_192K 0x08 +#define AUDIO_RATE_320K 0x09 + +/* Audio Pipeline Buffer (AP Buffer) flags **********************************/ + +#define AUDIO_ABP_ALIGNMENT 0x000F /* Mask to define buffer alignment */ +#define AUDIO_ABP_CANDMA 0x0010 /* Set if the data is DMA'able */ +#define AUDIO_ABP_STATIC 0x0020 /* Set if statically allocated */ +#define AUDIO_ABP_ACTIVE 0x0040 /* Set if this buffer is still active. + * A buffer could become inactive + * if it is processed by an output + * device or a processing device + * that replaces it with an alternate + * buffer as a result of some DSP + * operation, etc. + */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/* Define the size of AP Buffer sample count base on CONFIG */ + +#ifdef CONFIG_AUDIO_LARGE_BUFFERS +typedef uint32_t apb_samp_t; +#else +typedef uint16_t apb_samp_t; +#endif + +/* This structure is used to describe the audio device capabilities */ + +struct audio_caps_s +{ + uint8_t ac_len; /* Length of the structure */ + uint8_t ac_type; /* Capabilities (device) type */ + uint8_t ac_subtype; /* Capabilities sub-type, if needed */ + uint8_t ac_channels; /* Number of channels (1, 2, 5, 7) */ + uint8_t ac_format[2]; /* Audio data format(s) for this device */ + uint8_t ac_controls[4]; /* Device specific controls. For AUDIO_DEVICE_QUERY, + * this field reports the device type supported + * by this lower-half driver. */ +}; + +/* This structure describes the characteristics of the Audio samples */ + +struct audio_info_s +{ + uint8_t samplerate; /* Sample Rate of the audio data */ + uint8_t channels; /* Number of channels (1, 2, 5, 7) */ + uint8_t format; /* Audio data format */ + uint8_t subformat; /* Audio subformat (maybe should be combined with format? */ +}; + +/* This structure describes an Audio Pipeline Buffer */ + +struct ap_buffer_s +{ + struct audio_info_s i; /* The info for samples in this buffer */ + apb_samp_t nmaxsamples;/* The maximum number of samples */ + apb_samp_t nsamples; /* The number of samples used */ + uint16_t flags; /* Buffer flags */ + uint8_t samp[0]; /* Offset of the first sample */ +} packed_struct; + +/* This structure is a set a callback functions used to call from the upper- + * half, generic Audo driver into lower-half, platform-specific logic that + * supports the low-level functionality. + */ + +struct audio_lowerhalf_s; +struct audio_ops_s +{ + /* This method is called to retrieve the lower-half device capabilities. + * It will be called with device type AUDIO_TYPE_QUERY to request the + * overall capabilities, such as to determine the types of devices supported + * audio formats supported, etc. Then it may be called once or more with + * reported supported device types to determine the specific capabilities + * of that device type (such as MP3 encoder, WMA encoder, PCM output, etc.). + */ + + CODE int (*getcaps)(FAR struct audio_lowerhalf_s *dev, int type, + FAR struct audio_caps_s *pCaps); + + /* This method is called to configure the driver for a specific mode of + * operation defined by the parameters selected in supplied device caps + * strucure. The lower-level device should perform any initialization + * needed to prepare for operations in the specified mode. It should not, + * however, process any audio data until the start method is called. + */ + + CODE int (*configure)(FAR struct audio_lowerhalf_s *dev, + FAR const struct audio_caps_s *pCaps); + + /* This method is called when the driver is closed. The lower half driver + * should stop processing audio data, including terminating any active + * output generation. It should also disable the audio hardware and put + * it into the lowest possible power usage state. + * + * Any enqueued Audio Pipeline Buffers that have not been processed / dequeued + * should be dequeued by this function. + */ + + CODE int (*shutdown)(FAR struct audio_lowerhalf_s *dev); + + /* Start audio streaming in the configured mode. For input and synthesis + * devices, this means it should begin sending streaming audio data. For output + * or processing type device, it means it should begin processing of any enqueued + * Audio Pipline Buffers. + */ + + CODE int (*start)(FAR struct audio_lowerhalf_s *dev); + + /* Stop audio streaming and/or processing of enqueued Audio Pipeline Buffers */ + + CODE int (*stop)(FAR struct audio_lowerhalf_s *dev); + + /* Enqueue a buffer for processing. This is a non-blocking enqueue operation. + * If the lower-half driver's buffer queue is full, then it should return an + * error code of -ENOMEM, and the upper-half driver can decide to either block + * the calling thread or deal with it in a non-blocking manner. + + * For each call to enqueuebuffer, the lower-half driver must call + * audio_dequeuebuffer when it is finished processing the bufferr, passing the + * previously enqueued apb and a dequeue status so that the upper-half driver + * can decide if a waiting thread needs to be release, if the dequeued buffer + * should be passed to the next block in the Audio Pipeline, etc. + */ + + CODE int (*enqueuebuffer)(FAR struct audio_lowerhalf_s *dev, + FAR struct ap_buffer_s *apb); + + /* Lower-half logic may support platform-specific ioctl commands */ + + CODE int (*ioctl)(FAR struct audio_lowerhalf_s *dev, + int cmd, unsigned long arg); +}; + +/* This structure is the generic form of state structure used by lower half + * Audio driver. This state structure is passed to the Audio driver when the + * driver is initialized. Then, on subsequent callbacks into the lower half + * Audio logic, this structure is provided so that the Audio logic can + * maintain state information. + * + * Normally that Audio logic will have its own, custom state structure + * that is simply cast to struct audio_lowerhalf_s. In order to perform such + * casts, the initial fields of the custom state structure match the initial + * fields of the following generic Audio state structure. + */ + +struct audio_lowerhalf_s +{ + /* The first field of this state structure must be a pointer to the Audio + * callback structure: + */ + + FAR const struct audio_ops_s *ops; + + /* The custom Audio device state structure may include additional fields + * after the pointer to the Audio callback structure. + */ +}; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" { +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * "Upper-Half" Audio Driver Interfaces + ****************************************************************************/ +/**************************************************************************** + * Name: audio_register + * + * Description: + * This function binds an instance of a "lower half" Audio driver with the + * "upper half" Audio device and registers that device so that can be used + * by application code. + * + * When this function is called, the "lower half" driver should be in the + * reset state (as if the shutdown() method had already been called). + * + * Input parameters: + * name - The name of the audio device. This name will be used to generate + * a full path to the driver in the format "/dev/audio/[name]" in the NuttX + * filesystem (i.e. the path "/dev/audio" will be prepended to the supplied + * device name. The recommended convention is to name Audio drivers + * based on the type of functionality they provide, such as "/dev/audio/pcm0", + * "/dev/audio/midi0", "/dev/audio/mp30, etc. + * dev - A pointer to an instance of lower half audio driver. This instance + * is bound to the Audio driver and must persists as long as the driver + * persists. + * + * Returned Value: + * Zero on success; a negated errno value on failure. + * + ****************************************************************************/ + +EXTERN int audio_register(FAR const char *name, FAR struct audio_lowerhalf_s *dev); + +/**************************************************************************** + * Name: abp_alloc + * + * Description: + * Allocated an AP Buffer and prepares it for use. This allocates a dynamically + * allocated buffer that has no special DMA capabilities. If a static buffer + * or a buffer with DMA ability is needed, then it must be allocated manually + * and then call apb_prepare, passing it the allocated memory. + * + * Input parameters: + * + * Returned Value: + * Pointer to the allocated buffer or NULL if no memory. + * + ****************************************************************************/ + +FAR struct ap_buffer_s *apb_alloc(int type, int sampleCount); + +/**************************************************************************** + * Name: abp_prepare + * + * Description: + * Prepare a pre-allocated AP Buffer for use in the Audio Pipeline. + * + * Input parameters: + * apb - The pre-allocated AP Buffer + * size - The size of the pre-allocated buffer (for verification) + * allocmode - Indicates if the buffer is static or dynamic memory + * format - The format of samples to be used in the buffer + * subformat - The sub-format of samples + * maxsamples - The size, in samples, of the buffer + * + * Returned Value: + * None + * + ****************************************************************************/ + +EXTERN void apb_prepare(struct ap_buffer_s *apb, int8_t allocmode, uint8_t format, + uint8_t subformat, apb_samp_t maxsamples); + +/**************************************************************************** + * Name: apb_free + * + * Free's a previously allocated or referenced Audio Pipeline Buffer + * + ****************************************************************************/ + +EXTERN void apb_free(FAR struct ap_buffer_s *apb); + +/**************************************************************************** + * Name: apb_reference + * + * Claim a reference to an Audio Pipeline Buffer. Each call to apb_reference + * will increment the reference count and must have a matching apb_free + * call. When the refcount decrements to zero, the buffer will be freed. + * + ****************************************************************************/ + +EXTERN void apb_reference(FAR struct ap_buffer_s *apb); + +/**************************************************************************** + * Platform-Dependent "Lower-Half" Audio Driver Interfaces + ****************************************************************************/ + +/**************************************************************************** + * Name: vs1053_initialize + * + * Description: + * This function initializes the driver for the VS1053 codec chip + * + * Input parameters: + * spi - This is a placeholder for now. Actual init parameters will be + * determined once the audio interface is "finalized". + * + * Returned Value: + * Zero on success; a negated errno value on failure. + * + ****************************************************************************/ +#ifdef CONFIG_VS1053 +EXTERN FAR struct audio_lowerhalf_s *vs1053_initialize(int spidevice); +#endif + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* CONFIG_AUDIO */ +#endif /* __INCLUDE_NUTTX_AUDIO_H */ diff --git a/nuttx/include/nuttx/fs/ioctl.h b/nuttx/include/nuttx/fs/ioctl.h index bd80a7150..1e44729af 100644 --- a/nuttx/include/nuttx/fs/ioctl.h +++ b/nuttx/include/nuttx/fs/ioctl.h @@ -66,6 +66,7 @@ #define _CAIOCBASE (0x0d00) /* CDC/ACM ioctl commands */ #define _BATIOCBASE (0x0e00) /* Battery driver ioctl commands */ #define _QEIOCBASE (0x0f00) /* Quadrature encoder ioctl commands */ +#define _AUDIOIOCBASE (0x1000) /* Audio ioctl commands */ /* Macros used to manage ioctl commands */ @@ -232,6 +233,12 @@ #define _QEIOCVALID(c) (_IOC_TYPE(c)==_QEIOCBASE) #define _QEIOC(nr) _IOC(_QEIOCBASE,nr) +/* NuttX Audio driver ioctol definitions ***********************/ +/* (see nuttx/audio/audio.h) */ + +#define _AUDIOIOCVALID(c) (_IOC_TYPE(c)==_AUDIOIOCBASE) +#define _AUDIOIOC(nr) _IOC(_AUDIOIOCBASE,nr) + /**************************************************************************** * Public Type Definitions ****************************************************************************/ |