@@ -10,6 +10,18 @@ pub fn render() -> Result<Vec<Tokens>> {
10
10
generic_items. push ( quote ! {
11
11
use core:: marker;
12
12
13
+ ///Marker trait for readable register/field
14
+ pub trait Readable { }
15
+
16
+ ///Marker trait for writable register/field
17
+ pub trait Writable { }
18
+
19
+ ///Reset value of the register
20
+ pub trait ResetValue <U > {
21
+ ///Reset value of the register
22
+ fn reset_value( ) -> U ;
23
+ }
24
+
13
25
///Converting enumerated values to bits
14
26
pub trait ToBits <N > {
15
27
///Conversion method
@@ -18,23 +30,97 @@ pub fn render() -> Result<Vec<Tokens>> {
18
30
} ) ;
19
31
20
32
generic_items. push ( quote ! {
21
- ///Value read from the register
22
- pub struct FR <U , T > {
23
- pub ( crate ) bits : U ,
24
- _reg : marker:: PhantomData <T >,
33
+ ///Wrapper for registers
34
+ pub struct Reg <U , REG > {
35
+ register : vcell :: VolatileCell < U > ,
36
+ _marker : marker:: PhantomData <REG >,
25
37
}
26
38
27
- impl <U , T , FI > PartialEq < FI > for FR < U , T >
39
+ impl <U , REG > Reg < U , REG >
28
40
where
29
- U : PartialEq ,
30
- FI : ToBits < U >
41
+ Self : Readable ,
42
+ U : Copy
31
43
{
32
- fn eq( & self , other: & FI ) -> bool {
33
- self . bits. eq( & other. _bits( ) )
44
+ ///Reads the contents of the register
45
+ #[ inline( always) ]
46
+ pub fn read( & self ) -> R <U , Self > {
47
+ R { bits: self . register. get( ) , _reg: marker:: PhantomData }
48
+ }
49
+ }
50
+
51
+ impl <U , REG > Reg <U , REG >
52
+ where
53
+ Self : ResetValue <U > + Writable ,
54
+ U : Copy ,
55
+ {
56
+ ///Writes the reset value to the register
57
+ #[ inline( always) ]
58
+ pub fn reset( & self ) {
59
+ self . register. set( Self :: reset_value( ) )
34
60
}
35
61
}
62
+ } ) ;
36
63
37
- impl <U , T > FR <U , T >
64
+ generic_items. push ( quote ! {
65
+ impl <U , REG > Reg <U , REG >
66
+ where
67
+ Self : ResetValue <U > + Writable ,
68
+ U : Copy
69
+ {
70
+ ///Writes to the register
71
+ #[ inline( always) ]
72
+ pub fn write<F >( & self , f: F )
73
+ where
74
+ F : FnOnce ( & mut W <U , Self >) -> & mut W <U , Self >
75
+ {
76
+ self . register. set( f( & mut W { bits: Self :: reset_value( ) , _reg: marker:: PhantomData } ) . bits) ;
77
+ }
78
+ }
79
+ } ) ;
80
+
81
+ generic_items. push ( quote ! {
82
+ impl <U , REG > Reg <U , REG >
83
+ where
84
+ Self : Writable ,
85
+ U : Copy + Default
86
+ {
87
+ ///Writes Zero to the register
88
+ #[ inline( always) ]
89
+ pub fn write_with_zero<F >( & self , f: F )
90
+ where
91
+ F : FnOnce ( & mut W <U , Self >) -> & mut W <U , Self >
92
+ {
93
+ self . register. set( f( & mut W { bits: U :: default ( ) , _reg: marker:: PhantomData } ) . bits) ;
94
+ }
95
+ }
96
+ } ) ;
97
+
98
+ generic_items. push ( quote ! {
99
+ impl <U , REG > Reg <U , REG >
100
+ where
101
+ Self : Readable + Writable ,
102
+ U : Copy ,
103
+ {
104
+ ///Modifies the contents of the register
105
+ #[ inline( always) ]
106
+ pub fn modify<F >( & self , f: F )
107
+ where
108
+ for <' w> F : FnOnce ( & R <U , Self >, & ' w mut W <U , Self >) -> & ' w mut W <U , Self >
109
+ {
110
+ let bits = self . register. get( ) ;
111
+ self . register. set( f( & R { bits, _reg: marker:: PhantomData } , & mut W { bits, _reg: marker:: PhantomData } ) . bits) ;
112
+ }
113
+ }
114
+ } ) ;
115
+
116
+ generic_items. push ( quote ! {
117
+ ///Register/field reader
118
+ pub struct R <U , T > {
119
+ pub ( crate ) bits: U ,
120
+ _reg: marker:: PhantomData <T >,
121
+ }
122
+
123
+ impl <U , T > R <U , T >
38
124
where
39
125
U : Copy
40
126
{
@@ -46,7 +132,7 @@ pub fn render() -> Result<Vec<Tokens>> {
46
132
_reg: marker:: PhantomData ,
47
133
}
48
134
}
49
- ///Read raw bits from field
135
+ ///Read raw bits from register/ field
50
136
#[ inline( always) ]
51
137
pub fn bits( & self ) -> U {
52
138
self . bits
@@ -55,7 +141,19 @@ pub fn render() -> Result<Vec<Tokens>> {
55
141
} ) ;
56
142
57
143
generic_items. push ( quote ! {
58
- impl <FI > FR <bool , FI > {
144
+ impl <U , T , FI > PartialEq <FI > for R <U , T >
145
+ where
146
+ U : PartialEq ,
147
+ FI : ToBits <U >
148
+ {
149
+ fn eq( & self , other: & FI ) -> bool {
150
+ self . bits. eq( & other. _bits( ) )
151
+ }
152
+ }
153
+ } ) ;
154
+
155
+ generic_items. push ( quote ! {
156
+ impl <FI > R <bool , FI > {
59
157
///Value of the field as raw bits
60
158
#[ inline( always) ]
61
159
pub fn bit( & self ) -> bool {
@@ -74,6 +172,27 @@ pub fn render() -> Result<Vec<Tokens>> {
74
172
}
75
173
} ) ;
76
174
175
+ generic_items. push ( quote ! {
176
+ ///Register writer
177
+ pub struct W <U , REG > {
178
+ ///Writable bits
179
+ pub bits: U ,
180
+ _reg: marker:: PhantomData <REG >,
181
+ }
182
+ } ) ;
183
+
184
+ generic_items. push ( quote ! {
185
+ impl <U , REG > W <U , REG > {
186
+ ///Writes raw bits to the register
187
+ #[ inline( always) ]
188
+ pub fn bits( & mut self , bits: U ) -> & mut Self {
189
+ self . bits = bits;
190
+ self
191
+ }
192
+ }
193
+ } ) ;
194
+
195
+
77
196
generic_items. push ( quote ! {
78
197
///Used if enumerated values cover not the whole range
79
198
#[ derive( Clone , Copy , PartialEq ) ]
@@ -88,7 +207,7 @@ pub fn render() -> Result<Vec<Tokens>> {
88
207
code. push ( quote ! {
89
208
#[ allow( unused_imports) ]
90
209
use generic:: * ;
91
- /// Common register and bit access and modify traits
210
+ ///Common register and bit access and modify traits
92
211
pub mod generic {
93
212
#( #generic_items) *
94
213
}
0 commit comments