From cbfb118c02feff4cf8728dd8af66f783730c95be Mon Sep 17 00:00:00 2001 From: Luigi Sartor Piucco Date: Fri, 1 Dec 2023 13:02:37 -0300 Subject: [PATCH] attiny-hal: update adc macro invocations --- mcu/attiny-hal/src/adc.rs | 208 +++++++++++++++++++++++--------------- 1 file changed, 126 insertions(+), 82 deletions(-) diff --git a/mcu/attiny-hal/src/adc.rs b/mcu/attiny-hal/src/adc.rs index 7b59f504a4..fd463550cd 100644 --- a/mcu/attiny-hal/src/adc.rs +++ b/mcu/attiny-hal/src/adc.rs @@ -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. @@ -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, + } }