mirror of
https://github.com/lumapu/ahoy.git
synced 2025-04-28 09:46:26 +02:00
fix SPI topics, not completely tested
This commit is contained in:
parent
008c5a1698
commit
0afe0d7fc9
8 changed files with 49 additions and 47 deletions
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
patches/GxEPD2_HAL.patch eol=crlf
|
|
@ -17,9 +17,7 @@
|
|||
|
||||
class nrfHal: public RF24_hal, public SpiPatcherHandle {
|
||||
public:
|
||||
nrfHal() {
|
||||
mSpiPatcher = SpiPatcher::getInstance(SPI2_HOST);
|
||||
}
|
||||
nrfHal() {}
|
||||
|
||||
void patch() override {
|
||||
esp_rom_gpio_connect_out_signal(mPinMosi, spi_periph_signal[mHostDevice].spid_out, false, false);
|
||||
|
@ -41,7 +39,8 @@ class nrfHal: public RF24_hal, public SpiPatcherHandle {
|
|||
mPinEn = static_cast<gpio_num_t>(en);
|
||||
mSpiSpeed = speed;
|
||||
|
||||
mHostDevice = mSpiPatcher->getDevice();
|
||||
mHostDevice = (14 == sclk) ? SPI2_HOST : SPI3_HOST;
|
||||
mSpiPatcher = SpiPatcher::getInstance(mHostDevice);
|
||||
|
||||
gpio_reset_pin(mPinMosi);
|
||||
gpio_set_direction(mPinMosi, GPIO_MODE_OUTPUT);
|
||||
|
@ -72,7 +71,7 @@ class nrfHal: public RF24_hal, public SpiPatcherHandle {
|
|||
.pre_cb = nullptr,
|
||||
.post_cb = nullptr
|
||||
};
|
||||
ESP_ERROR_CHECK(spi_bus_add_device(mHostDevice, &devcfg, &spi));
|
||||
mSpiPatcher->addDevice(mHostDevice, &devcfg, &spi);
|
||||
release_spi();
|
||||
|
||||
gpio_reset_pin(mPinEn);
|
||||
|
|
|
@ -16,9 +16,7 @@
|
|||
|
||||
class cmtHal : public SpiPatcherHandle {
|
||||
public:
|
||||
cmtHal() {
|
||||
mSpiPatcher = SpiPatcher::getInstance(DEF_CMT_SPI_HOST);
|
||||
}
|
||||
cmtHal() {}
|
||||
|
||||
void patch() override {
|
||||
esp_rom_gpio_connect_out_signal(mPinSdio, spi_periph_signal[mHostDevice].spid_out, false, false);
|
||||
|
@ -39,7 +37,8 @@ class cmtHal : public SpiPatcherHandle {
|
|||
mPinFcs = static_cast<gpio_num_t>(fcs);
|
||||
mSpiSpeed = speed;
|
||||
|
||||
mHostDevice = mSpiPatcher->getDevice();
|
||||
mHostDevice = (14 == clk) ? SPI2_HOST : SPI3_HOST;
|
||||
mSpiPatcher = SpiPatcher::getInstance(mHostDevice);
|
||||
|
||||
gpio_reset_pin(mPinSdio);
|
||||
gpio_set_direction(mPinSdio, GPIO_MODE_INPUT_OUTPUT);
|
||||
|
@ -67,7 +66,7 @@ class cmtHal : public SpiPatcherHandle {
|
|||
.pre_cb = nullptr,
|
||||
.post_cb = nullptr
|
||||
};
|
||||
ESP_ERROR_CHECK(spi_bus_add_device(mHostDevice, &devcfg_reg, &spi_reg));
|
||||
mSpiPatcher->addDevice(mHostDevice, &devcfg_reg, &spi_reg);
|
||||
release_spi();
|
||||
|
||||
gpio_reset_pin(mPinFcs);
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include <Arduino.h>
|
||||
#include <esp_netif.h>
|
||||
#include <WiFiGeneric.h>
|
||||
#include <driver/spi_master.h>
|
||||
#include "../utils/spiPatcher.h"
|
||||
|
||||
// Functions from WiFiGeneric
|
||||
void tcpipInit();
|
||||
|
@ -44,23 +44,8 @@ class AhoyEthernetSpi {
|
|||
gpio_reset_pin(static_cast<gpio_num_t>(pin_int));
|
||||
gpio_set_pull_mode(static_cast<gpio_num_t>(pin_int), GPIO_PULLUP_ONLY);
|
||||
|
||||
|
||||
spi_bus_config_t buscfg = {
|
||||
.mosi_io_num = pin_mosi,
|
||||
.miso_io_num = pin_miso,
|
||||
.sclk_io_num = pin_sclk,
|
||||
.quadwp_io_num = -1,
|
||||
.quadhd_io_num = -1,
|
||||
.data4_io_num = -1,
|
||||
.data5_io_num = -1,
|
||||
.data6_io_num = -1,
|
||||
.data7_io_num = -1,
|
||||
.max_transfer_sz = 0, // uses default value internally
|
||||
.flags = 0,
|
||||
.intr_flags = 0
|
||||
};
|
||||
|
||||
ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO));
|
||||
mHostDevice = (14 == pin_sclk) ? SPI2_HOST : SPI3_HOST;
|
||||
mSpiPatcher = SpiPatcher::getInstance(mHostDevice);
|
||||
|
||||
spi_device_interface_config_t devcfg = {
|
||||
.command_bits = 16, // actually address phase
|
||||
|
@ -79,8 +64,7 @@ class AhoyEthernetSpi {
|
|||
.post_cb = nullptr
|
||||
};
|
||||
|
||||
spi_device_handle_t spi;
|
||||
ESP_ERROR_CHECK(spi_bus_add_device(SPI3_HOST, &devcfg, &spi));
|
||||
mSpiPatcher->addDevice(mHostDevice, &devcfg, &spi);
|
||||
|
||||
// Reset sequence
|
||||
if(-1 != pin_rst) {
|
||||
|
@ -137,6 +121,9 @@ class AhoyEthernetSpi {
|
|||
private:
|
||||
esp_eth_handle_t eth_handle;
|
||||
esp_netif_t *eth_netif;
|
||||
spi_host_device_t mHostDevice;
|
||||
spi_device_handle_t spi;
|
||||
SpiPatcher *mSpiPatcher;
|
||||
};
|
||||
|
||||
#endif /*__ETH_SPI_H__*/
|
||||
|
|
|
@ -15,9 +15,7 @@
|
|||
|
||||
class epdHal: public GxEPD2_HalInterface, public SpiPatcherHandle {
|
||||
public:
|
||||
epdHal() {
|
||||
mSpiPatcher = SpiPatcher::getInstance(SPI3_HOST);
|
||||
}
|
||||
epdHal() {}
|
||||
|
||||
void patch() override {
|
||||
esp_rom_gpio_connect_out_signal(mPinMosi, spi_periph_signal[mHostDevice].spid_out, false, false);
|
||||
|
@ -40,7 +38,8 @@ class epdHal: public GxEPD2_HalInterface, public SpiPatcherHandle {
|
|||
mPinBusy = static_cast<gpio_num_t>(busy);
|
||||
mSpiSpeed = speed;
|
||||
|
||||
mHostDevice = mSpiPatcher->getDevice();
|
||||
mHostDevice = (14 == sclk) ? SPI2_HOST : SPI3_HOST;
|
||||
mSpiPatcher = SpiPatcher::getInstance(mHostDevice);
|
||||
|
||||
gpio_reset_pin(mPinMosi);
|
||||
gpio_set_direction(mPinMosi, GPIO_MODE_OUTPUT);
|
||||
|
@ -68,7 +67,7 @@ class epdHal: public GxEPD2_HalInterface, public SpiPatcherHandle {
|
|||
.pre_cb = nullptr,
|
||||
.post_cb = nullptr
|
||||
};
|
||||
ESP_ERROR_CHECK(spi_bus_add_device(mHostDevice, &devcfg, &spi));
|
||||
mSpiPatcher->addDevice(mHostDevice, &devcfg, &spi);
|
||||
release_spi();
|
||||
|
||||
if(GPIO_NUM_NC != mPinRst) {
|
||||
|
|
|
@ -110,7 +110,7 @@
|
|||
|
||||
#if DEBUG_LEVEL >= DBG_ERROR
|
||||
#define PERR(str) DBGPRINT(F("E: ")); DBGPRINT(str);
|
||||
#define PERRLN(str) DBGPRINT(F("E: ")); DBGPRINTLN(str);
|
||||
#define PERRLN(str) DBGPRINT(F("E: ")); DBGPRINTLN(str); DSERIAL.flush();
|
||||
#else
|
||||
#define PERR(str)
|
||||
#define PERRLN(str)
|
||||
|
|
|
@ -5,5 +5,6 @@
|
|||
|
||||
#if defined(ESP32)
|
||||
#include "spiPatcher.h"
|
||||
SpiPatcher *SpiPatcher::mInstance = nullptr;
|
||||
SpiPatcher *SpiPatcher::InstanceHost2 = nullptr;
|
||||
SpiPatcher *SpiPatcher::InstanceHost3 = nullptr;
|
||||
#endif
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#if defined(ESP32)
|
||||
|
||||
#include "dbg.h"
|
||||
#include "spiPatcherHandle.h"
|
||||
|
||||
#include <driver/spi_master.h>
|
||||
|
@ -17,7 +18,7 @@
|
|||
class SpiPatcher {
|
||||
protected:
|
||||
explicit SpiPatcher(spi_host_device_t dev) :
|
||||
mHostDevice(dev), mCurHandle(nullptr) {
|
||||
mCurHandle(nullptr) {
|
||||
// Use binary semaphore instead of mutex for performance reasons
|
||||
mutex = xSemaphoreCreateBinaryStatic(&mutex_buffer);
|
||||
xSemaphoreGive(mutex);
|
||||
|
@ -36,23 +37,37 @@ class SpiPatcher {
|
|||
.flags = 0,
|
||||
.intr_flags = 0
|
||||
};
|
||||
ESP_ERROR_CHECK(spi_bus_initialize(mHostDevice, &buscfg, SPI_DMA_DISABLED));
|
||||
ESP_ERROR_CHECK(spi_bus_initialize(dev, &buscfg, SPI_DMA_DISABLED));
|
||||
}
|
||||
|
||||
public:
|
||||
SpiPatcher(SpiPatcher &other) = delete;
|
||||
SpiPatcher(const SpiPatcher &other) = delete;
|
||||
void operator=(const SpiPatcher &) = delete;
|
||||
|
||||
static SpiPatcher* getInstance(spi_host_device_t dev) {
|
||||
if(nullptr == mInstance)
|
||||
mInstance = new SpiPatcher(dev);
|
||||
return mInstance;
|
||||
if(SPI2_HOST == dev) {
|
||||
if(nullptr == InstanceHost2)
|
||||
InstanceHost2 = new SpiPatcher(dev);
|
||||
return InstanceHost2;
|
||||
} else { // SPI3_HOST
|
||||
if(nullptr == InstanceHost3)
|
||||
InstanceHost3 = new SpiPatcher(dev);
|
||||
return InstanceHost3;
|
||||
}
|
||||
}
|
||||
|
||||
~SpiPatcher() { vSemaphoreDelete(mutex); }
|
||||
|
||||
spi_host_device_t getDevice() {
|
||||
return mHostDevice;
|
||||
inline void addDevice(spi_host_device_t host_id, const spi_device_interface_config_t *dev_config, spi_device_handle_t *handle) {
|
||||
if(SPI2_HOST == host_id)
|
||||
mHost2Cnt++;
|
||||
if(SPI3_HOST == host_id)
|
||||
mHost3Cnt++;
|
||||
|
||||
if((mHost2Cnt > 3) || (mHost3Cnt > 3))
|
||||
DPRINTLN(DBG_ERROR, F("maximum number of SPI devices reached (3)"));
|
||||
|
||||
ESP_ERROR_CHECK(spi_bus_add_device(host_id, dev_config, handle));
|
||||
}
|
||||
|
||||
inline void request(SpiPatcherHandle* handle) {
|
||||
|
@ -74,13 +89,14 @@ class SpiPatcher {
|
|||
}
|
||||
|
||||
protected:
|
||||
static SpiPatcher *mInstance;
|
||||
static SpiPatcher *InstanceHost2;
|
||||
static SpiPatcher *InstanceHost3;
|
||||
|
||||
private:
|
||||
const spi_host_device_t mHostDevice;
|
||||
SpiPatcherHandle* mCurHandle;
|
||||
SemaphoreHandle_t mutex;
|
||||
StaticSemaphore_t mutex_buffer;
|
||||
uint8_t mHost2Cnt = 0, mHost3Cnt = 0;
|
||||
};
|
||||
|
||||
#endif /*ESP32*/
|
||||
|
|
Loading…
Add table
Reference in a new issue