e310x/
gpio.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! GPIO instantiation.
6
7use 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}