@@ -30,7 +30,14 @@ static int eth_enc28j60_soft_reset(struct device *dev)
30
30
struct eth_enc28j60_runtime * context = dev -> driver_data ;
31
31
u8_t tx_buf [2 ] = {ENC28J60_SPI_SC , 0xFF };
32
32
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 ));
34
41
}
35
42
36
43
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)
43
50
tx_buf [0 ] = ENC28J60_SPI_RCR | ENC28J60_REG_ECON1 ;
44
51
tx_buf [1 ] = 0x0 ;
45
52
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 ));
47
61
48
62
tx_buf [0 ] = ENC28J60_SPI_WCR | ENC28J60_REG_ECON1 ;
49
63
tx_buf [1 ] = (tx_buf [1 ] & 0xFC ) | ((reg_addr >> 8 ) & 0x0F );
50
64
51
- spi_write (context -> spi , tx_buf , 2 );
65
+ spi_write (& context -> spi_cfg , tx_bufs , ARRAY_SIZE ( tx_bufs ) );
52
66
53
67
k_sem_give (& context -> spi_sem );
54
68
}
@@ -64,7 +78,14 @@ static void eth_enc28j60_write_reg(struct device *dev, u16_t reg_addr,
64
78
tx_buf [0 ] = ENC28J60_SPI_WCR | (reg_addr & 0xFF );
65
79
tx_buf [1 ] = value ;
66
80
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 ));
68
89
69
90
k_sem_give (& context -> spi_sem );
70
91
}
@@ -85,7 +106,14 @@ static void eth_enc28j60_read_reg(struct device *dev, u16_t reg_addr,
85
106
tx_buf [0 ] = ENC28J60_SPI_RCR | (reg_addr & 0xFF );
86
107
tx_buf [1 ] = 0x0 ;
87
108
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 ));
89
117
90
118
* value = tx_buf [tx_size - 1 ];
91
119
@@ -103,7 +131,14 @@ static void eth_enc28j60_set_eth_reg(struct device *dev, u16_t reg_addr,
103
131
tx_buf [0 ] = ENC28J60_SPI_BFS | (reg_addr & 0xFF );
104
132
tx_buf [1 ] = value ;
105
133
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 ));
107
142
108
143
k_sem_give (& context -> spi_sem );
109
144
}
@@ -120,7 +155,14 @@ static void eth_enc28j60_clear_eth_reg(struct device *dev, u16_t reg_addr,
120
155
tx_buf [0 ] = ENC28J60_SPI_BFC | (reg_addr & 0xFF );
121
156
tx_buf [1 ] = value ;
122
157
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 ));
124
166
125
167
k_sem_give (& context -> spi_sem );
126
168
}
@@ -143,14 +185,29 @@ static void eth_enc28j60_write_mem(struct device *dev, u8_t *data_buffer,
143
185
++ i , index_buf += MAX_BUFFER_LENGTH ) {
144
186
context -> mem_buf [0 ] = ENC28J60_SPI_WBM ;
145
187
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 ));
148
197
}
149
198
150
199
if (num_remaining > 0 ) {
151
200
context -> mem_buf [0 ] = ENC28J60_SPI_WBM ;
152
201
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 ));
154
211
}
155
212
156
213
k_sem_give (& context -> spi_sem );
@@ -171,9 +228,16 @@ static void eth_enc28j60_read_mem(struct device *dev, u8_t *data_buffer,
171
228
for (int i = 0 ; i < num_segments ;
172
229
++ i , data_buffer += MAX_BUFFER_LENGTH ) {
173
230
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
+
177
241
if (data_buffer ) {
178
242
memcpy (data_buffer , context -> mem_buf + 1 ,
179
243
MAX_BUFFER_LENGTH );
@@ -182,9 +246,16 @@ static void eth_enc28j60_read_mem(struct device *dev, u8_t *data_buffer,
182
246
183
247
if (num_remaining > 0 ) {
184
248
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
+
188
259
if (data_buffer ) {
189
260
memcpy (data_buffer , context -> mem_buf + 1 ,
190
261
num_remaining );
@@ -335,7 +406,12 @@ static int eth_enc28j60_init(struct device *dev)
335
406
{
336
407
const struct eth_enc28j60_config * config = dev -> config -> config_info ;
337
408
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 ;
339
415
340
416
k_sem_init (& context -> spi_sem , 0 , UINT_MAX );
341
417
k_sem_give (& context -> spi_sem );
@@ -346,12 +422,18 @@ static int eth_enc28j60_init(struct device *dev)
346
422
return - EINVAL ;
347
423
}
348
424
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 ) {
351
427
SYS_LOG_ERR ("SPI master port %s not found" , config -> spi_port );
352
428
return - EINVAL ;
353
429
}
354
430
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
+
355
437
/* Initialize GPIO */
356
438
if (gpio_pin_configure (context -> gpio , config -> gpio_pin ,
357
439
(GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE
@@ -372,21 +454,6 @@ static int eth_enc28j60_init(struct device *dev)
372
454
return - EINVAL ;
373
455
}
374
456
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
-
390
457
if (eth_enc28j60_soft_reset (dev )) {
391
458
SYS_LOG_ERR ("Soft-reset failed" );
392
459
return - EIO ;
@@ -698,7 +765,8 @@ static const struct eth_enc28j60_config eth_enc28j60_0_config = {
698
765
.gpio_pin = CONFIG_ETH_ENC28J60_0_GPIO_PIN ,
699
766
.spi_port = CONFIG_ETH_ENC28J60_0_SPI_PORT_NAME ,
700
767
.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 ,
702
770
.full_duplex = CONFIG_ETH_EN28J60_0_FULL_DUPLEX ,
703
771
.timeout = CONFIG_ETH_EN28J60_TIMEOUT ,
704
772
};
0 commit comments