1use core::ops::{Index, IndexMut};
8
9use kernel::utilities::StaticRef;
10use sifive::gpio::{pins, GpioPin, GpioRegisters};
11
12pub const GPIO0_BASE: StaticRef<GpioRegisters> =
13 unsafe { StaticRef::new(0x1001_2000 as *const GpioRegisters) };
14
15pub struct Port<'a> {
16 pins: [GpioPin<'a>; 32],
17}
18
19impl<'a> Index<usize> for Port<'a> {
20 type Output = GpioPin<'a>;
21
22 fn index(&self, index: usize) -> &GpioPin<'a> {
23 &self.pins[index]
24 }
25}
26
27impl<'a> IndexMut<usize> for Port<'a> {
28 fn index_mut(&mut self, index: usize) -> &mut GpioPin<'a> {
29 &mut self.pins[index]
30 }
31}
32
33impl Port<'_> {
34 pub const fn new() -> Self {
35 Self {
36 pins: [
37 GpioPin::new(GPIO0_BASE, pins::pin0, pins::pin0::SET, pins::pin0::CLEAR),
38 GpioPin::new(GPIO0_BASE, pins::pin1, pins::pin1::SET, pins::pin1::CLEAR),
39 GpioPin::new(GPIO0_BASE, pins::pin2, pins::pin2::SET, pins::pin2::CLEAR),
40 GpioPin::new(GPIO0_BASE, pins::pin3, pins::pin3::SET, pins::pin3::CLEAR),
41 GpioPin::new(GPIO0_BASE, pins::pin4, pins::pin4::SET, pins::pin4::CLEAR),
42 GpioPin::new(GPIO0_BASE, pins::pin5, pins::pin5::SET, pins::pin5::CLEAR),
43 GpioPin::new(GPIO0_BASE, pins::pin6, pins::pin6::SET, pins::pin6::CLEAR),
44 GpioPin::new(GPIO0_BASE, pins::pin7, pins::pin7::SET, pins::pin7::CLEAR),
45 GpioPin::new(GPIO0_BASE, pins::pin8, pins::pin8::SET, pins::pin8::CLEAR),
46 GpioPin::new(GPIO0_BASE, pins::pin9, pins::pin9::SET, pins::pin9::CLEAR),
47 GpioPin::new(
48 GPIO0_BASE,
49 pins::pin10,
50 pins::pin10::SET,
51 pins::pin10::CLEAR,
52 ),
53 GpioPin::new(
54 GPIO0_BASE,
55 pins::pin11,
56 pins::pin11::SET,
57 pins::pin11::CLEAR,
58 ),
59 GpioPin::new(
60 GPIO0_BASE,
61 pins::pin12,
62 pins::pin12::SET,
63 pins::pin12::CLEAR,
64 ),
65 GpioPin::new(
66 GPIO0_BASE,
67 pins::pin13,
68 pins::pin13::SET,
69 pins::pin13::CLEAR,
70 ),
71 GpioPin::new(
72 GPIO0_BASE,
73 pins::pin14,
74 pins::pin14::SET,
75 pins::pin14::CLEAR,
76 ),
77 GpioPin::new(
78 GPIO0_BASE,
79 pins::pin15,
80 pins::pin15::SET,
81 pins::pin15::CLEAR,
82 ),
83 GpioPin::new(
84 GPIO0_BASE,
85 pins::pin16,
86 pins::pin16::SET,
87 pins::pin16::CLEAR,
88 ),
89 GpioPin::new(
90 GPIO0_BASE,
91 pins::pin17,
92 pins::pin17::SET,
93 pins::pin17::CLEAR,
94 ),
95 GpioPin::new(
96 GPIO0_BASE,
97 pins::pin18,
98 pins::pin18::SET,
99 pins::pin18::CLEAR,
100 ),
101 GpioPin::new(
102 GPIO0_BASE,
103 pins::pin19,
104 pins::pin19::SET,
105 pins::pin19::CLEAR,
106 ),
107 GpioPin::new(
108 GPIO0_BASE,
109 pins::pin20,
110 pins::pin20::SET,
111 pins::pin20::CLEAR,
112 ),
113 GpioPin::new(
114 GPIO0_BASE,
115 pins::pin21,
116 pins::pin21::SET,
117 pins::pin21::CLEAR,
118 ),
119 GpioPin::new(
120 GPIO0_BASE,
121 pins::pin22,
122 pins::pin22::SET,
123 pins::pin22::CLEAR,
124 ),
125 GpioPin::new(
126 GPIO0_BASE,
127 pins::pin23,
128 pins::pin23::SET,
129 pins::pin23::CLEAR,
130 ),
131 GpioPin::new(
132 GPIO0_BASE,
133 pins::pin24,
134 pins::pin24::SET,
135 pins::pin24::CLEAR,
136 ),
137 GpioPin::new(
138 GPIO0_BASE,
139 pins::pin25,
140 pins::pin25::SET,
141 pins::pin25::CLEAR,
142 ),
143 GpioPin::new(
144 GPIO0_BASE,
145 pins::pin26,
146 pins::pin26::SET,
147 pins::pin26::CLEAR,
148 ),
149 GpioPin::new(
150 GPIO0_BASE,
151 pins::pin27,
152 pins::pin27::SET,
153 pins::pin27::CLEAR,
154 ),
155 GpioPin::new(
156 GPIO0_BASE,
157 pins::pin28,
158 pins::pin28::SET,
159 pins::pin28::CLEAR,
160 ),
161 GpioPin::new(
162 GPIO0_BASE,
163 pins::pin29,
164 pins::pin29::SET,
165 pins::pin29::CLEAR,
166 ),
167 GpioPin::new(
168 GPIO0_BASE,
169 pins::pin30,
170 pins::pin30::SET,
171 pins::pin30::CLEAR,
172 ),
173 GpioPin::new(
174 GPIO0_BASE,
175 pins::pin31,
176 pins::pin31::SET,
177 pins::pin31::CLEAR,
178 ),
179 ],
180 }
181 }
182}