1
1
//! Clock configuration
2
2
use crate :: core:: clint:: MTIME ;
3
3
use crate :: time:: Hertz ;
4
- use e310x:: { AONCLK , PRCI } ;
4
+ use e310x:: { Aonclk as AONCLK , Prci as PRCI } ;
5
5
use riscv:: interrupt;
6
6
use riscv:: register:: mcycle;
7
7
@@ -72,10 +72,10 @@ impl CoreClk {
72
72
// Assume `psdclkbypass_n` is not used
73
73
74
74
// Temporarily switch to the internal oscillator
75
- let prci = unsafe { & * PRCI :: ptr ( ) } ;
75
+ let prci = unsafe { PRCI :: steal ( ) } ;
76
76
let hfrosc_freq = self . configure_hfrosc ( ) ;
77
77
// Switch to HFROSC, bypass PLL
78
- prci. pllcfg
78
+ prci. pllcfg ( )
79
79
. modify ( |_, w| w. sel ( ) . bit ( false ) . bypass ( ) . bit ( true ) ) ;
80
80
81
81
if let Some ( freq) = self . hfxosc {
@@ -87,27 +87,27 @@ impl CoreClk {
87
87
88
88
/// Configures clock generation system with external oscillator
89
89
fn configure_with_external ( self , source_freq : Hertz ) -> Hertz {
90
- let prci = unsafe { & * PRCI :: ptr ( ) } ;
90
+ let prci = unsafe { PRCI :: steal ( ) } ;
91
91
92
92
// Enable HFXOSC
93
- prci. hfxosccfg . write ( |w| w. enable ( ) . bit ( true ) ) ;
93
+ prci. hfxosccfg ( ) . write ( |w| w. enable ( ) . bit ( true ) ) ;
94
94
95
95
// Wait for HFXOSC to stabilize
96
- while !prci. hfxosccfg . read ( ) . ready ( ) . bit_is_set ( ) { }
96
+ while !prci. hfxosccfg ( ) . read ( ) . ready ( ) . bit_is_set ( ) { }
97
97
98
98
// Select HFXOSC as pllref
99
- prci. pllcfg . modify ( |_, w| w. refsel ( ) . bit ( true ) ) ;
99
+ prci. pllcfg ( ) . modify ( |_, w| w. refsel ( ) . bit ( true ) ) ;
100
100
101
101
let freq;
102
102
if source_freq. 0 == self . coreclk . 0 {
103
103
// Use external oscillator with bypassed PLL
104
104
freq = source_freq;
105
105
106
106
// Bypass PLL
107
- prci. pllcfg . modify ( |_, w| w. bypass ( ) . bit ( true ) ) ;
107
+ prci. pllcfg ( ) . modify ( |_, w| w. bypass ( ) . bit ( true ) ) ;
108
108
109
109
// Bypass divider
110
- prci. plloutdiv . write ( |w| w. divby1 ( ) . bit ( true ) ) ;
110
+ prci. plloutdiv ( ) . write ( |w| w. divby1 ( ) . bit ( true ) ) ;
111
111
} else {
112
112
// Use external oscillator with PLL
113
113
@@ -116,57 +116,57 @@ impl CoreClk {
116
116
}
117
117
118
118
// Switch to PLL
119
- prci. pllcfg . modify ( |_, w| w. sel ( ) . bit ( true ) ) ;
119
+ prci. pllcfg ( ) . modify ( |_, w| w. sel ( ) . bit ( true ) ) ;
120
120
121
121
// Disable HFROSC to save power
122
- prci. hfrosccfg . write ( |w| w. enable ( ) . bit ( false ) ) ;
122
+ prci. hfrosccfg ( ) . write ( |w| w. enable ( ) . bit ( false ) ) ;
123
123
124
124
freq
125
125
}
126
126
127
127
/// Configures clock generation system with internal oscillator
128
128
fn configure_with_internal ( self , hfrosc_freq : Hertz ) -> Hertz {
129
- let prci = unsafe { & * PRCI :: ptr ( ) } ;
129
+ let prci = unsafe { PRCI :: steal ( ) } ;
130
130
131
131
let freq;
132
132
if hfrosc_freq. 0 == self . coreclk . 0 {
133
133
// Use internal oscillator with bypassed PLL
134
134
freq = hfrosc_freq;
135
135
136
136
// Switch to HFROSC, bypass PLL to save power
137
- prci. pllcfg
137
+ prci. pllcfg ( )
138
138
. modify ( |_, w| w. sel ( ) . bit ( false ) . bypass ( ) . bit ( true ) ) ;
139
139
140
140
//
141
- prci. pllcfg . modify ( |_, w| w. bypass ( ) . bit ( true ) ) ;
141
+ prci. pllcfg ( ) . modify ( |_, w| w. bypass ( ) . bit ( true ) ) ;
142
142
} else {
143
143
// Use internal oscillator with PLL
144
144
145
145
// Configure PLL and divider
146
146
freq = self . configure_pll ( hfrosc_freq, self . coreclk ) ;
147
147
148
148
// Switch to PLL
149
- prci. pllcfg . modify ( |_, w| w. sel ( ) . bit ( true ) ) ;
149
+ prci. pllcfg ( ) . modify ( |_, w| w. sel ( ) . bit ( true ) ) ;
150
150
}
151
151
152
152
// Disable HFXOSC to save power
153
- prci. hfxosccfg . write ( |w| w. enable ( ) . bit ( false ) ) ;
153
+ prci. hfxosccfg ( ) . write ( |w| w. enable ( ) . bit ( false ) ) ;
154
154
155
155
freq
156
156
}
157
157
158
158
/// Configures internal high-frequency oscillator (`HFROSC`)
159
159
fn configure_hfrosc ( & self ) -> Hertz {
160
- let prci = unsafe { & * PRCI :: ptr ( ) } ;
160
+ let prci = unsafe { PRCI :: steal ( ) } ;
161
161
162
162
// TODO: use trim value from OTP
163
163
164
164
// Configure HFROSC to 13.8 MHz
165
- prci. hfrosccfg
165
+ prci. hfrosccfg ( )
166
166
. write ( |w| unsafe { w. div ( ) . bits ( 4 ) . trim ( ) . bits ( 16 ) . enable ( ) . bit ( true ) } ) ;
167
167
168
168
// Wait for HFROSC to stabilize
169
- while !prci. hfrosccfg . read ( ) . ready ( ) . bit_is_set ( ) { }
169
+ while !prci. hfrosccfg ( ) . read ( ) . ready ( ) . bit_is_set ( ) { }
170
170
171
171
Hertz ( 13_800_000 )
172
172
}
@@ -270,8 +270,8 @@ impl CoreClk {
270
270
} ;
271
271
272
272
// Configure PLL
273
- let prci = unsafe { & * PRCI :: ptr ( ) } ;
274
- prci. pllcfg . modify ( |_, w| unsafe {
273
+ let prci = unsafe { PRCI :: steal ( ) } ;
274
+ prci. pllcfg ( ) . modify ( |_, w| unsafe {
275
275
w. pllr ( )
276
276
. bits ( r)
277
277
. pllf ( )
@@ -283,7 +283,7 @@ impl CoreClk {
283
283
} ) ;
284
284
285
285
// Configure PLL Output Divider
286
- prci. plloutdiv
286
+ prci. plloutdiv ( )
287
287
. write ( |w| unsafe { w. div ( ) . bits ( divider_div as u8 ) . divby1 ( ) . bit ( divider_bypass) } ) ;
288
288
289
289
// Wait for PLL Lock
@@ -295,7 +295,7 @@ impl CoreClk {
295
295
let time = mtime. mtime ( ) + 4 ;
296
296
while mtime. mtime ( ) < time { }
297
297
// Now it is safe to check for PLL Lock
298
- while !prci. pllcfg . read ( ) . lock ( ) . bit_is_set ( ) { }
298
+ while !prci. pllcfg ( ) . read ( ) . lock ( ) . bit_is_set ( ) { }
299
299
300
300
Hertz ( divout_freq)
301
301
}
@@ -318,13 +318,13 @@ impl AonClk {
318
318
319
319
/// Freezes low-frequency clock configuration, making it effective
320
320
pub ( crate ) fn freeze ( self ) -> Hertz {
321
- let aonclk = unsafe { & * AONCLK :: ptr ( ) } ;
321
+ let aonclk = unsafe { AONCLK :: steal ( ) } ;
322
322
323
323
if let Some ( freq) = self . lfaltclk {
324
324
// Use external oscillator.
325
325
326
326
// Disable unused LFROSC to save power.
327
- aonclk. lfrosccfg . write ( |w| w. enable ( ) . bit ( false ) ) ;
327
+ aonclk. lfrosccfg ( ) . write ( |w| w. enable ( ) . bit ( false ) ) ;
328
328
329
329
freq
330
330
} else {
@@ -334,14 +334,14 @@ impl AonClk {
334
334
let div = 4 ; // LFROSC/5
335
335
336
336
// Configure LFROSC
337
- aonclk. lfrosccfg . write ( |w| unsafe {
337
+ aonclk. lfrosccfg ( ) . write ( |w| unsafe {
338
338
w. trim ( ) . bits ( trim) ;
339
339
w. div ( ) . bits ( div) ;
340
340
w. enable ( ) . bit ( true )
341
341
} ) ;
342
342
343
343
// Wait for LFROSC to stabilize
344
- while !aonclk. lfrosccfg . read ( ) . ready ( ) . bit_is_set ( ) { }
344
+ while !aonclk. lfrosccfg ( ) . read ( ) . ready ( ) . bit_is_set ( ) { }
345
345
346
346
Hertz ( 32_768 ) // It's not so accurate: ≈30 kHz according to the datasheet
347
347
}
0 commit comments