@@ -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+
177182pub 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