@@ -81,23 +81,39 @@ impl core::ops::Deref for RegisterBlock {
81
81
}
82
82
}
83
83
84
+ /// Extend constructor to owned UART register blocks.
85
+ pub trait UartExt < ' a , const I : usize > {
86
+ /// Creates a polling serial instance, without interrupt or DMA configurations.
87
+ fn serial < PADS > (
88
+ self ,
89
+ pads : PADS ,
90
+ config : impl Into < Config > ,
91
+ clocks : & Clocks ,
92
+ ccu : & ccu:: RegisterBlock ,
93
+ ) -> Serial < ' a , PADS >
94
+ where
95
+ PADS : Pads < I > ;
96
+ }
97
+
84
98
/// Managed serial structure with peripheral and pads.
85
- #[ derive( Debug ) ]
86
- pub struct Serial < UART , const I : usize , PADS : Pads < I > > {
87
- uart : UART ,
99
+ pub struct Serial < ' a , PADS > {
100
+ uart : & ' a RegisterBlock ,
88
101
pads : PADS ,
89
102
}
90
103
91
- impl < UART : AsRef < RegisterBlock > , const I : usize , PADS : Pads < I > > Serial < UART , I , PADS > {
104
+ impl < ' a , PADS > Serial < ' a , PADS > {
92
105
/// Create a serial instance.
93
106
#[ inline]
94
- pub fn new (
95
- uart : UART ,
107
+ pub fn new < const I : usize > (
108
+ uart : & ' a RegisterBlock ,
96
109
pads : PADS ,
97
110
config : impl Into < Config > ,
98
111
clocks : & Clocks ,
99
112
ccu : & ccu:: RegisterBlock ,
100
- ) -> Self {
113
+ ) -> Self
114
+ where
115
+ PADS : Pads < I > ,
116
+ {
101
117
// 1. unwrap parameters
102
118
let Config {
103
119
baudrate,
@@ -111,8 +127,8 @@ impl<UART: AsRef<RegisterBlock>, const I: usize, PADS: Pads<I>> Serial<UART, I,
111
127
unsafe { PADS :: Clock :: reset ( ccu) } ;
112
128
// 3. set interrupt configuration
113
129
// on BT0 stage we disable all uart interrupts
114
- let interrupt_types = uart. as_ref ( ) . ier ( ) . read ( ) ;
115
- uart. as_ref ( ) . ier ( ) . write (
130
+ let interrupt_types = uart. ier ( ) . read ( ) ;
131
+ uart. ier ( ) . write (
116
132
interrupt_types
117
133
. disable_ms ( )
118
134
. disable_rda ( )
@@ -121,7 +137,7 @@ impl<UART: AsRef<RegisterBlock>, const I: usize, PADS: Pads<I>> Serial<UART, I,
121
137
) ;
122
138
// 4. calculate and set baudrate
123
139
let uart_clk = ( clocks. apb1 . 0 + 8 * bps) / ( 16 * bps) ;
124
- uart. as_ref ( ) . write_divisor ( uart_clk as u16 ) ;
140
+ uart. write_divisor ( uart_clk as u16 ) ;
125
141
// 5. additional configurations
126
142
let char_len = match wordlength {
127
143
WordLength :: Five => CharLen :: FIVE ,
@@ -135,8 +151,8 @@ impl<UART: AsRef<RegisterBlock>, const I: usize, PADS: Pads<I>> Serial<UART, I,
135
151
Parity :: Odd => PARITY :: ODD ,
136
152
Parity :: Even => PARITY :: EVEN ,
137
153
} ;
138
- let lcr = uart. as_ref ( ) . lcr ( ) . read ( ) ;
139
- uart. as_ref ( ) . lcr ( ) . write (
154
+ let lcr = uart. lcr ( ) . read ( ) ;
155
+ uart. lcr ( ) . write (
140
156
lcr. set_char_len ( char_len)
141
157
. set_one_stop_bit ( one_stop_bit)
142
158
. set_parity ( parity) ,
@@ -154,22 +170,27 @@ impl<UART: AsRef<RegisterBlock>, const I: usize, PADS: Pads<I>> Serial<UART, I,
154
170
}
155
171
/// Close uart and release peripheral.
156
172
#[ inline]
157
- pub fn free ( self , ccu : & ccu:: RegisterBlock ) -> ( UART , PADS ) {
173
+ pub fn free < const I : usize > ( self , ccu : & ccu:: RegisterBlock ) -> PADS
174
+ where
175
+ PADS : Pads < I > ,
176
+ {
158
177
// clock is closed for self.clock_gate is dropped
159
178
unsafe { PADS :: Clock :: free ( ccu) } ;
160
- ( self . uart , self . pads )
179
+ self . pads
161
180
}
162
181
}
163
182
164
- impl < UART : AsRef < RegisterBlock > , const I : usize , TX : Transmit < I > , RX : Receive < I > >
165
- Serial < UART , I , ( TX , RX ) >
166
- {
183
+ impl < ' a , TX , RX > Serial < ' a , ( TX , RX ) > {
167
184
/// Split serial instance into transmit and receive halves.
168
185
#[ inline]
169
- pub fn split ( self ) -> ( TransmitHalf < UART , I , TX > , ReceiveHalf < UART , I , RX > ) {
186
+ pub fn split < const I : usize > ( self ) -> ( TransmitHalf < ' a , TX > , ReceiveHalf < ' a , RX > )
187
+ where
188
+ TX : Transmit < I > ,
189
+ RX : Receive < I > ,
190
+ {
170
191
(
171
192
TransmitHalf {
172
- uart : unsafe { core :: ptr :: read_volatile ( & self . uart ) } ,
193
+ uart : self . uart ,
173
194
_pads : self . pads . 0 ,
174
195
} ,
175
196
ReceiveHalf {
@@ -181,16 +202,14 @@ impl<UART: AsRef<RegisterBlock>, const I: usize, TX: Transmit<I>, RX: Receive<I>
181
202
}
182
203
183
204
/// Transmit half from splitted serial structure.
184
- #[ derive( Debug ) ]
185
- pub struct TransmitHalf < UART , const I : usize , PADS : Transmit < I > > {
186
- uart : UART ,
205
+ pub struct TransmitHalf < ' a , PADS > {
206
+ uart : & ' a RegisterBlock ,
187
207
_pads : PADS ,
188
208
}
189
209
190
210
/// Receive half from splitted serial structure.
191
- #[ derive( Debug ) ]
192
- pub struct ReceiveHalf < UART , const I : usize , PADS : Receive < I > > {
193
- uart : UART ,
211
+ pub struct ReceiveHalf < ' a , PADS > {
212
+ uart : & ' a RegisterBlock ,
194
213
_pads : PADS ,
195
214
}
196
215
@@ -200,9 +219,11 @@ pub trait Pads<const I: usize> {
200
219
}
201
220
202
221
/// Valid transmit pin for UART peripheral.
222
+ #[ diagnostic:: on_unimplemented( message = "selected pad does not connect to UART{I} TX signal" ) ]
203
223
pub trait Transmit < const I : usize > { }
204
224
205
225
/// Valid receive pin for UART peripheral.
226
+ #[ diagnostic:: on_unimplemented( message = "selected pad does not connect to UART{I} RX signal" ) ]
206
227
pub trait Receive < const I : usize > { }
207
228
208
229
#[ inline]
@@ -251,67 +272,53 @@ where
251
272
type Clock = ccu:: UART < I > ;
252
273
}
253
274
254
- impl < UART : AsRef < RegisterBlock > , const I : usize , PADS : Pads < I > > embedded_io:: ErrorType
255
- for Serial < UART , I , PADS >
256
- {
275
+ impl < ' a , PADS > embedded_io:: ErrorType for Serial < ' a , PADS > {
257
276
type Error = core:: convert:: Infallible ;
258
277
}
259
278
260
- impl < UART : AsRef < RegisterBlock > , const I : usize , PADS : Transmit < I > > embedded_io:: ErrorType
261
- for TransmitHalf < UART , I , PADS >
262
- {
279
+ impl < ' a , PADS > embedded_io:: ErrorType for TransmitHalf < ' a , PADS > {
263
280
type Error = core:: convert:: Infallible ;
264
281
}
265
282
266
- impl < UART : AsRef < RegisterBlock > , const I : usize , PADS : Receive < I > > embedded_io:: ErrorType
267
- for ReceiveHalf < UART , I , PADS >
268
- {
283
+ impl < ' a , PADS > embedded_io:: ErrorType for ReceiveHalf < ' a , PADS > {
269
284
type Error = core:: convert:: Infallible ;
270
285
}
271
286
272
- impl < UART : AsRef < RegisterBlock > , const I : usize , PADS : Pads < I > > embedded_io:: Write
273
- for Serial < UART , I , PADS >
274
- {
287
+ impl < ' a , PADS > embedded_io:: Write for Serial < ' a , PADS > {
275
288
#[ inline]
276
289
fn write ( & mut self , buffer : & [ u8 ] ) -> Result < usize , Self :: Error > {
277
- uart_write_blocking ( self . uart . as_ref ( ) , buffer)
290
+ uart_write_blocking ( self . uart , buffer)
278
291
}
279
292
280
293
#[ inline]
281
294
fn flush ( & mut self ) -> Result < ( ) , Self :: Error > {
282
- uart_flush_blocking ( self . uart . as_ref ( ) )
295
+ uart_flush_blocking ( self . uart )
283
296
}
284
297
}
285
298
286
- impl < UART : AsRef < RegisterBlock > , const I : usize , PADS : Transmit < I > > embedded_io:: Write
287
- for TransmitHalf < UART , I , PADS >
288
- {
299
+ impl < ' a , PADS > embedded_io:: Write for TransmitHalf < ' a , PADS > {
289
300
#[ inline]
290
301
fn write ( & mut self , buffer : & [ u8 ] ) -> Result < usize , Self :: Error > {
291
- uart_write_blocking ( self . uart . as_ref ( ) , buffer)
302
+ uart_write_blocking ( self . uart , buffer)
292
303
}
293
304
294
305
#[ inline]
295
306
fn flush ( & mut self ) -> Result < ( ) , Self :: Error > {
296
- uart_flush_blocking ( self . uart . as_ref ( ) )
307
+ uart_flush_blocking ( self . uart )
297
308
}
298
309
}
299
310
300
- impl < UART : AsRef < RegisterBlock > , const I : usize , PADS : Pads < I > > embedded_io:: Read
301
- for Serial < UART , I , PADS >
302
- {
311
+ impl < ' a , PADS > embedded_io:: Read for Serial < ' a , PADS > {
303
312
#[ inline]
304
313
fn read ( & mut self , buffer : & mut [ u8 ] ) -> Result < usize , Self :: Error > {
305
- uart_read_blocking ( self . uart . as_ref ( ) , buffer)
314
+ uart_read_blocking ( self . uart , buffer)
306
315
}
307
316
}
308
317
309
- impl < UART : AsRef < RegisterBlock > , const I : usize , PADS : Receive < I > > embedded_io:: Read
310
- for ReceiveHalf < UART , I , PADS >
311
- {
318
+ impl < ' a , PADS > embedded_io:: Read for ReceiveHalf < ' a , PADS > {
312
319
#[ inline]
313
320
fn read ( & mut self , buffer : & mut [ u8 ] ) -> Result < usize , Self :: Error > {
314
- uart_read_blocking ( self . uart . as_ref ( ) , buffer)
321
+ uart_read_blocking ( self . uart , buffer)
315
322
}
316
323
}
317
324
0 commit comments