blob: b80d1c0f576033579d2cdce70d10baae9a136aa9 [file] [log] [blame]
/*
* Copyright 2019 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef __CROS_EC_AUDIO_CODEC_H
#define __CROS_EC_AUDIO_CODEC_H
#include "stdint.h"
/*
* Common abstract layer
*/
/*
* Checks capability of audio codec.
*
* @cap is an integer from enum ec_codec_cap. Note that it represents a
* bit field in a 32-bit integer. The valid range is [0, 31].
*
* Returns:
* 1 if audio codec capabilities include cap passed as parameter.
* 0 if not capable.
*/
int audio_codec_capable(uint8_t cap);
/*
* Registers shared memory (SHM).
*
* @shm_id is a SHM identifier from enum ec_codec_shm_id.
* @cap is an integer from enum ec_codec_cap.
* @addr is the address pointer to the SHM.
* @len is the maximum length of the SHM.
* @type is an integer from enum ec_codec_shm_type.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal errors.
* EC_ERROR_INVAL if invalid shm_id.
* EC_ERROR_INVAL if invalid cap.
* EC_ERROR_BUSY if the shm_id has been registered.
*/
int audio_codec_register_shm(uint8_t shm_id, uint8_t cap,
uintptr_t *addr, uint32_t len, uint8_t type);
/*
* Translates the physical address from AP to EC's memory space. Required if
* wants to use AP SHM.
*
* @ap_addr is physical address from AP.
* @ec_addr is the translation destination.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal errors.
* EC_ERROR_UNIMPLEMENTED if no concrete implementation.
*/
int audio_codec_memmap_ap_to_ec(uintptr_t ap_addr, uintptr_t *ec_addr);
/*
* Scales a S16_LE sample by multiplying scalar.
*/
int16_t audio_codec_s16_scale_and_clip(int16_t orig, uint8_t scalar);
/*
* DMIC abstract layer
*/
/*
* Gets the maximum possible gain value. All channels share the same maximum
* gain value [0, max].
*
* The gain has no unit and should fit in a scale to represent relative dB.
*
* For example, suppose maximum possible gain value is 4, one could define a
* mapping:
* - 0 => -10 dB
* - 1 => -5 dB
* - 2 => 0 dB
* - 3 => 5 dB
* - 4 => 10 dB
*
* @max_gain is the destination address to put the gain value.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
*/
int audio_codec_dmic_get_max_gain(uint8_t *max_gain);
/*
* Sets the microphone gain for the specified channel.
*
* @channel is an integer from enum ec_codec_dmic_channel. The valid range
* is [0, 7].
* @gain is the target gain for the specified channel. The valid range
* is [0, max_gain]. See also audio_codec_dmic_get_max_gain.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_INVAL if channel does not look good.
* EC_ERROR_INVAL if gain does not look good.
*/
int audio_codec_dmic_set_gain_idx(uint8_t channel, uint8_t gain);
/*
* Gets the microphone gain of the specified channel.
*
* @channel is an integer from enum ec_codec_dmic_channel. The valid range
* is [0, 7].
* @gain is the destination address to put the gain value of the channel.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_INVAL if channel does not look good.
*/
int audio_codec_dmic_get_gain_idx(uint8_t channel, uint8_t *gain);
/*
* I2S RX abstract layer
*/
/*
* Enables I2S RX.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_BUSY if has enabled.
*/
int audio_codec_i2s_rx_enable(void);
/*
* Disables I2S RX.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_BUSY if has not enabled.
*/
int audio_codec_i2s_rx_disable(void);
/*
* Sets I2S RX sample depth.
*
* @depth is an integer from enum ec_codec_i2s_rx_sample_depth.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_INVAL if depth does not look good.
*/
int audio_codec_i2s_rx_set_sample_depth(uint8_t depth);
/*
* Sets I2S RX DAI format.
*
* @daifmt is an integer from enum ec_codec_i2s_rx_daifmt.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_INVAL if daifmt does not look good.
*/
int audio_codec_i2s_rx_set_daifmt(uint8_t daifmt);
/*
* Sets I2S RX BCLK.
*
* @bclk is an integer to represent the bit clock rate.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_INVAL if bclk does not look good.
*/
int audio_codec_i2s_rx_set_bclk(uint32_t bclk);
/*
* WoV abstract layer
*/
/*
* Enables WoV.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_BUSY if has enabled.
*/
int audio_codec_wov_enable(void);
/*
* Disables WoV.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_BUSY if has not enabled.
*/
int audio_codec_wov_disable(void);
/*
* Reads the WoV audio data from chip.
*
* @buf is the target pointer to put the data.
* @count is the maximum number of bytes to read.
*
* Returns:
* -1 if any errors.
* 0 if no data.
* >0 if success. The returned value denotes number of bytes read.
*/
int32_t audio_codec_wov_read(void *buf, uint32_t count);
/*
* Enables notification if WoV audio data is available.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_BUSY if has enabled.
* EC_ERROR_ACCESS_DENIED if the notifiee has not set.
*/
int audio_codec_wov_enable_notifier(void);
/*
* Disables WoV data notification.
*
* Returns:
* EC_SUCCESS if success.
* EC_ERROR_UNKNOWN if internal error.
* EC_ERROR_BUSY if has not enabled.
* EC_ERROR_ACCESS_DENIED if the notifiee has not set.
*/
int audio_codec_wov_disable_notifier(void);
/*
* Audio buffer for 2 seconds S16_LE, 16kHz, mono.
*/
extern uintptr_t audio_codec_wov_audio_buf_addr;
/*
* Language model buffer for speech-micro. At least 67KB.
*/
extern uintptr_t audio_codec_wov_lang_buf_addr;
/*
* Task for running WoV.
*/
void audio_codec_wov_task(void *arg);
#endif