mirror of
https://github.com/hardkernel/kernel_common_drivers.git
synced 2026-06-25 12:03:48 +09:00
aa19568bc4
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>
350 lines
9.9 KiB
C
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*/
|