Skip to content

Commit fc994f3

Browse files
committed
net: change enc28j60 to new SPI API
Signed-off-by: Matthias Boesl <[email protected]>
1 parent 4c01e1a commit fc994f3

File tree

3 files changed

+116
-40
lines changed

3 files changed

+116
-40
lines changed

drivers/ethernet/Kconfig.enc28j60

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,17 @@ config ETH_ENC28J60_0_SPI_PORT_NAME
7777
help
7878
Master SPI port name through which ENC28J60C chip is accessed.
7979

80-
config ETH_ENC28J60_0_SLAVE
81-
hex "ETH_ENC28J60 SPI slave select pin"
82-
default 1
80+
config ETH_ENC28J60_0_SPI_CS_PORT_NAME
81+
string "SPI cs port name"
82+
default "GPIOB"
8383
help
84-
ENC28J60C chip select pin.
84+
Master SPI port name through which ENC28J60C chip is accessed.
85+
86+
config ETH_ENC28J60_0_SPI_CS_PIN
87+
int "SPI CS pin"
88+
default 12
89+
help
90+
CS pin used for the SPI device
8591

8692
config ETH_ENC28J60_0_SPI_BUS_FREQ
8793
int "ENC28J60C SPI bus speed in Hz"

drivers/ethernet/eth_enc28j60.c

Lines changed: 103 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,14 @@ static int eth_enc28j60_soft_reset(struct device *dev)
3030
struct eth_enc28j60_runtime *context = dev->driver_data;
3131
u8_t tx_buf[2] = {ENC28J60_SPI_SC, 0xFF};
3232

33-
return spi_write(context->spi, tx_buf, 2);
33+
const struct spi_buf tx_bufs[] = {
34+
{
35+
.buf = tx_buf,
36+
.len = sizeof(tx_buf),
37+
},
38+
};
39+
40+
return spi_write(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs));
3441
}
3542

3643
static void eth_enc28j60_set_bank(struct device *dev, u16_t reg_addr)
@@ -43,12 +50,19 @@ static void eth_enc28j60_set_bank(struct device *dev, u16_t reg_addr)
4350
tx_buf[0] = ENC28J60_SPI_RCR | ENC28J60_REG_ECON1;
4451
tx_buf[1] = 0x0;
4552

46-
spi_transceive(context->spi, tx_buf, 2, tx_buf, 2);
53+
struct spi_buf tx_bufs[] = {
54+
{
55+
.buf = tx_buf,
56+
.len = sizeof(tx_buf),
57+
},
58+
};
59+
60+
spi_transceive(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs), tx_bufs, ARRAY_SIZE(tx_bufs));
4761

4862
tx_buf[0] = ENC28J60_SPI_WCR | ENC28J60_REG_ECON1;
4963
tx_buf[1] = (tx_buf[1] & 0xFC) | ((reg_addr >> 8) & 0x0F);
5064

51-
spi_write(context->spi, tx_buf, 2);
65+
spi_write(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs));
5266

5367
k_sem_give(&context->spi_sem);
5468
}
@@ -64,7 +78,14 @@ static void eth_enc28j60_write_reg(struct device *dev, u16_t reg_addr,
6478
tx_buf[0] = ENC28J60_SPI_WCR | (reg_addr & 0xFF);
6579
tx_buf[1] = value;
6680

67-
spi_write(context->spi, tx_buf, 2);
81+
const struct spi_buf tx_bufs[] = {
82+
{
83+
.buf = tx_buf,
84+
.len = sizeof(tx_buf),
85+
},
86+
};
87+
88+
spi_write(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs));
6889

6990
k_sem_give(&context->spi_sem);
7091
}
@@ -85,7 +106,14 @@ static void eth_enc28j60_read_reg(struct device *dev, u16_t reg_addr,
85106
tx_buf[0] = ENC28J60_SPI_RCR | (reg_addr & 0xFF);
86107
tx_buf[1] = 0x0;
87108

88-
spi_transceive(context->spi, tx_buf, tx_size, tx_buf, tx_size);
109+
struct spi_buf tx_bufs[] = {
110+
{
111+
.buf = tx_buf,
112+
.len = sizeof(tx_buf),
113+
},
114+
};
115+
116+
spi_transceive(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs), tx_bufs, ARRAY_SIZE(tx_bufs));
89117

90118
*value = tx_buf[tx_size - 1];
91119

