rp/clocks: don't expose unstable pac items
exposing pac items kind of undermines the unstable-pac feature. directly exposing register structure is also pretty inconvenient since the clock switching code takes care of the src/aux difference in behavior, so a user needn't really be forced to write down decomposed register values.
This commit is contained in:
		
							parent
							
								
									d97a771479
								
							
						
					
					
						commit
						f97b591831
					
				| @ -6,11 +6,18 @@ use crate::{pac, reset, Peripheral}; | |||||||
| // TODO fix terrible use of global here
 | // TODO fix terrible use of global here
 | ||||||
| static mut XIN_HZ: u32 = 0; | static mut XIN_HZ: u32 = 0; | ||||||
| 
 | 
 | ||||||
| pub use rp_pac::clocks::vals::{ | #[repr(u8)] | ||||||
|     ClkAdcCtrlAuxsrc as AdcAuxsrc, ClkGpoutCtrlAuxsrc as GpoutSrc, ClkPeriCtrlAuxsrc as PeriClkAuxsrc, | #[non_exhaustive] | ||||||
|     ClkRefCtrlAuxsrc as RefAuxsrc, ClkRtcCtrlAuxsrc as RtcAuxsrc, ClkSysCtrlAuxsrc as SysAuxsrc, | #[derive(Clone, Copy, Debug, PartialEq, Eq)] | ||||||
|     ClkUsbCtrlAuxsrc as UsbAuxsrc, | pub enum PeriClkSrc { | ||||||
| }; |     Sys = ClkPeriCtrlAuxsrc::CLK_SYS.0, | ||||||
|  |     PllSys = ClkPeriCtrlAuxsrc::CLKSRC_PLL_SYS.0, | ||||||
|  |     PllUsb = ClkPeriCtrlAuxsrc::CLKSRC_PLL_USB.0, | ||||||
|  |     Rosc = ClkPeriCtrlAuxsrc::ROSC_CLKSRC_PH.0, | ||||||
|  |     Xosc = ClkPeriCtrlAuxsrc::XOSC_CLKSRC.0, | ||||||
|  |     Gpin0 = ClkPeriCtrlAuxsrc::CLKSRC_GPIN0.0, | ||||||
|  |     Gpin1 = ClkPeriCtrlAuxsrc::CLKSRC_GPIN1.0, | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| #[non_exhaustive] | #[non_exhaustive] | ||||||
| pub struct ClockConfig { | pub struct ClockConfig { | ||||||
| @ -18,7 +25,7 @@ pub struct ClockConfig { | |||||||
|     pub xosc: Option<XoscConfig>, |     pub xosc: Option<XoscConfig>, | ||||||
|     pub ref_clk: RefClkConfig, |     pub ref_clk: RefClkConfig, | ||||||
|     pub sys_clk: SysClkConfig, |     pub sys_clk: SysClkConfig, | ||||||
|     pub peri_clk_src: Option<ClkPeriCtrlAuxsrc>, |     pub peri_clk_src: Option<PeriClkSrc>, | ||||||
|     pub usb_clk: Option<UsbClkConfig>, |     pub usb_clk: Option<UsbClkConfig>, | ||||||
|     pub adc_clk: Option<AdcClkConfig>, |     pub adc_clk: Option<AdcClkConfig>, | ||||||
|     pub rtc_clk: Option<RtcClkConfig>, |     pub rtc_clk: Option<RtcClkConfig>, | ||||||
| @ -28,7 +35,7 @@ impl ClockConfig { | |||||||
|     pub fn crystal(crystal_hz: u32) -> Self { |     pub fn crystal(crystal_hz: u32) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             rosc: Some(RoscConfig { |             rosc: Some(RoscConfig { | ||||||
|                 range: pac::rosc::vals::FreqRange::MEDIUM, |                 range: RoscRange::Medium, | ||||||
|                 drive_strength: [0; 8], |                 drive_strength: [0; 8], | ||||||
|                 div: 16, |                 div: 16, | ||||||
|             }), |             }), | ||||||
| @ -52,23 +59,23 @@ impl ClockConfig { | |||||||
|                 div: 1, |                 div: 1, | ||||||
|             }, |             }, | ||||||
|             sys_clk: SysClkConfig { |             sys_clk: SysClkConfig { | ||||||
|                 src: SysClkSrc::Aux(ClkSysCtrlAuxsrc::CLKSRC_PLL_SYS), |                 src: SysClkSrc::PllSys, | ||||||
|                 div_int: 1, |                 div_int: 1, | ||||||
|                 div_frac: 0, |                 div_frac: 0, | ||||||
|             }, |             }, | ||||||
|             peri_clk_src: Some(ClkPeriCtrlAuxsrc::CLK_SYS), |             peri_clk_src: Some(PeriClkSrc::Sys), | ||||||
|             usb_clk: Some(UsbClkConfig { |             usb_clk: Some(UsbClkConfig { | ||||||
|                 src: ClkUsbCtrlAuxsrc::CLKSRC_PLL_USB, |                 src: UsbClkSrc::PllUsb, | ||||||
|                 div: 1, |                 div: 1, | ||||||
|                 phase: 0, |                 phase: 0, | ||||||
|             }), |             }), | ||||||
|             adc_clk: Some(AdcClkConfig { |             adc_clk: Some(AdcClkConfig { | ||||||
|                 src: ClkAdcCtrlAuxsrc::CLKSRC_PLL_USB, |                 src: AdcClkSrc::PllUsb, | ||||||
|                 div: 1, |                 div: 1, | ||||||
|                 phase: 0, |                 phase: 0, | ||||||
|             }), |             }), | ||||||
|             rtc_clk: Some(RtcClkConfig { |             rtc_clk: Some(RtcClkConfig { | ||||||
|                 src: ClkRtcCtrlAuxsrc::CLKSRC_PLL_USB, |                 src: RtcClkSrc::PllUsb, | ||||||
|                 div_int: 1024, |                 div_int: 1024, | ||||||
|                 div_frac: 0, |                 div_frac: 0, | ||||||
|                 phase: 0, |                 phase: 0, | ||||||
| @ -79,7 +86,7 @@ impl ClockConfig { | |||||||
|     pub fn rosc() -> Self { |     pub fn rosc() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             rosc: Some(RoscConfig { |             rosc: Some(RoscConfig { | ||||||
|                 range: pac::rosc::vals::FreqRange::HIGH, |                 range: RoscRange::High, | ||||||
|                 drive_strength: [0; 8], |                 drive_strength: [0; 8], | ||||||
|                 div: 1, |                 div: 1, | ||||||
|             }), |             }), | ||||||
| @ -89,19 +96,19 @@ impl ClockConfig { | |||||||
|                 div: 1, |                 div: 1, | ||||||
|             }, |             }, | ||||||
|             sys_clk: SysClkConfig { |             sys_clk: SysClkConfig { | ||||||
|                 src: SysClkSrc::Aux(ClkSysCtrlAuxsrc::ROSC_CLKSRC), |                 src: SysClkSrc::Rosc, | ||||||
|                 div_int: 1, |                 div_int: 1, | ||||||
|                 div_frac: 0, |                 div_frac: 0, | ||||||
|             }, |             }, | ||||||
|             peri_clk_src: Some(ClkPeriCtrlAuxsrc::ROSC_CLKSRC_PH), |             peri_clk_src: Some(PeriClkSrc::Rosc), | ||||||
|             usb_clk: None, |             usb_clk: None, | ||||||
|             adc_clk: Some(AdcClkConfig { |             adc_clk: Some(AdcClkConfig { | ||||||
|                 src: ClkAdcCtrlAuxsrc::ROSC_CLKSRC_PH, |                 src: AdcClkSrc::Rosc, | ||||||
|                 div: 1, |                 div: 1, | ||||||
|                 phase: 0, |                 phase: 0, | ||||||
|             }), |             }), | ||||||
|             rtc_clk: Some(RtcClkConfig { |             rtc_clk: Some(RtcClkConfig { | ||||||
|                 src: ClkRtcCtrlAuxsrc::ROSC_CLKSRC_PH, |                 src: RtcClkSrc::Rosc, | ||||||
|                 div_int: 1024, |                 div_int: 1024, | ||||||
|                 div_frac: 0, |                 div_frac: 0, | ||||||
|                 phase: 0, |                 phase: 0, | ||||||
| @ -110,8 +117,18 @@ impl ClockConfig { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[repr(u16)] | ||||||
|  | #[non_exhaustive] | ||||||
|  | #[derive(Clone, Copy, Debug, PartialEq, Eq)] | ||||||
|  | pub enum RoscRange { | ||||||
|  |     Low = pac::rosc::vals::FreqRange::LOW.0, | ||||||
|  |     Medium = pac::rosc::vals::FreqRange::MEDIUM.0, | ||||||
|  |     High = pac::rosc::vals::FreqRange::HIGH.0, | ||||||
|  |     TooHigh = pac::rosc::vals::FreqRange::TOOHIGH.0, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub struct RoscConfig { | pub struct RoscConfig { | ||||||
|     pub range: pac::rosc::vals::FreqRange, |     pub range: RoscRange, | ||||||
|     pub drive_strength: [u8; 8], |     pub drive_strength: [u8; 8], | ||||||
|     pub div: u16, |     pub div: u16, | ||||||
| } | } | ||||||
| @ -134,15 +151,30 @@ pub struct RefClkConfig { | |||||||
|     pub div: u8, |     pub div: u8, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[non_exhaustive] | ||||||
|  | #[derive(Clone, Copy, Debug, PartialEq, Eq)] | ||||||
| pub enum RefClkSrc { | pub enum RefClkSrc { | ||||||
|  |     // main sources
 | ||||||
|     Xosc, |     Xosc, | ||||||
|     Rosc, |     Rosc, | ||||||
|     Aux(ClkRefCtrlAuxsrc), |     // aux sources
 | ||||||
|  |     PllUsb, | ||||||
|  |     Gpin0, | ||||||
|  |     Gpin1, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[non_exhaustive] | ||||||
|  | #[derive(Clone, Copy, Debug, PartialEq, Eq)] | ||||||
| pub enum SysClkSrc { | pub enum SysClkSrc { | ||||||
|  |     // main sources
 | ||||||
|     Ref, |     Ref, | ||||||
|     Aux(ClkSysCtrlAuxsrc), |     // aux sources
 | ||||||
|  |     PllSys, | ||||||
|  |     PllUsb, | ||||||
|  |     Rosc, | ||||||
|  |     Xosc, | ||||||
|  |     Gpin0, | ||||||
|  |     Gpin1, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct SysClkConfig { | pub struct SysClkConfig { | ||||||
| @ -151,20 +183,56 @@ pub struct SysClkConfig { | |||||||
|     pub div_frac: u8, |     pub div_frac: u8, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[repr(u8)] | ||||||
|  | #[non_exhaustive] | ||||||
|  | #[derive(Clone, Copy, Debug, PartialEq, Eq)] | ||||||
|  | pub enum UsbClkSrc { | ||||||
|  |     PllUsb = ClkUsbCtrlAuxsrc::CLKSRC_PLL_USB.0, | ||||||
|  |     PllSys = ClkUsbCtrlAuxsrc::CLKSRC_PLL_SYS.0, | ||||||
|  |     Rosc = ClkUsbCtrlAuxsrc::ROSC_CLKSRC_PH.0, | ||||||
|  |     Xosc = ClkUsbCtrlAuxsrc::XOSC_CLKSRC.0, | ||||||
|  |     Gpin0 = ClkUsbCtrlAuxsrc::CLKSRC_GPIN0.0, | ||||||
|  |     Gpin1 = ClkUsbCtrlAuxsrc::CLKSRC_GPIN1.0, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub struct UsbClkConfig { | pub struct UsbClkConfig { | ||||||
|     pub src: ClkUsbCtrlAuxsrc, |     pub src: UsbClkSrc, | ||||||
|     pub div: u8, |     pub div: u8, | ||||||
|     pub phase: u8, |     pub phase: u8, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[repr(u8)] | ||||||
|  | #[non_exhaustive] | ||||||
|  | #[derive(Clone, Copy, Debug, PartialEq, Eq)] | ||||||
|  | pub enum AdcClkSrc { | ||||||
|  |     PllUsb = ClkAdcCtrlAuxsrc::CLKSRC_PLL_USB.0, | ||||||
|  |     PllSys = ClkAdcCtrlAuxsrc::CLKSRC_PLL_SYS.0, | ||||||
|  |     Rosc = ClkAdcCtrlAuxsrc::ROSC_CLKSRC_PH.0, | ||||||
|  |     Xosc = ClkAdcCtrlAuxsrc::XOSC_CLKSRC.0, | ||||||
|  |     Gpin0 = ClkAdcCtrlAuxsrc::CLKSRC_GPIN0.0, | ||||||
|  |     Gpin1 = ClkAdcCtrlAuxsrc::CLKSRC_GPIN1.0, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub struct AdcClkConfig { | pub struct AdcClkConfig { | ||||||
|     pub src: ClkAdcCtrlAuxsrc, |     pub src: AdcClkSrc, | ||||||
|     pub div: u8, |     pub div: u8, | ||||||
|     pub phase: u8, |     pub phase: u8, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[repr(u8)] | ||||||
|  | #[non_exhaustive] | ||||||
|  | #[derive(Clone, Copy, Debug, PartialEq, Eq)] | ||||||
|  | pub enum RtcClkSrc { | ||||||
|  |     PllUsb = ClkRtcCtrlAuxsrc::CLKSRC_PLL_USB.0, | ||||||
|  |     PllSys = ClkRtcCtrlAuxsrc::CLKSRC_PLL_SYS.0, | ||||||
|  |     Rosc = ClkRtcCtrlAuxsrc::ROSC_CLKSRC_PH.0, | ||||||
|  |     Xosc = ClkRtcCtrlAuxsrc::XOSC_CLKSRC.0, | ||||||
|  |     Gpin0 = ClkRtcCtrlAuxsrc::CLKSRC_GPIN0.0, | ||||||
|  |     Gpin1 = ClkRtcCtrlAuxsrc::CLKSRC_GPIN1.0, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub struct RtcClkConfig { | pub struct RtcClkConfig { | ||||||
|     pub src: ClkRtcCtrlAuxsrc, |     pub src: RtcClkSrc, | ||||||
|     pub div_int: u32, |     pub div_int: u32, | ||||||
|     pub div_frac: u8, |     pub div_frac: u8, | ||||||
|     pub phase: u8, |     pub phase: u8, | ||||||
| @ -229,27 +297,21 @@ pub(crate) unsafe fn init(config: ClockConfig) { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     match config.ref_clk.src { |     let (ref_src, ref_aux) = { | ||||||
|         RefClkSrc::Xosc => { |         use {ClkRefCtrlAuxsrc as Aux, ClkRefCtrlSrc as Src}; | ||||||
|             c.clk_ref_ctrl().write(|w| { |         match config.ref_clk.src { | ||||||
|                 w.set_src(ClkRefCtrlSrc::XOSC_CLKSRC); |             RefClkSrc::Xosc => (Src::XOSC_CLKSRC, Aux::CLKSRC_PLL_USB), | ||||||
|             }); |             RefClkSrc::Rosc => (Src::ROSC_CLKSRC_PH, Aux::CLKSRC_PLL_USB), | ||||||
|             while c.clk_ref_selected().read() != 1 << ClkRefCtrlSrc::XOSC_CLKSRC.0 {} |             RefClkSrc::PllUsb => (Src::CLKSRC_CLK_REF_AUX, Aux::CLKSRC_PLL_USB), | ||||||
|  |             RefClkSrc::Gpin0 => (Src::CLKSRC_CLK_REF_AUX, Aux::CLKSRC_GPIN0), | ||||||
|  |             RefClkSrc::Gpin1 => (Src::CLKSRC_CLK_REF_AUX, Aux::CLKSRC_GPIN1), | ||||||
|         } |         } | ||||||
|         RefClkSrc::Rosc => { |     }; | ||||||
|             c.clk_ref_ctrl().write(|w| { |     c.clk_ref_ctrl().write(|w| { | ||||||
|                 w.set_src(ClkRefCtrlSrc::ROSC_CLKSRC_PH); |         w.set_src(ref_src); | ||||||
|             }); |         w.set_auxsrc(ref_aux); | ||||||
|             while c.clk_ref_selected().read() != 1 << ClkRefCtrlSrc::ROSC_CLKSRC_PH.0 {} |     }); | ||||||
|         } |     while c.clk_ref_selected().read() != 1 << ref_src.0 {} | ||||||
|         RefClkSrc::Aux(src) => { |  | ||||||
|             c.clk_ref_ctrl().write(|w| { |  | ||||||
|                 w.set_auxsrc(src); |  | ||||||
|                 w.set_src(ClkRefCtrlSrc::CLKSRC_CLK_REF_AUX); |  | ||||||
|             }); |  | ||||||
|             while c.clk_ref_selected().read() != 1 << ClkRefCtrlSrc::CLKSRC_CLK_REF_AUX.0 {} |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     c.clk_ref_div().write(|w| { |     c.clk_ref_div().write(|w| { | ||||||
|         w.set_int(config.ref_clk.div); |         w.set_int(config.ref_clk.div); | ||||||
|     }); |     }); | ||||||
| @ -259,26 +321,27 @@ pub(crate) unsafe fn init(config: ClockConfig) { | |||||||
|         w.set_enable(true); |         w.set_enable(true); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     match config.sys_clk.src { |     let (sys_src, sys_aux) = { | ||||||
|         SysClkSrc::Ref => { |         use {ClkSysCtrlAuxsrc as Aux, ClkSysCtrlSrc as Src}; | ||||||
|             c.clk_sys_ctrl().write(|w| { |         match config.sys_clk.src { | ||||||
|                 w.set_src(ClkSysCtrlSrc::CLK_REF); |             SysClkSrc::Ref => (Src::CLK_REF, Aux::CLKSRC_PLL_SYS), | ||||||
|             }); |             SysClkSrc::PllSys => (Src::CLKSRC_CLK_SYS_AUX, Aux::CLKSRC_PLL_SYS), | ||||||
|             while c.clk_sys_selected().read() != 1 << ClkSysCtrlSrc::CLK_REF.0 {} |             SysClkSrc::PllUsb => (Src::CLKSRC_CLK_SYS_AUX, Aux::CLKSRC_PLL_USB), | ||||||
|         } |             SysClkSrc::Rosc => (Src::CLKSRC_CLK_SYS_AUX, Aux::ROSC_CLKSRC), | ||||||
|         SysClkSrc::Aux(src) => { |             SysClkSrc::Xosc => (Src::CLKSRC_CLK_SYS_AUX, Aux::XOSC_CLKSRC), | ||||||
|             c.clk_sys_ctrl().write(|w| { |             SysClkSrc::Gpin0 => (Src::CLKSRC_CLK_SYS_AUX, Aux::CLKSRC_GPIN0), | ||||||
|                 w.set_src(ClkSysCtrlSrc::CLK_REF); |             SysClkSrc::Gpin1 => (Src::CLKSRC_CLK_SYS_AUX, Aux::CLKSRC_GPIN1), | ||||||
|             }); |  | ||||||
|             while c.clk_sys_selected().read() != 1 << ClkSysCtrlSrc::CLK_REF.0 {} |  | ||||||
| 
 |  | ||||||
|             c.clk_sys_ctrl().write(|w| { |  | ||||||
|                 w.set_auxsrc(src); |  | ||||||
|                 w.set_src(ClkSysCtrlSrc::CLKSRC_CLK_SYS_AUX); |  | ||||||
|             }); |  | ||||||
|             while c.clk_sys_selected().read() != 1 << ClkSysCtrlSrc::CLKSRC_CLK_SYS_AUX.0 {} |  | ||||||
|         } |         } | ||||||
|  |     }; | ||||||
|  |     if sys_src != ClkSysCtrlSrc::CLK_REF { | ||||||
|  |         c.clk_sys_ctrl().write(|w| w.set_src(ClkSysCtrlSrc::CLK_REF)); | ||||||
|  |         while c.clk_sys_selected().read() != 1 << ClkSysCtrlSrc::CLK_REF.0 {} | ||||||
|     } |     } | ||||||
|  |     c.clk_sys_ctrl().write(|w| { | ||||||
|  |         w.set_auxsrc(sys_aux); | ||||||
|  |         w.set_src(sys_src); | ||||||
|  |     }); | ||||||
|  |     while c.clk_sys_selected().read() != 1 << sys_src.0 {} | ||||||
|     c.clk_sys_div().write(|w| { |     c.clk_sys_div().write(|w| { | ||||||
|         w.set_int(config.sys_clk.div_int); |         w.set_int(config.sys_clk.div_int); | ||||||
|         w.set_frac(config.sys_clk.div_frac); |         w.set_frac(config.sys_clk.div_frac); | ||||||
| @ -289,7 +352,7 @@ pub(crate) unsafe fn init(config: ClockConfig) { | |||||||
|     if let Some(src) = config.peri_clk_src { |     if let Some(src) = config.peri_clk_src { | ||||||
|         c.clk_peri_ctrl().write(|w| { |         c.clk_peri_ctrl().write(|w| { | ||||||
|             w.set_enable(true); |             w.set_enable(true); | ||||||
|             w.set_auxsrc(src); |             w.set_auxsrc(ClkPeriCtrlAuxsrc(src as _)); | ||||||
|         }); |         }); | ||||||
|     } else { |     } else { | ||||||
|         peris.set_spi0(false); |         peris.set_spi0(false); | ||||||
| @ -304,7 +367,7 @@ pub(crate) unsafe fn init(config: ClockConfig) { | |||||||
|         c.clk_usb_ctrl().write(|w| { |         c.clk_usb_ctrl().write(|w| { | ||||||
|             w.set_phase(conf.phase); |             w.set_phase(conf.phase); | ||||||
|             w.set_enable(true); |             w.set_enable(true); | ||||||
|             w.set_auxsrc(conf.src); |             w.set_auxsrc(ClkUsbCtrlAuxsrc(conf.src as _)); | ||||||
|         }); |         }); | ||||||
|     } else { |     } else { | ||||||
|         peris.set_usbctrl(false); |         peris.set_usbctrl(false); | ||||||
| @ -316,7 +379,7 @@ pub(crate) unsafe fn init(config: ClockConfig) { | |||||||
|         c.clk_adc_ctrl().write(|w| { |         c.clk_adc_ctrl().write(|w| { | ||||||
|             w.set_phase(conf.phase); |             w.set_phase(conf.phase); | ||||||
|             w.set_enable(true); |             w.set_enable(true); | ||||||
|             w.set_auxsrc(conf.src); |             w.set_auxsrc(ClkAdcCtrlAuxsrc(conf.src as _)); | ||||||
|         }); |         }); | ||||||
|     } else { |     } else { | ||||||
|         peris.set_adc(false); |         peris.set_adc(false); | ||||||
| @ -334,7 +397,7 @@ pub(crate) unsafe fn init(config: ClockConfig) { | |||||||
|         c.clk_rtc_ctrl().write(|w| { |         c.clk_rtc_ctrl().write(|w| { | ||||||
|             w.set_phase(conf.phase); |             w.set_phase(conf.phase); | ||||||
|             w.set_enable(true); |             w.set_enable(true); | ||||||
|             w.set_auxsrc(conf.src); |             w.set_auxsrc(ClkRtcCtrlAuxsrc(conf.src as _)); | ||||||
|         }); |         }); | ||||||
|     } else { |     } else { | ||||||
|         peris.set_rtc(false); |         peris.set_rtc(false); | ||||||
| @ -369,7 +432,7 @@ unsafe fn configure_rosc(config: RoscConfig) { | |||||||
| 
 | 
 | ||||||
|     p.ctrl().write(|w| { |     p.ctrl().write(|w| { | ||||||
|         w.set_enable(pac::rosc::vals::Enable::ENABLE); |         w.set_enable(pac::rosc::vals::Enable::ENABLE); | ||||||
|         w.set_freq_range(config.range); |         w.set_freq_range(pac::rosc::vals::FreqRange(config.range as u16)); | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -671,6 +734,21 @@ impl_gpoutpin!(PIN_23, 1); | |||||||
| impl_gpoutpin!(PIN_24, 2); | impl_gpoutpin!(PIN_24, 2); | ||||||
| impl_gpoutpin!(PIN_25, 3); | impl_gpoutpin!(PIN_25, 3); | ||||||
| 
 | 
 | ||||||
|  | #[repr(u8)] | ||||||
|  | pub enum GpoutSrc { | ||||||
|  |     PllSys = ClkGpoutCtrlAuxsrc::CLKSRC_PLL_SYS.0, | ||||||
|  |     Gpin0 = ClkGpoutCtrlAuxsrc::CLKSRC_GPIN0.0, | ||||||
|  |     Gpin1 = ClkGpoutCtrlAuxsrc::CLKSRC_GPIN1.0, | ||||||
|  |     PllUsb = ClkGpoutCtrlAuxsrc::CLKSRC_PLL_USB.0, | ||||||
|  |     Rosc = ClkGpoutCtrlAuxsrc::ROSC_CLKSRC.0, | ||||||
|  |     Xosc = ClkGpoutCtrlAuxsrc::XOSC_CLKSRC.0, | ||||||
|  |     Sys = ClkGpoutCtrlAuxsrc::CLK_SYS.0, | ||||||
|  |     Usb = ClkGpoutCtrlAuxsrc::CLK_USB.0, | ||||||
|  |     Adc = ClkGpoutCtrlAuxsrc::CLK_ADC.0, | ||||||
|  |     Rtc = ClkGpoutCtrlAuxsrc::CLK_RTC.0, | ||||||
|  |     Ref = ClkGpoutCtrlAuxsrc::CLK_REF.0, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub struct Gpout<'d, T: GpoutPin> { | pub struct Gpout<'d, T: GpoutPin> { | ||||||
|     gpout: PeripheralRef<'d, T>, |     gpout: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
| @ -696,11 +774,11 @@ impl<'d, T: GpoutPin> Gpout<'d, T> { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn set_src(&self, src: ClkGpoutCtrlAuxsrc) { |     pub fn set_src(&self, src: GpoutSrc) { | ||||||
|         unsafe { |         unsafe { | ||||||
|             let c = pac::CLOCKS; |             let c = pac::CLOCKS; | ||||||
|             c.clk_gpout_ctrl(self.gpout.number()).modify(|w| { |             c.clk_gpout_ctrl(self.gpout.number()).modify(|w| { | ||||||
|                 w.set_auxsrc(src); |                 w.set_auxsrc(ClkGpoutCtrlAuxsrc(src as _)); | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -17,14 +17,14 @@ async fn main(_spawner: Spawner) { | |||||||
|     gpout3.enable(); |     gpout3.enable(); | ||||||
| 
 | 
 | ||||||
|     loop { |     loop { | ||||||
|         gpout3.set_src(clocks::GpoutSrc::CLK_SYS); |         gpout3.set_src(clocks::GpoutSrc::Sys); | ||||||
|         info!( |         info!( | ||||||
|             "Pin 25 is now outputing CLK_SYS/1000, should be toggling at {}", |             "Pin 25 is now outputing CLK_SYS/1000, should be toggling at {}", | ||||||
|             gpout3.get_freq() |             gpout3.get_freq() | ||||||
|         ); |         ); | ||||||
|         Timer::after(Duration::from_secs(2)).await; |         Timer::after(Duration::from_secs(2)).await; | ||||||
| 
 | 
 | ||||||
|         gpout3.set_src(clocks::GpoutSrc::CLK_REF); |         gpout3.set_src(clocks::GpoutSrc::Ref); | ||||||
|         info!( |         info!( | ||||||
|             "Pin 25 is now outputing CLK_REF/1000, should be toggling at {}", |             "Pin 25 is now outputing CLK_REF/1000, should be toggling at {}", | ||||||
|             gpout3.get_freq() |             gpout3.get_freq() | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user