98 lines
2.3 KiB
C++
98 lines
2.3 KiB
C++
#ifndef _UDISPLAY_SPI_CONTROLLER_H_
|
|
#define _UDISPLAY_SPI_CONTROLLER_H_
|
|
|
|
#include <Arduino.h>
|
|
#include <SPI.h>
|
|
|
|
#ifdef ESP32
|
|
#include "soc/spi_reg.h"
|
|
#include "soc/spi_struct.h"
|
|
#include "esp32-hal-spi.h"
|
|
#include "driver/spi_master.h"
|
|
#include "soc/gpio_periph.h"
|
|
#endif
|
|
|
|
#ifndef ESP32
|
|
#include "spi_register.h"
|
|
#endif
|
|
|
|
struct SPIControllerConfig {
|
|
uint8_t bus_nr;
|
|
int8_t cs;
|
|
int8_t clk;
|
|
int8_t mosi;
|
|
int8_t dc;
|
|
int8_t miso;
|
|
uint32_t speed;
|
|
};
|
|
|
|
/**
|
|
* Minimal SPIController - wraps low-level SPI functions
|
|
* Extracted from uDisplay_spi.cpp
|
|
*/
|
|
class SPIController {
|
|
public:
|
|
SPIController(const SPIControllerConfig& config);
|
|
~SPIController() = default;
|
|
|
|
// ===== Pin Control =====
|
|
void csLow();
|
|
void csHigh();
|
|
void dcLow();
|
|
void dcHigh();
|
|
|
|
// ===== Transaction Control =====
|
|
void beginTransaction();
|
|
void endTransaction();
|
|
|
|
// ===== High-Level Write Functions =====
|
|
void writeCommand(uint8_t cmd);
|
|
void writeData8(uint8_t data);
|
|
void writeData16(uint16_t data);
|
|
void writeData32(uint32_t data);
|
|
|
|
// ===== RA8876 Specific =====
|
|
uint8_t writeReg16(uint8_t reg, uint16_t wval);
|
|
uint8_t readData(void);
|
|
uint8_t readStatus(void);
|
|
|
|
// ===== Direct Access =====
|
|
SPIClass* getSPI() { return spi; }
|
|
// SPISettings getSPISettings() { return spi_settings; }
|
|
|
|
// ===== DMA =====
|
|
#ifdef ESP32
|
|
bool initDMA(uint16_t width, uint16_t height, uint8_t data);
|
|
void dmaWait(void);
|
|
bool dmaBusy(void);
|
|
void pushPixelsDMA(uint16_t* image, uint32_t len);
|
|
void pushPixels3DMA(uint8_t* image, uint32_t len);
|
|
#endif
|
|
SPIControllerConfig spi_config; // make this private in the future again!
|
|
|
|
private:
|
|
SPIClass* spi;
|
|
SPISettings spi_settings;
|
|
|
|
// ===== Low-Level Write Functions =====
|
|
void write8(uint8_t val);
|
|
void write8_slow(uint8_t val);
|
|
void write9(uint8_t val, uint8_t dc);
|
|
void write9_slow(uint8_t val, uint8_t dc);
|
|
void write16(uint16_t val);
|
|
void write32(uint32_t val);
|
|
void hw_write9(uint8_t val, uint8_t dc);
|
|
|
|
#ifdef ESP32
|
|
bool dma_enabled = false;
|
|
bool async_dma_enabled = false;
|
|
|
|
spi_host_device_t spi_host = VSPI_HOST;
|
|
bool DMA_Enabled = false;
|
|
uint8_t spiBusyCheck;
|
|
spi_device_handle_t dmaHAL = nullptr; // For DMA
|
|
spi_transaction_t trans;
|
|
#endif //ESP32
|
|
};
|
|
|
|
#endif // _UDISPLAY_SPI_CONTROLLER_H_
|