aboutsummaryrefslogtreecommitdiff
path: root/embassy-nxp/src
diff options
context:
space:
mode:
authorRoi Bachynskyi <[email protected]>2025-08-31 20:08:35 +0300
committerRoi Bachynskyi <[email protected]>2025-09-12 11:07:02 +0300
commitf58d2ceda1abcb44cd8e02c24316433ab4777b2c (patch)
tree46cb82d721a45cc51577f71c0dafdf7cefa2bd89 /embassy-nxp/src
parent19bb3668669710dbd1d17dc5fb0dee6d915f012e (diff)
lpc55: pint rewritten
Diffstat (limited to 'embassy-nxp/src')
-rw-r--r--embassy-nxp/src/pint.rs97
1 files changed, 33 insertions, 64 deletions
diff --git a/embassy-nxp/src/pint.rs b/embassy-nxp/src/pint.rs
index ff414b4e6..e594aaa6a 100644
--- a/embassy-nxp/src/pint.rs
+++ b/embassy-nxp/src/pint.rs
@@ -5,10 +5,11 @@ use core::pin::Pin as FuturePin;
5use core::task::{Context, Poll}; 5use core::task::{Context, Poll};
6 6
7use critical_section::Mutex; 7use critical_section::Mutex;
8use embassy_hal_internal::interrupt::InterruptExt;
8use embassy_sync::waitqueue::AtomicWaker; 9use embassy_sync::waitqueue::AtomicWaker;
9 10
10use crate::gpio::{self, inputmux_reg, pint_reg, syscon_reg, AnyPin, Level, SealedPin}; 11use crate::gpio::{self, AnyPin, Level, SealedPin};
11use crate::pac::interrupt; 12use crate::pac::{interrupt, INPUTMUX, PINT, SYSCON};
12use crate::Peri; 13use crate::Peri;
13 14
14struct PinInterrupt { 15struct PinInterrupt {
@@ -88,18 +89,18 @@ enum InterruptOn {
88} 89}
89 90
90pub(crate) fn init() { 91pub(crate) fn init() {
91 syscon_reg().ahbclkctrl0.modify(|_, w| w.pint().enable()); 92 SYSCON.ahbclkctrl0().modify(|w| w.set_pint(true));
92 93
93 // Enable interrupts 94 // Enable interrupts
94 unsafe { 95 unsafe {
95 crate::pac::NVIC::unmask(crate::pac::Interrupt::PIN_INT0); 96 interrupt::PIN_INT0.enable();
96 crate::pac::NVIC::unmask(crate::pac::Interrupt::PIN_INT1); 97 interrupt::PIN_INT1.enable();
97 crate::pac::NVIC::unmask(crate::pac::Interrupt::PIN_INT2); 98 interrupt::PIN_INT2.enable();
98 crate::pac::NVIC::unmask(crate::pac::Interrupt::PIN_INT3); 99 interrupt::PIN_INT3.enable();
99 crate::pac::NVIC::unmask(crate::pac::Interrupt::PIN_INT4); 100 interrupt::PIN_INT4.enable();
100 crate::pac::NVIC::unmask(crate::pac::Interrupt::PIN_INT5); 101 interrupt::PIN_INT5.enable();
101 crate::pac::NVIC::unmask(crate::pac::Interrupt::PIN_INT6); 102 interrupt::PIN_INT6.enable();
102 crate::pac::NVIC::unmask(crate::pac::Interrupt::PIN_INT7); 103 interrupt::PIN_INT7.enable();
103 }; 104 };
104 105
105 info!("Pin interrupts initialized"); 106 info!("Pin interrupts initialized");
@@ -119,24 +120,19 @@ impl<'d> InputFuture<'d> {
119 let interrupt_number = next_available_interrupt()?; 120 let interrupt_number = next_available_interrupt()?;
120 121
121 // Clear interrupt, just in case 122 // Clear interrupt, just in case
122 pint_reg() 123 PINT.rise().write(|w| w.set_rdet(1 << interrupt_number));
123 .rise 124 PINT.fall().write(|w| w.set_fdet(1 << interrupt_number));
124 .write(|w| unsafe { w.rdet().bits(1 << interrupt_number) });
125 pint_reg()
126 .fall
127 .write(|w| unsafe { w.fdet().bits(1 << interrupt_number) });
128 125
129 // Enable input multiplexing on pin interrupt register 0 for pin (32*bank + pin_number) 126 // Enable input multiplexing on pin interrupt register 0 for pin (32*bank + pin_number)
130 inputmux_reg().pintsel[interrupt_number] 127 INPUTMUX
131 .write(|w| unsafe { w.intpin().bits(32 * pin.pin_bank() as u8 + pin.pin_number()) }); 128 .pintsel(interrupt_number as usize)
129 .write(|w| w.set_intpin(32 * pin.pin_bank() as u8 + pin.pin_number()));
132 130
133 match interrupt_on { 131 match interrupt_on {
134 InterruptOn::Level(level) => { 132 InterruptOn::Level(level) => {
135 // Set pin interrupt register to edge sensitive or level sensitive 133 // Set pin interrupt register to edge sensitive or level sensitive
136 // 0 = edge sensitive, 1 = level sensitive 134 // 0 = edge sensitive, 1 = level sensitive
137 pint_reg() 135 PINT.isel().modify(|w| w.set_pmode(w.pmode() | (1 << interrupt_number)));
138 .isel
139 .modify(|r, w| unsafe { w.bits(r.bits() | (1 << interrupt_number)) });
140 136
141 // Enable level interrupt. 137 // Enable level interrupt.
142 // 138 //
@@ -144,63 +140,44 @@ impl<'d> InputFuture<'d> {
144 // is activated. 140 // is activated.
145 141
146 // 0 = no-op, 1 = enable 142 // 0 = no-op, 1 = enable
147 pint_reg() 143 PINT.sienr().write(|w| w.set_setenrl(1 << interrupt_number));
148 .sienr
149 .write(|w| unsafe { w.setenrl().bits(1 << interrupt_number) });
150 144
151 // Set active level 145 // Set active level
152 match level { 146 match level {
153 Level::Low => { 147 Level::Low => {
154 // 0 = no-op, 1 = select LOW 148 // 0 = no-op, 1 = select LOW
155 pint_reg() 149 PINT.cienf().write(|w| w.set_cenaf(1 << interrupt_number));
156 .cienf
157 .write(|w| unsafe { w.cenaf().bits(1 << interrupt_number) });
158 } 150 }
159 Level::High => { 151 Level::High => {
160 // 0 = no-op, 1 = select HIGH 152 // 0 = no-op, 1 = select HIGH
161 pint_reg() 153 PINT.sienf().write(|w| w.set_setenaf(1 << interrupt_number));
162 .sienf
163 .write(|w| unsafe { w.setenaf().bits(1 << interrupt_number) });
164 } 154 }
165 } 155 }
166 } 156 }
167 InterruptOn::Edge(edge) => { 157 InterruptOn::Edge(edge) => {
168 // Set pin interrupt register to edge sensitive or level sensitive 158 // Set pin interrupt register to edge sensitive or level sensitive
169 // 0 = edge sensitive, 1 = level sensitive 159 // 0 = edge sensitive, 1 = level sensitive
170 pint_reg() 160 PINT.isel()
171 .isel 161 .modify(|w| w.set_pmode(w.pmode() & !(1 << interrupt_number)));
172 .modify(|r, w| unsafe { w.bits(r.bits() & !(1 << interrupt_number)) });
173 162
174 // Enable rising/falling edge detection 163 // Enable rising/falling edge detection
175 match edge { 164 match edge {
176 Edge::Rising => { 165 Edge::Rising => {
177 // 0 = no-op, 1 = enable rising edge 166 // 0 = no-op, 1 = enable rising edge
178 pint_reg() 167 PINT.sienr().write(|w| w.set_setenrl(1 << interrupt_number));
179 .sienr
180 .write(|w| unsafe { w.setenrl().bits(1 << interrupt_number) });
181 // 0 = no-op, 1 = disable falling edge 168 // 0 = no-op, 1 = disable falling edge
182 pint_reg() 169 PINT.cienf().write(|w| w.set_cenaf(1 << interrupt_number));
183 .cienf
184 .write(|w| unsafe { w.cenaf().bits(1 << interrupt_number) });
185 } 170 }
186 Edge::Falling => { 171 Edge::Falling => {
187 // 0 = no-op, 1 = enable falling edge 172 // 0 = no-op, 1 = enable falling edge
188 pint_reg() 173 PINT.sienf().write(|w| w.set_setenaf(1 << interrupt_number));
189 .sienf
190 .write(|w| unsafe { w.setenaf().bits(1 << interrupt_number) });
191 // 0 = no-op, 1 = disable rising edge 174 // 0 = no-op, 1 = disable rising edge
192 pint_reg() 175 PINT.cienr().write(|w| w.set_cenrl(1 << interrupt_number));
193 .cienr
194 .write(|w| unsafe { w.cenrl().bits(1 << interrupt_number) });
195 } 176 }
196 Edge::Both => { 177 Edge::Both => {
197 // 0 = no-op, 1 = enable 178 // 0 = no-op, 1 = enable
198 pint_reg() 179 PINT.sienr().write(|w| w.set_setenrl(1 << interrupt_number));
199 .sienr 180 PINT.sienf().write(|w| w.set_setenaf(1 << interrupt_number));
200 .write(|w| unsafe { w.setenrl().bits(1 << interrupt_number) });
201 pint_reg()
202 .sienf
203 .write(|w| unsafe { w.setenaf().bits(1 << interrupt_number) });
204 } 181 }
205 } 182 }
206 } 183 }
@@ -239,12 +216,8 @@ impl<'d> Drop for InputFuture<'d> {
239 216
240 // Disable pin interrupt 217 // Disable pin interrupt
241 // 0 = no-op, 1 = disable 218 // 0 = no-op, 1 = disable
242 pint_reg() 219 PINT.cienr().write(|w| w.set_cenrl(1 << interrupt_number));
243 .cienr 220 PINT.cienf().write(|w| w.set_cenaf(1 << interrupt_number));
244 .write(|w| unsafe { w.cenrl().bits(1 << interrupt_number) });
245 pint_reg()
246 .cienf
247 .write(|w| unsafe { w.cenaf().bits(1 << interrupt_number) });
248 221
249 critical_section::with(|cs| { 222 critical_section::with(|cs| {
250 let mut pin_interrupts = PIN_INTERRUPTS.borrow(cs).borrow_mut(); 223 let mut pin_interrupts = PIN_INTERRUPTS.borrow(cs).borrow_mut();
@@ -277,12 +250,8 @@ impl<'d> Future for InputFuture<'d> {
277} 250}
278 251
279fn handle_interrupt(interrupt_number: usize) { 252fn handle_interrupt(interrupt_number: usize) {
280 pint_reg() 253 PINT.rise().write(|w| w.set_rdet(1 << interrupt_number));
281 .rise 254 PINT.fall().write(|w| w.set_fdet(1 << interrupt_number));
282 .write(|w| unsafe { w.rdet().bits(1 << interrupt_number) });
283 pint_reg()
284 .fall
285 .write(|w| unsafe { w.fdet().bits(1 << interrupt_number) });
286 255
287 critical_section::with(|cs| { 256 critical_section::with(|cs| {
288 let mut pin_interrupts = PIN_INTERRUPTS.borrow(cs).borrow_mut(); 257 let mut pin_interrupts = PIN_INTERRUPTS.borrow(cs).borrow_mut();