blob: 8abe117f332a2b0cc5dcdf7821738751c0932b93 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2* All Rights Reserved
3*
4* MARVELL CONFIDENTIAL
5* Copyright 2012 Marvell International Ltd All Rights Reserved.
6* The source code contained or described herein and all documents related to
7* the source code ("Material") are owned by Marvell International Ltd or its
8* suppliers or licensors. Title to the Material remains with Marvell International Ltd
9* or its suppliers and licensors. The Material contains trade secrets and
10* proprietary and confidential information of Marvell or its suppliers and
11* licensors. The Material is protected by worldwide copyright and trade secret
12* laws and treaty provisions. No part of the Material may be used, copied,
13* reproduced, modified, published, uploaded, posted, transmitted, distributed,
14* or disclosed in any way without Marvell's prior express written permission.
15*
16* No license under any patent, copyright, trade secret or other intellectual
17* property right is granted to or conferred upon you by disclosure or delivery
18* of the Materials, either expressly, by implication, inducement, estoppel or
19* otherwise. Any license under such intellectual property rights must be
20* express and approved by Marvell in writing.
21*
22*/
23
24#ifndef __H_ACM_APH__
25#define __H_ACM_APH__
26
27#include "acm_debug.h"
28#include "acm_ach.h"
29#include "acm_api.h"
30#include "audio_protocol.h"
31#include "audio_profile.h"
32
33#define MAX_STRING_LEN 60
34#define MAX_VOLUME_INDEX 100
35#define INVALID_CTL_UNIT_ID 0
36#define INVALID_PATH_ID 0xFF
37#define INVALID_ORDER_INDEX 0xFF
38
39#define XML_NAME_LEN 128
40#define DIGITAL_GAIN_OFFSET 37
41#define GENERATE_XML_NAME(BUF, SIZE, PREFIX, APPENDIX) \
42do{\
43 (BUF) = (char *)malloc((SIZE)); \
44 if ((BUF)) {\
45 memset((BUF), 0, (SIZE)); \
46 snprintf((BUF), (SIZE), "%s%s.xml", (PREFIX), (APPENDIX));\
47 } \
48}while(0)
49
50#define PATHSTATUS_MAX 2048
51//--------------------------------------------------------------
52//-------- Basic Elements Definition
53//--------------------------------------------------------------
54typedef enum {
55 APH_PATH_ID_HIFIPLAYTOEARPHONE = 0,
56 APH_PATH_ID_HIFIPLAYTOSPKR,
57 APH_PATH_ID_HIFIPLAYTOHP,
58 APH_PATH_ID_HIFIRECORDFROMMIC1,
59 APH_PATH_ID_HIFIRECORDFROMHSMIC,
60 APH_PATH_ID_VOICEPLAYTOEARPHONE,
61 APH_PATH_ID_VOICEPLAYTOSPKR,
62 APH_PATH_ID_VOICEPLAYTOHP,
63 APH_PATH_ID_VOICERECORDFROMMIC1,
64 APH_PATH_ID_VOICERECORDFROMHSMIC,
65
66 APH_PATH_ID_CNT
67} APH_PATH_ID;
68
69#define APH_PATH_OUT_CNT 6
70#define APH_PATH_IN_CNT 4
71
72typedef enum {
73 APH_GAIN_ID_NB = 0,
74 APH_GAIN_ID_WB,
75 APH_GAIN_ID_NB_EXTRA,
76 APH_GAIN_ID_WB_EXTRA,
77
78 APH_GAIN_ID_CNT
79} APH_GAIN_ID;
80
81typedef enum {
82 ELBA,
83 USTICA,
84 DELAY,
85 NAU8810,
b.liub17525e2025-05-14 17:22:29 +080086 ES8311,
87 TLV320AIC3X,
b.liue9582032025-04-17 19:18:16 +080088 ALC5616,
b.liub17525e2025-05-14 17:22:29 +080089
b.liue9582032025-04-17 19:18:16 +080090
91 AUDIO_COMPONENT_CNT
92} APH_AudioComponent;
93
94
95typedef enum {
96 ENABLE,
97 DISABLE,
98 MUTE,
99 SETVOLUME,
100 SWITCH,
101
102 PATH_OPERATION_CNT
103} APH_PathOperation;
104
105/* Force type is added for GELATO, as some registers are used as trigger/update signal, will repeatedly write a same value. For bit value with Force field type, just write to codec ignore ref_count/bind-writing/cache check features */
106typedef enum {
107 REG_FIELD_TYPE_INVALID = 0,
108 REG_FIELD_TYPE_NORMAL = 1,
109 REG_FIELD_TYPE_GAIN = 2,
110 REG_FIELD_TYPE_COEFF = 4,
111 REG_FIELD_TYPE_FORCE = 8
112} APH_RegisterFieldType;
113
114typedef enum {
115 REG_MISC_NONE,
116 REG_MISC_MIC1,
117 REG_MISC_MIC2,
118 REG_MISC_DUAL_MIC,
119 REG_MISC_SLAVE,
120 REG_MISC_MASTER,
121 REG_MISC_NB_RATE,
122 REG_MISC_WB_RATE,
123 REG_MISC_VOIP_RATE,
124 REG_MISC_DEFAULT_RATE,
125 REG_MISC_FORCE_DELAY
126} APH_RegisterMisc;
127
128typedef enum {
129 PATH_DIRECTION_IN,
130 PATH_DIRECTION_OUT,
131} APH_PathDirection;
132
133typedef enum {
134 HIFI_PATH,
135 FM_PATH,
136 VOICE_PATH,
137 UNKNOW_PATH,
138}APH_PathType;
139
140
141//--------------------------------------------------------------
142//-------- ACM_APH Related Data Structures
143//--------------------------------------------------------------
144typedef struct {
145 APH_AudioComponent Component;
146 unsigned char Address;
147 unsigned short Value;
148} ACMAPH_Register;
149
150typedef struct {
151 APH_PATH_ID PathID;
152 ACMAPH_Register *RegisterList;
153 unsigned char RegisterNum;
154} ACMAPH_Component;
155
156typedef struct {
157 int PathID;
158 char PathName[32];
159} ACMAPH_AudioPathID;
160
161typedef struct {
162 unsigned char Volume;
163 APH_AudioComponent Component;
164 unsigned char Address;
165 unsigned short Value;
166} ACMAPH_VolumeRegister;
167
168typedef struct {
169 APH_PATH_ID PathID;
170 ACMAPH_VolumeRegister *RegisterList;
171 unsigned char RegisterNum;
172} ACMAPH_VolumeComponent;
173
174
175typedef struct {
176 APH_GAIN_ID id;
177 unsigned char volume;
178 signed char gain;
179} ACMAPH_MSAGain;
180
181typedef struct {
182 APH_PATH_ID PathID;
183 ACMAPH_MSAGain *GainList;
184 unsigned char GainNum;
185} ACMAPH_MSAComponent;
186
187
188//--------------------------------------------------------------
189//-------- Path Configuration Related Data Structures
190//--------------------------------------------------------------
191typedef struct tag_APH_ControlUnitConfiguration {
192 union {
193 struct {
194 unsigned char reg_index;
195 unsigned char reg_mask;
196 unsigned char reg_shift;
197 unsigned char reg_type;
198 unsigned char reg_misc;
199 unsigned short length;
200 unsigned char *reg_value;
201 } i2c;
202 struct {
203 unsigned char gpio_port;
204 unsigned char gpio_value;
205 } gpio;
206 struct {
207 unsigned char hci_ocf;
208 unsigned char hci_ogf;
209 unsigned short length;
210 unsigned char *hci_parameters;
211 } hci;
212 struct {
213 unsigned int delay_value;
214 unsigned char delay_misc;
215 } delay;
216 } ctl_unit;
217 unsigned short control_unit_id;
218 struct tag_APH_ControlUnitConfiguration *next;
219} APH_ControlUnitConfiguration;
220
221
222//--------------------------------------------------------------
223//-------- APH Related Data Structures
224//--------------------------------------------------------------
225typedef struct {
226 APH_AudioComponent component_id;
227 ACH_ComponentHandler *component_handler;
228} APH_ACHComponent;
229
230typedef struct {
231 unsigned short enabled;
232 unsigned int value;
233 unsigned char mute;
234} APH_PathStatus;
235
236typedef enum
237{
238 AUDIOHAL_SPK_MUTE = 0,
239 AUDIOHAL_SPK_VOL_1,
240 AUDIOHAL_SPK_VOL_2,
241 AUDIOHAL_SPK_VOL_3,
242 AUDIOHAL_SPK_VOL_4,
243 AUDIOHAL_SPK_VOL_5,
244 AUDIOHAL_SPK_VOL_6,
245 AUDIOHAL_SPK_VOL_7,
246 AUDIOHAL_SPK_VOL_8,
247 AUDIOHAL_SPK_VOL_9,
248 AUDIOHAL_SPK_VOL_10,
249 AUDIOHAL_SPK_VOL_QTY //11
250} AUDIOHAL_SPK_LEVEL_T;
251
252typedef enum {
253 APH_CODEC_ID_NONE=0,
254 APH_CODEC_ID_PM805,
255 APH_CODEC_ID_PM812,
256 APH_CODEC_ID_NAU8810,
b.liub17525e2025-05-14 17:22:29 +0800257 APH_CODEC_ID_ES8311,
258 APH_CODEC_ID_TLV320AIC3X,
b.liue9582032025-04-17 19:18:16 +0800259 APH_CODEC_ID_ALC5616,
b.liub17525e2025-05-14 17:22:29 +0800260
b.liue9582032025-04-17 19:18:16 +0800261 APH_CODEC_CNT
262} APH_CODEC_ID;
263
264typedef struct
265{
266 APH_AudioComponent Component_1;
267 unsigned short RegAddr_1;
268 unsigned short RegVal_1;
269
270 APH_AudioComponent Component_2;
271 unsigned short RegAddr_2;
272 unsigned short RegVal_2;
273
274 APH_AudioComponent Component_3;
275 unsigned short RegAddr_3;
276 unsigned short RegVal_3;
277
278 APH_AudioComponent Component_4;
279 unsigned short RegAddr_4;
280 unsigned short RegVal_4;
281} ACMCodec_GainInT;
282
283typedef struct
284{
285 APH_AudioComponent Component_1;
286 unsigned short RegAddr_1;
287 unsigned short RegVal_1;
288
289 APH_AudioComponent Component_2;
290 unsigned short RegAddr_2;
291 unsigned short RegVal_2;
292
293 APH_AudioComponent Component_3;
294 unsigned short RegAddr_3;
295 unsigned short RegVal_3;
296
297 APH_AudioComponent Component_4;
298 unsigned short RegAddr_4;
299 unsigned short RegVal_4;
300} ACMCodec_GainOutT;
301
302typedef struct
303{
304 AUDIO_PROFILE_ID Profile_id;
305 unsigned short CodecControl;
306 ACMCodec_GainInT Tx_CodecGain; //TX has the same gain for every volume
307 short Tx_DSPGain; //TX has the same gain for every volume, High 8bits: WB gain, Low 8bits: NB gain
308 ACMCodec_GainOutT Rx_CodecGain[AUDIOHAL_SPK_VOL_QTY];
309 short Rx_DSPGain[AUDIOHAL_SPK_VOL_QTY]; //High 8bits: WB gain, Low 8bits: NB gain
310 short Rx_DSPSideToneGain; //High 8bits: WB gain, Low 8bits: NB gain
311} ACMCodec_GainT;
312
313//--------------------------------------------------------------
314//-------- External APH APIs
315//--------------------------------------------------------------
316const ACMAPH_AudioPathID *ACM_GetPathConfigTable();
317
318void ACM_Init_Property(void);
319void ACM_APHInit(void);
320void ACM_APHDeInit(void);
321char * ACM_GetPathName(int PathID);
322ACM_ReturnCode APHAudioPathEnable(const char *path, unsigned int value);
323ACM_ReturnCode APHAudioPathDisable(const char *path);
324ACM_ReturnCode APHAudioPathCheck (const char * path_Rx, const char * path_Tx) ;
325void APHDisableAllPath(void);
326ACM_ReturnCode APHAudioPathSwitch (const char *path_Rx, const char *path_Tx, unsigned int value);
327ACM_ReturnCode APHAudioPathMute(const char *path, unsigned int value);
328ACM_ReturnCode APHAudioPathVolumeSet(const char *path, unsigned int value);
329ACM_ReturnCode ACM_ReloadCalibrationData(void);
330ACM_ReturnCode APHReloadNvm(void);
331ACM_ReturnCode APHAudioPathCheckPathId (int path_id_Rx, int path_id_Tx);
332ACM_ReturnCode ACM_GetEnabledPathId(int *path_id_Rx, int *path_id_Tx, int *volume_Rx, int *mute_Tx);
333ACM_ReturnCode APHGetMSAGain(const char *out_path, const char *path, unsigned char *volume, unsigned short id, signed short *gain, signed short *sidetone_gain);
334unsigned int ACM_GetEnabledPathVolume(void);
335ACM_ReturnCode ACM_GetPathStatus(char *buff, unsigned int maxsize);
336ACM_ReturnCode ACM_GetPathDirection(const char *path, unsigned char *path_direction);
337
338#endif