imxrt_hal/chip/drivers/ccm_10xx/
clock_gate.rs1use crate::ral::{self, ccm::CCM};
60
61#[cfg_attr(feature = "defmt", derive(defmt::Format))]
63#[derive(Debug, Clone, Copy, PartialEq, Eq)]
64#[repr(u32)]
65pub enum Setting {
66 Off = 0,
68 OnlyRun = 1,
70 On = 3,
72}
73
74pub const OFF: Setting = Setting::Off;
76pub const ON: Setting = Setting::On;
78
79impl Setting {
80 fn from_raw(raw: u32) -> Self {
81 match raw {
82 0 => Setting::Off,
83 1 => Setting::OnlyRun,
84 3 => Setting::On,
85 _ => unreachable!(), }
87 }
88}
89
90#[cfg_attr(feature = "defmt", derive(defmt::Format))]
92#[derive(Debug, Clone, Copy, PartialEq, Eq)]
93#[allow(unused)]
94#[repr(u8)]
95enum Register {
96 CCGR0,
97 CCGR1,
98 CCGR2,
99 CCGR3,
100 CCGR4,
101 CCGR5,
102 CCGR6,
103 CCGR7,
104}
105
106use Register::*;
107
108#[cfg_attr(feature = "defmt", derive(defmt::Format))]
110#[derive(Debug, Clone, Copy, PartialEq, Eq)]
111#[allow(unused)]
112#[repr(u8)]
113enum Gate {
114 CG0,
115 CG1,
116 CG2,
117 CG3,
118 CG4,
119 CG5,
120 CG6,
121 CG7,
122 CG8,
123 CG9,
124 CG10,
125 CG11,
126 CG12,
127 CG13,
128 CG14,
129 CG15,
130}
131
132use Gate::*;
133
134impl Gate {
135 #[inline(always)]
138 const fn shift(self) -> usize {
139 self as usize * 2
140 }
141}
142
143#[cfg_attr(feature = "defmt", derive(defmt::Format))]
148#[derive(Debug, PartialEq, Eq, Clone, Copy)]
149pub struct Locator {
150 register: Register,
151 gate: Gate,
152}
153
154const fn locator(register: Register, gate: Gate) -> Locator {
155 Locator { register, gate }
156}
157
158#[inline(always)]
160fn clock_gate_register(ccm: &CCM, register: Register) -> &ral::RWRegister<u32> {
161 match register {
162 Register::CCGR0 => &ccm.CCGR0,
163 Register::CCGR1 => &ccm.CCGR1,
164 Register::CCGR2 => &ccm.CCGR2,
165 Register::CCGR3 => &ccm.CCGR3,
166 Register::CCGR4 => &ccm.CCGR4,
167 Register::CCGR5 => &ccm.CCGR5,
168 Register::CCGR6 => &ccm.CCGR6,
169 Register::CCGR7 => {
170 cfg_if::cfg_if! {
173 if #[cfg(any(chip = "imxrt1060", chip = "imxrt1064"))] {
174 &ccm.CCGR7
176 } else {
177 unreachable!()
180 }
181 }
182 }
183 }
184}
185
186impl Locator {
187 pub fn get(&self, ccm: &CCM) -> Setting {
189 let ccgr = clock_gate_register(ccm, self.register);
190 let raw = (ccgr.read() >> self.gate.shift()) & 0b11;
191 Setting::from_raw(raw)
192 }
193
194 pub fn set(&self, ccm: &mut CCM, setting: Setting) {
196 let ccgr = clock_gate_register(ccm, self.register);
197 let mut raw = ccgr.read();
198 raw &= !(0b11 << self.gate.shift());
199 raw |= (setting as u32) << self.gate.shift();
200 ccgr.write(raw);
201 }
202}
203
204#[inline(always)]
206pub const fn pit() -> Locator {
207 locator(CCGR1, CG6)
208}
209
210#[inline(always)]
212pub const fn gpt_serial<const N: u8>() -> Locator
213where
214 ral::gpt::Instance<N>: ral::Valid,
215{
216 [locator(CCGR1, CG11), locator(CCGR0, CG13)][N as usize - 1]
217}
218
219#[inline(always)]
221pub const fn gpt_bus<const N: u8>() -> Locator
222where
223 ral::gpt::Instance<N>: ral::Valid,
224{
225 [locator(CCGR1, CG10), locator(CCGR0, CG12)][N as usize - 1]
226}
227
228#[inline(always)]
237pub const fn gpio<const N: u8>() -> Locator
238where
239 ral::gpio::Instance<N>: ral::Valid,
240{
241 [
242 locator(CCGR1, CG13),
243 locator(CCGR0, CG15),
244 locator(CCGR2, CG13),
245 locator(CCGR3, CG6),
246 locator(CCGR1, CG15),
247 ][N as usize - 1]
248}
249
250#[inline(always)]
252pub const fn lpuart<const N: u8>() -> Locator
253where
254 ral::lpuart::Instance<N>: ral::Valid,
255{
256 [
257 locator(CCGR5, CG12),
258 locator(CCGR0, CG14),
259 locator(CCGR0, CG6),
260 locator(CCGR1, CG12),
261 locator(CCGR3, CG1),
262 locator(CCGR3, CG3),
263 locator(CCGR5, CG13),
264 locator(CCGR6, CG7),
265 ][N as usize - 1]
266}
267
268#[inline(always)]
270pub const fn dma() -> Locator {
271 locator(CCGR5, CG3)
272}
273
274#[inline(always)]
276pub const fn lpi2c<const N: u8>() -> Locator
277where
278 ral::lpi2c::Instance<N>: ral::Valid,
279{
280 [
281 locator(CCGR2, CG3),
282 locator(CCGR2, CG4),
283 locator(CCGR2, CG5),
284 locator(CCGR6, CG12),
285 ][N as usize - 1]
286}
287
288#[inline(always)]
290pub const fn lpspi<const N: u8>() -> Locator
291where
292 ral::lpspi::Instance<N>: ral::Valid,
293{
294 [
295 locator(CCGR1, CG0),
296 locator(CCGR1, CG1),
297 locator(CCGR1, CG2),
298 locator(CCGR1, CG3),
299 ][N as usize - 1]
300}
301
302#[allow(clippy::assertions_on_constants)]
303const _: () = assert!(ral::SOLE_INSTANCE == 0u8);
304
305#[inline(always)]
307pub const fn flexio<const N: u8>() -> Locator
308where
309 ral::flexio::Instance<N>: ral::Valid,
310{
311 [
312 locator(CCGR5, CG1),
313 locator(CCGR3, CG0),
314 locator(CCGR7, CG6),
315 ][if N == ral::SOLE_INSTANCE {
316 N as usize
317 } else {
318 N as usize - 1
319 }]
320}
321
322#[inline(always)]
324pub const fn flexpwm<const N: u8>() -> Locator
325where
326 ral::pwm::Instance<N>: ral::Valid,
327{
328 [
329 locator(CCGR4, CG8),
330 locator(CCGR4, CG9),
331 locator(CCGR4, CG10),
332 locator(CCGR4, CG11),
333 ][if N == ral::SOLE_INSTANCE {
334 N as usize
335 } else {
336 N as usize - 1
337 }]
338 }
344
345#[inline(always)]
347pub const fn trng() -> Locator {
348 locator(CCGR6, CG6)
349}
350
351#[inline(always)]
353pub const fn snvs_lp() -> Locator {
354 locator(CCGR5, CG15)
355}
356
357#[inline(always)]
359pub const fn snvs_hp() -> Locator {
360 locator(CCGR5, CG14)
361}
362
363#[inline(always)]
365pub const fn usb() -> Locator {
366 locator(CCGR6, CG0)
367}
368
369#[cfg(not(feature = "imxrt1010"))]
371#[inline(always)]
372pub const fn usdhc<const N: u8>() -> Locator
373where
374 ral::usdhc::Instance<N>: ral::Valid,
375{
376 [locator(CCGR6, CG1), locator(CCGR6, CG2)][N as usize - 1]
377}
378
379#[inline(always)]
381pub const fn adc<const N: u8>() -> Locator
382where
383 ral::adc::Instance<N>: ral::Valid,
384{
385 [locator(CCGR1, CG8), locator(CCGR1, CG4)][if N == ral::SOLE_INSTANCE {
386 N as usize
387 } else {
388 N as usize - 1
389 }]
390}
391
392#[inline(always)]
394pub const fn flexspi<const N: u8>() -> Locator
395where
396 ral::flexspi::Instance<N>: ral::Valid,
397{
398 [locator(CCGR6, CG5), locator(CCGR7, CG1)][if N == ral::SOLE_INSTANCE {
399 N as usize
400 } else {
401 N as usize - 1
402 }]
403}
404
405#[inline(always)]
407pub const fn sai<const N: u8>() -> Locator
408where
409 ral::sai::Instance<N>: ral::Valid,
410{
411 [
412 locator(CCGR5, CG9),
413 locator(CCGR5, CG10),
414 locator(CCGR5, CG11),
415 ][if N == ral::SOLE_INSTANCE {
416 N as usize
417 } else {
418 N as usize - 1
419 }]
420}
421
422pub use crate::chip::config::ccm::clock_gate::*;