|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+use mkl25z4::{GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, SIM, SPI0, SPI1};
|
|
|
2
|
+use mkl25z4_hal::gpio::{self, gpioa, gpiob, gpioc, gpiod, gpioe, GpioExt};
|
|
|
3
|
+use mkl25z4_hal::spi::{self, Phase, Polarity, Spi};
|
|
|
4
|
+
|
|
|
5
|
+pub struct Pins {
|
|
|
6
|
+ /// 5V supply for the LED (active high).
|
|
|
7
|
+ pub enable_5v: gpioa::PA1<gpio::Output<gpio::PushPull>>,
|
|
|
8
|
+ /// Red display frontlight LEDs (active high).
|
|
|
9
|
+ pub red: gpioe::PE29<gpio::Output<gpio::PushPull>>,
|
|
|
10
|
+ /// Green display frontlight LEDs (active high).
|
|
|
11
|
+ pub green: gpioe::PE30<gpio::Output<gpio::PushPull>>,
|
|
|
12
|
+ /// Blue display frontlight LEDs (active high).
|
|
|
13
|
+ pub blue: gpioe::PE31<gpio::Output<gpio::PushPull>>,
|
|
|
14
|
+
|
|
|
15
|
+ /// Top switch (active low).
|
|
|
16
|
+ pub top_switch: gpioc::PC1<gpio::Input<gpio::PullUp>>,
|
|
|
17
|
+ /// Left switches (top to bottom, active low).
|
|
|
18
|
+ pub left_switches: (
|
|
|
19
|
+ gpiod::PD1<gpio::Input<gpio::PullUp>>,
|
|
|
20
|
+ gpiod::PD2<gpio::Input<gpio::PullUp>>,
|
|
|
21
|
+ gpiod::PD3<gpio::Input<gpio::PullUp>>,
|
|
|
22
|
+ gpiod::PD4<gpio::Input<gpio::PullUp>>,
|
|
|
23
|
+ ),
|
|
|
24
|
+ /// Right switches (top to bottom, active low).
|
|
|
25
|
+ pub right_switches: (
|
|
|
26
|
+ gpioa::PA13<gpio::Input<gpio::PullUp>>,
|
|
|
27
|
+ gpioa::PA12<gpio::Input<gpio::PullUp>>,
|
|
|
28
|
+ gpioa::PA5<gpio::Input<gpio::PullUp>>,
|
|
|
29
|
+ gpioa::PA4<gpio::Input<gpio::PullUp>>,
|
|
|
30
|
+ ),
|
|
|
31
|
+
|
|
|
32
|
+ /// Ambient light sensor enable (active high).
|
|
|
33
|
+ pub als_en: gpioe::PE20<gpio::Output<gpio::PushPull>>,
|
|
|
34
|
+ // TODO: ADC for the ambient light sensor.
|
|
|
35
|
+ /// Ambient light sensor.
|
|
|
36
|
+ pub als: gpioe::PE21<gpio::Input<gpio::Floating>>,
|
|
|
37
|
+
|
|
|
38
|
+ // TODO: PWM for the buzzer.
|
|
|
39
|
+ /// Buzzer (active high).
|
|
|
40
|
+ pub buzzer: gpioc::PC3<gpio::Output<gpio::PushPull>>,
|
|
|
41
|
+
|
|
|
42
|
+ /// NRF IRQ line (active low).
|
|
|
43
|
+ pub nrf_irq: gpiob::PB0<gpio::Input<gpio::PullUp>>,
|
|
|
44
|
+ /// NRF chip select (active low).
|
|
|
45
|
+ pub nrf_cs: gpiob::PB1<gpio::Output<gpio::PushPull>>,
|
|
|
46
|
+ /// NRF chip enable.
|
|
|
47
|
+ pub nrf_ce: gpiob::PB2<gpio::Output<gpio::PushPull>>,
|
|
|
48
|
+ /// NRF supply voltage enable (active low).
|
|
|
49
|
+ pub nrf_pwr: gpiob::PB3<gpio::Output<gpio::PushPull>>,
|
|
|
50
|
+ /// SPI for the NRF module.
|
|
|
51
|
+ pub nrf_spi: Spi<
|
|
|
52
|
+ SPI1,
|
|
|
53
|
+ gpiob::PB16<gpio::Alternate2>,
|
|
|
54
|
+ gpiob::PB17<gpio::Alternate2>,
|
|
|
55
|
+ gpiod::PD5<gpio::Alternate2>,
|
|
|
56
|
+ >,
|
|
|
57
|
+
|
|
|
58
|
+ /// BME280 chip select (active low).
|
|
|
59
|
+ pub bme_cs: gpioc::PC2<gpio::Output<gpio::PushPull>>,
|
|
|
60
|
+
|
|
|
61
|
+ /// Display busy (active low).
|
|
|
62
|
+ pub display_busy: gpioc::PC4<gpio::Input<gpio::PullUp>>,
|
|
|
63
|
+ /// Display chip select (active low).
|
|
|
64
|
+ pub display_cs: gpioc::PC8<gpio::Output<gpio::PushPull>>,
|
|
|
65
|
+ /// Display data/command.
|
|
|
66
|
+ pub display_dc: gpioc::PC9<gpio::Output<gpio::PushPull>>,
|
|
|
67
|
+ /// Display reset (active low).
|
|
|
68
|
+ pub display_rst: gpioc::PC10<gpio::Output<gpio::PushPull>>,
|
|
|
69
|
+ /// Display supply voltage enable (active low).
|
|
|
70
|
+ pub display_pwr: gpioc::PC11<gpio::Output<gpio::PushPull>>,
|
|
|
71
|
+
|
|
|
72
|
+ /// SPI for both display and BME280.
|
|
|
73
|
+ pub display_bme_spi: Spi<
|
|
|
74
|
+ SPI0,
|
|
|
75
|
+ gpioc::PC7<gpio::Alternate5>,
|
|
|
76
|
+ gpioc::PC6<gpio::Alternate5>,
|
|
|
77
|
+ gpioc::PC5<gpio::Alternate2>,
|
|
|
78
|
+ >,
|
|
|
79
|
+}
|
|
|
80
|
+
|
|
|
81
|
+impl Pins {
|
|
|
82
|
+ pub fn configure(
|
|
|
83
|
+ sim: &mut SIM,
|
|
|
84
|
+ gpioa: GPIOA,
|
|
|
85
|
+ gpiob: GPIOB,
|
|
|
86
|
+ gpioc: GPIOC,
|
|
|
87
|
+ gpiod: GPIOD,
|
|
|
88
|
+ gpioe: GPIOE,
|
|
|
89
|
+ spi0: SPI0,
|
|
|
90
|
+ spi1: SPI1,
|
|
|
91
|
+ ) -> Pins {
|
|
|
92
|
+ let mut gpioa = gpioa.split(sim);
|
|
|
93
|
+ let mut gpiob = gpiob.split(sim);
|
|
|
94
|
+ let mut gpioc = gpioc.split(sim);
|
|
|
95
|
+ let mut gpiod = gpiod.split(sim);
|
|
|
96
|
+ let mut gpioe = gpioe.split(sim);
|
|
|
97
|
+
|
|
|
98
|
+ // SPI0 for the display/BME module.
|
|
|
99
|
+ let mosi = gpioc.pc7.into_alternate(&mut gpioc.pddr);
|
|
|
100
|
+ let miso = gpioc.pc6.into_alternate(&mut gpioc.pddr);
|
|
|
101
|
+ let sck = gpioc.pc5.into_alternate(&mut gpioc.pddr);
|
|
|
102
|
+ let mode = spi::Mode {
|
|
|
103
|
+ polarity: Polarity::IdleLow,
|
|
|
104
|
+ phase: Phase::CaptureOnFirstTransition,
|
|
|
105
|
+ };
|
|
|
106
|
+ let spi0 = Spi::spi0(spi0, mosi, miso, sck, mode, sim);
|
|
|
107
|
+
|
|
|
108
|
+ // SPI1 for the NRF module.
|
|
|
109
|
+ let mosi = gpiob.pb16.into_alternate(&mut gpiob.pddr);
|
|
|
110
|
+ let miso = gpiob.pb17.into_alternate(&mut gpiob.pddr);
|
|
|
111
|
+ let sck = gpiod.pd5.into_alternate(&mut gpiod.pddr);
|
|
|
112
|
+ let mode = spi::Mode {
|
|
|
113
|
+ polarity: Polarity::IdleLow,
|
|
|
114
|
+ phase: Phase::CaptureOnFirstTransition,
|
|
|
115
|
+ };
|
|
|
116
|
+ let spi1 = Spi::spi1(spi1, mosi, miso, sck, mode, sim);
|
|
|
117
|
+
|
|
|
118
|
+ Pins {
|
|
|
119
|
+ enable_5v: gpioa.pa1.into_push_pull_output(&mut gpioa.pddr),
|
|
|
120
|
+ red: gpioe.pe29.into_push_pull_output(&mut gpioe.pddr),
|
|
|
121
|
+ green: gpioe.pe30.into_push_pull_output(&mut gpioe.pddr),
|
|
|
122
|
+ blue: gpioe.pe31.into_push_pull_output(&mut gpioe.pddr),
|
|
|
123
|
+ top_switch: gpioc.pc1.into_pull_up_input(&mut gpioc.pddr),
|
|
|
124
|
+ left_switches: (
|
|
|
125
|
+ gpiod.pd1.into_pull_up_input(&mut gpiod.pddr),
|
|
|
126
|
+ gpiod.pd2.into_pull_up_input(&mut gpiod.pddr),
|
|
|
127
|
+ gpiod.pd3.into_pull_up_input(&mut gpiod.pddr),
|
|
|
128
|
+ gpiod.pd4.into_pull_up_input(&mut gpiod.pddr),
|
|
|
129
|
+ ),
|
|
|
130
|
+ right_switches: (
|
|
|
131
|
+ gpioa.pa13.into_pull_up_input(&mut gpioa.pddr),
|
|
|
132
|
+ gpioa.pa12.into_pull_up_input(&mut gpioa.pddr),
|
|
|
133
|
+ gpioa.pa5.into_pull_up_input(&mut gpioa.pddr),
|
|
|
134
|
+ gpioa.pa4.into_pull_up_input(&mut gpioa.pddr),
|
|
|
135
|
+ ),
|
|
|
136
|
+ als_en: gpioe.pe20.into_push_pull_output(&mut gpioe.pddr),
|
|
|
137
|
+ als: gpioe.pe21.into_floating_input(&mut gpioe.pddr),
|
|
|
138
|
+ buzzer: gpioc.pc3.into_push_pull_output(&mut gpioc.pddr),
|
|
|
139
|
+ nrf_irq: gpiob.pb0.into_pull_up_input(&mut gpiob.pddr),
|
|
|
140
|
+ nrf_cs: gpiob.pb1.into_push_pull_output(&mut gpiob.pddr),
|
|
|
141
|
+ nrf_ce: gpiob.pb2.into_push_pull_output(&mut gpiob.pddr),
|
|
|
142
|
+ nrf_pwr: gpiob.pb3.into_push_pull_output(&mut gpiob.pddr),
|
|
|
143
|
+ nrf_spi: spi1,
|
|
|
144
|
+ bme_cs: gpioc.pc2.into_push_pull_output(&mut gpioc.pddr),
|
|
|
145
|
+ display_busy: gpioc.pc4.into_pull_up_input(&mut gpioc.pddr),
|
|
|
146
|
+ display_cs: gpioc.pc8.into_push_pull_output(&mut gpioc.pddr),
|
|
|
147
|
+ display_dc: gpioc.pc9.into_push_pull_output(&mut gpioc.pddr),
|
|
|
148
|
+ display_rst: gpioc.pc10.into_push_pull_output(&mut gpioc.pddr),
|
|
|
149
|
+ display_pwr: gpioc.pc11.into_push_pull_output(&mut gpioc.pddr),
|
|
|
150
|
+
|
|
|
151
|
+ display_bme_spi: spi0,
|
|
|
152
|
+ }
|
|
|
153
|
+ }
|
|
|
154
|
+}
|