@@ -103,7 +131,14 @@ static void eth_enc28j60_set_eth_reg(struct device *dev, u16_t reg_addr,
103131
tx_buf[0] = ENC28J60_SPI_BFS | (reg_addr & 0xFF);
104132
tx_buf[1] = value;
105133

106-
spi_write(context->spi, tx_buf, 2);
134+
const struct spi_buf tx_bufs[] = {
135+
{
136+
.buf = tx_buf,
137+
.len = sizeof(tx_buf),
138+
},
139+
};
140+
141+
spi_write(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs));
107142

108143
k_sem_give(&context->spi_sem);
109144
}
@@ -120,7 +155,14 @@ static void eth_enc28j60_clear_eth_reg(struct device *dev, u16_t reg_addr,
120155
tx_buf[0] = ENC28J60_SPI_BFC | (reg_addr & 0xFF);
121156
tx_buf[1] = value;
122157

123-
spi_write(context->spi, tx_buf, 2);
158+
const struct spi_buf tx_bufs[] = {
159+
{
160+
.buf = tx_buf,
161+
.len = sizeof(tx_buf),
162+
},
163+
};
164+
165+
spi_write(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs));
124166

125167
k_sem_give(&context->spi_sem);
126168
}
@@ -143,14 +185,29 @@ static void eth_enc28j60_write_mem(struct device *dev, u8_t *data_buffer,
143185
++i, index_buf += MAX_BUFFER_LENGTH) {
144186
context->mem_buf[0] = ENC28J60_SPI_WBM;
145187
memcpy(context->mem_buf + 1, index_buf, MAX_BUFFER_LENGTH);
146-
spi_write(context->spi,
147-
context->mem_buf, MAX_BUFFER_LENGTH + 1);
188+
189+
const struct spi_buf tx_bufs[] = {
190+
{
191+
.buf = context->mem_buf,
192+
.len = MAX_BUFFER_LENGTH + 1,
193+
},
194+
};
195+
196+
spi_write(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs));
148197
}
149198

150199
if (num_remaining > 0) {
151200
context->mem_buf[0] = ENC28J60_SPI_WBM;
152201
memcpy(context->mem_buf + 1, index_buf, num_remaining);
153-
spi_write(context->spi, context->mem_buf, num_remaining + 1);
202+
203+
const struct spi_buf tx_bufs[] = {
204+
{
205+
.buf = context->mem_buf,
206+
.len = num_remaining + 1,
207+
},
208+
};
209+
210+
spi_write(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs));
154211
}
155212

