Skip to content

Commit 5ced109

Browse files
committed
dma: changed match_channel to use channel.into
1 parent 92df79b commit 5ced109

1 file changed

Lines changed: 107 additions & 124 deletions

File tree

chips/stm32u5xx/src/dma.rs

Lines changed: 107 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ register_bitfields! [
3939
/// Request selection
4040
REQSEL OFFSET(0) NUMBITS(7) [],
4141
],
42-
4342
pub DmaChannelCR [
4443
/// Transfer complete interrupt enable
4544
TCIE OFFSET(8) NUMBITS(1) [],
@@ -174,6 +173,12 @@ pub enum ChannelId {
174173
Channel15 = 15,
175174
}
176175

176+
impl From<ChannelId> for usize {
177+
fn from(val: ChannelId) -> usize {
178+
val as usize
179+
}
180+
}
181+
177182
pub struct ChannelDma {
178183
pub channel: ChannelId,
179184
pub in_use: Cell<bool>,
@@ -221,125 +226,106 @@ impl Dma {
221226
}
222227

223228
pub fn match_channel(&self, channel: ChannelId) -> Option<usize> {
224-
match channel {
225-
ChannelId::Channel00 => Some(0),
226-
ChannelId::Channel01 => Some(1),
227-
ChannelId::Channel02 => Some(2),
228-
ChannelId::Channel03 => Some(3),
229-
ChannelId::Channel04 => Some(4),
230-
ChannelId::Channel05 => Some(5),
231-
ChannelId::Channel06 => Some(6),
232-
ChannelId::Channel07 => Some(7),
233-
ChannelId::Channel08 => Some(8),
234-
ChannelId::Channel09 => Some(9),
235-
ChannelId::Channel10 => Some(10),
236-
ChannelId::Channel11 => Some(11),
237-
ChannelId::Channel12 => Some(12),
238-
ChannelId::Channel13 => Some(13),
239-
ChannelId::Channel14 => Some(14),
240-
ChannelId::Channel15 => Some(15),
241-
}
229+
Some(channel.into())
242230
}
243231

244232
pub fn setup_usart1_tx(&self, channel: ChannelId, buffer_addr: u32, length: u32) {
245-
if let Some(channel_id) = self.match_channel(channel) {
246-
// 1. Mark channel as Secure AND Privileged
247-
self.registers.seccfgr.modify(CH_FIELDS[channel_id].val(1));
248-
self.registers.privcfgr.modify(CH_FIELDS[channel_id].val(1));
249-
250-
let ch = &self.registers.channels[channel_id];
251-
252-
// 2. Ensure channel is disabled
253-
ch.c_r.write(DmaChannelCR::EN::CLEAR);
254-
255-
// 3. Clear all flags
256-
ch.f_cr.write(
257-
DmaChannelFCR::SUSPF::SET
258-
+ DmaChannelFCR::USEF::SET
259-
+ DmaChannelFCR::ULEF::SET
260-
+ DmaChannelFCR::DTEF::SET
261-
+ DmaChannelFCR::HTF::SET
262-
+ DmaChannelFCR::TCF::SET,
263-
);
264-
265-
// 4. Configure Transfer Register 1 (TR1)
266-
// SINC (bit 3) = 1
267-
// SAP (bit 14) = 0 (Port 0)
268-
// DAP (bit 30) = 0 (Port 0 - Safer for U545)
269-
ch.t_r1.write(
270-
DmaChannelTR1::SINC::SET + DmaChannelTR1::SAP::CLEAR + DmaChannelTR1::DAP::CLEAR,
271-
);
272-
273-
// 5. Configure Transfer Register 2 (TR2)
274-
// REQSEL = 25 (USART1_TX on U545), DREQ = 1 (Destination request)
275-
ch.t_r2
276-
.write(DmaChannelTR2::REQSEL.val(25) + DmaChannelTR2::DREQ::SET);
277-
278-
// 6. Set Addresses
279-
ch.s_ar.set(buffer_addr);
280-
ch.d_ar.set(USART1_TDR);
281-
282-
// 7. Set Block Register 1 (BR1)
283-
ch.b_r1.set(length & 0xFFFF);
284-
285-
// 8. Enable Transfer Complete Interrupt (bit 8) and Start (bit 0)
286-
ch.c_r
287-
.write(DmaChannelCR::TCIE::SET + DmaChannelCR::EN::SET);
288-
}
233+
let channel_id: usize = channel.into();
234+
235+
// 1. Mark channel as Secure AND Privileged
236+
self.registers.seccfgr.modify(CH_FIELDS[channel_id].val(1));
237+
self.registers.privcfgr.modify(CH_FIELDS[channel_id].val(1));
238+
239+
let ch = &self.registers.channels[channel_id];
240+
241+
// 2. Ensure channel is disabled
242+
ch.c_r.write(DmaChannelCR::EN::CLEAR);
243+
244+
// 3. Clear all flags
245+
ch.f_cr.write(
246+
DmaChannelFCR::SUSPF::SET
247+
+ DmaChannelFCR::USEF::SET
248+
+ DmaChannelFCR::ULEF::SET
249+
+ DmaChannelFCR::DTEF::SET
250+
+ DmaChannelFCR::HTF::SET
251+
+ DmaChannelFCR::TCF::SET,
252+
);
253+
254+
// 4. Configure Transfer Register 1 (TR1)
255+
// SINC (bit 3) = 1
256+
// SAP (bit 14) = 0 (Port 0)
257+
// DAP (bit 30) = 0 (Port 0 - Safer for U545)
258+
ch.t_r1.write(
259+
DmaChannelTR1::SINC::SET + DmaChannelTR1::SAP::CLEAR + DmaChannelTR1::DAP::CLEAR,
260+
);
261+
262+
// 5. Configure Transfer Register 2 (TR2)
263+
// REQSEL = 25 (USART1_TX on U545), DREQ = 1 (Destination request)
264+
ch.t_r2
265+
.write(DmaChannelTR2::REQSEL.val(25) + DmaChannelTR2::DREQ::SET);
266+
267+
// 6. Set Addresses
268+
ch.s_ar.set(buffer_addr);
269+
ch.d_ar.set(USART1_TDR);
270+
271+
// 7. Set Block Register 1 (BR1)
272+
ch.b_r1.set(length & 0xFFFF);
273+
274+
// 8. Enable Transfer Complete Interrupt (bit 8) and Start (bit 0)
275+
ch.c_r
276+
.write(DmaChannelCR::TCIE::SET + DmaChannelCR::EN::SET);
289277
}
290278

291279
pub fn setup_usart1_rx(&self, channel: ChannelId, buffer_addr: u32, length: u32) {
292-
if let Some(channel_id) = self.match_channel(channel) {
293-
// Mark channel as Secure AND Privileged
294-
self.registers.seccfgr.modify(CH_FIELDS[channel_id].val(1));
295-
self.registers.privcfgr.modify(CH_FIELDS[channel_id].val(1));
296-
297-
let ch = &self.registers.channels[channel_id];
298-
299-
ch.c_r.write(DmaChannelCR::EN::CLEAR);
300-
ch.f_cr.write(
301-
DmaChannelFCR::SUSPF::SET
302-
+ DmaChannelFCR::USEF::SET
303-
+ DmaChannelFCR::ULEF::SET
304-
+ DmaChannelFCR::DTEF::SET
305-
+ DmaChannelFCR::HTF::SET
306-
+ DmaChannelFCR::TCF::SET,
307-
);
308-
309-
// Configure TR1 (Security + Direction)
310-
// DINC (19), SSEC (15), DSEC (31)
311-
ch.t_r1.write(
312-
DmaChannelTR1::DINC::SET + DmaChannelTR1::SSEC::SET + DmaChannelTR1::DSEC::SET,
313-
);
314-
315-
// Configure TR2 (Trigger Source) - REQSEL = 24
316-
ch.t_r2.write(DmaChannelTR2::REQSEL.val(24));
317-
318-
// 6. Set Addresses
319-
ch.s_ar.set(USART1_RDR);
320-
ch.d_ar.set(buffer_addr);
321-
322-
// 7. Set Block Register 1 (BR1)
323-
ch.b_r1.set(length & 0xFFFF);
324-
325-
// 8. Enable
326-
ch.c_r
327-
.write(DmaChannelCR::TCIE::SET + DmaChannelCR::EN::SET);
328-
}
280+
let channel_id: usize = channel.into();
281+
282+
// Mark channel as Secure AND Privileged
283+
self.registers.seccfgr.modify(CH_FIELDS[channel_id].val(1));
284+
self.registers.privcfgr.modify(CH_FIELDS[channel_id].val(1));
285+
286+
let ch = &self.registers.channels[channel_id];
287+
288+
ch.c_r.write(DmaChannelCR::EN::CLEAR);
289+
ch.f_cr.write(
290+
DmaChannelFCR::SUSPF::SET
291+
+ DmaChannelFCR::USEF::SET
292+
+ DmaChannelFCR::ULEF::SET
293+
+ DmaChannelFCR::DTEF::SET
294+
+ DmaChannelFCR::HTF::SET
295+
+ DmaChannelFCR::TCF::SET,
296+
);
297+
298+
// Configure TR1 (Security + Direction)
299+
// DINC (19), SSEC (15), DSEC (31)
300+
ch.t_r1
301+
.write(DmaChannelTR1::DINC::SET + DmaChannelTR1::SSEC::SET + DmaChannelTR1::DSEC::SET);
302+
303+
// Configure TR2 (Trigger Source) - REQSEL = 24
304+
ch.t_r2.write(DmaChannelTR2::REQSEL.val(24));
305+
306+
// 6. Set Addresses
307+
ch.s_ar.set(USART1_RDR);
308+
ch.d_ar.set(buffer_addr);
309+
310+
// 7. Set Block Register 1 (BR1)
311+
ch.b_r1.set(length & 0xFFFF);
312+
313+
// 8. Enable
314+
ch.c_r
315+
.write(DmaChannelCR::TCIE::SET + DmaChannelCR::EN::SET);
329316
}
330317

331318
pub fn clear_interrupt(&self, channel: ChannelId) {
332-
if let Some(channel_id) = self.match_channel(channel) {
333-
let ch = &self.registers.channels[channel_id];
334-
ch.f_cr.write(
335-
DmaChannelFCR::SUSPF::SET
336-
+ DmaChannelFCR::USEF::SET
337-
+ DmaChannelFCR::ULEF::SET
338-
+ DmaChannelFCR::DTEF::SET
339-
+ DmaChannelFCR::HTF::SET
340-
+ DmaChannelFCR::TCF::SET,
341-
);
342-
}
319+
let channel_id: usize = channel.into();
320+
let ch = &self.registers.channels[channel_id];
321+
ch.f_cr.write(
322+
DmaChannelFCR::SUSPF::SET
323+
+ DmaChannelFCR::USEF::SET
324+
+ DmaChannelFCR::ULEF::SET
325+
+ DmaChannelFCR::DTEF::SET
326+
+ DmaChannelFCR::HTF::SET
327+
+ DmaChannelFCR::TCF::SET,
328+
);
343329
}
344330

345331
pub fn request_channel(&self) -> Option<ChannelId> {
@@ -353,26 +339,23 @@ impl Dma {
353339
}
354340

355341
pub fn release_channel(&self, id: ChannelId) {
356-
if let Some(index) = self.match_channel(id) {
357-
if self.channels[index].in_use.get() {
358-
self.channels[index].in_use.set(false);
359-
self.channels[index].client.clear();
360-
}
342+
let index: usize = id.into();
343+
if self.channels[index].in_use.get() {
344+
self.channels[index].in_use.set(false);
345+
self.channels[index].client.clear();
361346
}
362347
}
363348

364349
pub fn set_client(&self, id: ChannelId, client: &'static dyn DmaClient) {
365-
if let Some(index) = self.match_channel(id) {
366-
self.channels[index].client.set(client);
367-
}
350+
let index: usize = id.into();
351+
self.channels[index].client.set(client);
368352
}
369353

370354
pub fn handle_interrupt(&self, id: ChannelId) {
371355
self.clear_interrupt(id);
372-
if let Some(index) = self.match_channel(id) {
373-
self.channels[index].client.map(|client| {
374-
client.transfer_done(id);
375-
});
376-
}
356+
let index: usize = id.into();
357+
self.channels[index].client.map(|client| {
358+
client.transfer_done(id);
359+
});
377360
}
378361
}

0 commit comments

Comments
 (0)