Skip to content

Commit

Permalink
attiny-hal: update adc macro invocations
Browse files Browse the repository at this point in the history
  • Loading branch information
LuigiPiucco committed Dec 1, 2023
1 parent f48b718 commit cbfb118
Showing 1 changed file with 126 additions and 82 deletions.
208 changes: 126 additions & 82 deletions mcu/attiny-hal/src/adc.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
#![allow(non_camel_case_types)]
//! Analog-to-Digital Converter
use crate::port;
use crate::{
pac,
port::*,
};
pub use avr_hal_generic::adc::{AdcChannel, AdcOps, ClockDivider};

/// Check the [`avr_hal_generic::adc::Adc`] documentation.
Expand Down Expand Up @@ -32,109 +35,150 @@ pub mod channel {

#[cfg(feature = "attiny85")]
avr_hal_generic::impl_adc! {
hal: crate::Attiny,
peripheral: crate::pac::ADC,
settings: AdcSettings,
apply_settings: |peripheral, settings| {
apply_clock(peripheral, settings);
peripheral.admux.write(|w| match settings.ref_voltage {
/// Select the voltage reference for the ADC peripheral
///
/// The internal voltage reference options may not be used if an external reference voltage is
/// being applied to the AREF pin.
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum ReferenceVoltage {
/// Voltage applied to AREF pin.
Aref,
/// System reference voltage, GND (default).
#[default]
AVcc,
/// Internal 1.1V reference.
Internal1_1,
/// Internal 2.56V reference.
Internal2_56,
}

pub fn set_reference(self, settings: Self::Settings) {
self.admux.write(|w| match settings.ref_voltage {
ReferenceVoltage::Aref => w.refs().aref(),
ReferenceVoltage::AVcc => w.refs().vcc(),
ReferenceVoltage::Internal1_1 => w.refs().internal().refs2().clear_bit(),
ReferenceVoltage::Internal2_56 => w.refs().internal().refs2().set_bit(),
});
},
channel_id: crate::pac::adc::admux::MUX_A,
set_channel: |peripheral, id| {
peripheral.admux.modify(|_, w| w.mux().variant(id));
},
pins: {
port::PB5: (crate::pac::adc::admux::MUX_A::ADC0, didr0::adc0d),
port::PB2: (crate::pac::adc::admux::MUX_A::ADC1, didr0::adc1d),
port::PB4: (crate::pac::adc::admux::MUX_A::ADC2, didr0::adc2d),
port::PB3: (crate::pac::adc::admux::MUX_A::ADC3, didr0::adc3d),
},
channels: {
channel::Vbg: crate::pac::adc::admux::MUX_A::ADC_VBG,
channel::Gnd: crate::pac::adc::admux::MUX_A::ADC_GND,
channel::Temperature: crate::pac::adc::admux::MUX_A::TEMPSENS,
},
}
}
pub fn set_channel(self, channel: Self::Channel) {
self.admux.modify(|_, w| w.mux().variant(channel));
}

impl AdcProvider for pac::ADC {
type Hal = crate::Attiny;

const PB5: DIDR0::ADC0D = pac::adc::admux::MUX_A::ADC0;
const PB2: DIDR0::ADC1D = pac::adc::admux::MUX_A::ADC1;
const PB4: DIDR0::ADC2D = pac::adc::admux::MUX_A::ADC2;
const PB3: DIDR0::ADC3D = pac::adc::admux::MUX_A::ADC3;
}

type ChannelId = pac::adc::admux::MUX_A;
pub enum Channels {
channel::Vbg = pac::adc::admux::MUX_A::ADC_VBG,
channel::Gnd = pac::adc::admux::MUX_A::ADC_GND,
channel::Temperature = pac::adc::admux::MUX_A::TEMPSENS,
}
}

#[cfg(feature = "attiny88")]
avr_hal_generic::impl_adc! {
hal: crate::Attiny,
peripheral: crate::pac::ADC,
settings: AdcSettings,
apply_settings: |peripheral, settings| {
apply_clock(peripheral, settings);
peripheral.admux.write(|w| match settings.ref_voltage {
/// Select the voltage reference for the ADC peripheral
///
/// The internal voltage reference options may not be used if an external reference voltage is
/// being applied to the AREF pin.
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum ReferenceVoltage {
/// System reference voltage, GND (default).
#[default]
AVcc,
/// Internal 1.1V reference.
Internal1_1,
}

pub fn set_reference(self, settings: Self::Settings) {
self.admux.write(|w| match settings.ref_voltage {
ReferenceVoltage::AVcc => w.refs0().avcc(),
ReferenceVoltage::Internal1_1 => w.refs0().internal(),
});
},
channel_id: crate::pac::adc::admux::MUX_A,
set_channel: |peripheral, id| {
peripheral.admux.modify(|_, w| w.mux().variant(id));
},
pins: {
port::PC0: (crate::pac::adc::admux::MUX_A::ADC0, didr0::adc0d),
port::PC1: (crate::pac::adc::admux::MUX_A::ADC1, didr0::adc1d),
port::PC2: (crate::pac::adc::admux::MUX_A::ADC2, didr0::adc2d),
port::PC3: (crate::pac::adc::admux::MUX_A::ADC3, didr0::adc3d),
port::PC4: (crate::pac::adc::admux::MUX_A::ADC4, didr0::adc4d),
port::PC5: (crate::pac::adc::admux::MUX_A::ADC5, didr0::adc5d),
port::PA0: (crate::pac::adc::admux::MUX_A::ADC6, didr0::adc6d),
port::PA1: (crate::pac::adc::admux::MUX_A::ADC7, didr0::adc7d),
},
channels: {
channel::Vbg: crate::pac::adc::admux::MUX_A::ADC_VBG,
channel::Gnd: crate::pac::adc::admux::MUX_A::ADC_GND,
channel::Temperature: crate::pac::adc::admux::MUX_A::TEMPSENS,
},
}
}
pub fn set_channel(self, channel: Self::Channel) {
self.admux.modify(|_, w| w.mux().variant(channel));
}

impl AdcProvider for pac::ADC {
type Hal = crate::Attiny;

const PC0: DIDR0::ADC0D = pac::adc::admux::MUX_A::ADC0;
const PC1: DIDR0::ADC1D = pac::adc::admux::MUX_A::ADC1;
const PC2: DIDR0::ADC2D = pac::adc::admux::MUX_A::ADC2;
const PC3: DIDR0::ADC3D = pac::adc::admux::MUX_A::ADC3;
const PC4: DIDR0::ADC4D = pac::adc::admux::MUX_A::ADC4;
const PC5: DIDR0::ADC5D = pac::adc::admux::MUX_A::ADC5;
const PA0: DIDR0::ADC6D = pac::adc::admux::MUX_A::ADC6;
const PA1: DIDR0::ADC7D = pac::adc::admux::MUX_A::ADC7;
}

type ChannelId = pac::adc::admux::MUX_A;
pub enum Channels {
channel::Vbg = pac::adc::admux::MUX_A::ADC_VBG,
channel::Gnd = pac::adc::admux::MUX_A::ADC_GND,
channel::Temperature = pac::adc::admux::MUX_A::TEMPSENS,
}
}

#[cfg(feature = "attiny167")]
avr_hal_generic::impl_adc! {
hal: crate::Attiny,
peripheral: crate::pac::ADC,
settings: AdcSettings,
apply_settings: |peripheral, settings| {
apply_clock(peripheral, settings);
peripheral.amiscr.write(|w| match settings.ref_voltage {
/// Select the voltage reference for the ADC peripheral
///
/// The internal voltage reference options may not be used if an external reference voltage is
/// being applied to the AREF pin.
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum ReferenceVoltage {
/// Voltage applied to AREF pin.
Aref,
/// System reference voltage, GND (default).
#[default]
AVcc,
/// Internal 1.1V reference.
Internal1_1,
/// Internal 2.56V reference.
Internal2_56,
}

pub fn set_reference(self, settings: Self::Settings) {
self.amiscr.write(|w| match settings.ref_voltage {
ReferenceVoltage::Aref => w.arefen().set_bit(),
_ => w.arefen().clear_bit(),
});
peripheral.admux.write(|w| match settings.ref_voltage {
self.admux.write(|w| match settings.ref_voltage {
ReferenceVoltage::Aref => w.refs().avcc(),
ReferenceVoltage::AVcc => w.refs().avcc(),
ReferenceVoltage::Internal1_1 => w.refs().internal_11(),
ReferenceVoltage::Internal2_56 => w.refs().internal_256(),
});
},
channel_id: crate::pac::adc::admux::MUX_A,
set_channel: |peripheral, id| {
peripheral.admux.modify(|_, w| w.mux().variant(id));
},
pins: {
port::PA0: (crate::pac::adc::admux::MUX_A::ADC0, didr0::adc0d),
port::PA1: (crate::pac::adc::admux::MUX_A::ADC1, didr0::adc1d),
port::PA2: (crate::pac::adc::admux::MUX_A::ADC2, didr0::adc2d),
port::PA3: (crate::pac::adc::admux::MUX_A::ADC3, didr0::adc3d),
port::PA4: (crate::pac::adc::admux::MUX_A::ADC4, didr0::adc4d),
port::PA5: (crate::pac::adc::admux::MUX_A::ADC5, didr0::adc5d),
port::PA6: (crate::pac::adc::admux::MUX_A::ADC6, didr0::adc6d),
port::PA7: (crate::pac::adc::admux::MUX_A::ADC7, didr0::adc7d),
port::PB5: (crate::pac::adc::admux::MUX_A::ADC8, didr1::adc8d),
port::PB6: (crate::pac::adc::admux::MUX_A::ADC9, didr1::adc9d),
port::PB7: (crate::pac::adc::admux::MUX_A::ADC10, didr1::adc10d),
},
channels: {
channel::AVcc_4: crate::pac::adc::admux::MUX_A::ADC_AVCC_4,
channel::Vbg: crate::pac::adc::admux::MUX_A::ADC_VBG,
channel::Gnd: crate::pac::adc::admux::MUX_A::ADC_GND,
channel::Temperature: crate::pac::adc::admux::MUX_A::TEMPSENS,
},
}
pub fn set_channel(self, channel: Self::Channel) {
self.admux.modify(|_, w| w.mux().variant(channel));
}

impl AdcProvider for pac::ADC {
type Hal = crate::Attiny;

const PB5: DIDR0::ADC0D = pac::adc::admux::MUX_A::ADC0;
const PB2: DIDR0::ADC1D = pac::adc::admux::MUX_A::ADC1;
const PB4: DIDR0::ADC2D = pac::adc::admux::MUX_A::ADC2;
const PB3: DIDR0::ADC3D = pac::adc::admux::MUX_A::ADC3;
}

type ChannelId = pac::adc::admux::MUX_A;
pub enum Channels {
channel::AVcc_4 = pac::adc::admux::MUX_A::ADC_AVCC_4,
channel::Vbg = pac::adc::admux::MUX_A::ADC_VBG,
channel::Gnd = pac::adc::admux::MUX_A::ADC_GND,
channel::Temperature = pac::adc::admux::MUX_A::TEMPSENS,
}
}

0 comments on commit cbfb118

Please sign in to comment.