Add struct mip_spi for SPI drivers, and skeleton for enc28j60 driver

This commit is contained in:
cpq 2022-08-31 08:34:38 +01:00
parent 3cf85770c7
commit 8a61969c8f
6 changed files with 67 additions and 32 deletions

View File

@ -1,6 +1,3 @@
// Copyright (c) 2022 Cesanta Software Limited
// All rights reserved
#include "mip.h"
#if MG_ENABLE_MIP && defined(__arm__)
@ -120,10 +117,10 @@ static size_t mip_driver_stm32_tx(const void *buf, size_t len, void *userdata) {
(void) userdata;
}
static bool mip_driver_stm32_status(void *userdata) {
static bool mip_driver_stm32_up(void *userdata) {
uint32_t bsr = eth_read_phy(PHY_ADDR, PHY_BSR);
return bsr & BIT(2) ? 1 : 0;
(void) userdata;
return bsr & BIT(2) ? 1 : 0;
}
void ETH_IRQHandler(void);
@ -144,6 +141,6 @@ void ETH_IRQHandler(void) {
struct mip_driver mip_driver_stm32 = {.init = mip_driver_stm32_init,
.tx = mip_driver_stm32_tx,
.rxcb = mip_driver_stm32_setrx,
.status = mip_driver_stm32_status};
.setrx = mip_driver_stm32_setrx,
.up = mip_driver_stm32_up};
#endif // MG_ENABLE_MIP

View File

@ -681,8 +681,8 @@ static void mip_poll(struct mip_if *ifp, uint64_t uptime_ms) {
}
// Handle physical interface up/down status
if (ifp->driver->status) {
bool up = ifp->driver->status(ifp->driver_data);
if (ifp->driver->up) {
bool up = ifp->driver->up(ifp->driver_data);
bool current = ifp->state != MIP_STATE_DOWN;
if (up != current) {
ifp->state = up == false ? MIP_STATE_DOWN
@ -713,7 +713,7 @@ static void on_rx(void *buf, size_t len, void *userdata) {
void mip_init(struct mg_mgr *mgr, struct mip_ipcfg *ipcfg,
struct mip_driver *driver, void *driver_data) {
size_t maxpktsize = 1500, qlen = driver->rxcb ? 1024 * 16 : 0;
size_t maxpktsize = 1500, qlen = driver->setrx ? 1024 * 16 : 0;
struct mip_if *ifp =
(struct mip_if *) calloc(1, sizeof(*ifp) + 2 * maxpktsize + qlen);
memcpy(ifp->mac, ipcfg->mac, sizeof(ifp->mac));
@ -727,7 +727,7 @@ void mip_init(struct mg_mgr *mgr, struct mip_ipcfg *ipcfg,
ifp->queue.buf = ifp->tx.buf + maxpktsize;
ifp->queue.len = qlen;
if (driver->init) driver->init(ipcfg->mac, driver_data);
if (driver->rxcb) driver->rxcb(on_rx, ifp);
if (driver->setrx) driver->setrx(on_rx, ifp);
mgr->priv = ifp;
mgr->extraconnsize = sizeof(struct tcpstate);
}

View File

@ -7,9 +7,9 @@ struct mip_driver {
void (*init)(uint8_t *mac, void *data); // Initialise driver
size_t (*tx)(const void *, size_t, void *data); // Transmit frame
size_t (*rx)(void *buf, size_t len, void *data); // Receive frame (polling)
bool (*status)(void *data); // Up/down status
bool (*up)(void *data); // Up/down status
// Set receive callback for interrupt-driven drivers
void (*rxcb)(void (*fn)(void *buf, size_t len, void *rxdata), void *rxdata);
void (*setrx)(void (*fn)(void *buf, size_t len, void *rxdata), void *rxdata);
};
struct mip_ipcfg {
@ -20,3 +20,12 @@ struct mip_ipcfg {
void mip_init(struct mg_mgr *, struct mip_ipcfg *, struct mip_driver *, void *);
extern struct mip_driver mip_driver_stm32;
extern struct mip_driver mip_driver_enc28j60;
// Drivers that require SPI, can use this SPI abstraction
struct mip_spi {
void *spi; // Opaque SPI bus descriptor
uint8_t (*txn)(void *, uint8_t); // SPI transaction: write 1 byte, read reply
void (*begin)(void *); // SPI begin: slave select low
void (*end)(void *); // SPI end: slave select high
};

View File

@ -4970,9 +4970,6 @@ char *mg_remove_double_dots(char *s) {
#ifdef MG_ENABLE_LINES
#line 1 "src/timer.c"
#endif
// Copyright (c) Cesanta Software Limited
// All rights reserved
@ -5928,12 +5925,38 @@ size_t mg_ws_wrap(struct mg_connection *c, size_t len, int op) {
return c->send.len;
}
#ifdef MG_ENABLE_LINES
#line 1 "mip/driver_enc28j60.c"
#endif
static void mip_driver_enc28j60_init(uint8_t *mac, void *data) {
(void) mac, (void) data;
}
static size_t mip_driver_enc28j60_tx(const void *buf, size_t len, void *data) {
(void) buf, (void) len, (void) data;
return 0;
}
static size_t mip_driver_enc28j60_rx(void *buf, size_t len, void *data) {
(void) buf, (void) len, (void) data;
return 0;
}
static bool mip_driver_enc28j60_up(void *data) {
(void) data;
return false;
}
struct mip_driver mip_driver_enc28j60 = {.init = mip_driver_enc28j60_init,
.tx = mip_driver_enc28j60_tx,
.rx = mip_driver_enc28j60_rx,
.up = mip_driver_enc28j60_up};
#ifdef MG_ENABLE_LINES
#line 1 "mip/driver_stm32.c"
#endif
// Copyright (c) 2022 Cesanta Software Limited
// All rights reserved
#if MG_ENABLE_MIP && defined(__arm__)
@ -6053,10 +6076,10 @@ static size_t mip_driver_stm32_tx(const void *buf, size_t len, void *userdata) {
(void) userdata;
}
static bool mip_driver_stm32_status(void *userdata) {
static bool mip_driver_stm32_up(void *userdata) {
uint32_t bsr = eth_read_phy(PHY_ADDR, PHY_BSR);
return bsr & BIT(2) ? 1 : 0;
(void) userdata;
return bsr & BIT(2) ? 1 : 0;
}
void ETH_IRQHandler(void);
@ -6077,8 +6100,8 @@ void ETH_IRQHandler(void) {
struct mip_driver mip_driver_stm32 = {.init = mip_driver_stm32_init,
.tx = mip_driver_stm32_tx,
.rxcb = mip_driver_stm32_setrx,
.status = mip_driver_stm32_status};
.setrx = mip_driver_stm32_setrx,
.up = mip_driver_stm32_up};
#endif // MG_ENABLE_MIP
#ifdef MG_ENABLE_LINES
@ -6767,8 +6790,8 @@ static void mip_poll(struct mip_if *ifp, uint64_t uptime_ms) {
}
// Handle physical interface up/down status
if (ifp->driver->status) {
bool up = ifp->driver->status(ifp->driver_data);
if (ifp->driver->up) {
bool up = ifp->driver->up(ifp->driver_data);
bool current = ifp->state != MIP_STATE_DOWN;
if (up != current) {
ifp->state = up == false ? MIP_STATE_DOWN
@ -6799,7 +6822,7 @@ static void on_rx(void *buf, size_t len, void *userdata) {
void mip_init(struct mg_mgr *mgr, struct mip_ipcfg *ipcfg,
struct mip_driver *driver, void *driver_data) {
size_t maxpktsize = 1500, qlen = driver->rxcb ? 1024 * 16 : 0;
size_t maxpktsize = 1500, qlen = driver->setrx ? 1024 * 16 : 0;
struct mip_if *ifp =
(struct mip_if *) calloc(1, sizeof(*ifp) + 2 * maxpktsize + qlen);
memcpy(ifp->mac, ipcfg->mac, sizeof(ifp->mac));
@ -6813,7 +6836,7 @@ void mip_init(struct mg_mgr *mgr, struct mip_ipcfg *ipcfg,
ifp->queue.buf = ifp->tx.buf + maxpktsize;
ifp->queue.len = qlen;
if (driver->init) driver->init(ipcfg->mac, driver_data);
if (driver->rxcb) driver->rxcb(on_rx, ifp);
if (driver->setrx) driver->setrx(on_rx, ifp);
mgr->priv = ifp;
mgr->extraconnsize = sizeof(struct tcpstate);
}

View File

@ -1426,9 +1426,9 @@ struct mip_driver {
void (*init)(uint8_t *mac, void *data); // Initialise driver
size_t (*tx)(const void *, size_t, void *data); // Transmit frame
size_t (*rx)(void *buf, size_t len, void *data); // Receive frame (polling)
bool (*status)(void *data); // Up/down status
bool (*up)(void *data); // Up/down status
// Set receive callback for interrupt-driven drivers
void (*rxcb)(void (*fn)(void *buf, size_t len, void *rxdata), void *rxdata);
void (*setrx)(void (*fn)(void *buf, size_t len, void *rxdata), void *rxdata);
};
struct mip_ipcfg {
@ -1439,6 +1439,15 @@ struct mip_ipcfg {
void mip_init(struct mg_mgr *, struct mip_ipcfg *, struct mip_driver *, void *);
extern struct mip_driver mip_driver_stm32;
extern struct mip_driver mip_driver_enc28j60;
// Drivers that require SPI, can use this SPI abstraction
struct mip_spi {
void *spi; // Opaque SPI bus descriptor
uint8_t (*txn)(void *, uint8_t); // SPI transaction: write 1 byte, read reply
void (*begin)(void *); // SPI begin: slave select low
void (*end)(void *); // SPI end: slave select high
};
#ifdef __cplusplus
}

View File

@ -1,6 +1,3 @@
// Copyright (c) Cesanta Software Limited
// All rights reserved
#include "timer.h"
#include "arch.h"