2
2
//! This is a simple example of how to use the `riscv-peripheral` crate to generate
3
3
//! peripheral definitions for a target.
4
4
5
- use riscv_pac:: { ExternalInterruptNumber , HartIdNumber , InterruptNumber , PriorityNumber } ;
5
+ use riscv_pac:: { pac_enum , ExternalInterruptNumber } ;
6
6
7
7
#[ repr( u16 ) ]
8
+ #[ pac_enum( unsafe HartIdNumber ) ]
8
9
#[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
9
10
pub enum HartId {
10
11
H0 = 0 ,
11
12
}
12
13
13
- unsafe impl HartIdNumber for HartId {
14
- const MAX_HART_ID_NUMBER : u16 = Self :: H0 as u16 ;
15
-
16
- #[ inline]
17
- fn number ( self ) -> u16 {
18
- self as _
19
- }
20
-
21
- #[ inline]
22
- fn from_number ( number : u16 ) -> Result < Self , u16 > {
23
- if number > Self :: MAX_HART_ID_NUMBER {
24
- Err ( number)
25
- } else {
26
- // SAFETY: valid context number
27
- Ok ( unsafe { core:: mem:: transmute ( number) } )
28
- }
29
- }
30
- }
31
-
32
- #[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
33
14
#[ repr( u16 ) ]
15
+ #[ pac_enum( unsafe InterruptNumber ) ]
16
+ #[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
34
17
pub enum Interrupt {
35
18
WATCHDOG = 1 ,
36
19
RTC = 2 ,
@@ -86,29 +69,11 @@ pub enum Interrupt {
86
69
I2C0 = 52 ,
87
70
}
88
71
89
- unsafe impl InterruptNumber for Interrupt {
90
- const MAX_INTERRUPT_NUMBER : u16 = Self :: I2C0 as u16 ;
91
-
92
- #[ inline]
93
- fn number ( self ) -> u16 {
94
- self as _
95
- }
96
-
97
- #[ inline]
98
- fn from_number ( number : u16 ) -> Result < Self , u16 > {
99
- if number == 0 || number > Self :: MAX_INTERRUPT_NUMBER {
100
- Err ( number)
101
- } else {
102
- // SAFETY: valid interrupt number
103
- Ok ( unsafe { core:: mem:: transmute ( number) } )
104
- }
105
- }
106
- }
107
-
108
72
unsafe impl ExternalInterruptNumber for Interrupt { }
109
73
110
- #[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
111
74
#[ repr( u8 ) ]
75
+ #[ pac_enum( unsafe PriorityNumber ) ]
76
+ #[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
112
77
pub enum Priority {
113
78
P0 = 0 ,
114
79
P1 = 1 ,
@@ -120,25 +85,6 @@ pub enum Priority {
120
85
P7 = 7 ,
121
86
}
122
87
123
- unsafe impl PriorityNumber for Priority {
124
- const MAX_PRIORITY_NUMBER : u8 = Self :: P7 as u8 ;
125
-
126
- #[ inline]
127
- fn number ( self ) -> u8 {
128
- self as _
129
- }
130
-
131
- #[ inline]
132
- fn from_number ( number : u8 ) -> Result < Self , u8 > {
133
- if number > Self :: MAX_PRIORITY_NUMBER {
134
- Err ( number)
135
- } else {
136
- // SAFETY: valid priority number
137
- Ok ( unsafe { core:: mem:: transmute ( number) } )
138
- }
139
- }
140
- }
141
-
142
88
#[ cfg( feature = "aclint-hal-async" ) ]
143
89
riscv_peripheral:: clint_codegen!(
144
90
base 0x0200_0000 ,
0 commit comments