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
16
17void startWatchdog(int) {
18}
19
21}
22
24}
25
27}
28
30/*lint -restore*/
31
32 chDbgPanic3("_unhandled_exception", __FILE__, __LINE__);
33 while (true) {
34 }
35}
36
38 chDbgPanic3("DebugMonitorVector", __FILE__, __LINE__);
39 while (TRUE)
40 ;
41}
42
43void UsageFaultVector(void) {
44 chDbgPanic3("UsageFaultVector", __FILE__, __LINE__);
45 while (TRUE)
46 ;
47}
48
49void BusFaultVector(void) {
50 chDbgPanic3("BusFaultVector", __FILE__, __LINE__);
51 while (TRUE) {
52 }
53}
54
55void HardFaultVector(void) {
56 while (TRUE) {
57 }
58}
59
60#if HAL_USE_SPI || defined(__DOXYGEN__)
61/* zero index is SPI_NONE */
62bool isSpiInitialized[SPI_TOTAL_COUNT + 1] = { true, false, false, false, false, false, false };
63
64static int getSpiAf(SPIDriver *driver) {
65#if STM32_SPI_USE_SPI1
66 if (driver == &SPID1) {
67 return EFI_SPI1_AF;
68 }
69#endif
70#if STM32_SPI_USE_SPI2
71 if (driver == &SPID2) {
72 return EFI_SPI2_AF;
73 }
74#endif
75#if STM32_SPI_USE_SPI3
76 if (driver == &SPID3) {
77 return EFI_SPI3_AF;
78 }
79#endif
80 return -1;
81}
82
85 return; // already initialized
87 if (device == SPI_DEVICE_1) {
88// todo: introduce a nice structure with all fields for same SPI
89#if STM32_SPI_USE_SPI1
90// scheduleMsg(&logging, "Turning on SPI1 pins");
97#endif /* STM32_SPI_USE_SPI1 */
98 }
99 if (device == SPI_DEVICE_2) {
100#if STM32_SPI_USE_SPI2
101// scheduleMsg(&logging, "Turning on SPI2 pins");
108#endif /* STM32_SPI_USE_SPI2 */
109 }
110 if (device == SPI_DEVICE_3) {
111#if STM32_SPI_USE_SPI3
112// scheduleMsg(&logging, "Turning on SPI3 pins");
119#endif /* STM32_SPI_USE_SPI3 */
120 }
121}
122
123void initSpiModule(SPIDriver *driver, brain_pin_e sck, brain_pin_e miso,
124 brain_pin_e mosi,
125 int sckMode,
126 int mosiMode,
127 int misoMode) {
128
129 /**
130 * See https://github.com/rusefi/rusefi/pull/664/
131 *
132 * Info on the silicon defect can be found in this document, section 2.5.2:
133 * 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
134 */
135 efiSetPadMode("SPI CLK ", sck, PAL_MODE_ALTERNATE(getSpiAf(driver)) | sckMode | PAL_STM32_OSPEED_HIGHEST);
136
137 efiSetPadMode("SPI MOSI", mosi, PAL_MODE_ALTERNATE(getSpiAf(driver)) | mosiMode | PAL_STM32_OSPEED_HIGHEST);
138 efiSetPadMode("SPI MISO", miso, PAL_MODE_ALTERNATE(getSpiAf(driver)) | misoMode | PAL_STM32_OSPEED_HIGHEST);
139}
140
141void initSpiCsNoOccupy(SPIConfig *spiConfig, brain_pin_e csPin) {
142 ioportid_t port = getHwPort("spi", csPin);
143 ioportmask_t pin = getHwPin("spi", csPin);
144 spiConfig->ssport = port;
145 spiConfig->sspad = pin;
146}
147
148void initSpiCs(SPIConfig *spiConfig, brain_pin_e csPin) {
149 /* TODO: why this is here? */
150#ifdef _CHIBIOS_RT_CONF_VER_6_1_
151 spiConfig->end_cb = nullptr;
152#else
153 spiConfig->data_cb = nullptr;
154 spiConfig->error_cb = nullptr;
155#endif
156
157 initSpiCsNoOccupy(spiConfig, csPin);
158 // CS is controlled inside 'hal_spi_lld' driver using both software and hardware methods.
159 //efiSetPadMode("chip select", csPin, PAL_MODE_OUTPUT_OPENDRAIN);
160}
161
162int spiGetBaseClock(SPIDriver*)
163{
164 // TODO: implement
165 return 0;
166}
167
168int spiCalcClockDiv(SPIDriver*, SPIConfig*, unsigned int)
169{
170 // TODO: implement
171 return -1;
172}
173
174#endif /* HAL_USE_SPI */
175
177 return BOR_Level_None;
178}
179
181 return BOR_Result_Ok;
182}
183
184#if EFI_CAN_SUPPORT || defined(__DOXYGEN__)
185
187 return pin == Gpio::A11 || pin == Gpio::B8 || pin == Gpio::D0;
188}
189
191 return pin == Gpio::A12 || pin == Gpio::B9 || pin == Gpio::D1;
192}
193
195 return pin == Gpio::B5 || pin == Gpio::B12;
196}
197
199 return pin == Gpio::B6 || pin == Gpio::B13;
200}
201
205
209
210CANDriver* detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx) {
211 if (isValidCan1RxPin(pinRx) && isValidCan1TxPin(pinTx))
212 return &CAND1;
213 if (isValidCan2RxPin(pinRx) && isValidCan2TxPin(pinTx))
214 return &CAND2;
215 return NULL;
216}
217
218void canHwInfo(CANDriver* cand)
219{
220 /* TODO: */
221 (void)cand;
222}
223
224#endif /* EFI_CAN_SUPPORT */
225
227 return false;
228}
229
231 // sectors 0..11 are the 1st memory bank (1Mb), and 12..23 are the 2nd (the same structure).
232 if (sector <= 3 || (sector >= 12 && sector <= 15))
233 return 16 * 1024;
234 else if (sector == 4 || sector == 16)
235 return 64 * 1024;
236 else if ((sector >= 5 && sector <= 11) || (sector >= 17 && sector <= 23))
237 return 128 * 1024;
238 return 0;
239}
240
241
242/**
243 * Flex Non Volatile Memory is faster than flash
244 * It also has smaller pages so it takes less time to erase
245 *
246 * There is no remote access to FlexNVM meaning that we cannot erase settings externally
247 */
248
250 return 0x10000000;
251}
252
254 return 0x10008000;
255}
256
257/*static*/ hardware_pwm* hardware_pwm::tryInitPin(const char*, brain_pin_e, float, float) {
258 // TODO: implement me!
259 return nullptr;
260}
261
263 // Init slow ADC
264 adcStart(&ADCD1, NULL);
265
266 // Init fast ADC (MAP sensor)
267 adcStart(&ADCD2, NULL);
268}
269
271 // TODO: implement me!
272 return 0;
273}
274
276 // TODO: implement me!
278}
279
280bool readSlowAnalogInputs(adcsample_t* convertedSamples) {
281 // TODO: implement me!
282 return true;
283}
284
287 return invalidAdcToken;
288 }
289
290 // TODO: implement me!
291 return invalidAdcToken;
292}
293
295 if (token == invalidAdcToken) {
296 return 0;
297 }
298
299 // TODO: implement me!
300 return 0;
301}
302
306
308 return "Unknown";
309}
310
311#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
static hardware_pwm * tryInitPin(const char *msg, brain_pin_e pin, float frequencyHz, float duty)
Definition mpu_util.cpp:257