sdk-hwV1.3/lichee/linux-4.9/include/sound/aw_rpaf/common.h

345 lines
9.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* linux/sound/aw_rpaf/common.h -- Remote Process Audio Framework Layer
*
* (C) Copyright 2019-2025
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
* yumingfeng <yumingfeng@allwinnertech.com>
*
* some simple description for this code
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
*/
#ifndef _AW_RPAF_COMMON_H_
#define _AW_RPAF_COMMON_H_
#define SRAM_PCM_CACHE_QUEUE 16U
#define DSP_SOUND_CARDS 4U
#include <uapi/sound/asound.h>
#include <sound/soc.h>
#include <sound/soc-dai.h>
#include <sound/soc-topology.h>
static const char *const awrpaf_info_pre = "AWRPAF_INFO";
static const char *const awrpaf_debug_pre = "AWRPAF_DEBUG";
static const char *const awrpaf_err_pre = "AWRPAF_ERR";
#if 0
#define awrpaf_info(fmt, ...) \
printk(KERN_INFO pr_fmt("[%s][%s:%d]"fmt), \
awrpaf_info_pre, __func__, __LINE__, ##__VA_ARGS__)
#else
#define awrpaf_info(fmt, ...)
#endif
#if 0
#define awrpaf_debug(fmt, ...) \
printk(KERN_DEBUG pr_fmt("[%s][%s:%d]"fmt), \
awrpaf_debug_pre, __func__, __LINE__, ##__VA_ARGS__)
#else
#define awrpaf_debug(fmt, ...)
#endif
#define awrpaf_err(fmt, ...) \
printk(KERN_ERR pr_fmt("[%s][%s:%d]"fmt), \
awrpaf_err_pre, __func__, __LINE__, ##__VA_ARGS__)
/* the arm is 64bit cpu and dsp is 32bit cpu */
struct msg_audio_package {
uint32_t audioMsgVal;
uint32_t sharePointer;
};
/** PCM sample format */
enum hifi_pcm_format {
/** Unknown */
SND_PCM_FORMAT_UNKNOWN = -1,
/** Signed 8 bit */
SND_PCM_FORMAT_S8 = 0,
/** Unsigned 8 bit */
SND_PCM_FORMAT_U8,
/** Signed 16 bit Little Endian */
SND_PCM_FORMAT_S16_LE,
/** Signed 16 bit Big Endian */
SND_PCM_FORMAT_S16_BE,
/** Unsigned 16 bit Little Endian */
SND_PCM_FORMAT_U16_LE,
/** Unsigned 16 bit Big Endian */
SND_PCM_FORMAT_U16_BE,
/** Signed 24 bit Little Endian using low three bytes in 32-bit word */
SND_PCM_FORMAT_S24_LE,
/** Signed 24 bit Big Endian using low three bytes in 32-bit word */
SND_PCM_FORMAT_S24_BE,
/** Unsigned 24 bit Little Endian using low three bytes in 32-bit word */
SND_PCM_FORMAT_U24_LE,
/** Unsigned 24 bit Big Endian using low three bytes in 32-bit word */
SND_PCM_FORMAT_U24_BE,
/** Signed 32 bit Little Endian */
SND_PCM_FORMAT_S32_LE,
/** Signed 32 bit Big Endian */
SND_PCM_FORMAT_S32_BE,
/** Unsigned 32 bit Little Endian */
SND_PCM_FORMAT_U32_LE,
/** Unsigned 32 bit Big Endian */
SND_PCM_FORMAT_U32_BE,
/* only support little endian */
/** Signed 16 bit CPU endian */
SND_PCM_FORMAT_S16 = SND_PCM_FORMAT_S16_LE,
/** Unsigned 16 bit CPU endian */
SND_PCM_FORMAT_U16 = SND_PCM_FORMAT_U16_LE,
/** Signed 24 bit CPU endian */
SND_PCM_FORMAT_S24 = SND_PCM_FORMAT_S24_LE,
/** Unsigned 24 bit CPU endian */
SND_PCM_FORMAT_U24 = SND_PCM_FORMAT_U24_LE,
/** Signed 32 bit CPU endian */
SND_PCM_FORMAT_S32 = SND_PCM_FORMAT_S32_LE,
/** Unsigned 32 bit CPU endian */
SND_PCM_FORMAT_U32 = SND_PCM_FORMAT_U32_LE,
SND_PCM_FORMAT_LAST = SND_PCM_FORMAT_U32_BE,
};
enum snd_stream_direction {
SND_STREAM_PLAYBACK = 0,
SND_STREAM_CAPTURE,
};
enum snd_codec_type {
SND_CODEC_TYPE_PCM,
SND_CODEC_TYPE_MP3,
SND_CODEC_TYPE_AAC,
SND_CODEC_TYPE_OTHER,
};
enum snd_data_type {
SND_DATA_TYPE_PCM,
SND_DATA_TYPE_RAW,
SND_DATA_TYPE_OTHER,
};
enum MSGBOX_SOC_DSP_AUDIO_COMMAND {
MSGBOX_SOC_DSP_AUDIO_NULL_COMMAND = 0,
/* PCM stream的同步操作接口 */
MSGBOX_SOC_DSP_AUDIO_PCM_COMMAND,
/* 该定义各式各样并且种类过多, 暂不做全功能支持,后者后期迭代增加 */
MSGBOX_SOC_DSP_AUDIO_MIXER_COMMAND,
/* for misc driver */
/* 该定义用于调试外挂codec寄存器的读写 */
MSGBOX_SOC_DSP_AUDIO_DEBUG_COMMAND,
/* 该定义用于组件数据读写 */
MSGBOX_SOC_DSP_AUDIO_COMPONENT_COMMAND,
};
/*
* param[0] = MSGBOX_SOC_DSP_AUDIO_COMMAND->MSGBOX_SOC_DSP_AUDIO_PCM_COMMAND
* param[1] = *snd_soc_dsp_substream
* param[2] = SND_SOC_DSP_PCM_COMMAND
* param[3] = *params
*/
enum SND_SOC_DSP_PCM_COMMAND {
/*
* for cpudai driver and machine driver
* need to get status after execing at dsp & sync
*/
SND_SOC_DSP_PCM_PROBE,
SND_SOC_DSP_PCM_SUSPEND,
SND_SOC_DSP_PCM_RESUME,
SND_SOC_DSP_PCM_REMOVE,
/* the cmd of pcm stream interface & sync */
SND_SOC_DSP_PCM_STARTUP,
SND_SOC_DSP_PCM_HW_PARAMS,
SND_SOC_DSP_PCM_PREPARE,
SND_SOC_DSP_PCM_WRITEI,
SND_SOC_DSP_PCM_READI,
SND_SOC_DSP_PCM_START,
SND_SOC_DSP_PCM_STOP,
SND_SOC_DSP_PCM_DRAIN,
SND_SOC_DSP_PCM_SHUTDOWN,
};
/*
* param[0] = MSGBOX_DSP_AUDIO_COMMAND->MSGBOX_DSP_AUDIO_CTL_COMMAND
* param[1] = *snd_dsp_hal_mixer
* param[2] = SND_SOC_DSP_MIXER_COMMAND
* param[3] = NULL
*/
enum SND_SOC_DSP_MIXER_COMMAND {
/* the cmd of interface & sync */
SND_SOC_DSP_MIXER_OPEN = 0,
SND_SOC_DSP_MIXER_WRITE,
SND_SOC_DSP_MIXER_READ,
SND_SOC_DSP_MIXER_CLOSE,
};
/*
* param[0] = MSGBOX_SOC_DSP_AUDIO_COMMAND->MSGBOX_SOC_DSP_DEBUG_COMMAND
* param[1] = *snd_soc_dsp_substream
* param[2] = SND_SOC_DSP_DEBUG_COMMAND
* param[3] = *params
*/
enum SND_SOC_DSP_DEBUG_COMMAND {
/* for getting params */
SND_SOC_DSP_DEBUG_GET_REG,
/* for setting params */
SND_SOC_DSP_DEBUG_SET_REG,
/* the cmd of pcm stream status interface & sync */
SND_SOC_DSP_DEBUG_GET_HWPARAMS,
SND_SOC_DSP_DEBUG_GET_PCM_STATUS,
};
/*
* param[0] = MSGBOX_DSP_AUDIO_COMMAND->MSGBOX_DSP_AUDIO_COMPONENT_COMMAND
* param[1] = *snd_dsp_hal_component
* param[2] = SND_SOC_DSP_COMPONENT_COMMAND
* param[3] = NULL
*/
enum SND_SOC_DSP_COMPONENT_COMMAND {
/* the cmd of interface & sync */
SND_SOC_DSP_COMPONENT_CREATE,
SND_SOC_DSP_COMPONENT_REMOVE,
SND_SOC_DSP_COMPONENT_SUSPEND,
SND_SOC_DSP_COMPONENT_RESUME,
SND_SOC_DSP_COMPONENT_STATUS,
SND_SOC_DSP_COMPONENT_SW_PARAMS,
SND_SOC_DSP_COMPONENT_START,
SND_SOC_DSP_COMPONENT_STOP,
SND_SOC_DSP_COMPONENT_WRITE,
SND_SOC_DSP_COMPONENT_READ,
/* stream component */
SND_SOC_DSP_COMPONENT_SET_STREAM_PARAMS,
/* algo control */
SND_SOC_DSP_COMPONENT_ALGO_GET,
SND_SOC_DSP_COMPONENT_ALGO_SET,
};
/* 判断当前状态 */
enum SND_DSP_COMPONENT_STATE {
SND_DSP_COMPONENT_STATE_OPEN,
SND_DSP_COMPONENT_STATE_CREATE,
SND_DSP_COMPONENT_STATE_SETUP,
SND_DSP_COMPONENT_STATE_START,
SND_DSP_COMPONENT_STATE_RUNNING,
SND_DSP_COMPONENT_STATE_STOP,
SND_DSP_COMPONENT_STATE_REMOVE,
SND_DSP_COMPONENT_STATE_CLOSE,
};
/* 用于dsp任务之间信息单元传递 */
struct snd_dsp_hal_queue_item {
struct snd_soc_dsp_substream *soc_substream;
struct snd_soc_dsp_component *soc_component;
struct snd_soc_dsp_mixer *soc_mixer;
struct snd_soc_dsp_debug *soc_debug;
struct snd_dsp_hal_substream *hal_substream;
struct snd_dsp_hal_component *hal_component;
struct snd_dsp_hal_mixer *hal_mixer;
uint32_t pxAudioMsgVal;
unsigned char used;
struct list_head list;
int32_t ret_val;
};
/* 会缓存在dram中 */
struct snd_soc_dsp_sdram_buf {
void *read_buf;
uint32_t read_size;
struct list_head list;
};
struct snd_dsp_hal_component_process_driver {
/* 分配自身算法需要的结构空间变量和配置参数 */
//int32_t (*create)(void **handle, struct snd_soc_dsp_native_component *native_component);
int32_t (*create)(void **handle, void *native_component);
/* 实现该算法处理buffer并回填buffer, 算法设计不同时更改输入和输出buf */
int32_t (*process)(void *handle, void *input_buffer, uint32_t * const input_size,
void *output_buffer, uint32_t * const output_size);
/* 算法资源释放 */
int32_t (*release)(void *handle);
};
struct snd_soc_dsp_pcm_params {
/* eg:0 sndcodec; 1 snddmic; 2 snddaudio0; 3 snddaudio1 */
int32_t card;
int32_t device;
/*
* 根据名字匹配:
* 0: hw:audiocodec;
* 1: hw:snddmic;
* 2: hw:snddaudio0;
* 3: hw:snddaudio1;
*/
char driver[32];
/* 1:capture; 0:playback */
enum snd_stream_direction stream;
/* -- HW params -- */
snd_pcm_format_t format; /* SNDRV_PCM_FORMAT_* */
uint32_t rate; /* rate in Hz */
uint32_t channels;
uint32_t resample_rate;
/* only for hw substream */
uint32_t period_size; /* 中断周期 */
uint32_t periods; /* 中断周期个数 */
/* 在流中buffer务必一致大小, 代码中务必检查! */
uint32_t buffer_size; /* 共享buf大小 */
uint32_t pcm_frames;
/* data type */
enum snd_data_type data_type;
/* mp3 - aac */
enum snd_codec_type codec_type;
/* dsp pcm status */
int32_t status;
/* 从设备树种获取的私有数据 */
uint32_t dts_data;
/* for dsp0 is 1, for dsp1 is 0 */
uint32_t hw_stream;
/* dsp data transmission mode */
uint32_t data_mode;
/* soc stream wake/sleep */
uint32_t stream_wake;
/* 独立算法组件用到的参数:buffer大小 */
unsigned int input_size;
unsigned int output_size;
unsigned int dump_size;
/* 保存算法用到的参数具体由算法定义预留32字节 */
uint32_t algo_params[8];
};
enum snd_dsp_handle_type {
HANDLE_TYPE_NULL = 0,
HANDLE_TYPE_SOC_MIXER,
HANDLE_TYPE_HAL_MIXER,
HANDLE_TYPE_HAL_SUBSTREAM,
HANDLE_TYPE_HAL_COMPONENT,
};
enum snd_dsp_list_type {
LIST_TYPE_NULL = 0,
LIST_TYPE_HAL_MIXER,
LIST_TYPE_SOC_MIXER,
LIST_TYPE_HAL_SUBSTREAM,
LIST_TYPE_SOC_SUBSTREAM,
LIST_TYPE_HAL_COMPONENT,
LIST_TYPE_SOC_COMPONENT,
};
#endif