drivers/enc28j60: cleanup

Simplify usage of params via MACROs and copy params struct instead
of (re)assigning values to driver struct. Overall code cleanup.
This commit is contained in:
smlng 2018-09-05 13:18:16 +02:00
parent 17b14cd8a0
commit 4759f691fc
3 changed files with 45 additions and 47 deletions

View File

@ -34,6 +34,10 @@
#define ENABLE_DEBUG (0) #define ENABLE_DEBUG (0)
#include "debug.h" #include "debug.h"
#define SPI_BUS (dev->p.spi)
#define CS_PIN (dev->p.cs_pin)
#define INT_PIN (dev->p.int_pin)
#define RST_PIN (dev->p.rst_pin)
/** /**
* @brief Amount of time to hold the reset pin low on reset * @brief Amount of time to hold the reset pin low on reset
*/ */
@ -90,9 +94,9 @@ static void switch_bank(enc28j60_t *dev, int8_t bank)
return; return;
} }
/* clear old value */ /* clear old value */
spi_transfer_reg(dev->spi, dev->cs_pin, (CMD_BFC | REG_ECON1), 0x03); spi_transfer_reg(SPI_BUS, CS_PIN, (CMD_BFC | REG_ECON1), 0x03);
/* set new value */ /* set new value */
spi_transfer_reg(dev->spi, dev->cs_pin, (CMD_BFS | REG_ECON1), bank); spi_transfer_reg(SPI_BUS, CS_PIN, (CMD_BFS | REG_ECON1), bank);
/* remember active bank */ /* remember active bank */
dev->bank = bank; dev->bank = bank;
} }
@ -102,13 +106,13 @@ static uint8_t cmd_rcr(enc28j60_t *dev, uint8_t reg, int8_t bank)
uint8_t res; uint8_t res;
/* start transaction */ /* start transaction */
spi_acquire(dev->spi, dev->cs_pin, SPI_MODE_0, SPI_CLK); spi_acquire(SPI_BUS, CS_PIN, SPI_MODE_0, SPI_CLK);
switch_bank(dev, bank); switch_bank(dev, bank);
res = spi_transfer_reg(dev->spi, dev->cs_pin, (CMD_RCR | reg), 0); res = spi_transfer_reg(SPI_BUS, CS_PIN, (CMD_RCR | reg), 0);
/* finish SPI transaction */ /* finish SPI transaction */
spi_release(dev->spi); spi_release(SPI_BUS);
return res; return res;
} }
@ -118,13 +122,13 @@ static uint8_t cmd_rcr_miimac(enc28j60_t *dev, uint8_t reg, int8_t bank)
char res[2]; char res[2];
/* start transaction */ /* start transaction */
spi_acquire(dev->spi, dev->cs_pin, SPI_MODE_0, SPI_CLK); spi_acquire(SPI_BUS, CS_PIN, SPI_MODE_0, SPI_CLK);
switch_bank(dev, bank); switch_bank(dev, bank);
spi_transfer_regs(dev->spi, dev->cs_pin, (CMD_RCR | reg), NULL, res, 2); spi_transfer_regs(SPI_BUS, CS_PIN, (CMD_RCR | reg), NULL, res, 2);
/* finish SPI transaction */ /* finish SPI transaction */
spi_release(dev->spi); spi_release(SPI_BUS);
return (uint8_t)res[1]; return (uint8_t)res[1];
} }
@ -132,37 +136,37 @@ static uint8_t cmd_rcr_miimac(enc28j60_t *dev, uint8_t reg, int8_t bank)
static void cmd_wcr(enc28j60_t *dev, uint8_t reg, int8_t bank, uint8_t value) static void cmd_wcr(enc28j60_t *dev, uint8_t reg, int8_t bank, uint8_t value)
{ {
/* start transaction */ /* start transaction */
spi_acquire(dev->spi, dev->cs_pin, SPI_MODE_0, SPI_CLK); spi_acquire(SPI_BUS, CS_PIN, SPI_MODE_0, SPI_CLK);
switch_bank(dev, bank); switch_bank(dev, bank);
spi_transfer_reg(dev->spi, dev->cs_pin, (CMD_WCR | reg), value); spi_transfer_reg(SPI_BUS, CS_PIN, (CMD_WCR | reg), value);
/* finish SPI transaction */ /* finish SPI transaction */
spi_release(dev->spi); spi_release(SPI_BUS);
} }
static void cmd_bfs(enc28j60_t *dev, uint8_t reg, int8_t bank, uint8_t mask) static void cmd_bfs(enc28j60_t *dev, uint8_t reg, int8_t bank, uint8_t mask)
{ {
/* start transaction */ /* start transaction */
spi_acquire(dev->spi, dev->cs_pin, SPI_MODE_0, SPI_CLK); spi_acquire(SPI_BUS, CS_PIN, SPI_MODE_0, SPI_CLK);
switch_bank(dev, bank); switch_bank(dev, bank);
spi_transfer_reg(dev->spi, dev->cs_pin, (CMD_BFS | reg), mask); spi_transfer_reg(SPI_BUS, CS_PIN, (CMD_BFS | reg), mask);
/* finish SPI transaction */ /* finish SPI transaction */
spi_release(dev->spi); spi_release(SPI_BUS);
} }
static void cmd_bfc(enc28j60_t *dev, uint8_t reg, int8_t bank, uint8_t mask) static void cmd_bfc(enc28j60_t *dev, uint8_t reg, int8_t bank, uint8_t mask)
{ {
/* start transaction */ /* start transaction */
spi_acquire(dev->spi, dev->cs_pin, SPI_MODE_0, SPI_CLK); spi_acquire(SPI_BUS, CS_PIN, SPI_MODE_0, SPI_CLK);
switch_bank(dev, bank); switch_bank(dev, bank);
spi_transfer_reg(dev->spi, dev->cs_pin, (CMD_BFC | reg), mask); spi_transfer_reg(SPI_BUS, CS_PIN, (CMD_BFC | reg), mask);
/* finish SPI transaction */ /* finish SPI transaction */
spi_release(dev->spi); spi_release(SPI_BUS);
} }
static uint16_t cmd_r_addr(enc28j60_t *dev, uint8_t addr) static uint16_t cmd_r_addr(enc28j60_t *dev, uint8_t addr)
@ -205,21 +209,21 @@ static void cmd_w_phy(enc28j60_t *dev, uint8_t reg, uint16_t val)
static void cmd_rbm(enc28j60_t *dev, uint8_t *data, size_t len) static void cmd_rbm(enc28j60_t *dev, uint8_t *data, size_t len)
{ {
/* start transaction */ /* start transaction */
spi_acquire(dev->spi, dev->cs_pin, SPI_MODE_0, SPI_CLK); spi_acquire(SPI_BUS, CS_PIN, SPI_MODE_0, SPI_CLK);
/* transfer data */ /* transfer data */
spi_transfer_regs(dev->spi, dev->cs_pin, CMD_RBM, NULL, data, len); spi_transfer_regs(SPI_BUS, CS_PIN, CMD_RBM, NULL, data, len);
/* finish SPI transaction */ /* finish SPI transaction */
spi_release(dev->spi); spi_release(SPI_BUS);
} }
static void cmd_wbm(enc28j60_t *dev, uint8_t *data, size_t len) static void cmd_wbm(enc28j60_t *dev, uint8_t *data, size_t len)
{ {
/* start transaction */ /* start transaction */
spi_acquire(dev->spi, dev->cs_pin, SPI_MODE_0, SPI_CLK); spi_acquire(SPI_BUS, CS_PIN, SPI_MODE_0, SPI_CLK);
/* transfer data */ /* transfer data */
spi_transfer_regs(dev->spi, dev->cs_pin, CMD_WBM, data, NULL, len); spi_transfer_regs(SPI_BUS, CS_PIN, CMD_WBM, data, NULL, len);
/* finish SPI transaction */ /* finish SPI transaction */
spi_release(dev->spi); spi_release(SPI_BUS);
} }
static void mac_get(enc28j60_t *dev, uint8_t *mac) static void mac_get(enc28j60_t *dev, uint8_t *mac)
@ -254,7 +258,7 @@ static int nd_send(netdev_t *netdev, const iolist_t *iolist)
uint8_t ctrl = 0; uint8_t ctrl = 0;
int c = 0; int c = 0;
mutex_lock(&dev->devlock); mutex_lock(&dev->lock);
if (cmd_rcr(dev, REG_ECON1, -1) & ECON1_TXRTS) { if (cmd_rcr(dev, REG_ECON1, -1) & ECON1_TXRTS) {
/* there is already a transmission in progress */ /* there is already a transmission in progress */
@ -271,7 +275,7 @@ static int nd_send(netdev_t *netdev, const iolist_t *iolist)
* otherwise we suppose that the transmission is still in progress * otherwise we suppose that the transmission is still in progress
* and return EBUSY * and return EBUSY
*/ */
mutex_unlock(&dev->devlock); mutex_unlock(&dev->lock);
return -EBUSY; return -EBUSY;
} }
} }
@ -297,7 +301,7 @@ static int nd_send(netdev_t *netdev, const iolist_t *iolist)
netdev->stats.tx_bytes += c; netdev->stats.tx_bytes += c;
#endif #endif
mutex_unlock(&dev->devlock); mutex_unlock(&dev->lock);
return c; return c;
} }
@ -319,7 +323,7 @@ static int nd_recv(netdev_t *netdev, void *buf, size_t max_len, void *info)
uint16_t next; uint16_t next;
(void)info; (void)info;
mutex_lock(&dev->devlock); mutex_lock(&dev->lock);
/* set read pointer to RX read address */ /* set read pointer to RX read address */
uint16_t rx_rd_ptr = cmd_r_addr(dev, ADDR_RX_READ); uint16_t rx_rd_ptr = cmd_r_addr(dev, ADDR_RX_READ);
@ -347,7 +351,7 @@ static int nd_recv(netdev_t *netdev, void *buf, size_t max_len, void *info)
cmd_bfs(dev, REG_ECON2, -1, ECON2_PKTDEC); cmd_bfs(dev, REG_ECON2, -1, ECON2_PKTDEC);
} }
mutex_unlock(&dev->devlock); mutex_unlock(&dev->lock);
return (int)size; return (int)size;
} }
@ -358,21 +362,21 @@ static int nd_init(netdev_t *netdev)
uint8_t tmp; uint8_t tmp;
/* get exclusive access of the device */ /* get exclusive access of the device */
mutex_lock(&dev->devlock); mutex_lock(&dev->lock);
/* setup the low-level interfaces */ /* setup the low-level interfaces */
gpio_init(dev->reset_pin, GPIO_OUT); gpio_init(RST_PIN, GPIO_OUT);
gpio_clear(dev->reset_pin); /* this puts the device into reset state */ gpio_clear(RST_PIN); /* this puts the device into reset state */
res = spi_init_cs(dev->spi, dev->cs_pin); res = spi_init_cs(SPI_BUS, CS_PIN);
if (res != SPI_OK) { if (res != SPI_OK) {
DEBUG("[enc28j60] init: error initializing the CS pin [%i]\n", res); DEBUG("[enc28j60] init: error initializing the CS pin [%i]\n", res);
return -1; return -1;
} }
gpio_init_int(dev->int_pin, GPIO_IN, GPIO_FALLING, on_int, (void *)dev); gpio_init_int(INT_PIN, GPIO_IN, GPIO_FALLING, on_int, (void *)dev);
/* wait at least 1ms and then release device from reset state */ /* wait at least 1ms and then release device from reset state */
xtimer_usleep(DELAY_RESET); xtimer_usleep(DELAY_RESET);
gpio_set(dev->reset_pin); gpio_set(RST_PIN);
/* wait for oscillator to be stable before proceeding */ /* wait for oscillator to be stable before proceeding */
res = 0; res = 0;
@ -442,7 +446,7 @@ static int nd_init(netdev_t *netdev)
#ifdef MODULE_NETSTATS_L2 #ifdef MODULE_NETSTATS_L2
memset(&netdev->stats, 0, sizeof(netstats_t)); memset(&netdev->stats, 0, sizeof(netstats_t));
#endif #endif
mutex_unlock(&dev->devlock); mutex_unlock(&dev->lock);
return 0; return 0;
} }
@ -536,11 +540,8 @@ static const netdev_driver_t netdev_driver_enc28j60 = {
void enc28j60_setup(enc28j60_t *dev, const enc28j60_params_t *params) void enc28j60_setup(enc28j60_t *dev, const enc28j60_params_t *params)
{ {
dev->netdev.driver = &netdev_driver_enc28j60; dev->netdev.driver = &netdev_driver_enc28j60;
dev->spi = params->spi;
dev->cs_pin = params->cs_pin;
dev->int_pin = params->int_pin;
dev->reset_pin = params->reset_pin;
mutex_init(&dev->devlock);
dev->bank = 99; /* mark as invalid */ dev->bank = 99; /* mark as invalid */
dev->p = *params;
mutex_init(&dev->lock);
dev->tx_time = 0; dev->tx_time = 0;
} }

View File

@ -46,7 +46,7 @@ extern "C" {
#define ENC28J60_PARAMS { .spi = ENC28J60_PARAM_SPI, \ #define ENC28J60_PARAMS { .spi = ENC28J60_PARAM_SPI, \
.cs_pin = ENC28J60_PARAM_CS, \ .cs_pin = ENC28J60_PARAM_CS, \
.int_pin = ENC28J60_PARAM_INT, \ .int_pin = ENC28J60_PARAM_INT, \
.reset_pin = ENC28J60_PARAM_RESET } .rst_pin = ENC28J60_PARAM_RESET }
#endif #endif
/** @} */ /** @} */

