Files
kernel_common_drivers/drivers/audiobridge/dsp_client_api.h
T
wenlong.zhu aa19568bc4 AduioBridge: porting from 4.19 to 5.15 [1/1]
PD#SWPL-114902

Problem:
1.AudioBridge module needs to be added to kernel 5.15.

Solution:
1.Makefiles, Kconfig, and code need to be adjusted in AudioBridge.

Verify:
A113L AD403 Board

Change-Id: I47ef1f7c50836c6617969dc2c37d8d340fc15f19
Signed-off-by: wenlong.zhu <wenlong.zhu@amlogic.com>
2023-03-23 22:10:18 -07:00

350 lines
9.9 KiB
C

/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef _DSP_CLIENT_API_H
#define _DSP_CLIENT_API_H
/*cmd mode*/
#define MBX_SYSTEM 0x0
#define MBX_CODEC 0x1
#define MBX_TINYALSA 0x2
#define MBX_PIPELINE 0x3
/*sys cmd*/
#define CMD_SHM_ALLOC 0x3
#define CMD_SHM_FREE 0x4
/*AWE cmd*/
#define CMD_APROCESS_OPEN 0x34
#define CMD_APROCESS_CLOSE 0x35
#define CMD_APROCESS_START 0x36
#define CMD_APROCESS_STOP 0x37
#define CMD_APROCESS_READ 0x38
#define CMD_APROCESS_WRITE 0x39
#define CMD_APROCESS_WRITE_SPEAKER 0x3a
#define CMD_APROCESS_DQBUF 0x3c
#define CMD_APROCESS_QBUF 0x3d
#define CMD_APROCESS_GET_GAIN 0x3e
#define CMD_APROCESS_SET_GAIN 0x3f
/*tinyalsa cmd*/
#define TINYALSA_API_OPEN 0x4
#define TINYALSA_API_CLOSE 0x5
#define TINYALSA_API_WRITEI 0x6
#define TINYALSA_API_READI 0x7
#define TINYALSA_API_GETLATENCY 0x8
/*Message composition with module(6bits), function(10bits)*/
#define __MBX_COMPOSE_MSG(mod, func) (((mod) << 10) | ((func) & 0x3FF))
/*Mssage Composition*/
#define MBX_CMD_SHM_ALLOC __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_SHM_ALLOC)
#define MBX_CMD_SHM_FREE __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_SHM_FREE)
#define MBX_TINYALSA_OPEN __MBX_COMPOSE_MSG(MBX_TINYALSA, TINYALSA_API_OPEN)
#define MBX_TINYALSA_CLOSE __MBX_COMPOSE_MSG(MBX_TINYALSA, TINYALSA_API_CLOSE)
#define MBX_TINYALSA_WRITEI __MBX_COMPOSE_MSG(MBX_TINYALSA, TINYALSA_API_WRITEI)
#define MBX_TINYALSA_READI __MBX_COMPOSE_MSG(MBX_TINYALSA, TINYALSA_API_READI)
#define MBX_TINYALSA_GETLATENCY __MBX_COMPOSE_MSG(MBX_TINYALSA, TINYALSA_API_GETLATENCY)
#define MBX_CMD_APROCESS_OPEN __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_OPEN)
#define MBX_CMD_APROCESS_CLOSE __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_CLOSE)
#define MBX_CMD_APROCESS_START __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_START)
#define MBX_CMD_APROCESS_STOP __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_STOP)
#define MBX_CMD_APROCESS_READ __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_READ)
#define MBX_CMD_APROCESS_WRITE __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_WRITE)
#define MBX_CMD_APROCESS_DQBUF __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_DQBUF)
#define MBX_CMD_APROCESS_QBUF __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_QBUF)
#define MBX_CMD_APROCESS_GET_GAIN __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_GET_GAIN)
#define MBX_CMD_APROCESS_SET_GAIN __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_SET_GAIN)
#define MBX_CMD_APROCESS_WRITE_SPEAKER __MBX_COMPOSE_MSG(MBX_SYSTEM, CMD_APROCESS_WRITE_SPEAKER)
/*pcm*/
/** A flag that specifies that the PCM is an output.
* May not be bitwise AND'd with @ref PCM_IN.
* Used in @ref pcm_open.
* @ingroup libtinyalsa-pcm
*/
#define PCM_OUT 0x00000000
/** Specifies that the PCM is an input.
* May not be bitwise AND'd with @ref PCM_OUT.
* Used in @ref pcm_open.
* @ingroup libtinyalsa-pcm
*/
#define PCM_IN 0x10000000
/** Specifies that the PCM will use mmap read and write methods.
* Used in @ref pcm_open.
* @ingroup libtinyalsa-pcm
*/
#define PCM_MMAP 0x00000001
/** Specifies no interrupt requests.
* May only be bitwise AND'd with @ref PCM_MMAP.
* Used in @ref pcm_open.
* @ingroup libtinyalsa-pcm
*/
#define PCM_NOIRQ 0x00000002
/** When set, calls to @ref pcm_write
* for a playback stream will not attempt
* to restart the stream in the case of an
* underflow, but will return -EPIPE instead.
* After the first -EPIPE error, the stream
* is considered to be stopped, and a second
* call to pcm_write will attempt to restart
* the stream.
* Used in @ref pcm_open.
* @ingroup libtinyalsa-pcm
*/
#define PCM_NORESTART 0x00000004
/** Specifies monotonic timestamps.
* Used in @ref pcm_open.
* @ingroup libtinyalsa-pcm
*/
#define PCM_MONOTONIC 0x00000008
/** If used with @ref pcm_open and @ref pcm_params_get,
* it will not cause the function to block if
* the PCM is not available. It will also cause
* the functions @ref pcm_readi and @ref pcm_writei
* to exit if they would cause the caller to wait.
* @ingroup libtinyalsa-pcm
*/
#define PCM_NONBLOCK 0x00000010
/** Means a PCM STATE MASK
* @ingroup libtinyalsa-pcm
*/
#define PCM_STATE_MASK 0x000F
/** Means a PCM is prepared
* @ingroup libtinyalsa-pcm
*/
#define PCM_STATE_PREPARED 0x02
/** For inputs, this means the PCM is recording audio samples.
* For outputs, this means the PCM is playing audio samples.
* @ingroup libtinyalsa-pcm
*/
#define PCM_STATE_RUNNING 0x03
/** For inputs, this means an overrun occurred.
* For outputs, this means an underrun occurred.
*/
#define PCM_STATE_XRUN 0x04
/** For outputs, this means audio samples are played.
* A PCM is in a draining state when it is coming to a stop.
*/
#define PCM_STATE_DRAINING 0x05
/** Means a PCM is suspended.
* @ingroup libtinyalsa-pcm
*/
#define PCM_STATE_SUSPENDED 0x07
/** Means a PCM has been disconnected.
* @ingroup libtinyalsa-pcm
*/
#define PCM_STATE_DISCONNECTED 0x08
/*tinyalsa*/
enum ALSA_DEVICE_IN {
DEVICE_TDMIN_A = 0,
DEVICE_TDMIN_B = 1,
DEVICE_SPDIFIN = 2,
DEVICE_LOOPBACK = 3,
DEVICE_PDMIN = 4
};
enum ALSA_DEVICE_OUT {
DEVICE_TDMOUT_A = 0,
DEVICE_TDMOUT_B = 1
};
enum LOOPBACK_BUF {
PROCESSBUF = 0,
RAWBUF,
};
struct rpc_pcm_config {
/** The number of channels in a frame */
u32 channels;
/** The number of frames per second */
u32 rate;
/** The number of frames in a period */
u32 period_size;
/** The number of periods in a PCM */
u32 period_count;
/** The sample format of a PCM */
int format;
/* Values to use for the ALSA start, stop and silence thresholds. Setting
* any one of these values to 0 will cause the default tinyalsa values to be
* used instead. Tinyalsa defaults are as follows.
*
* start_threshold : period_count * period_size
* stop_threshold : period_count * period_size
* silence_threshold : 0
*/
/** The minimum number of frames required to start the PCM */
u32 start_threshold;
/** The minimum number of frames required to stop the PCM */
u32 stop_threshold;
/** The minimum number of frames to silence the PCM */
u32 silence_threshold;
} __packed;
/** Enumeration of a PCM's hardware parameters.
* Each of these parameters is either a mask or an interval.
* @ingroup libtinyalsa-pcm
*/
struct pcm_open_st {
u32 card;
u32 device;
u32 flags;
struct rpc_pcm_config pcm_config; // dsp also could access this address
u64 out_pcm;
} __packed;
struct pcm_close_st {
u64 pcm;
s32 out_ret;
} __packed;
struct aml_pcm_ctx {
u64 pcm_srv_hdl;
struct rpc_pcm_config config;
};
struct acodec_shm_alloc_st {
u64 phy;
u64 size;
s32 pid;
} __packed;
struct acodec_shm_free_st {
u64 phy;
} __packed;
struct pcm_io_st {
u64 pcm;
u64 data; /*dsp need access this address*/
u32 count;
s32 out_ret;
} __packed;
struct pcm_process_open_st {
u32 card;
u32 device;
u32 flags;
struct rpc_pcm_config pcm_config; /*dsp also could access this address*/
u64 out_pcm;
} __packed;
struct pcm_process_close_st {
u64 pcm;
s32 out_ret;
} __packed;
struct pcm_process_buf_st {
u64 pcm;
u64 release_buf_handle;
u64 buf_handle;
u64 data;
u32 count;
u32 id;
s32 out_ret;
} __packed;
struct pcm_process_gain_st {
u64 pcm;
u32 is_out;
s32 gain;
s32 out_ret;
} __packed;
struct aml_dsp_id {
int value;
int id;
};
/*loopback pcm operation*/
struct aml_pro_pcm_ctx {
u64 pcm_srv_hdl;
struct rpc_pcm_config config;
};
struct pcm_process_io_st {
u64 pcm;
u64 data; /*dsp need access this address*/
u32 count;
u32 id;
s32 out_ret;
} __packed;
enum DSP_PCM_FORMAT {
/** Signed 16-bit, little endian */
DSP_PCM_FORMAT_S16_LE = 0,
/** Signed, 8-bit */
DSP_PCM_FORMAT_S8 = 1,
/** Signed, 16-bit, big endian */
DSP_PCM_FORMAT_S16_BE = 2,
/** Signed, 24-bit (32-bit in memory), little endian */
DSP_PCM_FORMAT_S24_LE,
/** Signed, 24-bit (32-bit in memory), big endian */
DSP_PCM_FORMAT_S24_BE,
/** Signed, 24-bit, little endian */
DSP_PCM_FORMAT_S24_3LE,
/** Signed, 24-bit, big endian */
DSP_PCM_FORMAT_S24_3BE,
/** Signed, 32-bit, little endian */
DSP_PCM_FORMAT_S32_LE,
/** Signed, 32-bit, big endian */
DSP_PCM_FORMAT_S32_BE,
/** Max of the enumeration list, not an actual format. */
DSP_PCM_FORMAT_MAX
};
struct buf_info {
u64 handle;
u64 phyaddr;
void *viraddr;
u32 size;
};
u32 pcm_client_frame_to_bytes(void *hdl, u32 frame);
void *pcm_client_open(u32 card, u32 device, u32 flags,
struct rpc_pcm_config *config, struct device *dev, u32 dspid);
int pcm_client_close(void *hdl, struct device *dev, u32 dspid);
int pcm_client_writei(void *hdl, const phys_addr_t data, u32 count,
struct device *dev, u32 dspid);
int pcm_client_readi(void *hdl, const phys_addr_t data, u32 count,
struct device *dev, u32 dspid);
int pcm_process_client_writei_to_speaker(void *hdl, const phys_addr_t data, u32 count,
u32 bypass, struct device *dev, u32 dspid);
void *pcm_process_client_open(u32 card, u32 device, u32 flags,
struct rpc_pcm_config *config, struct device *dev, u32 dspid);
int pcm_process_client_close(void *hdl, struct device *dev, u32 dspid);
int pcm_process_client_start(void *hdl, struct device *dev, u32 dspid);
int pcm_process_client_stop(void *hdl, struct device *dev, u32 dspid);
int pcm_process_client_dqbuf(void *hdl, struct buf_info *buf, struct buf_info *release_buf,
u32 type, struct device *dev, u32 dspid);
int pcm_process_client_qbuf(void *hdl, struct buf_info *buf, u32 type,
struct device *dev, u32 dspid);
int pcm_process_client_get_volume_gain(void *hdl, int *gain,
int is_out, struct device *dev, u32 dspid);
int pcm_process_client_set_volume_gain(void *hdl, int gain,
int is_out, struct device *dev, u32 dspid);
void *aml_dsp_mem_allocate(phys_addr_t *phy, size_t size, struct device *dev, u32 dspid);
void aml_dsp_mem_free(phys_addr_t phy, struct device *dev, u32 dspid);
void *audio_device_open(u32 card, u32 device, u32 flags,
struct rpc_pcm_config *config, struct device *dev, u32 dspid);
#endif /*_DSP_CLIENT_API_H*/