From ddbb6c8c31a558b82f8e2a13ddb364e371ec5776 Mon Sep 17 00:00:00 2001
From: Univa <41708691+Univa@users.noreply.github.com>
Date: Tue, 21 May 2024 19:03:14 -0400
Subject: [PATCH] add back InternalChannel and implement it where its missing

---
 embassy-stm32/src/adc/f1.rs      |  6 +++++-
 embassy-stm32/src/adc/f3.rs      |  6 +++++-
 embassy-stm32/src/adc/f3_v1_1.rs |  6 +++++-
 embassy-stm32/src/adc/g4.rs      |  8 +++++++-
 embassy-stm32/src/adc/mod.rs     |  5 ++++-
 embassy-stm32/src/adc/v1.rs      | 12 +++++++++++-
 embassy-stm32/src/adc/v2.rs      |  8 +++++++-
 embassy-stm32/src/adc/v3.rs      | 12 +++++++++++-
 embassy-stm32/src/adc/v4.rs      |  8 +++++++-
 9 files changed, 62 insertions(+), 9 deletions(-)

diff --git a/embassy-stm32/src/adc/f1.rs b/embassy-stm32/src/adc/f1.rs
index 3822d5032..cc7ffdea8 100644
--- a/embassy-stm32/src/adc/f1.rs
+++ b/embassy-stm32/src/adc/f1.rs
@@ -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 {
diff --git a/embassy-stm32/src/adc/f3.rs b/embassy-stm32/src/adc/f3.rs
index 3f076d64b..363ddbe3a 100644
--- a/embassy-stm32/src/adc/f3.rs
+++ b/embassy-stm32/src/adc/f3.rs
@@ -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 {
diff --git a/embassy-stm32/src/adc/f3_v1_1.rs b/embassy-stm32/src/adc/f3_v1_1.rs
index 106956989..73bfe4876 100644
--- a/embassy-stm32/src/adc/f3_v1_1.rs
+++ b/embassy-stm32/src/adc/f3_v1_1.rs
@@ -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 {
diff --git a/embassy-stm32/src/adc/g4.rs b/embassy-stm32/src/adc/g4.rs
index ce7f5db70..f9751bd92 100644
--- a/embassy-stm32/src/adc/g4.rs
+++ b/embassy-stm32/src/adc/g4.rs
@@ -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 {
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs
index 6a3d0f44c..3e62b6f3b 100644
--- a/embassy-stm32/src/adc/mod.rs
+++ b/embassy-stm32/src/adc/mod.rs
@@ -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 {
diff --git a/embassy-stm32/src/adc/v1.rs b/embassy-stm32/src/adc/v1.rs
index 090790c39..abd58952d 100644
--- a/embassy-stm32/src/adc/v1.rs
+++ b/embassy-stm32/src/adc/v1.rs
@@ -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 {
diff --git a/embassy-stm32/src/adc/v2.rs b/embassy-stm32/src/adc/v2.rs
index 033108195..f7b791903 100644
--- a/embassy-stm32/src/adc/v2.rs
+++ b/embassy-stm32/src/adc/v2.rs
@@ -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 {
diff --git a/embassy-stm32/src/adc/v3.rs b/embassy-stm32/src/adc/v3.rs
index be857f4dd..36e0e3df3 100644
--- a/embassy-stm32/src/adc/v3.rs
+++ b/embassy-stm32/src/adc/v3.rs
@@ -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 {
diff --git a/embassy-stm32/src/adc/v4.rs b/embassy-stm32/src/adc/v4.rs
index f564114c2..bf3a55797 100644
--- a/embassy-stm32/src/adc/v4.rs
+++ b/embassy-stm32/src/adc/v4.rs
@@ -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 {