1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
use crate::peripherals::*;
use embedded_hal::blocking::delay::DelayMs;
use eeprom24x::Eeprom24x;
use embedded_hal::digital::v1_compat::OldOutputPin;
use l3gd20::L3gd20;
use mt9v034_i2c::Mt9v034;
use core::sync::atomic::{AtomicPtr, Ordering};
use cortex_m::singleton;
use crate::dcmi::DcmiWrapper;
#[cfg(feature = "rttdebug")]
use panic_rtt_core::rprintln;
pub struct Board<'a> {
pub activity_led: LedOutputActivity,
pub comms_led: LedOutputComm,
pub error_led: LedOutputError,
pub delay_source: DelaySource,
pub external_i2c1: I2c1BusManager,
pub camera_config: Option<CameraConfigType<'a>>,
pub gyro: Option<GyroType>,
pub eeprom: Option<EepromType<'a>>,
pub dcmi_wrap: Option<DcmiWrapper>,
pub usart2: Usart2Port,
pub usart3: Usart3Port,
pub uart4: Uart4Port,
}
impl Board<'_> {
pub fn new() -> Self {
#[cfg(feature = "rttdebug")]
rprintln!("new board");
let (
raw_user_leds,
mut delay_source,
i2c1_port,
i2c2_port,
spi2_port,
spi_cs_gyro,
usart2,
usart3,
uart4,
dcmi_ctrl_pins,
dcmi_data_pins,
dma2,
dcmi,
) = setup_peripherals();
core::mem::forget(dcmi_ctrl_pins);
core::mem::forget(dcmi_data_pins);
let i2c1_bus_mgr = shared_bus::CortexMBusManager::new(i2c1_port);
let mut gyro_opt: Option<_> = None;
#[cfg(not(feature = "breakout"))]
{
let old_gyro_csn = OldOutputPin::new(spi_cs_gyro);
if let Ok(mut gyro) = L3gd20::new(spi2_port, old_gyro_csn) {
if let Ok(device_id) = gyro.who_am_i() {
if device_id == 0xD4 {
#[cfg(feature = "rttdebug")]
rprintln!("gyro setup done");
gyro_opt = Some(gyro)
}
}
}
}
let i2c2_bus_mgr: &'static mut I2c2BusManager =
singleton!(:I2c2BusManager =
shared_bus::CortexMBusManager::new(i2c2_port)
)
.unwrap();
let mut eeprom_opt = None;
#[cfg(not(feature = "breakout"))]
{
#[cfg(feature = "rttdebug")]
rprintln!("eeprom setup start");
let eeprom_i2c_address = eeprom24x::SlaveAddr::default();
const PARAM_ADDRESS: u32 = 0x1234;
let mut eeprom = Eeprom24x::new_24x128(
i2c2_bus_mgr.acquire(),
eeprom_i2c_address,
);
eeprom.write_byte(PARAM_ADDRESS, 0xAA).unwrap();
delay_source.delay_ms(5u8);
let read_data = eeprom.read_byte(PARAM_ADDRESS).unwrap();
#[cfg(feature = "rttdebug")]
rprintln!("eeprom data: 0x{:X}", read_data);
let eeprom_opt = Some(eeprom);
}
let mut dcmi_wrap = DcmiWrapper::new(dcmi, dma2);
dcmi_wrap.setup();
#[cfg(feature = "breakout")]
let base_i2c_address = mt9v034_i2c::ARDUCAM_BREAKOUT_ADDRESS;
#[cfg(not(feature = "breakout"))]
let base_i2c_address = mt9v034_i2c::PX4FLOW_CAM_ADDRESS;
let mut cam_config =
Mt9v034::new(i2c2_bus_mgr.acquire(), base_i2c_address);
cam_config
.setup(&mut delay_source)
.expect("could not configure MT9V034");
Self {
activity_led: raw_user_leds.0,
comms_led: raw_user_leds.1,
error_led: raw_user_leds.2,
external_i2c1: i2c1_bus_mgr,
camera_config: Some(cam_config),
gyro: gyro_opt,
delay_source,
eeprom: eeprom_opt,
dcmi_wrap: Some(dcmi_wrap),
usart2,
usart3,
uart4,
}
}
}
pub type BusManager<Port> = shared_bus::proxy::BusManager<
cortex_m::interrupt::Mutex<core::cell::RefCell<Port>>,
Port,
>;
pub type BusProxy<'a, Port> = shared_bus::proxy::BusProxy<
'a,
cortex_m::interrupt::Mutex<core::cell::RefCell<Port>>,
Port,
>;
pub type I2c1BusManager = BusManager<I2c1Port>;
pub type I2c1BusProxy<'a> = BusProxy<'a, I2c1Port>;
pub type I2c2BusManager = BusManager<I2c2Port>;
pub type I2c2BusProxy<'a> = BusProxy<'a, I2c2Port>;
pub type GyroType = l3gd20::L3gd20<Spi2Port, OldOutputPin<SpiGyroCsn>>;
pub type EepromType<'a> = eeprom24x::Eeprom24x<
I2c2BusProxy<'a>,
eeprom24x::page_size::B64,
eeprom24x::addr_size::TwoBytes,
>;
pub type CameraConfigType<'a> = Mt9v034<I2c2BusProxy<'a>>;