add back InternalChannel and implement it where its missing

This commit is contained in:
Univa 2024-05-21 19:03:14 -04:00
parent 7cdbae2a5d
commit ddbb6c8c31
9 changed files with 62 additions and 9 deletions

View file

@ -4,7 +4,7 @@ use core::task::Poll;
use embassy_hal_internal::into_ref;
use super::blocking_delay_us;
use super::{blocking_delay_us, InternalChannel};
use crate::adc::{Adc, AdcChannel, Instance, SampleTime};
use crate::time::Hertz;
use crate::{interrupt, Peripheral};
@ -32,6 +32,8 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl
}
pub struct Vref;
impl<T: Instance> InternalChannel<T> for Vref {}
impl<T: Instance> super::SealedInternalChannel<T> for Vref {}
impl<T: Instance> AdcChannel<T> for Vref {}
impl<T: Instance> super::SealedAdcChannel<T> for Vref {
fn channel(&self) -> u8 {
@ -40,6 +42,8 @@ impl<T: Instance> super::SealedAdcChannel<T> for Vref {
}
pub struct Temperature;
impl<T: Instance> InternalChannel<T> for Temperature {}
impl<T: Instance> super::SealedInternalChannel<T> for Temperature {}
impl<T: Instance> AdcChannel<T> for Temperature {}
impl<T: Instance> super::SealedAdcChannel<T> for Temperature {
fn channel(&self) -> u8 {

View file

@ -4,7 +4,7 @@ use core::task::Poll;
use embassy_hal_internal::into_ref;
use super::blocking_delay_us;
use super::{blocking_delay_us, InternalChannel};
use crate::adc::{Adc, AdcChannel, Instance, SampleTime};
use crate::interrupt::typelevel::Interrupt;
use crate::time::Hertz;
@ -32,6 +32,8 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl
}
pub struct Vref;
impl<T: Instance> InternalChannel<T> for Vref {}
impl<T: Instance> super::SealedInternalChannel<T> for Vref {}
impl<T: Instance> AdcChannel<T> for Vref {}
impl<T: Instance> super::SealedAdcChannel<T> for Vref {
fn channel(&self) -> u8 {
@ -47,6 +49,8 @@ impl Vref {
}
pub struct Temperature;
impl<T: Instance> InternalChannel<T> for Temperature {}
impl<T: Instance> super::SealedInternalChannel<T> for Temperature {}
impl<T: Instance> AdcChannel<T> for Temperature {}
impl<T: Instance> super::SealedAdcChannel<T> for Temperature {
fn channel(&self) -> u8 {

View file

@ -6,7 +6,7 @@ use embassy_futures::yield_now;
use embassy_hal_internal::into_ref;
use embassy_time::Instant;
use super::Resolution;
use super::{InternalChannel, Resolution};
use crate::adc::{Adc, AdcChannel, Instance, SampleTime};
use crate::interrupt::typelevel::Interrupt;
use crate::time::Hertz;
@ -64,6 +64,8 @@ fn update_vref<T: Instance>(op: i8) {
}
pub struct Vref<T: Instance>(core::marker::PhantomData<T>);
impl<T: Instance> InternalChannel<T> for Vref<T> {}
impl<T: Instance> super::SealedInternalChannel<T> for Vref<T> {}
impl<T: Instance> AdcChannel<T> for Vref<T> {}
impl<T: Instance> super::SealedAdcChannel<T> for Vref<T> {
fn channel(&self) -> u8 {
@ -123,6 +125,8 @@ impl<T: Instance> Drop for Vref<T> {
}
pub struct Temperature<T: Instance>(core::marker::PhantomData<T>);
impl<T: Instance> InternalChannel<T> for Temperature<T> {}
impl<T: Instance> super::SealedInternalChannel<T> for Temperature<T> {}
impl<T: Instance> AdcChannel<T> for Temperature<T> {}
impl<T: Instance> super::SealedAdcChannel<T> for Temperature<T> {
fn channel(&self) -> u8 {

View file

@ -2,7 +2,7 @@
use pac::adc::vals::{Adcaldif, Difsel, Exten};
use pac::adccommon::vals::Presc;
use super::{blocking_delay_us, Adc, AdcChannel, Instance, Resolution, SampleTime};
use super::{blocking_delay_us, Adc, AdcChannel, Instance, InternalChannel, Resolution, SampleTime};
use crate::time::Hertz;
use crate::{pac, Peripheral};
@ -33,6 +33,8 @@ const VBAT_CHANNEL: u8 = 17;
// NOTE: Vrefint/Temperature/Vbat are not available on all ADCs, this currently cannot be modeled with stm32-data, so these are available from the software on all ADCs
/// Internal voltage reference channel.
pub struct VrefInt;
impl<T: Instance> InternalChannel<T> for VrefInt {}
impl<T: Instance> super::SealedInternalChannel<T> for VrefInt {}
impl<T: Instance> AdcChannel<T> for VrefInt {}
impl<T: Instance> super::SealedAdcChannel<T> for VrefInt {
fn channel(&self) -> u8 {
@ -42,6 +44,8 @@ impl<T: Instance> super::SealedAdcChannel<T> for VrefInt {
/// Internal temperature channel.
pub struct Temperature;
impl<T: Instance> InternalChannel<T> for Temperature {}
impl<T: Instance> super::SealedInternalChannel<T> for Temperature {}
impl<T: Instance> AdcChannel<T> for Temperature {}
impl<T: Instance> super::SealedAdcChannel<T> for Temperature {
fn channel(&self) -> u8 {
@ -51,6 +55,8 @@ impl<T: Instance> super::SealedAdcChannel<T> for Temperature {
/// Internal battery voltage channel.
pub struct Vbat;
impl<T: Instance> InternalChannel<T> for Vbat {}
impl<T: Instance> super::SealedInternalChannel<T> for Vbat {}
impl<T: Instance> AdcChannel<T> for Vbat {}
impl<T: Instance> super::SealedAdcChannel<T> for Vbat {
fn channel(&self) -> u8 {

View file

@ -61,7 +61,7 @@ trait SealedInstance {
}
pub(crate) trait SealedAdcPin<T: Instance> {}
pub(crate) trait SealedInternalChannel<T> {}
pub(crate) trait SealedAdcChannel<T> {
#[cfg(any(adc_v1, adc_l0, adc_v2, adc_g4, adc_v4))]
fn setup(&mut self) {}
@ -126,6 +126,9 @@ pub trait Instance: SealedInstance + crate::Peripheral<P = Self> + crate::rcc::R
/// ADC pin.
#[allow(private_bounds)]
pub trait AdcPin<T: Instance>: AdcChannel<T> + SealedAdcPin<T> {}
/// ADC internal channel.
#[allow(private_bounds)]
pub trait InternalChannel<T>: SealedInternalChannel<T> {}
/// ADC channel.
#[allow(private_bounds)]
pub trait AdcChannel<T>: SealedAdcChannel<T> + Sized {

View file

@ -6,7 +6,7 @@ use embassy_hal_internal::into_ref;
#[cfg(adc_l0)]
use stm32_metapac::adc::vals::Ckmode;
use super::blocking_delay_us;
use super::{blocking_delay_us, InternalChannel};
use crate::adc::{Adc, AdcChannel, Instance, Resolution, SampleTime};
use crate::interrupt::typelevel::Interrupt;
use crate::peripherals::ADC1;
@ -35,6 +35,12 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl
#[cfg(not(adc_l0))]
pub struct Vbat;
#[cfg(not(adc_l0))]
impl InternalChannel<ADC1> for Vbat {}
#[cfg(not(adc_l0))]
impl super::SealedInternalChannel<ADC1> for Vbat {}
#[cfg(not(adc_l0))]
impl AdcChannel<ADC1> for Vbat {}
@ -46,6 +52,8 @@ impl super::SealedAdcChannel<ADC1> for Vbat {
}
pub struct Vref;
impl InternalChannel<ADC1> for Vref {}
impl super::SealedInternalChannel<ADC1> for Vref {}
impl AdcChannel<ADC1> for Vref {}
impl super::SealedAdcChannel<ADC1> for Vref {
fn channel(&self) -> u8 {
@ -54,6 +62,8 @@ impl super::SealedAdcChannel<ADC1> for Vref {
}
pub struct Temperature;
impl InternalChannel<ADC1> for Temperature {}
impl super::SealedInternalChannel<ADC1> for Temperature {}
impl AdcChannel<ADC1> for Temperature {}
impl super::SealedAdcChannel<ADC1> for Temperature {
fn channel(&self) -> u8 {

View file

@ -1,6 +1,6 @@
use embassy_hal_internal::into_ref;
use super::blocking_delay_us;
use super::{blocking_delay_us, InternalChannel};
use crate::adc::{Adc, AdcChannel, Instance, Resolution, SampleTime};
use crate::peripherals::ADC1;
use crate::time::Hertz;
@ -12,6 +12,8 @@ pub const VREF_DEFAULT_MV: u32 = 3300;
pub const VREF_CALIB_MV: u32 = 3300;
pub struct VrefInt;
impl InternalChannel<ADC1> for VrefInt {}
impl super::SealedInternalChannel<ADC1> for VrefInt {}
impl AdcChannel<ADC1> for VrefInt {}
impl super::SealedAdcChannel<ADC1> for VrefInt {
fn channel(&self) -> u8 {
@ -27,6 +29,8 @@ impl VrefInt {
}
pub struct Temperature;
impl InternalChannel<ADC1> for Temperature {}
impl super::SealedInternalChannel<ADC1> for Temperature {}
impl AdcChannel<ADC1> for Temperature {}
impl super::SealedAdcChannel<ADC1> for Temperature {
fn channel(&self) -> u8 {
@ -48,6 +52,8 @@ impl Temperature {
}
pub struct Vbat;
impl InternalChannel<ADC1> for Vbat {}
impl super::SealedInternalChannel<ADC1> for Vbat {}
impl AdcChannel<ADC1> for Vbat {}
impl super::SealedAdcChannel<ADC1> for Vbat {
fn channel(&self) -> u8 {

View file

@ -1,7 +1,7 @@
use cfg_if::cfg_if;
use embassy_hal_internal::into_ref;
use super::blocking_delay_us;
use super::{blocking_delay_us, InternalChannel};
use crate::adc::{Adc, AdcChannel, Instance, Resolution, SampleTime};
use crate::Peripheral;
@ -11,6 +11,8 @@ pub const VREF_DEFAULT_MV: u32 = 3300;
pub const VREF_CALIB_MV: u32 = 3000;
pub struct VrefInt;
impl<T: Instance> InternalChannel<T> for VrefInt {}
impl<T: Instance> super::SealedInternalChannel<T> for VrefInt {}
impl<T: Instance> AdcChannel<T> for VrefInt {}
impl<T: Instance> super::SealedAdcChannel<T> for VrefInt {
fn channel(&self) -> u8 {
@ -30,6 +32,8 @@ impl<T: Instance> super::SealedAdcChannel<T> for VrefInt {
}
pub struct Temperature;
impl<T: Instance> InternalChannel<T> for Temperature {}
impl<T: Instance> super::SealedInternalChannel<T> for Temperature {}
impl<T: Instance> AdcChannel<T> for Temperature {}
impl<T: Instance> super::SealedAdcChannel<T> for Temperature {
fn channel(&self) -> u8 {
@ -49,6 +53,8 @@ impl<T: Instance> super::SealedAdcChannel<T> for Temperature {
}
pub struct Vbat;
impl<T: Instance> InternalChannel<T> for Vbat {}
impl<T: Instance> super::SealedInternalChannel<T> for Vbat {}
impl<T: Instance> AdcChannel<T> for Vbat {}
impl<T: Instance> super::SealedAdcChannel<T> for Vbat {
fn channel(&self) -> u8 {
@ -70,6 +76,8 @@ impl<T: Instance> super::SealedAdcChannel<T> for Vbat {
cfg_if! {
if #[cfg(adc_h5)] {
pub struct VddCore;
impl<T: Instance> InternalChannel<T> for VddCore {}
impl<T: Instance> super::SealedInternalChannel<T> for VddCore {}
impl<T: Instance> AdcChannel<T> for VddCore {}
impl<T: Instance> super::SealedAdcChannel<T> for VddCore {
fn channel(&self) -> u8 {
@ -82,6 +90,8 @@ cfg_if! {
cfg_if! {
if #[cfg(adc_u0)] {
pub struct DacOut;
impl<T: Instance> InternalChannel<T> for DacOut {}
impl<T: Instance> super::SealedInternalChannel<T> for DacOut {}
impl<T: Instance> AdcChannel<T> for DacOut {}
impl<T: Instance> super::SealedAdcChannel<T> for DacOut {
fn channel(&self) -> u8 {

View file

@ -2,7 +2,7 @@
use pac::adc::vals::{Adcaldif, Boost, Difsel, Exten, Pcsel};
use pac::adccommon::vals::Presc;
use super::{blocking_delay_us, Adc, AdcChannel, Instance, Resolution, SampleTime};
use super::{blocking_delay_us, Adc, AdcChannel, Instance, InternalChannel, Resolution, SampleTime};
use crate::time::Hertz;
use crate::{pac, Peripheral};
@ -33,6 +33,8 @@ const VBAT_CHANNEL: u8 = 17;
// NOTE: Vrefint/Temperature/Vbat are not available on all ADCs, this currently cannot be modeled with stm32-data, so these are available from the software on all ADCs
/// Internal voltage reference channel.
pub struct VrefInt;
impl<T: Instance> InternalChannel<T> for VrefInt {}
impl<T: Instance> super::SealedInternalChannel<T> for VrefInt {}
impl<T: Instance> AdcChannel<T> for VrefInt {}
impl<T: Instance> super::SealedAdcChannel<T> for VrefInt {
fn channel(&self) -> u8 {
@ -42,6 +44,8 @@ impl<T: Instance> super::SealedAdcChannel<T> for VrefInt {
/// Internal temperature channel.
pub struct Temperature;
impl<T: Instance> InternalChannel<T> for Temperature {}
impl<T: Instance> super::SealedInternalChannel<T> for Temperature {}
impl<T: Instance> AdcChannel<T> for Temperature {}
impl<T: Instance> super::SealedAdcChannel<T> for Temperature {
fn channel(&self) -> u8 {
@ -51,6 +55,8 @@ impl<T: Instance> super::SealedAdcChannel<T> for Temperature {
/// Internal battery voltage channel.
pub struct Vbat;
impl<T: Instance> InternalChannel<T> for Vbat {}
impl<T: Instance> super::SealedInternalChannel<T> for Vbat {}
impl<T: Instance> AdcChannel<T> for Vbat {}
impl<T: Instance> super::SealedAdcChannel<T> for Vbat {
fn channel(&self) -> u8 {