Merge pull request #3481 from cesanta/spi

unify SPI helper APIs
This commit is contained in:
Sergey Lyubka authored and GitHub committed 2026-04-03 11:39:33 +01:00
commit 02e01f90b9
18 files changed
+75 -104

No files matched your search

+2 -2
View File
@@ -1178,7 +1178,7 @@ static bool cyw_spi_write(unsigned int f, uint32_t addr, void *data,
uint16_t len) {
struct mg_tcpip_driver_cyw_data *d =
(struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;
struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->bus;
struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) d->bus;
uint32_t hdr = CYW_SPID_WR | CYW_SPID_INC | CYW_SPID_FUNC(f) |
CYW_SPID_ADDR(addr) | CYW_SPID_LEN(len); // gSPI header
// TODO(scaprile): check spin in between and timeout values, return false
@@ -1208,7 +1208,7 @@ static void cyw_spi_read(unsigned int f, uint32_t addr, void *data,
uint16_t len) {
struct mg_tcpip_driver_cyw_data *d =
(struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;
struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->bus;
struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) d->bus;
uint32_t padding =
f == CYW_SPID_FUNC_CHIP
? 4
-8
View File
@@ -4,14 +4,6 @@
((defined(MG_ENABLE_DRIVER_CYW) && MG_ENABLE_DRIVER_CYW) || \
(defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO))
struct mg_tcpip_spi_ {
void *spi; // Opaque SPI bus descriptor
void (*begin)(void *); // SPI begin: slave select low
void (*end)(void *); // SPI end: slave select high
void (*txn)(void *, uint8_t *, uint8_t *,
size_t len); // SPI transaction: write-read len bytes
};
struct mg_tcpip_driver_cyw_firmware {
const uint8_t *code_addr;
size_t code_len;
+1 -1
View File
@@ -439,7 +439,7 @@ static size_t st67w6_spi_poll(uint8_t *write, uint8_t *read) {
struct mg_tcpip_driver_st67w6_data *d =
(struct mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;
struct spi_hdr *th, *rh = (struct spi_hdr *) read;
struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->spi;
struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) d->spi;
size_t padded;
unsigned int times;
-8
View File
@@ -3,14 +3,6 @@
#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_ST67W6) && \
MG_ENABLE_DRIVER_ST67W6
struct mg_tcpip_spi_ {
void *spi; // Opaque SPI bus descriptor
void (*begin)(void *); // SPI begin: slave select low
void (*end)(void *); // SPI end: slave select high
void (*txn)(void *, uint8_t *, uint8_t *,
size_t len); // SPI transaction: write-read len bytes
};
struct mg_tcpip_driver_st67w6_data {
struct mg_wifi_data wifi;
void *spi;
+3 -7
View File
@@ -4,16 +4,12 @@
static void w5100_txn(struct mg_tcpip_spi *s, uint16_t addr, bool wr, void *buf,
size_t len) {
size_t i;
uint8_t *p = (uint8_t *) buf;
uint8_t control = wr ? 0xF0 : 0x0F;
uint8_t cmd[] = {control, (uint8_t) (addr >> 8), (uint8_t) (addr & 255)};
s->begin(s->spi);
for (i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]);
for (i = 0; i < len; i++) {
uint8_t r = s->txn(s->spi, p[i]);
if (!wr) p[i] = r;
}
s->txn(s->spi, cmd, NULL, sizeof(cmd));
if (wr) s->txn(s->spi, (uint8_t *) buf, NULL, len);
if (!wr) s->txn(s->spi, NULL, (uint8_t *) buf, len);
s->end(s->spi);
}
+3 -7
View File
@@ -6,16 +6,12 @@ enum { W5500_CR = 0, W5500_S0 = 1, W5500_TX0 = 2, W5500_RX0 = 3 };
static void w5500_txn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr,
bool wr, void *buf, size_t len) {
size_t i;
uint8_t *p = (uint8_t *) buf;
uint8_t cmd[] = {(uint8_t) (addr >> 8), (uint8_t) (addr & 255),
(uint8_t) ((block << 3) | (wr ? 4 : 0))};
s->begin(s->spi);
for (i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]);
for (i = 0; i < len; i++) {
uint8_t r = s->txn(s->spi, p[i]);
if (!wr) p[i] = r;
}
s->txn(s->spi, cmd, NULL, sizeof(cmd));
if (wr) s->txn(s->spi, (uint8_t *) buf, NULL, len);
if (!wr) s->txn(s->spi, NULL, (uint8_t *) buf, len);
s->end(s->spi);
}
+5 -4
View File
@@ -122,10 +122,11 @@ extern struct mg_tcpip_driver mg_tcpip_driver_atcmd;
// Drivers that require SPI, can use this SPI abstraction
struct mg_tcpip_spi {
void *spi; // Opaque SPI bus descriptor
void (*begin)(void *); // SPI begin: slave select low
void (*end)(void *); // SPI end: slave select high
uint8_t (*txn)(void *, uint8_t); // SPI transaction: write 1 byte, read reply
void *spi; // Opaque SPI bus descriptor
void (*begin)(void *); // SPI begin: slave select active
void (*end)(void *); // SPI end: slave select inactive
void (*txn)(void *, uint8_t *write, uint8_t *read,
size_t len); // SPI transaction: write-read len bytes
};
// Alignment and memory section requirements