3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
29#if !defined(ESP_PLATFORM)
30#error "TinyGPU/Abstractions/EmulationIDF.h is ESP-IDF-only - include TinyGPU/Emulation.h instead, which routes here only when ESP_PLATFORM is defined."
36#include "driver/gpio.h"
37#include "driver/i2c.h"
38#include "driver/spi_master.h"
40#include "freertos/FreeRTOS.h"
41#include "freertos/task.h"
57inline void delay(uint32_t ms) { vTaskDelay(pdMS_TO_TICKS(ms)); }
62inline unsigned long millis() {
63 return static_cast<
unsigned long>(esp_timer_get_time() / 1000);
86 gpio_config_t cfg = {};
87 cfg.pin_bit_mask = (1ULL << pin);
88 cfg.mode = (mode == OUTPUT) ? GPIO_MODE_OUTPUT : GPIO_MODE_INPUT;
90 (mode == INPUT_PULLUP) ? GPIO_PULLUP_ENABLE : GPIO_PULLUP_DISABLE;
91 cfg.pull_down_en = GPIO_PULLDOWN_DISABLE;
92 cfg.intr_type = GPIO_INTR_DISABLE;
99 gpio_set_level(
static_cast<gpio_num_t>(pin), value);
104 if (pin < 0)
return LOW;
105 return gpio_get_level(
static_cast<gpio_num_t>(pin));
149 bool begin(
int sckPin,
int misoPin = -1,
int mosiPin = -1,
int ssPin = -1) {
151 if (busInitialized_)
return true;
152 spi_bus_config_t busCfg = {};
153 busCfg.sclk_io_num = sckPin;
154 busCfg.miso_io_num = misoPin;
155 busCfg.mosi_io_num = mosiPin;
156 busCfg.quadwp_io_num = -1;
157 busCfg.quadhd_io_num = -1;
158 busCfg.max_transfer_sz = 4096;
159 if (spi_bus_initialize(host_, &busCfg, SPI_DMA_CH_AUTO) != ESP_OK) {
162 busInitialized_ =
true;
171 if (device_ !=
nullptr &&
172 (settings.clock != lastClock_ || settings.dataMode != lastMode_)) {
173 spi_bus_remove_device(device_);
176 if (device_ ==
nullptr) {
177 spi_device_interface_config_t devCfg = {};
178 devCfg.clock_speed_hz =
static_cast<
int>(settings.clock);
179 devCfg.mode = settings.dataMode;
180 devCfg.spics_io_num = -1;
181 devCfg.queue_size = 1;
184 devCfg.flags = (settings.bitOrder == LSBFIRST)
185 ? (SPI_DEVICE_TXBIT_LSBFIRST | SPI_DEVICE_RXBIT_LSBFIRST)
187 if (spi_bus_add_device(host_, &devCfg, &device_) != ESP_OK) {
191 lastClock_ = settings
.clock;
204 if (device_ ==
nullptr)
return 0;
206 spi_transaction_t t = {};
210 spi_device_transmit(device_, &t);
218 if (device_ ==
nullptr || buf ==
nullptr || count == 0)
return;
219 spi_transaction_t t = {};
220 t.length = count * 8;
223 spi_device_transmit(device_, &t);
228 spi_device_handle_t device_ =
nullptr;
229 uint32_t lastClock_ = 0;
230 uint8_t lastMode_ = 0xFF;
231 bool busInitialized_ =
false;
257 bool begin(
int sdaPin,
int sclPin, uint32_t freqHz = 100000) {
258 if (installed_)
return true;
259 i2c_config_t cfg = {};
260 cfg.mode = I2C_MODE_MASTER;
261 cfg.sda_io_num = sdaPin;
262 cfg.scl_io_num = sclPin;
263 cfg.sda_pullup_en = GPIO_PULLUP_ENABLE;
264 cfg.scl_pullup_en = GPIO_PULLUP_ENABLE;
265 cfg.master.clk_speed = freqHz;
266 if (i2c_param_config(port_, &cfg) != ESP_OK)
return false;
267 if (i2c_driver_install(port_, I2C_MODE_MASTER, 0, 0, 0) != ESP_OK) {
279 pendingRestart_ =
false;
287 if (txLen_ <
sizeof(txBuf_)) txBuf_[txLen_++] = value;
297 pendingRestart_ =
true;
300 const esp_err_t err = runWriteOnly();
301 return (err == ESP_OK) ? 0 : 4;
310 length = clampLength(length);
312 if (pendingRestart_) {
313 err = runWriteThenRead(
static_cast<uint8_t>(address), length);
314 pendingRestart_ =
false;
316 err = runReadOnly(
static_cast<uint8_t>(address), length);
318 rxLen_ = (err == ESP_OK) ?
static_cast<size_t>(length) : 0;
325 int available()
const {
return static_cast<
int>(rxLen_ - rxPos_); }
330 if (rxPos_ >= rxLen_)
return -1;
331 return rxBuf_[rxPos_++];
335 static constexpr size_t kBufSize = 8;
339 uint8_t address_ = 0;
342 bool pendingRestart_ =
false;
346 bool installed_ =
false;
348 static int clampLength(
int length) {
349 if (length <= 0)
return 0;
350 if (
static_cast<size_t>(length) > kBufSize)
return static_cast<
int>(kBufSize);
354 void queueReadBytes(i2c_cmd_handle_t cmd,
int length) {
356 i2c_master_read(cmd, rxBuf_, length - 1, I2C_MASTER_ACK);
358 i2c_master_read_byte(cmd, rxBuf_ + (length - 1), I2C_MASTER_NACK);
361 esp_err_t runWriteOnly() {
362 i2c_cmd_handle_t cmd = i2c_cmd_link_create();
363 i2c_master_start(cmd);
364 i2c_master_write_byte(
365 cmd,
static_cast<uint8_t>((address_ << 1) | I2C_MASTER_WRITE),
true);
366 if (txLen_ > 0) i2c_master_write(cmd, txBuf_, txLen_,
true);
367 i2c_master_stop(cmd);
368 const esp_err_t err = i2c_master_cmd_begin(port_, cmd, kTimeout);
369 i2c_cmd_link_delete(cmd);
374 esp_err_t runWriteThenRead(uint8_t address,
int length) {
375 i2c_cmd_handle_t cmd = i2c_cmd_link_create();
376 i2c_master_start(cmd);
377 i2c_master_write_byte(
378 cmd,
static_cast<uint8_t>((address_ << 1) | I2C_MASTER_WRITE),
true);
379 if (txLen_ > 0) i2c_master_write(cmd, txBuf_, txLen_,
true);
380 i2c_master_start(cmd);
381 i2c_master_write_byte(
382 cmd,
static_cast<uint8_t>((address << 1) | I2C_MASTER_READ),
true);
383 queueReadBytes(cmd, length);
384 i2c_master_stop(cmd);
385 const esp_err_t err = i2c_master_cmd_begin(port_, cmd, kTimeout);
386 i2c_cmd_link_delete(cmd);
391 esp_err_t runReadOnly(uint8_t address,
int length) {
392 i2c_cmd_handle_t cmd = i2c_cmd_link_create();
393 i2c_master_start(cmd);
394 i2c_master_write_byte(
395 cmd,
static_cast<uint8_t>((address << 1) | I2C_MASTER_READ),
true);
396 queueReadBytes(cmd, length);
397 i2c_master_stop(cmd);
398 const esp_err_t err = i2c_master_cmd_begin(port_, cmd, kTimeout);
399 i2c_cmd_link_delete(cmd);
Definition: EmulationIDF.h:140
void beginTransaction(SPISettings settings)
Definition: EmulationIDF.h:170
void transfer(void *buf, size_t count)
Definition: EmulationIDF.h:217
SPIClass(spi_host_device_t host)
Definition: EmulationIDF.h:143
bool begin(int sckPin, int misoPin=-1, int mosiPin=-1, int ssPin=-1)
Definition: EmulationIDF.h:149
uint8_t transfer(uint8_t data)
Definition: EmulationIDF.h:203
void endTransaction()
Definition: EmulationIDF.h:199
Definition: EmulationIDF.h:250
size_t requestFrom(int address, int length)
Definition: EmulationIDF.h:309
bool begin(int sdaPin, int sclPin, uint32_t freqHz=100000)
Definition: EmulationIDF.h:257
uint8_t endTransmission(bool sendStop=true)
Definition: EmulationIDF.h:295
int read()
Definition: EmulationIDF.h:329
void write(uint8_t value)
Definition: EmulationIDF.h:286
int available() const
Definition: EmulationIDF.h:325
TwoWire(i2c_port_t port)
Definition: EmulationIDF.h:253
void beginTransmission(uint8_t address)
Definition: EmulationIDF.h:276
Definition: DSIBusESP32.h:19
constexpr int SPI_MODE1
Definition: EmulationIDF.h:115
constexpr int LSBFIRST
Definition: EmulationIDF.h:113
constexpr int SPI_MODE2
Definition: EmulationIDF.h:116
TwoWire Wire
Definition: EmulationIDF.h:406
SPIClass SPI
Definition: EmulationIDF.h:236
constexpr int LOW
Definition: EmulationIDF.h:74
unsigned long millis()
Definition: EmulationDesktop.h:43
constexpr int HIGH
Definition: EmulationIDF.h:73
void delay(uint32_t ms)
Definition: EmulationIDF.h:57
constexpr int SPI_MODE3
Definition: EmulationIDF.h:117
constexpr int INPUT_PULLUP
Definition: EmulationIDF.h:77
constexpr int MSBFIRST
Definition: EmulationIDF.h:112
constexpr int SPI_MODE0
Definition: EmulationIDF.h:114
void pinMode(int pin, int mode)
Definition: EmulationIDF.h:84
constexpr int INPUT
Definition: EmulationIDF.h:75
int digitalRead(int pin)
Reads a GPIO input level, matching Arduino's digitalRead().
Definition: EmulationIDF.h:103
void digitalWrite(int pin, int value)
Sets a GPIO output level, matching Arduino's digitalWrite().
Definition: EmulationIDF.h:97
constexpr int OUTPUT
Definition: EmulationIDF.h:76
Definition: EmulationIDF.h:121
SPISettings(uint32_t clockHz, uint8_t order, uint8_t mode)
Definition: EmulationIDF.h:127
uint8_t bitOrder
Definition: EmulationIDF.h:123
uint8_t dataMode
Definition: EmulationIDF.h:124
uint32_t clock
Definition: EmulationIDF.h:122
SPISettings()
Definition: EmulationIDF.h:126