rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
mpu_util.cpp
Go to the documentation of this file.
1/**
2 * @file mpu_util.cpp
3 *
4 * @date Jul 27, 2014
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 * @author andreika <prometheus.pcb@gmail.com>
7 */
8
9#include "pch.h"
10
11#if EFI_PROD_CODE
12
13#include "mpu_util.h"
14#include "flash_int.h"
15
16extern "C" {
17 void _unhandled_exception(void);
18 void DebugMonitorVector(void);
19 void UsageFaultVector(void);
20 void BusFaultVector(void);
21 void HardFaultVector(void);
22}
23
24void startWatchdog(int) {
25}
26
28}
29
31}
32
34}
35
37/*lint -restore*/
38
39 chDbgPanic3("_unhandled_exception", __FILE__, __LINE__);
40 while (true) {
41 }
42}
43
45 chDbgPanic3("DebugMonitorVector", __FILE__, __LINE__);
46 while (TRUE)
47 ;
48}
49
50void UsageFaultVector(void) {
51 chDbgPanic3("UsageFaultVector", __FILE__, __LINE__);
52 while (TRUE)
53 ;
54}
55
56void BusFaultVector(void) {
57 chDbgPanic3("BusFaultVector", __FILE__, __LINE__);
58 while (TRUE) {
59 }
60}
61
62void HardFaultVector(void) {
63 while (TRUE) {
64 }
65}
66
67#if HAL_USE_SPI || defined(__DOXYGEN__)
68/* zero index is SPI_NONE */
69bool isSpiInitialized[SPI_TOTAL_COUNT + 1] = { true, false, false, false, false, false, false };
70
71static int getSpiAf(SPIDriver *driver) {
72#if STM32_SPI_USE_SPI1
73 if (driver == &SPID1) {
74 return EFI_SPI1_AF;
75 }
76#endif
77#if STM32_SPI_USE_SPI2
78 if (driver == &SPID2) {
79 return EFI_SPI2_AF;
80 }
81#endif
82#if STM32_SPI_USE_SPI3
83 if (driver == &SPID3) {
84 return EFI_SPI3_AF;
85 }
86#endif
87 return -1;
88}
89
92 return; // already initialized
94 if (device == SPI_DEVICE_1) {
95// todo: introduce a nice structure with all fields for same SPI
96#if STM32_SPI_USE_SPI1
97// scheduleMsg(&logging, "Turning on SPI1 pins");
104#endif /* STM32_SPI_USE_SPI1 */
105 }
106 if (device == SPI_DEVICE_2) {
107#if STM32_SPI_USE_SPI2
108// scheduleMsg(&logging, "Turning on SPI2 pins");
115#endif /* STM32_SPI_USE_SPI2 */
116 }
117 if (device == SPI_DEVICE_3) {
118#if STM32_SPI_USE_SPI3
119// scheduleMsg(&logging, "Turning on SPI3 pins");
126#endif /* STM32_SPI_USE_SPI3 */
127 }
128}
129
130void initSpiModule(SPIDriver *driver, brain_pin_e sck, brain_pin_e miso,
131 brain_pin_e mosi,
132 int sckMode,
133 int mosiMode,
134 int misoMode) {
135
136 /**
137 * See https://github.com/rusefi/rusefi/pull/664/
138 *
139 * Info on the silicon defect can be found in this document, section 2.5.2:
140 * https://www.st.com/content/ccc/resource/technical/document/errata_sheet/0a/98/58/84/86/b6/47/a2/DM00037591.pdf/files/DM00037591.pdf/jcr:content/translations/en.DM00037591.pdf
141 */
142 efiSetPadMode("SPI CLK ", sck, PAL_MODE_ALTERNATE(getSpiAf(driver)) /*| sckMode | PAL_STM32_OSPEED_HIGHEST*/);
143
144 efiSetPadMode("SPI MOSI", mosi, PAL_MODE_ALTERNATE(getSpiAf(driver)) /*| mosiMode | PAL_STM32_OSPEED_HIGHEST*/);
145 efiSetPadMode("SPI MISO ", miso, PAL_MODE_ALTERNATE(getSpiAf(driver)) /*| misoMode | PAL_STM32_OSPEED_HIGHEST*/);
146}
147
148void initSpiCsNoOccupy(SPIConfig *spiConfig, brain_pin_e csPin) {
149 ioportid_t port = getHwPort("spi", csPin);
150 ioportmask_t pin = getHwPin("spi", csPin);
151 spiConfig->ssport = port;
152 spiConfig->sspad = pin;
153}
154
155void initSpiCs(SPIConfig *spiConfig, brain_pin_e csPin) {
156 /* TODO: why this is here? */
157#ifdef _CHIBIOS_RT_CONF_VER_6_1_
158 spiConfig->end_cb = nullptr;
159#else
160 spiConfig->data_cb = nullptr;
161 spiConfig->error_cb = nullptr;
162#endif
163
164 initSpiCsNoOccupy(spiConfig, csPin);
165 // CS is controlled inside 'hal_spi_lld' driver using both software and hardware methods.
166 //efiSetPadMode("chip select", csPin, PAL_MODE_OUTPUT_OPENDRAIN);
167}
168
169int spiGetBaseClock(SPIDriver*)
170{
171 // TODO: implement
172 return 0;
173}
174
175int spiCalcClockDiv(SPIDriver*, SPIConfig*, unsigned int)
176{
177 // TODO: implement
178 return -1;
179}
180
181#endif /* HAL_USE_SPI */
182
184 return BOR_Level_None;
185}
186
188 return BOR_Result_Ok;
189}
190
191#if EFI_CAN_SUPPORT || defined(__DOXYGEN__)
192
194 return pin == Gpio::A11 || pin == Gpio::B8 || pin == Gpio::D0;
195}
196
198 return pin == Gpio::A12 || pin == Gpio::B9 || pin == Gpio::D1;
199}
200
202 return pin == Gpio::B5 || pin == Gpio::B12;
203}
204
206 return pin == Gpio::B6 || pin == Gpio::B13;
207}
208
212
216
217CANDriver* detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx) {
218 if (isValidCan1RxPin(pinRx) && isValidCan1TxPin(pinTx))
219 return &CAND1;
220 if (isValidCan2RxPin(pinRx) && isValidCan2TxPin(pinTx))
221 return &CAND2;
222 return NULL;
223}
224
225void canHwInfo(CANDriver* cand)
226{
227 /* TODO: */
228 (void)cand;
229}
230
231#endif /* EFI_CAN_SUPPORT */
232
234 return false;
235}
236
238 // sectors 0..11 are the 1st memory bank (1Mb), and 12..23 are the 2nd (the same structure).
239 if (sector <= 3 || (sector >= 12 && sector <= 15))
240 return 16 * 1024;
241 else if (sector == 4 || sector == 16)
242 return 64 * 1024;
243 else if ((sector >= 5 && sector <= 11) || (sector >= 17 && sector <= 23))
244 return 128 * 1024;
245 return 0;
246}
247
249 return FLASH_ADDR;
250}
251
253 return FLASH_ADDR_SECOND_COPY;
254}
255
257 // Init slow ADC
258 adcStart(&ADCD1, NULL);
259
260 // Init fast ADC (MAP sensor)
261 adcStart(&ADCD2, NULL);
262}
263
265 // TODO: implement me!
266 return 0;
267}
268
270 // TODO: implement me!
272}
273
274bool readSlowAnalogInputs(adcsample_t* convertedSamples) {
275 // TODO: implement me!
276 return true;
277}
278
281 return invalidAdcToken;
282 }
283
284 // TODO: implement me!
285 return invalidAdcToken;
286}
287
289 if (token == invalidAdcToken) {
290 return 0;
291 }
292
293 // TODO: implement me!
294 return 0;
295}
296
300
302 return "Unknown";
303}
304
305#endif /* EFI_PROD_CODE */
static constexpr AdcToken invalidAdcToken
Definition adc_inputs.h:110
bool isAdcChannelValid(adc_channel_e hwChannel)
Definition adc_inputs.h:23
uint16_t channel
Definition adc_inputs.h:104
uint32_t AdcToken
Definition adc_inputs.h:98
bool mcuCanFlashWhileRunning()
Definition mpu_util.cpp:10
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
void chDbgPanic3(const char *, const char *, int)
static bool isValidCan2RxPin(brain_pin_e pin)
Definition mpu_util.cpp:201
int spiCalcClockDiv(SPIDriver *, SPIConfig *, unsigned int)
Definition mpu_util.cpp:175
void startWatchdog(int)
Definition mpu_util.cpp:24
Reset_Cause_t getMCUResetCause()
Definition mpu_util.cpp:297
CANDriver * detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx)
Definition mpu_util.cpp:217
void tryResetWatchdog()
Definition mpu_util.cpp:27
void HardFaultVector(void)
Definition mpu_util.cpp:62
void BusFaultVector(void)
Definition mpu_util.cpp:56
BOR_Level_t BOR_Get(void)
Definition mpu_util.cpp:183
bool readSlowAnalogInputs(adcsample_t *convertedSamples)
Definition mpu_util.cpp:274
void setWatchdogResetPeriod(int)
Definition mpu_util.cpp:30
BOR_Result_t BOR_Set(BOR_Level_t BORValue)
Definition mpu_util.cpp:187
bool isValidCanRxPin(brain_pin_e pin)
Definition mpu_util.cpp:213
int spiGetBaseClock(SPIDriver *)
Definition mpu_util.cpp:169
void DebugMonitorVector(void)
Definition mpu_util.cpp:44
static int getSpiAf(SPIDriver *driver)
Definition mpu_util.cpp:71
void initSpiModule(SPIDriver *driver, brain_pin_e sck, brain_pin_e miso, brain_pin_e mosi, int sckMode, int mosiMode, int misoMode)
Definition mpu_util.cpp:130
void baseMCUInit()
Definition mpu_util.cpp:33
adcsample_t getFastAdc(AdcToken token)
Definition mpu_util.cpp:288
void initSpiCsNoOccupy(SPIConfig *spiConfig, brain_pin_e csPin)
Definition mpu_util.cpp:148
void UsageFaultVector(void)
Definition mpu_util.cpp:50
bool isSpiInitialized[SPI_TOTAL_COUNT+1]
Definition mpu_util.cpp:69
void turnOnSpi(spi_device_e device)
Definition mpu_util.cpp:90
uintptr_t getFlashAddrSecondCopy()
Definition mpu_util.cpp:252
float getMcuVrefVoltage()
Definition mpu_util.cpp:269
void _unhandled_exception(void)
Definition mpu_util.cpp:36
static bool isValidCan1RxPin(brain_pin_e pin)
Definition mpu_util.cpp:193
bool isValidCanTxPin(brain_pin_e pin)
Definition mpu_util.cpp:209
static bool isValidCan2TxPin(brain_pin_e pin)
Definition mpu_util.cpp:205
uintptr_t getFlashAddrFirstCopy()
Definition mpu_util.cpp:248
size_t flashSectorSize(flashsector_t sector)
Get the size of sector.
Definition mpu_util.cpp:237
void initSpiCs(SPIConfig *spiConfig, brain_pin_e csPin)
Definition mpu_util.cpp:155
float getMcuTemperature()
Definition mpu_util.cpp:264
void portInitAdc()
Definition mpu_util.cpp:256
void canHwInfo(CANDriver *cand)
Definition mpu_util.cpp:225
static bool isValidCan1TxPin(brain_pin_e pin)
Definition mpu_util.cpp:197
AdcToken enableFastAdcChannel(const char *, adc_channel_e channel)
Definition mpu_util.cpp:279
BOR_Level_t
@ BOR_Level_None
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin)
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin)
static constexpr engine_configuration_s * engineConfiguration
uint8_t flashsector_t
Index of a sector.
Definition flash_int.h:89
ADCDriver ADCD2
ADC2 driver identifier.
Definition hal_adc_lld.c:49
uint16_t adcsample_t
ADC sample data type.
ADCDriver ADCD1
ADC1 driver identifier.
Definition hal_adc_lld.c:44
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
Definition hal_pal_lld.h:78
GPIO_TypeDef * ioportid_t
Port Identifier.
SPIDriver SPID1
SPI0 driver identifier.
Definition hal_spi_lld.c:42
SPIDriver SPID2
SPI1 driver identifier.
Definition hal_spi_lld.c:47
brain_pin_e getSckPin(spi_device_e device)
Definition hardware.cpp:126
brain_pin_e getMosiPin(spi_device_e device)
Definition hardware.cpp:106
brain_pin_e getMisoPin(spi_device_e device)
Definition hardware.cpp:86
static Lps25 device
Definition init_baro.cpp:4
BOR_Result_t
Definition mpu_util.h:95
@ BOR_Result_Ok
Definition mpu_util.h:96
Reset_Cause_t
Definition mpu_util.h:104
@ Reset_Cause_Unknown
Definition mpu_util.h:105
spi_device_e
brain_pin_e pin
Definition stm32_adc.cpp:15