1 /*
2  * Copyright 2019 NXP
3  * All rights reserved.
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef _FSL_TFA9896_H_
8 #define _FSL_TFA9896_H_
9 
10 #include "fsl_common.h"
11 #include "fsl_codec_i2c.h"
12 
13 /*!
14  * @addtogroup tfa9896
15  * @ingroup codec
16  * @{
17  */
18 
19 /*******************************************************************************
20  * Definitions
21  ******************************************************************************/
22 #ifdef TFA9896_DEBUG
23 #include "fsl_debug_console.h"
24 #define TFA9896_Printf DbgConsole_Printf
25 #else
26 #define TFA9896_Printf(format, args...) ((void)0)
27 #endif
28 
29 #define TFA9896_PATCH_EXTRA        6
30 #define FSL_TFA9896_DRIVER_VERSION (MAKE_VERSION(6, 0, 2))
31 
32 /*!@brief TFA I2S bit clock */
33 #define TFA_I2C_BITRATE (400000U)
34 
35 /*! @brief tfa9896 handle size */
36 #ifndef TFA9896_I2C_HANDLER_SIZE
37 #define TFA9896_I2C_HANDLER_SIZE (CODEC_I2C_MASTER_HANDLER_SIZE)
38 #endif
39 
40 #define Sleep(ms)                 usleep((ms)*1000)
41 #define TFA9896_I2C_ADDRESS_LEFT  (0x34)
42 #define TFA9896_I2C_ADDRESS_RIGHT (0x36)
43 #define TFA9896_LIVEDATA_CAPTURE
44 #define TFA1_FW_ReZ_SCALE             16384
45 #define MAX_PARAM_SIZE                (145 * 3)
46 #define TFA1_MAX_PARAM_SIZE           (145 * 3) /* TFA1 */
47 #define NXP_I2C_MAX_SIZE              254
48 #define MAX_I2C_LENGTH                NXP_I2C_MAX_SIZE
49 #define ROUND_DOWN(a, n)              (((a) / (n)) * (n))
50 #define TFA9896_API_WAITRESULT_NTRIES 30000
51 #define TFA1_BF_PWDN                  0x0900
52 /* RPC Status results */
53 #define STATUS_OK                0
54 #define STATUS_INVALID_MODULE_ID 2
55 #define STATUS_INVALID_PARAM_ID  3
56 #define STATUS_INVALID_INFO_ID   4
57 /* module Ids */
58 #define MODULE_FRAMEWORK        0
59 #define MODULE_SPEAKERBOOST     1
60 #define MODULE_BIQUADFILTERBANK 2
61 #define SB_PARAM_GET_STATE      0xC0
62 #define FW_PARAM_GET_STATE      0x84
63 /* RPC commands */
64 #define SB_PARAM_GET_RE0     0x85
65 #define SB_PARAM_SET_LSMODEL 0x06 /* Load a full model into SpeakerBoost.*/
66 #define SB_PARAM_SET_EQ      0x0A /* 2 Equaliser Filters.*/
67 #define SB_PARAM_SET_PRESET  0x0D /* Load a preset*/
68 #define SB_PARAM_SET_CONFIG  0x0E /* Load a config*/
69 #define SB_PARAM_SET_DRC     0x0F
70 #define SB_PARAM_SET_AGCINS  0x10
71 #define PARAM_GET_LSMODEL    0x86 /* Gets current LoudSpeaker impedance Model.*/
72 #define PARAM_GET_LSMODELW   0xC1 /* Gets current LoudSpeaker xcursion Model.*/
73 
74 #define FW_STATE_SIZE           9
75 #define FW_STATE_MAX_SIZE       FW_STATE_SIZE
76 #define SPKRBST_HEADROOM        7                /* Headroom applied to the main input signal */
77 #define SPKRBST_AGCGAIN_EXP     SPKRBST_HEADROOM /* Exponent used for AGC Gain related variables */
78 #define SPKRBST_TEMPERATURE_EXP 9
79 #define SPKRBST_LIMGAIN_EXP     4                /* Exponent used for Gain Corection related variables */
80 #define SPKRBST_TIMECTE_EXP     1
81 #define TFA1_BF_VOL             0x0687
82 #define TFA1_BF_ACS             0x00b0
83 #define TFA1_BF_DMEM            0x7011
84 #define TFA1_BF_MADD            0x710f
85 #define TFA1_BF_I2SDOE          0x04b0
86 #define TFA1_BF_PLLS            0x0010
87 #define TFA1_BF_SBSL            0x0950
88 #define TFA1_BF_RST             0x7000
89 #define TFA1_BF_I2CR            0x0910
90 #define TFA1_BF_AMPS            0x00e0
91 #define TFA1_BF_MTPB            0x0080
92 #define TFA1_BF_MTPK            0x0b07
93 #define TFA1_BF_SPKS            0x00a0
94 #define TFA1_BF_MTPOTC          0x8000
95 #define TFA1_BF_MTPEX           0x8010
96 #define TFA1_BF_MTP0            TFA1_BF_MTPOTC
97 #define TFA1_BF_CIMTP           0x62b0
98 #define TFA_MTPOTC_POS          0
99 #define TFA_MTPEX_POS           1
100 #ifndef MIN
101 #define MIN(A, B) (A < B ? A : B)
102 #endif //
103 #define TFA9896_CURRENTSENSE4_CTRL_CLKGATECFOFF (1 << 2)
104 #define TFA1_BF_RST                             0x7000
105 #define TFA1_BF_AREFS                           0x00f0
106 #define TFA1_BF_CLKS                            0x0060
107 #define TFA1_BF_AMPS                            0x00e0
108 #define TFA1_BF_MTPB                            0x0080
109 #ifdef ENABLE_AEC_DIRECTION
110 #define TFA1_BF_DOLS 0xa02
111 #define TFA1_BF_DORS 0xa32
112 #endif //
113 #define TFA1_BF_TDMSAMSZ           0x10a4
114 #define TFA1_BF_NBCK               0x14c3
115 #define TFA1_BF_AUDFS              0x04c3
116 #define TFA1_BF_CLIP               0x4900
117 #define TFA1_BF_CHS12              0x0431
118 #define TFA1_BF_CFE                0x0920
119 #define TFA1_BF_CHSA               0x0461
120 #define TFA1_BF_AMPC               0x0960
121 #define TFA1_BF_IPLL               0x09e0
122 #define TFA1_BF_ATTEN              0x0613
123 #define TFA1_BF_DCTRIP             0x0a04
124 #define TFA1_BF_DCPWM              0x07d0
125 #define bst_slpcmplvl              0xaa1
126 #define ignore_flag_voutcomp86     0x7e0
127 #define TFA9896_AUDIO_CTR          0x06
128 #define TFA9896_SYS_CTRL           0x09
129 #define TFA9896_CURRENTSENSE4      0x49
130 #define TFA9896_AUDIO_CTR_CFSM_MSK 0x20
131 #define TFA9896_SYS_CTRL_AMPE_MSK  0x8
132 #define TFA9896_SYS_CTRL_DCA_MSK   0x10
133 #define OPTIMIZED_RPC
134 #define PLL_READ_TRIAL 50
135 
136 /*! @brief status flag
137  *  @anchor _tfa9896_error
138  */
139 enum
140 {
141     kStatus_TFA9896_Ok              = MAKE_STATUS(kStatusGroup_Generic, 0), /*!< kStatus_TFA9896_Ok = 0,*/
142     kStatus_TFA9896_DSP_not_running = MAKE_STATUS(kStatusGroup_Generic, 1),
143     /*!< communication with the DSP failed, presumably because DSP not running  kStatus_TFA9896_DSP_not_running */
144     kStatus_TFA9896_Bad_Parameter = MAKE_STATUS(kStatusGroup_Generic, 2), /*!< kStatus_TFA9896_Bad_Parameter*/
145     kStatus_TFA9896_NotOpen =
146         MAKE_STATUS(kStatusGroup_Generic, 3), /*!< kStatus_TFA9896_NotOpen, the given handle is not open */
147     kStatus_TFA9896_OutOfHandles = MAKE_STATUS(kStatusGroup_Generic, 4), /*!< too many handles*/
148     kStatus_TFA9896_StateTimedOut =
149         MAKE_STATUS(kStatusGroup_Generic,
150                     5), /*!< the expected response did not occur within the expected time  Tfa9896_Error_StateTimedOut,
151                        the expected response did not occur within the expected time */
152     kStatus_TFA9896_RpcBase    = MAKE_STATUS(kStatusGroup_Generic, 100), /*!< kStatus_TFA9896_RpcBase = 100,*/
153     kStatus_TFA9896_RpcBusy    = MAKE_STATUS(kStatusGroup_Generic, 101), /*!< kStatus_TFA9896_RpcBusy = 101,*/
154     kStatus_TFA9896_RpcModId   = MAKE_STATUS(kStatusGroup_Generic, 102), /*!< kStatus_TFA9896_RpcModId = 102,*/
155     kStatus_TFA9896_RpcParamId = MAKE_STATUS(kStatusGroup_Generic, 103), /*!< kStatus_TFA9896_RpcParamId = 103*/
156     kStatus_TFA9896_RpcInfoId  = MAKE_STATUS(kStatusGroup_Generic, 104), /*!< kStatus_TFA9896_RpcInfoId = 104*/
157     kStatus_TFA9896_RpcNotAllowedSpeaker =
158         MAKE_STATUS(kStatusGroup_Generic, 105), /*!< kStatus_TFA9896_RpcNotAllowedSpeaker = 105*/
159     kStatus_TFA9896_Not_Implemented = MAKE_STATUS(kStatusGroup_Generic, 106), /*!< kStatus_TFA9896_Not_Implemented*/
160     kStatus_TFA9896_Not_Supported   = MAKE_STATUS(kStatusGroup_Generic, 107), /*!< kStatus_TFA9896_Not_Supported*/
161     kStatus_TFA9896_I2C_Fatal =
162         MAKE_STATUS(kStatusGroup_Generic, 108), /*!< Fatal I2C error occurred  kStatus_TFA9896_I2C_Fatal*/
163     kStatus_TFA9896_I2C_NonFatal =
164         MAKE_STATUS(kStatusGroup_Generic, 109), /*!< Nonfatal I2C error, and retry count reached */
165     kStatus_TFA9896_Other = MAKE_STATUS(kStatusGroup_Generic, 1000) /*!< kStatus_TFA9896_Other = 1000*/
166 };
167 
168 /*! @brief type definition */
169 typedef int int24;
170 typedef struct uint24M
171 {
172     uint8_t b[3];
173 } uint24M_t;
174 
175 /*! @brief biquadm */
176 typedef struct _tfa9896BiquadM
177 {
178     uint8_t bytes[6 * sizeof(uint24M_t)];
179 } tfa9896BiquadM_t;
180 
181 /*! @brief filter */
182 typedef struct _tfa9896FilterM
183 {
184     tfa9896BiquadM_t biquad;
185     uint8_t enabled;
186     uint8_t type; /*!< (== enum FilterTypes, assure 8bits length)*/
187     float frequency;
188     float Q;
189     float gain;
190 } tfa9896FilterM_t; /*!< 8 * float + int32 + byte == 37*/
191 
192 #ifdef SUPPORT_EXCURSION_FILTER
193 /*! @brief cont anti alias*/
194 typedef struct _tfa9896ContAntiAliasM
195 {
196     unsigned char index;  /*!< index determines destination type; anti-alias, integrator,eq */
197     unsigned char type;
198     float cutOffFreq;     /*!< cut off frequency*/
199     float samplingFreq;
200     float rippleDb;       /*!< integrator leakage*/
201     float rolloff;
202     uint8_t bytes[5 * 3]; /*!< payload 5*24buts coeffs*/
203 } tfa9896ContAntiAliasM_t;
204 
205 /*! @brief cont integrator */
206 typedef struct _tfa9896ContIntegratorM
207 {
208     int8_t index;         /*!< index determines destination type; anti-alias, integrator,eq */
209     uint8_t type;
210     float cutOffFreq;     /*!< cut off frequency*/
211     float samplingFreq;
212     float leakage;        /*!< integrator leakage*/
213     float reserved;
214     uint8_t bytes[5 * 3]; /*!< payload 5*24buts coeffs*/
215 } tfa9896ContIntegratorM_t;
216 
217 /*! @brief cont eqm */
218 typedef struct _tfa9896ContEqM
219 {
220     int8_t index;
221     uint8_t type;         /*!< (== enum FilterTypes, assure 8bits length)*/
222     float cutOffFreq;     /*!< cut off frequency, // range: [100.0 4000.0]*/
223     float samplingFreq;   /*!< sampling frequency*/
224     float Q;              /*!< range: [0.5 5.0]*/
225     float gainDb;         /*!< range: [-10.0 10.0]*/
226     uint8_t bytes[5 * 3]; /*!< payload 5*24buts coeffs*/
227 } tfa9896ContEqM_t;
228 
229 /*! @brief cont biquadm */
230 typedef struct _tfa9896ContBiquadM
231 {
232     /*tfaContEqM_t eq;*/
233     tfaContAntiAliasM_t aa;
234     /*tfaContIntegratorM_t in;*/
235 } tfaContBiquadM_t;
236 #endif
237 
238 /*! @brief mute dmem */
239 typedef enum _tfa9896_DMEM
240 {
241     DMEM_PMEM  = 0, /*!< pmem */
242     DMEM_XMEM  = 1, /*!< xmem */
243     DMEM_YMEM  = 2, /*!< ymem */
244     DMEM_IOMEM = 3, /*!< iomem */
245 } tfa9896_DMEM_t;
246 
247 /*! @brief mute status */
248 typedef enum _tfa9896_Mute
249 {
250     Mute_Off,
251     Mute_Digital,
252     Mute_Amplifier
253 } tfa9896_mute_t;
254 
255 /*! @brief status info live */
256 typedef struct _tfa9896_StateInfoLive
257 {
258     /* SpeakerBoost State */
259     float agcGain;  /* Current AGC Gain value */
260     float limGain;  /* Current Limiter Gain value */
261     float sMax;     /* Current Clip/Lim threshold */
262     int T;          /* Current Speaker Temperature value */
263     int statusFlag; /* Masked bit word, see TFA9896_SpeakerBoostStatusFlags */
264     float X1;       /* Current estimated Excursion value caused by Speakerboost gain control */
265     float X2;       /* Current estimated Excursion value caused by manual gain setting */
266     float Re;       /* Current Loudspeaker blocked resistance */
267     /* Framework state */
268     int shortOnMips; /* increments each time a MIPS problem is detected on the DSP, only presenton newer ICs */
269 } tfa9896_StateInfoLive_t;
270 
271 /*! @brief speaker boost status flag*/
272 typedef enum _tfa9896_SpeakerBoostStatusFlagsLive
273 {
274     tfa9896_SpeakerBoost_ActivityLive = 0,  /* Input signal activity. */
275     tfa9896_SpeakerBoost_S_CtrlLive,        /* S Control triggers the limiter */
276     tfa9896_SpeakerBoost_MutedLive,         /* 1 when signal is muted */
277     tfa9896_SpeakerBoost_X_CtrlLive,        /* X Control triggers the limiter */
278     tfa9896_SpeakerBoost_T_CtrlLive,        /* T Control triggers the limiter */
279     tfa9896_SpeakerBoost_NewModelLive,      /* New model is available */
280     tfa9896_SpeakerBoost_VolumeRdyLive,     /* 0 means stable volume, 1 means volume is still smoothing */
281     tfa9896_SpeakerBoost_DamagedLive,       /* Speaker Damage detected  */
282     tfa9896_SpeakerBoost_SignalClippingLive /* Input Signal clipping detected */
283 } tfa9896_SpeakerBoostStatusFlagsLive_t;
284 
285 /*! @brief speaker mode */
286 typedef struct _tfa9896SPKRBST_SpkrModel
287 {
288     double pFIR[128];         /* Pointer to Excurcussion  Impulse response or
289       Admittance Impulse response (reversed order!!) */
290     int Shift_FIR;            /* Exponent of HX data */
291     float leakageFactor;      /* Excursion model integration leakage */
292     float ReCorrection;       /* Correction factor for Re */
293     float xInitMargin;        /*(1)Margin on excursion model during startup */
294     float xDamageMargin;      /* Margin on excursion modelwhen damage has been detected */
295     float xMargin;            /* Margin on excursion model activated when LookaHead is 0 */
296     float Bl;                 /* Loudspeaker force factor */
297     int fRes;                 /*(1)Estimated Speaker Resonance Compensation Filter cutoff frequency */
298     int fResInit;             /* Initial Speaker Resonance Compensation Filter cutoff frequency */
299     float Qt;                 /* Speaker Resonance Compensation Filter Q-factor */
300     float xMax;               /* Maximum excursion of the speaker membrane */
301     float tMax;               /* Maximum Temperature of the speaker coil */
302     float tCoefA;             /*(1)Temperature coefficient */
303 } tfa9896SPKRBST_SpkrModel_t; /* (1) this value may change dynamically */
304 
305 /*! @brief Bit width. */
306 typedef enum _tfa9896_bit_width
307 {
308     ktfa9896_BitWidth16 = 0x0, /*!< 16 bits */
309 
310 } tfa9896_bit_width_t;
311 
312 /*! @brief The audio data transfer protocol. */
313 typedef enum _tfa9896_protocol
314 {
315     kTFA9896_ProtocolI2S = 0x2, /*!< I2S type */
316 } tfa9896_protocol_t;
317 
318 /*! @brief Sample rate. */
319 typedef enum _tfa9896_sample_rate
320 {
321     ktfa9896_SampleRate48kHz = 0x5 /*48kHz */
322 } tfa9896_sample_rate_t;
323 
324 /*! @brief Audio format configuration. */
325 typedef struct _tfa9896_audio_format
326 {
327     tfa9896_sample_rate_t sampleRate; /*!< Sample rate */
328     tfa9896_bit_width_t bitWidth;     /*!< Bit width */
329 } tfa9896_audio_format_t;
330 
331 /*! @brief Initialize structure of TFA9896 */
332 typedef struct _tfa9896_config
333 {
334     tfa9896_protocol_t protocol;   /*!< Audio transfer protocol */
335     tfa9896_audio_format_t format; /*!< Audio format */
336     bool master;                   /*!< true is master, false is slave */
337     uint8_t slaveAddress;          /*!< slave address */
338     codec_i2c_config_t i2cConfig;  /*!< i2c bus configuration */
339     uint8_t calibrate;             /*!< user handles calibration! */
340 
341 } tfa9896_config_t;
342 
343 /*! @brief tfa9896 handler */
344 typedef struct _tfa9896_handle
345 {
346     tfa9896_config_t *config; /*!< tfa9896 config pointer */
347     uint8_t i2cHandle[TFA9896_I2C_HANDLER_SIZE];
348 } tfa9896_handle_t;
349 /*******************************************************************************
350  * API
351  ******************************************************************************/
352 #if defined(__cplusplus)
353 extern "C" {
354 #endif
355 
356 /*!
357  * @brief check if TFA9896 Hardware factory registers are set .
358  *
359  * @param handle TFA9896 codec handle.
360  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
361  */
362 uint16_t TFA9896_isFactory(tfa9896_handle_t *handle);
363 
364 /*!
365  * @brief get TFA9896 bitfield value .
366  *
367  * @param handle TFA9896 codec handle.
368  * @param bf to be read
369  * @return Returns 16 bits read value.
370  */
371 uint16_t TFA9896_GetBits(tfa9896_handle_t *handle, const uint16_t bf);
372 /*!
373  * @brief set TFA9896 bitfield value .
374  *
375  * @param handle TFA9896 codec handle.
376  * @param bf to be set
377  * @param value to be set
378  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
379  */
380 status_t TFA9896_SetBits(tfa9896_handle_t *handle, const uint16_t bf, const uint16_t value);
381 /*!
382  * @brief wait for DSP to be stable before RPC communictaons .
383  *
384  * @param handle TFA9896 codec handle.
385  * @param ready DSP system stable status.
386  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
387  */
388 status_t TFA9896_DSP_System_Stable(tfa9896_handle_t *handle, int *ready);
389 /*!
390  * @brief clear MTP regsiters to prepare calibraion .
391  *
392  * @param handle TFA9896 codec handle.
393  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
394  */
395 status_t TFA9896_ClearOneTimeCalibration(tfa9896_handle_t *handle);
396 
397 /*!
398  * @brief set calibartion once registers.
399  *
400  * @param handle TFA9896 codec handle.
401  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
402  */
403 status_t TFA9896_SetOneTimeCalibration(tfa9896_handle_t *handle);
404 /*!
405  * @brief set MTP factory values .
406  *
407  * @param handle TFA9896 codec handle.
408  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
409  */
410 status_t TFA9896_SetFactoryValues(tfa9896_handle_t *handle);
411 /*!
412  * @brief check DSP patch suitability to the TFA9896 device .
413  *
414  * @param handle TFA9896 codec handle.
415  * @param patchheader pattern to check with.
416  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
417  */
418 status_t TFA9896_CheckICROMversion(tfa9896_handle_t *handle, const unsigned char patchheader[]);
419 /*!
420  * @brief load DSP patch to DSP memeory .
421  *
422  * @param handle TFA9896 codec handle.
423  * @param length of the patch.
424  * @param bytes that contains patch data.
425  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
426  */
427 status_t TFA9896_ProcessPatchFile(tfa9896_handle_t *handle, int length, const unsigned char *bytes);
428 /*!
429  * @brief set DSP memery table .
430  *
431  * @param handle TFA9896 codec handle.
432  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
433  */
434 status_t TFA9896_DSPWriteTables(tfa9896_handle_t *handle);
435 
436 /*!
437  * @brief write DSP config file to DSP memery .
438  *
439  * @param handle TFA9896 codec handle.
440  * @param length of the config.
441  * @param pConfigBytes that contains config data.
442  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
443  */
444 status_t TFA9896_DspWriteConfig(tfa9896_handle_t *handle, int length, const unsigned char *pConfigBytes);
445 /*!
446  * @brief write DSP speaker file to DSP memery .
447  *
448  * @param handle TFA9896 codec handle.
449  * @param length of the speaker data.
450  * @param pSpeakerBytes that contains speaker data.
451  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
452  */
453 status_t TFA9896_DspWriteSpeakerParameters(tfa9896_handle_t *handle, int length, const unsigned char *pSpeakerBytes);
454 /*!
455  * @brief write DSP preset file to DSP memery .
456  *
457  * @param handle TFA9896 codec handle.
458  * @param length of the preset data.
459  * @param pPresetBytes that contains preset data.
460  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
461  */
462 status_t TFA9896_DspWritePreset(tfa9896_handle_t *handle, int length, const unsigned char *pPresetBytes);
463 /*!
464  * @brief write DSP filter params to DSP memery .
465  *
466  * @param handle TFA9896 codec handle.
467  * @param filter of the filter data.
468  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
469  */
470 status_t TFA9896_Write_FilterBank(tfa9896_handle_t *handle, tfa9896FilterM_t *filter);
471 /*!
472  * @brief wait calibration to be finalized .
473  *
474  * @param handle TFA9896 codec handle.
475  * @param calibrateDone calibration done flag.
476  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
477  */
478 status_t TFA9896_WaitCalibrateDone(tfa9896_handle_t *handle, int *calibrateDone);
479 /*!
480  * @brief retrieve calibration impedance value and expose it to user.
481  *
482  * @param handle TFA9896 codec handle.
483  * @param pRe25 calibration value.
484  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
485  */
486 status_t TFA9896_DspGetCalibrationImpedance(tfa9896_handle_t *handle, float *pRe25);
487 /*!
488  * @brief print calibration value .
489  *
490  * @param handle TFA9896 codec handle.
491  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
492  */
493 status_t TFA9896_PrintCalibration(tfa9896_handle_t *handle);
494 
495 /*!
496  * @brief write word to IOMEM DSP memeory  .
497  *
498  * @param handle TFA9896 codec handle.
499  * @param address to be written.
500  * @param value value write.
501  * @param memtype to be written.
502  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
503  */
504 status_t TFA9896_DSP_Write_Mem_Word(tfa9896_handle_t *handle, unsigned short address, int value, int memtype);
505 
506 /*!
507  * @brief read a hardware regsiter .
508  *
509  * @param handle TFA9896 codec handle.
510  * @param subaddress register address.
511  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
512  */
513 status_t TFA9896_ReadRegister(tfa9896_handle_t *handle, uint8_t subaddress, unsigned short *value);
514 
515 /*!
516  * @brief write a hardware register .
517  *
518  * @param handle TFA9896 codec handle.
519  * @param subaddress register address.
520  * @param value value to write.
521  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
522  */
523 status_t TFA9896_WriteRegister(tfa9896_handle_t *handle, uint8_t subaddress, uint16_t value);
524 
525 /*!
526  * @brief mute/unmute TFA9896 codec
527  *
528  * @param handle TFA9896 codec handle.
529  * @param mute mute mode.
530  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
531  */
532 status_t TFA9896_SetMute(tfa9896_handle_t *handle, tfa9896_mute_t mute);
533 
534 /*!
535  * @brief Set amplifier volume.
536  * @param handle TFA9896 codec handle.
537  * @param volume_level volume level.
538  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
539  */
540 status_t TFA9896_SetVolume(tfa9896_handle_t *handle, uint8_t volume_level);
541 
542 /*!
543  * @brief set OVP in bypass .
544  *
545  * @param handle TFA98xx codec handle.
546  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
547  */
548 status_t TFA9896_SetOVPBypass(tfa9896_handle_t *handle);
549 
550 /*!
551  * @brief Initialize TFA9896.
552  *
553  * @param handle TFA98xx codec handle.
554  * @param tfa9896Config Codec configuration.
555  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
556  */
557 status_t TFA9896_Init(tfa9896_handle_t *handle, tfa9896_config_t *tfa9896Config);
558 
559 /*!
560  * @brief DeInitilize TFA9896.
561  *
562  * @param handle TFA98xx codec handle.
563  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
564  */
565 status_t TFA9896_Deinit(tfa9896_handle_t *handle);
566 
567 /*!
568  * @brief read a hardware regsiter .
569  *
570  * @param handle TFA98xx codec handle.
571  * @param subaddress register address.
572  * @param value read out register value.
573  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
574  */
575 status_t TFA9896_ReadRegister(tfa9896_handle_t *handle, uint8_t subaddress, unsigned short *value);
576 /*!
577  * @brief write a hardware register .
578  *
579  * @param handle TFA98xx codec handle.
580  * @param subaddress register address.
581  * @param value value to write.
582  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
583  */
584 status_t TFA9896_WriteRegister(tfa9896_handle_t *handle, uint8_t subaddress, uint16_t value);
585 /*!
586  * @brief set audio input format .
587  *
588  * @param handle TFA98xx codec handle.
589  * @param mclk master clock frequency
590  * @param sampleRate to be set.
591  * @param bitWidth to be set.
592  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
593  */
594 status_t TFA9896_SetFormat(tfa9896_handle_t *handle, uint32_t mclk, uint32_t sampleRate, uint32_t bitWidth);
595 /*!
596  * @brief power-on/off TFA98xx device.
597  *
598  * @param handle TFA98xx codec handle.
599  * @param powerdown to on/off
600  */
601 void TFA9896_Powerdown(tfa9896_handle_t *handle, int powerdown);
602 
603 /*!
604  * @brief mute/unmute TFA98XX codec
605  *
606  * @param handle TFA98xx codec handle.
607  * @param mute mute mode.
608  * @return Returns ::kStatus_TFA9896_Ok if success, otherwise returns error code.
609  */
610 status_t TFA9896_SetMute(tfa9896_handle_t *handle, tfa9896_mute_t mute);
611 
612 #if defined(__cplusplus)
613 }
614 #endif
615 
616 /*! @} */
617 
618 #endif /* _FSL_TFA9896_H_ */
619