@@ -7,52 +7,12 @@ mod utilities;
7
7
use cortex_m:: singleton;
8
8
use cortex_m_rt:: entry;
9
9
use cortex_m_semihosting:: debug;
10
- use embedded_dma:: { ReadBuffer , WriteBuffer } ;
11
10
use stm32h5xx_hal:: {
12
- gpdma:: { config:: transform:: * , DmaConfig , DmaTransfer , Word } ,
11
+ gpdma:: { config:: transform:: * , DmaConfig , DmaTransfer } ,
13
12
pac,
14
13
prelude:: * ,
15
14
} ;
16
15
17
- // Buffer is used to manage a reference to a static buffer returned by the cortex_m::singleton!
18
- // macro and which can be with the DmaTransfer API (which requires passing ReadBuffer and
19
- // WriteBuffer implementations by value) and then used to access the buffer after the transfer has
20
- // completed.
21
- struct Buffer < T : Word + ' static , const N : usize > {
22
- data : & ' static mut [ T ; N ] ,
23
- }
24
-
25
- impl < T , const N : usize > Buffer < T , N >
26
- where
27
- T : Word + ' static ,
28
- {
29
- fn new ( data : & ' static mut [ T ; N ] ) -> Self {
30
- Self { data }
31
- }
32
- }
33
-
34
- unsafe impl < T , const N : usize > ReadBuffer for & Buffer < T , N >
35
- where
36
- T : Word + ' static ,
37
- {
38
- type Word = T ;
39
-
40
- unsafe fn read_buffer ( & self ) -> ( * const Self :: Word , usize ) {
41
- ( self . data . as_ptr ( ) , N )
42
- }
43
- }
44
-
45
- unsafe impl < T , const N : usize > WriteBuffer for & mut Buffer < T , N >
46
- where
47
- T : Word + ' static ,
48
- {
49
- type Word = T ;
50
-
51
- unsafe fn write_buffer ( & mut self ) -> ( * mut Self :: Word , usize ) {
52
- ( self . data . as_mut_ptr ( ) , N )
53
- }
54
- }
55
-
56
16
#[ entry]
57
17
fn main ( ) -> ! {
58
18
utilities:: logger:: init ( ) ;
@@ -72,108 +32,90 @@ fn main() -> ! {
72
32
let src =
73
33
singleton ! ( : [ u8 ; 40 ] = core:: array:: from_fn( |i| i as u8 ) ) . unwrap ( ) ;
74
34
75
- let src_buffer = Buffer :: new ( src) ;
76
35
let dest = singleton ! ( : [ u8 ; 40 ] = [ 0u8 ; 40 ] ) . unwrap ( ) ;
77
- let mut dest_buffer = Buffer :: new ( dest) ;
78
36
79
37
let mut channel = channels. 0 ;
80
38
let config = DmaConfig :: new ( ) ;
81
- let mut transfer = DmaTransfer :: memory_to_memory (
82
- config,
83
- & mut channel,
84
- & src_buffer,
85
- & mut dest_buffer,
86
- ) ;
39
+ let mut transfer =
40
+ DmaTransfer :: memory_to_memory ( config, & mut channel, src, dest) ;
87
41
transfer. start ( ) . unwrap ( ) ;
88
42
transfer. wait_for_transfer_complete ( ) . unwrap ( ) ;
89
- assert_eq ! ( src_buffer. data, dest_buffer. data) ;
43
+ let ( src, dest) = transfer. free ( ) ;
44
+ assert_eq ! ( src, dest) ;
90
45
91
46
log:: info!( "u32 to u32 with data transform" ) ;
92
47
let src = singleton ! ( : [ u32 ; 10 ] = [ 0x12345678u32 ; 10 ] ) . unwrap ( ) ;
93
48
let dest = singleton ! ( : [ u32 ; 10 ] = [ 0u32 ; 10 ] ) . unwrap ( ) ;
94
- let mut dest_buffer = Buffer :: new ( dest) ;
95
49
96
50
let config = DmaConfig :: new ( ) . with_data_transform (
97
51
DataTransform :: builder ( )
98
52
. swap_destination_half_words ( )
99
53
. swap_destination_half_word_byte_order ( ) ,
100
54
) ;
101
55
102
- let mut transfer = DmaTransfer :: memory_to_memory (
103
- config,
104
- & mut channel,
105
- src,
106
- & mut dest_buffer,
107
- ) ;
56
+ let mut transfer =
57
+ DmaTransfer :: memory_to_memory ( config, & mut channel, src, dest) ;
108
58
109
59
transfer. start ( ) . unwrap ( ) ;
110
60
transfer. wait_for_transfer_complete ( ) . unwrap ( ) ;
61
+ let ( _, dest) = transfer. free ( ) ;
62
+
111
63
let expected = [ 0x78563412 ; 10 ] ;
112
- assert_eq ! ( expected, * dest_buffer . data ) ;
64
+ assert_eq ! ( expected, * dest ) ;
113
65
114
66
log:: info!( "u32 to u16 with truncate" ) ;
115
67
let src = singleton ! ( : [ u32 ; 10 ] = [ 0x12345678u32 ; 10 ] ) . unwrap ( ) ;
116
68
let dest = singleton ! ( : [ u16 ; 20 ] = [ 0u16 ; 20 ] ) . unwrap ( ) ;
117
- let mut dest_buffer = Buffer :: new ( dest) ;
118
69
119
70
let config = DmaConfig :: new ( ) . with_data_transform (
120
71
DataTransform :: builder ( ) . left_align_right_truncate ( ) ,
121
72
) ;
122
- let mut transfer = DmaTransfer :: memory_to_memory (
123
- config,
124
- & mut channel,
125
- src,
126
- & mut dest_buffer,
127
- ) ;
73
+ let mut transfer =
74
+ DmaTransfer :: memory_to_memory ( config, & mut channel, src, dest) ;
128
75
129
76
transfer. start ( ) . unwrap ( ) ;
130
77
transfer. wait_for_transfer_complete ( ) . unwrap ( ) ;
78
+ let ( _, dest) = transfer. free ( ) ;
79
+
131
80
let expected = [ 0x1234 ; 10 ] ;
132
- assert_eq ! ( expected, ( * dest_buffer . data ) [ 0 ..10 ] ) ;
81
+ assert_eq ! ( expected, ( * dest ) [ 0 ..10 ] ) ;
133
82
134
83
log:: info!( "u32 to u8 with unpack" ) ;
135
84
let src = singleton ! ( : [ u32 ; 10 ] = [ 0x12345678u32 ; 10 ] ) . unwrap ( ) ;
136
85
let dest = singleton ! ( : [ u8 ; 40 ] = [ 0u8 ; 40 ] ) . unwrap ( ) ;
137
- let mut dest_buffer = Buffer :: new ( dest) ;
138
86
139
87
let config =
140
88
DmaConfig :: new ( ) . with_data_transform ( DataTransform :: builder ( ) . unpack ( ) ) ;
141
- let mut transfer = DmaTransfer :: memory_to_memory (
142
- config,
143
- & mut channel,
144
- src,
145
- & mut dest_buffer,
146
- ) ;
89
+ let mut transfer =
90
+ DmaTransfer :: memory_to_memory ( config, & mut channel, src, dest) ;
147
91
148
92
transfer. start ( ) . unwrap ( ) ;
149
93
transfer. wait_for_transfer_complete ( ) . unwrap ( ) ;
94
+ let ( _, dest) = transfer. free ( ) ;
150
95
let expected = [ 0x78 , 0x56 , 0x34 , 0x12 ] ;
151
- assert_eq ! ( expected, ( * dest_buffer . data ) [ 0 ..4 ] ) ;
152
- assert_eq ! ( expected, ( * dest_buffer . data ) [ 36 ..40 ] ) ;
96
+ assert_eq ! ( expected, ( * dest ) [ 0 ..4 ] ) ;
97
+ assert_eq ! ( expected, ( * dest ) [ 36 ..40 ] ) ;
153
98
154
99
log:: info!( "u8 to u32 with pack" ) ;
155
100
let src = singleton ! ( : [ u8 ; 40 ] = [ 0u8 ; 40 ] ) . unwrap ( ) ;
156
101
let dest = singleton ! ( : [ u32 ; 10 ] = [ 0u32 ; 10 ] ) . unwrap ( ) ;
157
- let mut dest_buffer = Buffer :: new ( dest) ;
158
102
159
103
for chunk in src. chunks_mut ( 4 ) {
160
104
chunk. copy_from_slice ( & [ 0x78 , 0x56 , 0x34 , 0x12 ] ) ;
161
105
}
162
106
163
107
let config =
164
108
DmaConfig :: new ( ) . with_data_transform ( DataTransform :: builder ( ) . pack ( ) ) ;
165
- let mut transfer = DmaTransfer :: memory_to_memory (
166
- config,
167
- & mut channel,
168
- src,
169
- & mut dest_buffer,
170
- ) ;
109
+ let mut transfer =
110
+ DmaTransfer :: memory_to_memory ( config, & mut channel, src, dest) ;
171
111
172
112
transfer. start ( ) . unwrap ( ) ;
173
113
transfer. wait_for_transfer_complete ( ) . unwrap ( ) ;
114
+ let ( _, dest) = transfer. free ( ) ;
115
+
174
116
let expected = [ 0x12345678 ; 10 ] ;
175
- assert_eq ! ( expected, ( * dest_buffer . data ) ) ;
176
- assert_eq ! ( expected, ( * dest_buffer . data ) ) ;
117
+ assert_eq ! ( expected, * dest ) ;
118
+ assert_eq ! ( expected, * dest ) ;
177
119
178
120
log:: info!( "All tests passed!" ) ;
179
121
loop {
0 commit comments