rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
wifi_bsp.cpp
Go to the documentation of this file.
1#include "pch.h"
2
3#if EFI_WIFI
4
5#include "ch.h"
6#include "hal.h"
7
9
10#include "bus_wrapper/include/nm_bus_wrapper.h"
11
12// Implement these functions for your board for WiFi to work!
17
18void nm_bsp_sleep(uint32 u32TimeMsec) {
19 chThdSleepMilliseconds(u32TimeMsec);
20}
21
22static tpfNmBspIsr gpfIsr = nullptr;
23
24static void isrAdapter(void*, efitick_t) {
25 if (gpfIsr) {
26 gpfIsr();
27 }
28}
29
30static bool isrEnabled = false;
31
32void nm_bsp_interrupt_ctrl(uint8 u8Enable) {
33 if (u8Enable && !isrEnabled) {
34 efiExtiEnablePin("WiFi ISR", getWifiIsrPin(), PAL_EVENT_MODE_FALLING_EDGE, isrAdapter, nullptr);
35 isrEnabled = true;
36 } else if (!u8Enable && isrEnabled) {
38 isrEnabled = false;
39 }
40}
41
42void nm_bsp_register_isr(tpfNmBspIsr pfIsr) {
43 gpfIsr = pfIsr;
44
46}
47
48static SPIDriver* wifiSpi = nullptr;
49
50tstrNmBusCapabilities egstrNmBusCapabilities = { .u16MaxTrxSz = 4096 };
51
52#ifdef STM32H7XX
53// H7 SPI clock is set to 80MHz
54// fast mode is 80mhz/2 = 40MHz
55SPIConfig wifi_spicfg = {
56 .circular = false,
57 .end_cb = NULL,
58 .ssport = NULL,
59 .sspad = 0,
60 .cfg1 = 7 // 8 bits per byte
61 | 2 << 28 /* MBR = 2, divider = 8 */,
62 .cfg2 = 0
63};
64
65#else // Not H7, ie F4/F7
66
67// 168mhz F4: 42 or 21 MHz depending on which SPI device
68// 216mhz F7: 54 or 27 MHz depending on whcih SPI device
69
70static SPIConfig wifi_spicfg = {
71 .circular = false,
72 .end_cb = NULL,
73 .ssport = NULL,
74 .sspad = 0,
75 .cr1 = SPI_BaudRatePrescaler_2,
76 .cr2 = 0
77};
78
79#endif
80
83
84sint8 nm_bus_init(void*) {
85 auto spi = getWifiSpiDevice();
86 if (spi == SPI_NONE) {
87 return M2M_ERR_BUS_FAIL;
88 }
89
90 // Set up chip select, reset
91 wifiCs.initPin("WiFi CS", getWifiCsPin());
93 wifiReset.initPin("WiFi RST", getWifiResetPin());
94
95 // Reset the chip
97 chThdSleepMilliseconds(10);
99 chThdSleepMilliseconds(10);
100
101 // Set up SPI
103 wifi_spicfg.ssport = wifiCs.m_port;
104 wifi_spicfg.sspad = wifiCs.m_pin;
105 spiStart(wifiSpi, &wifi_spicfg);
106
107 // Take exclusive access of the bus for WiFi use, don't release it until the bus is de-init.
108 spiAcquireBus(wifiSpi);
109
110 return M2M_SUCCESS;
111}
112
113sint8 nm_bus_deinit(void) {
114 spiReleaseBus(wifiSpi);
115 spiStop(wifiSpi);
116
117 return M2M_SUCCESS;
118}
119
120sint8 nm_bus_speed(uint8 /*level*/) {
121 // Do we even need to do anything here?
122 return M2M_SUCCESS;
123}
124
125extern "C" void resetSpiDevice(SPIDriver* spi);
126
127sint8 nm_spi_rw(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz) {
128 spiSelectI(wifiSpi);
129
130 if (u16Sz < 16) {
131 for (size_t i = 0; i < u16Sz; i++) {
132 uint8 tx = pu8Mosi ? pu8Mosi[i] : 0;
133
134 uint8 rx = spiPolledExchange(wifiSpi, tx);
135
136 if (pu8Miso) {
137 pu8Miso[i] = rx;
138 }
139 }
140 } else {
141 // #if CORTEX_MODEL == 7
142 // if (pu8Mosi) {
143 // SCB_CleanDCache_by_Addr((uint32_t*)pu8Mosi, u16Sz);
144 // }
145 // #endif
146
147 // #ifdef STM32H7XX
148 // /* workaround for silicon errata */
149 // /* see https://github.com/rusefi/rusefi/issues/2395 */
150 // resetSpiDevice(wifiSpi);
151 // spiStart(wifiSpi, &wifi_spicfg);
152 // #endif
153
154 if (pu8Mosi && pu8Miso) {
155 spiExchange(wifiSpi, u16Sz, pu8Mosi, pu8Miso);
156 } else if (pu8Mosi) {
157 spiSend(wifiSpi, u16Sz, pu8Mosi);
158 } else if (pu8Miso) {
159 spiReceive(wifiSpi, u16Sz, pu8Miso);
160 } else {
161 // Neither MISO nor MOSI???
162 osalSysHalt("wifi neither mosi nor miso");
163 }
164
165 // #if CORTEX_MODEL == 7
166 // if (pu8Miso) {
167 // SCB_InvalidateDCache_by_Addr((uint32_t*)pu8Miso, u16Sz);
168 // }
169 // #endif
170 }
171
172 spiUnselectI(wifiSpi);
173
174 return M2M_SUCCESS;
175}
176
177#endif // EFI_WIFI
Single output pin reference and state.
Definition efi_output.h:49
void initPin(const char *msg, brain_pin_e brainPin, pin_output_mode_e outputMode, bool forceInitWithFatalError=false)
Definition efi_gpio.cpp:711
void setValue(const char *msg, int logicValue, bool isForce=false)
Definition efi_gpio.cpp:604
ioportid_t m_port
Definition efi_output.h:71
uint8_t m_pin
Definition efi_output.h:72
void efiExtiDisablePin(brain_pin_e brainPin)
int efiExtiEnablePin(const char *msg, brain_pin_e brainPin, uint32_t mode, ExtiCallback cb, void *cb_data)
SPIDriver * getSpiDevice(spi_device_e spiDevice)
Definition hardware.cpp:149
spi_device_e
static void isrAdapter(void *, efitick_t)
Definition wifi_bsp.cpp:24
void nm_bsp_register_isr(tpfNmBspIsr pfIsr)
Definition wifi_bsp.cpp:42
static bool isrEnabled
Definition wifi_bsp.cpp:30
static tpfNmBspIsr gpfIsr
Definition wifi_bsp.cpp:22
void resetSpiDevice(SPIDriver *spi)
sint8 nm_bus_init(void *)
Definition wifi_bsp.cpp:84
sint8 nm_bus_deinit(void)
Definition wifi_bsp.cpp:113
Gpio getWifiIsrPin()
sint8 nm_spi_rw(uint8 *pu8Mosi, uint8 *pu8Miso, uint16 u16Sz)
Definition wifi_bsp.cpp:127
SPIConfig wifi_spicfg
Definition wifi_bsp.cpp:55
spi_device_e getWifiSpiDevice()
sint8 nm_bus_speed(uint8)
Definition wifi_bsp.cpp:120
static OutputPin wifiCs
Definition wifi_bsp.cpp:81
static SPIDriver * wifiSpi
Definition wifi_bsp.cpp:48
static OutputPin wifiReset
Definition wifi_bsp.cpp:82
Gpio getWifiResetPin()
void nm_bsp_interrupt_ctrl(uint8 u8Enable)
Definition wifi_bsp.cpp:32
void nm_bsp_sleep(uint32 u32TimeMsec)
Definition wifi_bsp.cpp:18
Gpio getWifiCsPin()
tstrNmBusCapabilities egstrNmBusCapabilities
Definition wifi_bsp.cpp:50