View File

@ -39,7 +39,7 @@ typedef struct {
spi_t spi; /**< If I drink */ spi_t spi; /**< If I drink */
gpio_t cs_pin; /**< beer in the evening, */ gpio_t cs_pin; /**< beer in the evening, */
gpio_t int_pin; /**< I will be most certainly */ gpio_t int_pin; /**< I will be most certainly */
gpio_t reset_pin; /**< drunk in the morning?! */ gpio_t rst_pin; /**< drunk in the morning?! */
} enc28j60_params_t; } enc28j60_params_t;
/** /**
@ -47,12 +47,9 @@ typedef struct {
*/ */
typedef struct { typedef struct {
netdev_t netdev; /**< pull in the netdev fields */ netdev_t netdev; /**< pull in the netdev fields */
spi_t spi; /**< SPI bus the transceiver is connected to */
gpio_t cs_pin; /**< pin connected to the CHIP SELECT line */
gpio_t int_pin; /**< pin connected to the INT line */
gpio_t reset_pin; /**< pin connected to the RESET line */
mutex_t devlock; /**< lock the device on access */
int8_t bank; /**< remember the active register bank */ int8_t bank; /**< remember the active register bank */
enc28j60_params_t p; /**< SPI and pin confiuration */
mutex_t lock; /**< lock the device on access */
uint32_t tx_time; /**< last transmission time for timeout handling */ uint32_t tx_time; /**< last transmission time for timeout handling */
} enc28j60_t; } enc28j60_t;