summaryrefslogtreecommitdiff
path: root/sound_card_init/amp/src/max98373d/dsm_param.rs
diff options
context:
space:
mode:
Diffstat (limited to 'sound_card_init/amp/src/max98373d/dsm_param.rs')
-rw-r--r--sound_card_init/amp/src/max98373d/dsm_param.rs211
1 files changed, 0 insertions, 211 deletions
diff --git a/sound_card_init/amp/src/max98373d/dsm_param.rs b/sound_card_init/amp/src/max98373d/dsm_param.rs
deleted file mode 100644
index d9257522..00000000
--- a/sound_card_init/amp/src/max98373d/dsm_param.rs
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2020 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.
-use std::mem;
-
-use cros_alsa::{Card, TLV};
-use sof_sys::sof_abi_hdr;
-
-use dsm::{self, Error, Result};
-
-/// Amp volume mode enumeration used by set_volume().
-#[derive(Copy, Clone, PartialEq)]
-pub enum VolumeMode {
- /// Low mode protects the speaker by limiting its output volume if the
- /// calibration has not been completed successfully.
- Low = 0x1009B9CF,
- /// High mode removes the speaker output volume limitation after
- /// having successfully completed the calibration.
- High = 0x20000000,
-}
-
-#[derive(Copy, Clone)]
-/// Calibration mode enumeration.
-pub enum CalibMode {
- ON = 0x4,
- OFF = 0x1,
-}
-
-#[derive(Copy, Clone)]
-/// Smart pilot signal mode mode enumeration.
-pub enum SPTMode {
- ON = 0x1,
- OFF = 0x0,
-}
-
-#[derive(Copy, Clone)]
-/// DSM Parem field enumeration.
-enum DsmAPI {
- ParamCount = 0x0,
- CalibMode = 0x1,
- MakeupGain = 0x5,
- DsmRdc = 0x6,
- DsmAmbientTemp = 0x8,
- AdaptiveRdc = 0x12,
- SPTMode = 0x68,
-}
-
-#[derive(Debug)]
-/// It implements functions to access the `DSMParam` fields.
-pub struct DSMParam {
- param_count: usize,
- num_channels: usize,
- tlv: TLV,
-}
-
-impl DSMParam {
- const DWORD_PER_PARAM: usize = 2;
- const VALUE_OFFSET: usize = 1;
- const SOF_HEADER_SIZE: usize = mem::size_of::<sof_abi_hdr>() / mem::size_of::<i32>();
-
- /// Creates an `DSMParam`.
- /// # Arguments
- ///
- /// * `card` - `&Card`.
- /// * `num_channels` - number of channels.
- /// * `ctl_name` - the mixer control name to access the DSM param.
- ///
- /// # Results
- ///
- /// * `DSMParam` - It is initialized by the content of the given byte control .
- ///
- /// # Errors
- ///
- /// * If `Card` creation from sound card name fails.
- pub fn new(card: &mut Card, num_channels: usize, ctl_name: &str) -> Result<Self> {
- let tlv = card.control_tlv_by_name(ctl_name)?.load()?;
- Self::try_from_tlv(tlv, num_channels)
- }
-
- /// Sets DSMParam to the given calibration mode.
- pub fn set_calibration_mode(&mut self, mode: CalibMode) {
- for channel in 0..self.num_channels {
- self.set(channel, DsmAPI::CalibMode, mode as i32);
- }
- }
-
- /// Sets DSMParam to the given smart pilot signal mode.
- pub fn set_spt_mode(&mut self, mode: SPTMode) {
- for channel in 0..self.num_channels {
- self.set(channel, DsmAPI::SPTMode, mode as i32);
- }
- }
-
- /// Sets DSMParam to the given VolumeMode.
- pub fn set_volume_mode(&mut self, mode: VolumeMode) {
- for channel in 0..self.num_channels {
- self.set(channel, DsmAPI::MakeupGain, mode as i32);
- }
- }
-
- /// Reads the calibrated rdc from DSMParam.
- pub fn get_adaptive_rdc(&self) -> Vec<i32> {
- self.get(DsmAPI::AdaptiveRdc)
- }
-
- /// Sets DSMParam to the given the calibrated rdc.
- pub fn set_rdc(&mut self, ch: usize, rdc: i32) {
- self.set(ch, DsmAPI::DsmRdc, rdc);
- }
-
- /// Sets DSMParam to the given calibrated temp.
- pub fn set_ambient_temp(&mut self, ch: usize, temp: i32) {
- self.set(ch, DsmAPI::DsmAmbientTemp, temp);
- }
-
- /// Sets the `id` field to the given `val`.
- fn set(&mut self, channel: usize, id: DsmAPI, val: i32) {
- let pos = Self::value_pos(self.param_count, channel, id);
- self.tlv[pos] = val as u32;
- }
-
- /// Gets the val from the `id` field from all the channels.
- fn get(&self, id: DsmAPI) -> Vec<i32> {
- (0..self.num_channels)
- .map(|channel| {
- let pos = Self::value_pos(self.param_count, channel, id);
- self.tlv[pos] as i32
- })
- .collect()
- }
-
- fn try_from_tlv(tlv: TLV, num_channels: usize) -> Result<Self> {
- let param_count_pos = Self::value_pos(0, 0, DsmAPI::ParamCount);
-
- if tlv.len() < param_count_pos {
- return Err(Error::InvalidDSMParam);
- }
-
- let param_count = tlv[param_count_pos] as usize;
-
- if tlv.len() != Self::SOF_HEADER_SIZE + param_count * num_channels * Self::DWORD_PER_PARAM {
- return Err(Error::InvalidDSMParam);
- }
-
- Ok(Self {
- param_count,
- num_channels,
- tlv,
- })
- }
-
- #[inline]
- fn value_pos(param_count: usize, channel: usize, id: DsmAPI) -> usize {
- Self::SOF_HEADER_SIZE
- + (channel * param_count + id as usize) * Self::DWORD_PER_PARAM
- + Self::VALUE_OFFSET
- }
-}
-
-impl Into<TLV> for DSMParam {
- fn into(self) -> TLV {
- self.tlv
- }
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- const PARAM_COUNT: usize = 138;
- const CHANNEL_COUNT: usize = 2;
-
- #[test]
- fn test_dsmparam_try_from_tlv_ok() {
- let mut data = vec![
- 0u32;
- DSMParam::SOF_HEADER_SIZE
- + CHANNEL_COUNT * PARAM_COUNT * DSMParam::DWORD_PER_PARAM
- ];
- data[DSMParam::value_pos(PARAM_COUNT, 0, DsmAPI::ParamCount)] = PARAM_COUNT as u32;
- data[DSMParam::value_pos(PARAM_COUNT, 1, DsmAPI::ParamCount)] = PARAM_COUNT as u32;
-
- let tlv = TLV::new(0, data);
- assert!(DSMParam::try_from_tlv(tlv, CHANNEL_COUNT).is_ok());
- }
-
- #[test]
- fn test_dsmparam_try_from_invalid_len() {
- let data = vec![0u32; DSMParam::SOF_HEADER_SIZE];
-
- let tlv = TLV::new(0, data);
- assert_eq!(
- DSMParam::try_from_tlv(tlv, CHANNEL_COUNT).unwrap_err(),
- Error::InvalidDSMParam
- );
- }
-
- #[test]
- fn test_dsmparam_try_from_param_count() {
- let data = vec![
- 0u32;
- DSMParam::SOF_HEADER_SIZE
- + CHANNEL_COUNT * PARAM_COUNT * DSMParam::DWORD_PER_PARAM
- ];
-
- let tlv = TLV::new(0, data);
- assert_eq!(
- DSMParam::try_from_tlv(tlv, CHANNEL_COUNT).unwrap_err(),
- Error::InvalidDSMParam
- );
- }
-}