diff options
| -rw-r--r-- | .vscode/settings.json | 3 | ||||
| -rw-r--r-- | Cargo.example.toml | 2 | ||||
| -rw-r--r-- | embassy-rp/Cargo.toml | 2 | ||||
| -rw-r--r-- | embassy-rp/src/clocks.rs | 182 | ||||
| -rw-r--r-- | embassy-rp/src/gpio.rs | 2 | ||||
| -rw-r--r-- | embassy-rp/src/lib.rs | 82 | ||||
| -rw-r--r-- | embassy-rp/src/pll.rs | 76 | ||||
| -rw-r--r-- | embassy-rp/src/reset.rs | 17 | ||||
| -rw-r--r-- | embassy-rp/src/resets.rs | 29 | ||||
| -rw-r--r-- | embassy-rp/src/uart.rs | 3 | ||||
| -rw-r--r-- | examples/rp/Cargo.toml | 2 |
11 files changed, 210 insertions, 190 deletions
diff --git a/.vscode/settings.json b/.vscode/settings.json index ca242662b..c897dd798 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json | |||
| @@ -11,5 +11,6 @@ | |||
| 11 | "**/.git/objects/**": true, | 11 | "**/.git/objects/**": true, |
| 12 | "**/.git/subtree-cache/**": true, | 12 | "**/.git/subtree-cache/**": true, |
| 13 | "**/target/**": true | 13 | "**/target/**": true |
| 14 | } | 14 | }, |
| 15 | "git.ignoreLimitWarning": true | ||
| 15 | } \ No newline at end of file | 16 | } \ No newline at end of file |
diff --git a/Cargo.example.toml b/Cargo.example.toml index d94f7e9bb..c615d29ad 100644 --- a/Cargo.example.toml +++ b/Cargo.example.toml | |||
| @@ -40,7 +40,7 @@ members = [ | |||
| 40 | 40 | ||
| 41 | # rp2040 | 41 | # rp2040 |
| 42 | #"embassy-rp", | 42 | #"embassy-rp", |
| 43 | #"examples/rp2040", | 43 | #"examples/rp", |
| 44 | 44 | ||
| 45 | # std | 45 | # std |
| 46 | #"embassy-std", | 46 | #"embassy-std", |
diff --git a/embassy-rp/Cargo.toml b/embassy-rp/Cargo.toml index 80c1a8696..323afa1ee 100644 --- a/embassy-rp/Cargo.toml +++ b/embassy-rp/Cargo.toml | |||
| @@ -22,5 +22,5 @@ cortex-m-rt = "0.6.13" | |||
| 22 | cortex-m = "0.7.1" | 22 | cortex-m = "0.7.1" |
| 23 | critical-section = "0.2.1" | 23 | critical-section = "0.2.1" |
| 24 | 24 | ||
| 25 | rp2040-pac2 = { git = "https://github.com/Dirbaio/rp2040-pac", rev="254f4677937801155ca3cb17c7bb9d38eb62683e", features = ["rt"] } | 25 | rp2040-pac2 = { git = "https://github.com/embassy-rs/rp2040-pac2", rev="e8635fd05f43b6c21ec462fb8c06140e1fb26961", features = ["rt"] } |
| 26 | embedded-hal = { version = "0.2.4", features = [ "unproven" ] } | 26 | embedded-hal = { version = "0.2.4", features = [ "unproven" ] } |
diff --git a/embassy-rp/src/clocks.rs b/embassy-rp/src/clocks.rs new file mode 100644 index 000000000..71e738c4c --- /dev/null +++ b/embassy-rp/src/clocks.rs | |||
| @@ -0,0 +1,182 @@ | |||
| 1 | use pac::clocks::vals::*; | ||
| 2 | |||
| 3 | use crate::{pac, reset}; | ||
| 4 | |||
| 5 | const XOSC_MHZ: u32 = 12; | ||
| 6 | |||
| 7 | pub unsafe fn init() { | ||
| 8 | // Now reset all the peripherals, except QSPI and XIP (we're using those | ||
| 9 | // to execute from external flash!) | ||
| 10 | |||
| 11 | // Reset everything except: | ||
| 12 | // - QSPI (we're using it to run this code!) | ||
| 13 | // - PLLs (it may be suicide if that's what's clocking us) | ||
| 14 | let mut peris = reset::ALL_PERIPHERALS; | ||
| 15 | peris.set_io_qspi(false); | ||
| 16 | peris.set_pads_qspi(false); | ||
| 17 | peris.set_pll_sys(false); | ||
| 18 | peris.set_pll_usb(false); | ||
| 19 | reset::reset(peris); | ||
| 20 | |||
| 21 | let mut peris = reset::ALL_PERIPHERALS; | ||
| 22 | peris.set_adc(false); | ||
| 23 | peris.set_rtc(false); | ||
| 24 | peris.set_spi0(false); | ||
| 25 | peris.set_spi1(false); | ||
| 26 | peris.set_uart0(false); | ||
| 27 | peris.set_uart1(false); | ||
| 28 | peris.set_usbctrl(false); | ||
| 29 | reset::unreset_wait(peris); | ||
| 30 | |||
| 31 | // xosc 12 mhz | ||
| 32 | pac::WATCHDOG.tick().write(|w| { | ||
| 33 | w.set_cycles(XOSC_MHZ as u16); | ||
| 34 | w.set_enable(true); | ||
| 35 | }); | ||
| 36 | |||
| 37 | let c = pac::CLOCKS; | ||
| 38 | c.clk_sys_resus_ctrl() | ||
| 39 | .write_value(pac::clocks::regs::ClkSysResusCtrl(0)); | ||
| 40 | |||
| 41 | // Enable XOSC | ||
| 42 | const XOSC_MHZ: u32 = 12; | ||
| 43 | pac::XOSC | ||
| 44 | .ctrl() | ||
| 45 | .write(|w| w.set_freq_range(pac::xosc::vals::CtrlFreqRange::_1_15MHZ)); | ||
| 46 | |||
| 47 | let startup_delay = (((XOSC_MHZ * 1_000_000) / 1000) + 128) / 256; | ||
| 48 | pac::XOSC | ||
| 49 | .startup() | ||
| 50 | .write(|w| w.set_delay(startup_delay as u16)); | ||
| 51 | pac::XOSC.ctrl().write(|w| { | ||
| 52 | w.set_freq_range(pac::xosc::vals::CtrlFreqRange::_1_15MHZ); | ||
| 53 | w.set_enable(pac::xosc::vals::Enable::ENABLE); | ||
| 54 | }); | ||
| 55 | while !pac::XOSC.status().read().stable() {} | ||
| 56 | |||
| 57 | // Before we touch PLLs, switch sys and ref cleanly away from their aux sources. | ||
| 58 | c.clk_sys_ctrl() | ||
| 59 | .modify(|w| w.set_src(ClkSysCtrlSrc::CLK_REF)); | ||
| 60 | while c.clk_sys_selected().read() != 1 {} | ||
| 61 | c.clk_ref_ctrl() | ||
| 62 | .modify(|w| w.set_src(ClkRefCtrlSrc::ROSC_CLKSRC_PH)); | ||
| 63 | while c.clk_ref_selected().read() != 1 {} | ||
| 64 | |||
| 65 | // Configure PLLs | ||
| 66 | // REF FBDIV VCO POSTDIV | ||
| 67 | // PLL SYS: 12 / 1 = 12MHz * 125 = 1500MHZ / 6 / 2 = 125MHz | ||
| 68 | // PLL USB: 12 / 1 = 12MHz * 40 = 480 MHz / 5 / 2 = 48MHz | ||
| 69 | |||
| 70 | let mut peris = reset::Peripherals(0); | ||
| 71 | peris.set_pll_sys(true); | ||
| 72 | peris.set_pll_usb(true); | ||
| 73 | reset::reset(peris); | ||
| 74 | reset::unreset_wait(peris); | ||
| 75 | |||
| 76 | configure_pll(pac::PLL_SYS, 1, 1500_000_000, 6, 2); | ||
| 77 | configure_pll(pac::PLL_USB, 1, 480_000_000, 5, 2); | ||
| 78 | |||
| 79 | // CLK_REF = XOSC (12MHz) / 1 = 12MHz2Mhz | ||
| 80 | c.clk_ref_ctrl().write(|w| { | ||
| 81 | w.set_src(ClkRefCtrlSrc::XOSC_CLKSRC); | ||
| 82 | }); | ||
| 83 | while c.clk_ref_selected().read() != 1 << ClkRefCtrlSrc::XOSC_CLKSRC.0 {} | ||
| 84 | c.clk_ref_div().write(|w| w.set_int(1)); | ||
| 85 | |||
| 86 | // CLK SYS = PLL SYS (125MHz) / 1 = 125MHz | ||
| 87 | c.clk_sys_ctrl().write(|w| { | ||
| 88 | w.set_src(ClkSysCtrlSrc::CLK_REF); | ||
| 89 | }); | ||
| 90 | while c.clk_sys_selected().read() != 1 << ClkSysCtrlSrc::CLK_REF.0 {} | ||
| 91 | c.clk_sys_div().write(|w| w.set_int(1)); | ||
| 92 | c.clk_sys_ctrl().write(|w| { | ||
| 93 | w.set_auxsrc(ClkSysCtrlAuxsrc::CLKSRC_PLL_SYS); | ||
| 94 | w.set_src(ClkSysCtrlSrc::CLKSRC_CLK_SYS_AUX); | ||
| 95 | }); | ||
| 96 | while c.clk_sys_selected().read() != 1 << ClkSysCtrlSrc::CLKSRC_CLK_SYS_AUX.0 {} | ||
| 97 | |||
| 98 | // CLK USB = PLL USB (48MHz) / 1 = 48MHz | ||
| 99 | c.clk_usb_div().write(|w| w.set_int(1)); | ||
| 100 | c.clk_usb_ctrl().write(|w| { | ||
| 101 | w.set_enable(true); | ||
| 102 | w.set_auxsrc(ClkUsbCtrlAuxsrc::CLKSRC_PLL_USB); | ||
| 103 | }); | ||
| 104 | |||
| 105 | // CLK ADC = PLL USB (48MHZ) / 1 = 48MHz | ||
| 106 | c.clk_adc_div().write(|w| w.set_int(1)); | ||
| 107 | c.clk_adc_ctrl().write(|w| { | ||
| 108 | w.set_enable(true); | ||
| 109 | w.set_auxsrc(ClkAdcCtrlAuxsrc::CLKSRC_PLL_USB); | ||
| 110 | }); | ||
| 111 | |||
| 112 | // CLK RTC = PLL USB (48MHz) / 1024 = 46875Hz | ||
| 113 | c.clk_rtc_ctrl().modify(|w| { | ||
| 114 | w.set_enable(false); | ||
| 115 | }); | ||
| 116 | c.clk_rtc_div().write(|w| w.set_int(1024)); | ||
| 117 | c.clk_rtc_ctrl().write(|w| { | ||
| 118 | w.set_enable(true); | ||
| 119 | w.set_auxsrc(ClkRtcCtrlAuxsrc::CLKSRC_PLL_USB); | ||
| 120 | }); | ||
| 121 | |||
| 122 | // CLK PERI = clk_sys. Used as reference clock for Peripherals. No dividers so just select and enable | ||
| 123 | // Normally choose clk_sys or clk_usb | ||
| 124 | c.clk_peri_ctrl().write(|w| { | ||
| 125 | w.set_enable(true); | ||
| 126 | w.set_auxsrc(ClkPeriCtrlAuxsrc::CLK_SYS); | ||
| 127 | }); | ||
| 128 | } | ||
| 129 | |||
| 130 | pub(crate) fn clk_sys_freq() -> u32 { | ||
| 131 | 125_000_000 | ||
| 132 | } | ||
| 133 | |||
| 134 | pub(crate) fn clk_peri_freq() -> u32 { | ||
| 135 | 125_000_000 | ||
| 136 | } | ||
| 137 | |||
| 138 | pub(crate) fn clk_rtc_freq() -> u32 { | ||
| 139 | 46875 | ||
| 140 | } | ||
| 141 | |||
| 142 | unsafe fn configure_pll( | ||
| 143 | p: pac::pll::Pll, | ||
| 144 | refdiv: u32, | ||
| 145 | vco_freq: u32, | ||
| 146 | post_div1: u8, | ||
| 147 | post_div2: u8, | ||
| 148 | ) { | ||
| 149 | // Power off in case it's already running | ||
| 150 | p.pwr().write(|w| { | ||
| 151 | w.set_vcopd(true); | ||
| 152 | w.set_postdivpd(true); | ||
| 153 | w.set_dsmpd(true); | ||
| 154 | w.set_pd(true); | ||
| 155 | }); | ||
| 156 | p.fbdiv_int().write(|w| w.set_fbdiv_int(0)); | ||
| 157 | |||
| 158 | let ref_mhz = XOSC_MHZ / refdiv; | ||
| 159 | p.cs().write(|w| w.set_refdiv(ref_mhz as _)); | ||
| 160 | |||
| 161 | let fbdiv = vco_freq / (ref_mhz * 1_000_000); | ||
| 162 | assert!(fbdiv >= 16 && fbdiv <= 520); | ||
| 163 | assert!((post_div1 >= 1 && post_div1 <= 7) && (post_div2 >= 1 && post_div2 <= 7)); | ||
| 164 | assert!(post_div2 <= post_div1); | ||
| 165 | assert!(ref_mhz <= (vco_freq / 16)); | ||
| 166 | |||
| 167 | p.fbdiv_int().write(|w| w.set_fbdiv_int(fbdiv as _)); | ||
| 168 | |||
| 169 | p.pwr().modify(|w| { | ||
| 170 | w.set_pd(false); | ||
| 171 | w.set_vcopd(false); | ||
| 172 | }); | ||
| 173 | |||
| 174 | while !p.cs().read().lock() {} | ||
| 175 | |||
| 176 | p.prim().write(|w| { | ||
| 177 | w.set_postdiv1(post_div1); | ||
| 178 | w.set_postdiv2(post_div2); | ||
| 179 | }); | ||
| 180 | |||
| 181 | p.pwr().modify(|w| w.set_postdivpd(false)); | ||
| 182 | } | ||
diff --git a/embassy-rp/src/gpio.rs b/embassy-rp/src/gpio.rs index 88d5d0936..ee263fdb2 100644 --- a/embassy-rp/src/gpio.rs +++ b/embassy-rp/src/gpio.rs | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | use core::marker::PhantomData; | 1 | use core::marker::PhantomData; |
| 2 | 2 | ||
| 3 | use crate::pac; | 3 | use crate::pac; |
| 4 | use crate::pac::generic::{Reg, RW}; | 4 | use crate::pac::common::{Reg, RW}; |
| 5 | use crate::pac::SIO; | 5 | use crate::pac::SIO; |
| 6 | use crate::peripherals; | 6 | use crate::peripherals; |
| 7 | 7 | ||
diff --git a/embassy-rp/src/lib.rs b/embassy-rp/src/lib.rs index a66ced74a..80761bc50 100644 --- a/embassy-rp/src/lib.rs +++ b/embassy-rp/src/lib.rs | |||
| @@ -14,10 +14,11 @@ pub mod interrupt; | |||
| 14 | 14 | ||
| 15 | pub mod dma; | 15 | pub mod dma; |
| 16 | pub mod gpio; | 16 | pub mod gpio; |
| 17 | pub mod pll; | ||
| 18 | pub mod resets; | ||
| 19 | pub mod uart; | 17 | pub mod uart; |
| 20 | 18 | ||
| 19 | mod clocks; | ||
| 20 | mod reset; | ||
| 21 | |||
| 21 | embassy_extras::peripherals! { | 22 | embassy_extras::peripherals! { |
| 22 | PIN_0, | 23 | PIN_0, |
| 23 | PIN_1, | 24 | PIN_1, |
| @@ -93,83 +94,8 @@ pub fn init(_config: config::Config) -> Peripherals { | |||
| 93 | // before doing anything important. | 94 | // before doing anything important. |
| 94 | let peripherals = Peripherals::take(); | 95 | let peripherals = Peripherals::take(); |
| 95 | 96 | ||
| 96 | // Now reset all the peripherals, except QSPI and XIP (we're using those | ||
| 97 | // to execute from external flash!) | ||
| 98 | |||
| 99 | let resets = resets::Resets::new(); | ||
| 100 | |||
| 101 | // Reset everything except: | ||
| 102 | // - QSPI (we're using it to run this code!) | ||
| 103 | // - PLLs (it may be suicide if that's what's clocking us) | ||
| 104 | let mut peris = resets::ALL_PERIPHERALS; | ||
| 105 | peris.set_io_qspi(false); | ||
| 106 | peris.set_pads_qspi(false); | ||
| 107 | peris.set_pll_sys(false); | ||
| 108 | peris.set_pll_usb(false); | ||
| 109 | resets.reset(peris); | ||
| 110 | |||
| 111 | let mut peris = resets::ALL_PERIPHERALS; | ||
| 112 | peris.set_adc(false); | ||
| 113 | peris.set_rtc(false); | ||
| 114 | peris.set_spi0(false); | ||
| 115 | peris.set_spi1(false); | ||
| 116 | peris.set_uart0(false); | ||
| 117 | peris.set_uart1(false); | ||
| 118 | peris.set_usbctrl(false); | ||
| 119 | resets.unreset_wait(peris); | ||
| 120 | |||
| 121 | unsafe { | 97 | unsafe { |
| 122 | // xosc 12 mhz | 98 | clocks::init(); |
| 123 | pac::WATCHDOG.tick().write(|w| { | ||
| 124 | w.set_cycles(XOSC_MHZ as u16); | ||
| 125 | w.set_enable(true); | ||
| 126 | }); | ||
| 127 | |||
| 128 | pac::CLOCKS | ||
| 129 | .clk_sys_resus_ctrl() | ||
| 130 | .write_value(pac::clocks::regs::ClkSysResusCtrl(0)); | ||
| 131 | |||
| 132 | // Enable XOSC | ||
| 133 | // TODO extract to HAL module | ||
| 134 | const XOSC_MHZ: u32 = 12; | ||
| 135 | pac::XOSC | ||
| 136 | .ctrl() | ||
| 137 | .write(|w| w.set_freq_range(pac::xosc::vals::CtrlFreqRange::_1_15MHZ)); | ||
| 138 | |||
| 139 | let startup_delay = (((XOSC_MHZ * 1_000_000) / 1000) + 128) / 256; | ||
| 140 | pac::XOSC | ||
| 141 | .startup() | ||
| 142 | .write(|w| w.set_delay(startup_delay as u16)); | ||
| 143 | pac::XOSC.ctrl().write(|w| { | ||
| 144 | w.set_freq_range(pac::xosc::vals::CtrlFreqRange::_1_15MHZ); | ||
| 145 | w.set_enable(pac::xosc::vals::CtrlEnable::ENABLE); | ||
| 146 | }); | ||
| 147 | while !pac::XOSC.status().read().stable() {} | ||
| 148 | |||
| 149 | // Before we touch PLLs, switch sys and ref cleanly away from their aux sources. | ||
| 150 | pac::CLOCKS | ||
| 151 | .clk_sys_ctrl() | ||
| 152 | .modify(|w| w.set_src(pac::clocks::vals::ClkSysCtrlSrc::CLK_REF)); | ||
| 153 | while pac::CLOCKS.clk_sys_selected().read() != 1 {} | ||
| 154 | pac::CLOCKS | ||
| 155 | .clk_ref_ctrl() | ||
| 156 | .modify(|w| w.set_src(pac::clocks::vals::ClkRefCtrlSrc::ROSC_CLKSRC_PH)); | ||
| 157 | while pac::CLOCKS.clk_ref_selected().read() != 1 {} | ||
| 158 | |||
| 159 | let mut peris = resets::Peripherals(0); | ||
| 160 | peris.set_pll_sys(true); | ||
| 161 | peris.set_pll_usb(true); | ||
| 162 | resets.reset(peris); | ||
| 163 | resets.unreset_wait(peris); | ||
| 164 | |||
| 165 | pll::PLL::new(pll::PllSys).configure(1, 1500_000_000, 6, 2); | ||
| 166 | pll::PLL::new(pll::PllUsb).configure(1, 480_000_000, 5, 2); | ||
| 167 | |||
| 168 | // Activate peripheral clock and take external oscillator as input | ||
| 169 | pac::CLOCKS.clk_peri_ctrl().write(|w| { | ||
| 170 | w.set_enable(true); | ||
| 171 | w.set_auxsrc(pac::clocks::vals::ClkPeriCtrlAuxsrc::XOSC_CLKSRC); | ||
| 172 | }); | ||
| 173 | } | 99 | } |
| 174 | 100 | ||
| 175 | peripherals | 101 | peripherals |
diff --git a/embassy-rp/src/pll.rs b/embassy-rp/src/pll.rs deleted file mode 100644 index 13c16baf8..000000000 --- a/embassy-rp/src/pll.rs +++ /dev/null | |||
| @@ -1,76 +0,0 @@ | |||
| 1 | use crate::pac; | ||
| 2 | |||
| 3 | const XOSC_MHZ: u32 = 12; | ||
| 4 | |||
| 5 | pub struct PLL<T: Instance> { | ||
| 6 | inner: T, | ||
| 7 | } | ||
| 8 | |||
| 9 | impl<T: Instance> PLL<T> { | ||
| 10 | pub fn new(inner: T) -> Self { | ||
| 11 | Self { inner } | ||
| 12 | } | ||
| 13 | |||
| 14 | pub fn configure(&mut self, refdiv: u32, vco_freq: u32, post_div1: u8, post_div2: u8) { | ||
| 15 | unsafe { | ||
| 16 | let p = self.inner.regs(); | ||
| 17 | // Power off in case it's already running | ||
| 18 | p.pwr().write(|w| { | ||
| 19 | w.set_vcopd(true); | ||
| 20 | w.set_postdivpd(true); | ||
| 21 | w.set_dsmpd(true); | ||
| 22 | w.set_pd(true); | ||
| 23 | }); | ||
| 24 | p.fbdiv_int().write(|w| w.set_fbdiv_int(0)); | ||
| 25 | |||
| 26 | let ref_mhz = XOSC_MHZ / refdiv; | ||
| 27 | p.cs().write(|w| w.set_refdiv(ref_mhz as _)); | ||
| 28 | |||
| 29 | let fbdiv = vco_freq / (ref_mhz * 1_000_000); | ||
| 30 | assert!(fbdiv >= 16 && fbdiv <= 520); | ||
| 31 | assert!((post_div1 >= 1 && post_div1 <= 7) && (post_div2 >= 1 && post_div2 <= 7)); | ||
| 32 | assert!(post_div2 <= post_div1); | ||
| 33 | assert!(ref_mhz <= (vco_freq / 16)); | ||
| 34 | |||
| 35 | p.fbdiv_int().write(|w| w.set_fbdiv_int(fbdiv as _)); | ||
| 36 | |||
| 37 | p.pwr().modify(|w| { | ||
| 38 | w.set_pd(false); | ||
| 39 | w.set_vcopd(false); | ||
| 40 | }); | ||
| 41 | |||
| 42 | while !p.cs().read().lock() {} | ||
| 43 | |||
| 44 | p.prim().write(|w| { | ||
| 45 | w.set_postdiv1(post_div1); | ||
| 46 | w.set_postdiv2(post_div2); | ||
| 47 | }); | ||
| 48 | |||
| 49 | p.pwr().modify(|w| w.set_postdivpd(false)); | ||
| 50 | } | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | mod sealed { | ||
| 55 | pub trait Instance {} | ||
| 56 | impl Instance for super::PllSys {} | ||
| 57 | impl Instance for super::PllUsb {} | ||
| 58 | } | ||
| 59 | |||
| 60 | // todo make owned | ||
| 61 | pub struct PllSys; | ||
| 62 | pub struct PllUsb; | ||
| 63 | |||
| 64 | pub trait Instance { | ||
| 65 | fn regs(&self) -> pac::pll::Pll; | ||
| 66 | } | ||
| 67 | impl Instance for PllSys { | ||
| 68 | fn regs(&self) -> pac::pll::Pll { | ||
| 69 | pac::PLL_SYS | ||
| 70 | } | ||
| 71 | } | ||
| 72 | impl Instance for PllUsb { | ||
| 73 | fn regs(&self) -> pac::pll::Pll { | ||
| 74 | pac::PLL_USB | ||
| 75 | } | ||
| 76 | } | ||
diff --git a/embassy-rp/src/reset.rs b/embassy-rp/src/reset.rs new file mode 100644 index 000000000..914e6a698 --- /dev/null +++ b/embassy-rp/src/reset.rs | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | use crate::pac; | ||
| 2 | |||
| 3 | pub use pac::resets::regs::Peripherals; | ||
| 4 | |||
| 5 | pub const ALL_PERIPHERALS: Peripherals = Peripherals(0x01ffffff); | ||
| 6 | |||
| 7 | pub unsafe fn reset(peris: Peripherals) { | ||
| 8 | pac::RESETS.reset().write_value(peris); | ||
| 9 | } | ||
| 10 | |||
| 11 | pub unsafe fn unreset_wait(peris: Peripherals) { | ||
| 12 | // TODO use the "atomic clear" register version | ||
| 13 | pac::RESETS | ||
| 14 | .reset() | ||
| 15 | .modify(|v| *v = Peripherals(v.0 & !peris.0)); | ||
| 16 | while ((!pac::RESETS.reset_done().read().0) & peris.0) != 0 {} | ||
| 17 | } | ||
diff --git a/embassy-rp/src/resets.rs b/embassy-rp/src/resets.rs deleted file mode 100644 index 29610e202..000000000 --- a/embassy-rp/src/resets.rs +++ /dev/null | |||
| @@ -1,29 +0,0 @@ | |||
| 1 | use crate::pac; | ||
| 2 | |||
| 3 | pub use pac::resets::regs::Peripherals; | ||
| 4 | |||
| 5 | pub const ALL_PERIPHERALS: Peripherals = Peripherals(0x01ffffff); | ||
| 6 | |||
| 7 | pub struct Resets {} | ||
| 8 | |||
| 9 | impl Resets { | ||
| 10 | pub fn new() -> Self { | ||
| 11 | Self {} | ||
| 12 | } | ||
| 13 | |||
| 14 | pub fn reset(&self, peris: Peripherals) { | ||
| 15 | unsafe { | ||
| 16 | pac::RESETS.reset().write_value(peris); | ||
| 17 | } | ||
| 18 | } | ||
| 19 | |||
| 20 | pub fn unreset_wait(&self, peris: Peripherals) { | ||
| 21 | unsafe { | ||
| 22 | // TODO use the "atomic clear" register version | ||
| 23 | pac::RESETS | ||
| 24 | .reset() | ||
| 25 | .modify(|v| *v = Peripherals(v.0 & !peris.0)); | ||
| 26 | while ((!pac::RESETS.reset_done().read().0) & peris.0) != 0 {} | ||
| 27 | } | ||
| 28 | } | ||
| 29 | } | ||
diff --git a/embassy-rp/src/uart.rs b/embassy-rp/src/uart.rs index 2c8986302..6d354e7c4 100644 --- a/embassy-rp/src/uart.rs +++ b/embassy-rp/src/uart.rs | |||
| @@ -42,8 +42,7 @@ impl<'d, T: Instance> Uart<'d, T> { | |||
| 42 | unsafe { | 42 | unsafe { |
| 43 | let p = inner.regs(); | 43 | let p = inner.regs(); |
| 44 | 44 | ||
| 45 | // todo get this from somewhere | 45 | let clk_base = crate::clocks::clk_peri_freq(); |
| 46 | let clk_base = 12_000_000; | ||
| 47 | 46 | ||
| 48 | let baud_rate_div = (8 * clk_base) / config.baudrate; | 47 | let baud_rate_div = (8 * clk_base) / config.baudrate; |
| 49 | let mut baud_ibrd = baud_rate_div >> 7; | 48 | let mut baud_ibrd = baud_rate_div >> 7; |
diff --git a/examples/rp/Cargo.toml b/examples/rp/Cargo.toml index 71b48129f..e45bf5943 100644 --- a/examples/rp/Cargo.toml +++ b/examples/rp/Cargo.toml | |||
| @@ -19,7 +19,7 @@ defmt-error = [] | |||
| 19 | [dependencies] | 19 | [dependencies] |
| 20 | embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt", "defmt-trace"] } | 20 | embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt", "defmt-trace"] } |
| 21 | embassy-rp = { version = "0.1.0", path = "../../embassy-rp", features = ["defmt", "defmt-trace"] } | 21 | embassy-rp = { version = "0.1.0", path = "../../embassy-rp", features = ["defmt", "defmt-trace"] } |
| 22 | rp2040-pac2 = { git = "https://github.com/Dirbaio/rp2040-pac", rev="254f4677937801155ca3cb17c7bb9d38eb62683e" } | 22 | rp2040-pac2 = { git = "https://github.com/embassy-rs/rp2040-pac2", rev="e8635fd05f43b6c21ec462fb8c06140e1fb26961" } |
| 23 | atomic-polyfill = { version = "0.1.1" } | 23 | atomic-polyfill = { version = "0.1.1" } |
| 24 | 24 | ||
| 25 | defmt = "0.2.0" | 25 | defmt = "0.2.0" |
