aboutsummaryrefslogtreecommitdiff
path: root/drivers/dcdc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dcdc')
-rw-r--r--drivers/dcdc/Cargo.toml7
-rw-r--r--drivers/dcdc/src/lib.rs43
2 files changed, 50 insertions, 0 deletions
diff --git a/drivers/dcdc/Cargo.toml b/drivers/dcdc/Cargo.toml
new file mode 100644
index 0000000..5ed2fd6
--- /dev/null
+++ b/drivers/dcdc/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "imxrt-drivers-dcdc"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+ral-registers = { workspace = true }
diff --git a/drivers/dcdc/src/lib.rs b/drivers/dcdc/src/lib.rs
new file mode 100644
index 0000000..ab2b814
--- /dev/null
+++ b/drivers/dcdc/src/lib.rs
@@ -0,0 +1,43 @@
+#![no_std]
+
+pub type Instance = ral_registers::Instance<RegisterBlock>;
+
+#[repr(C)]
+#[allow(non_snake_case)]
+pub struct RegisterBlock {
+ pub REG0: u32,
+ pub REG1: u32,
+ pub REG2: u32,
+ pub REG3: u32,
+}
+
+pub type DCDC = ral_registers::Instance<RegisterBlock>;
+
+/// Set the target value of `VDD_SOC`, in millivolts
+///
+/// Values are clamped between 800mV and 1575mV, with 25mV step
+/// sizes.
+pub fn set_target_vdd_soc(dcdc: DCDC, millivolts: u32) {
+ let mv = millivolts.clamp(800, 1575);
+ let trg = (mv - 800) / 25;
+ ral_registers::modify_reg!(self, dcdc, REG3, TRG: trg);
+ while ral_registers::read_reg!(self, dcdc, REG0, STS_DC_OK == 0) {}
+}
+
+/// Returns the target value of `VDD_SOC`, in millivolts.
+pub fn target_vdd_soc(dcdc: DCDC) -> u32 {
+ let trg = ral_registers::read_reg!(self, dcdc, REG3, TRG);
+ trg * 25 + 800
+}
+
+ral_registers::register! {
+ pub REG3<u32> RW [
+ TRG start(0) width(5) RW {}
+ ]
+}
+
+ral_registers::register! {
+ pub REG0<u32> RW [
+ STS_DC_OK start(31) width(1) RW {}
+ ]
+}