156213
k_sem_give(&context->spi_sem);
@@ -171,9 +228,16 @@ static void eth_enc28j60_read_mem(struct device *dev, u8_t *data_buffer,
171228
for (int i = 0; i < num_segments;
172229
++i, data_buffer += MAX_BUFFER_LENGTH) {
173230
context->mem_buf[0] = ENC28J60_SPI_RBM;
174-
spi_transceive(context->spi,
175-
context->mem_buf, MAX_BUFFER_LENGTH + 1,
176-
context->mem_buf, MAX_BUFFER_LENGTH + 1);
231+
232+
struct spi_buf tx_bufs[] = {
233+
{
234+
.buf = context->mem_buf,
235+
.len = MAX_BUFFER_LENGTH + 1,
236+
},
237+
};
238+
239+
spi_transceive(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs), tx_bufs, ARRAY_SIZE(tx_bufs));
240+
177241
if (data_buffer) {
178242
memcpy(data_buffer, context->mem_buf + 1,
179243
MAX_BUFFER_LENGTH);
@@ -182,9 +246,16 @@ static void eth_enc28j60_read_mem(struct device *dev, u8_t *data_buffer,
182246

183247
if (num_remaining > 0) {
184248
context->mem_buf[0] = ENC28J60_SPI_RBM;
185-
spi_transceive(context->spi,
186-
context->mem_buf, num_remaining + 1,
187-
context->mem_buf, num_remaining + 1);
249+
250+
struct spi_buf tx_bufs[] = {
251+
{
252+
.buf = context->mem_buf,
253+
.len = num_remaining + 1,
254+
},
255+
};
256+
257+
spi_transceive(&context->spi_cfg, tx_bufs, ARRAY_SIZE(tx_bufs), tx_bufs, ARRAY_SIZE(tx_bufs));
258+
188259
if (data_buffer) {
189260
memcpy(data_buffer, context->mem_buf + 1,
190261
num_remaining);
@@ -335,7 +406,12 @@ static int eth_enc28j60_init(struct device *dev)
335406
{
336407
const struct eth_enc28j60_config *config = dev->config->config_info;
337408
struct eth_enc28j60_runtime *context = dev->driver_data;
338-
struct spi_config spi_cfg;
409+
410+
/* SPI config */
411+
context->spi_cfg.operation = SPI_WORD_SET(8);
412+
context->spi_cfg.frequency = config->spi_freq;
413+
context->spi_cfg.slave = 0;
414+
context->spi_cfg.cs->gpio_pin = config->spi_cs_pin;
339415

340416
k_sem_init(&context->spi_sem, 0, UINT_MAX);
341417
k_sem_give(&context->spi_sem);
@@ -346,12 +422,18 @@ static int eth_enc28j60_init(struct device *dev)
346422
return -EINVAL;
347423
}
348424

349-
context->spi = device_get_binding((char *)config->spi_port);
350-
if (!context->spi) {
425+
context->spi_cfg.dev = device_get_binding((char *)config->spi_port);
426+
if (!context->spi_cfg.dev) {
351427
SYS_LOG_ERR("SPI master port %s not found", config->spi_port);
352428
return -EINVAL;
353429
}
354430

431+
context->spi_cfg.cs->gpio_dev = device_get_binding((char *)config->spi_cs_port);
432+
if (!context->spi_cfg.cs->gpio_dev) {
433+
SYS_LOG_ERR("SPI CS port %s not found", config->spi_cs_port);
434+
return -EINVAL;
435+
}
436+
355437
/* Initialize GPIO */
356438
if (gpio_pin_configure(context->gpio, config->gpio_pin,
357439
(GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE
@@ -372,21 +454,6 @@ static int eth_enc28j60_init(struct device *dev)
372454
return -EINVAL;
373455
}
374456

375-
/* Initialize SPI:
376-
* Mode: 0/0; Size: 8 bits; MSB
377-
*/
378-
spi_cfg.config = 8 << 4;
379-
spi_cfg.max_sys_freq = config->spi_freq;
380-
381-
if (spi_configure(context->spi, &spi_cfg) < 0) {
382-
SYS_LOG_ERR("Failed to configure SPI");
383-
return -EIO;
384-
}
385-
386-
if (spi_slave_select(context->spi, config->spi_slave) < 0) {
387-
return -EIO;
388-
}
389-
390457
if (eth_enc28j60_soft_reset(dev)) {
391458
SYS_LOG_ERR("Soft-reset failed");
392459
return -EIO;
@@ -698,7 +765,8 @@ static const struct eth_enc28j60_config eth_enc28j60_0_config = {
698765
.gpio_pin = CONFIG_ETH_ENC28J60_0_GPIO_PIN,
699766
.spi_port = CONFIG_ETH_ENC28J60_0_SPI_PORT_NAME,
700767
.spi_freq = CONFIG_ETH_ENC28J60_0_SPI_BUS_FREQ,
701-
.spi_slave = CONFIG_ETH_ENC28J60_0_SLAVE,
768+
.spi_cs_port = CONFIG_ETH_ENC28J60_0_SPI_CS_PORT_NAME,
769+
.spi_cs_pin = CONFIG_ETH_ENC28J60_0_SPI_CS_PIN,
702770
.full_duplex = CONFIG_ETH_EN28J60_0_FULL_DUPLEX,
703771
.timeout = CONFIG_ETH_EN28J60_TIMEOUT,
704772
};

drivers/ethernet/eth_enc28j60_priv.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ struct eth_enc28j60_config {
217217
const char *gpio_port;
218218
u8_t gpio_pin;
219219
const char *spi_port;
220+
u8_t spi_cs_pin;
221+
const char *spi_cs_port;
220222
u32_t spi_freq;
221223
u8_t spi_slave;
222224
u8_t full_duplex;
@@ -229,7 +231,7 @@ struct eth_enc28j60_runtime {
229231
CONFIG_ETH_ENC28J60_RX_THREAD_STACK_SIZE);
230232
struct k_thread thread;
231233
struct device *gpio;
232-
struct device *spi;
234+
struct spi_config spi_cfg;
233235
struct gpio_callback gpio_cb;
234236
u8_t mem_buf[MAX_BUFFER_LENGTH + 1];
235237
u8_t tx_tsv[TSV_SIZE];

0 commit comments

Comments
 (0)