4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*/
6
6
7
- #define SYS_LOG_LEVEL SYS_LOG_LEVEL_INFO
7
+ #define SYS_LOG_LEVEL SYS_LOG_LEVEL_DEBUG
8
8
#include <logging/sys_log.h>
9
9
10
10
#include <zephyr.h>
@@ -112,6 +112,8 @@ static int spi_complete_loop(struct spi_config *spi_conf)
112
112
return -1 ;
113
113
}
114
114
115
+ SYS_LOG_DBG ("Passed" );
116
+
115
117
return 0 ;
116
118
}
117
119
@@ -142,6 +144,8 @@ static int spi_rx_half_start(struct spi_config *spi_conf)
142
144
return -1 ;
143
145
}
144
146
147
+ SYS_LOG_DBG ("Passed" );
148
+
145
149
return 0 ;
146
150
}
147
151
@@ -176,6 +180,8 @@ static int spi_rx_half_end(struct spi_config *spi_conf)
176
180
return -1 ;
177
181
}
178
182
183
+ SYS_LOG_DBG ("Passed" );
184
+
179
185
return 0 ;
180
186
}
181
187
@@ -216,12 +222,75 @@ static int spi_rx_every_4(struct spi_config *spi_conf)
216
222
return -1 ;
217
223
}
218
224
225
+ SYS_LOG_DBG ("Passed" );
226
+
219
227
return 0 ;
220
228
}
221
229
230
+ static struct k_poll_signal async_sig = K_POLL_SIGNAL_INITIALIZER ();
231
+ static struct k_poll_event async_evt =
232
+ K_POLL_EVENT_INITIALIZER (K_POLL_TYPE_SIGNAL ,
233
+ K_POLL_MODE_NOTIFY_ONLY ,
234
+ & async_sig );
235
+ static struct k_sem caller = K_SEM_INITIALIZER (caller , 0 , 1 );
236
+ static char __noinit spi_async_stack [256 ];
237
+ static int result = 1 ;
238
+
239
+ static void spi_async_call_cb (struct k_poll_event * async_evt ,
240
+ struct k_sem * caller_sem ,
241
+ void * unused )
242
+ {
243
+ SYS_LOG_DBG ("Polling..." );
244
+
245
+ while (1 ) {
246
+ k_poll (async_evt , 1 , K_MSEC (100 ));
247
+
248
+ result = async_evt -> signal -> result ;
249
+ k_sem_give (caller_sem );
250
+
251
+ /* Reinitializing for next call */
252
+ async_evt -> signal -> signaled = 0 ;
253
+ async_evt -> state = K_POLL_STATE_NOT_READY ;
254
+ }
255
+ }
256
+
257
+ static int spi_async_call (struct spi_config * spi_conf )
258
+ {
259
+ struct spi_buf tx = {
260
+ .buf = buffer_tx ,
261
+ .len = BUF_SIZE ,
262
+ };
263
+ struct spi_buf rx = {
264
+ .buf = buffer_rx ,
265
+ .len = BUF_SIZE ,
266
+ };
267
+ const struct spi_buf * tx_bufs [] = { & tx , NULL };
268
+ struct spi_buf * rx_bufs [] = { & rx , NULL };
269
+ int ret ;
270
+
271
+ ret = spi_transceive_async (spi_conf , tx_bufs , rx_bufs , & async_sig );
272
+ if (ret ) {
273
+ SYS_LOG_ERR ("Code %d" , ret );
274
+ return -1 ;
275
+ }
276
+
277
+ k_sem_take (& caller , K_FOREVER );
278
+
279
+ if (result ) {
280
+ SYS_LOG_ERR ("Call code %d" , ret );
281
+ return -1 ;
282
+ }
283
+
284
+ SYS_LOG_DBG ("Passed" );
285
+
286
+ return 0 ;
287
+ }
222
288
223
289
void main (void )
224
290
{
291
+ struct k_thread async_thread ;
292
+ k_tid_t async_thread_id ;
293
+
225
294
SYS_LOG_INF ("SPI test on buffex TX/RX %p/%p" , buffer_tx , buffer_rx );
226
295
227
296
if (cs_ctrl_gpio_config (spi_slow .cs ) ||
@@ -237,19 +306,28 @@ void main(void)
237
306
238
307
spi_fast .dev = spi_slow .dev ;
239
308
309
+ async_thread_id = k_thread_create (& async_thread , spi_async_stack , 256 ,
310
+ (k_thread_entry_t )spi_async_call_cb ,
311
+ & async_evt , & caller , NULL ,
312
+ K_PRIO_COOP (7 ), 0 , 0 );
313
+
240
314
if (spi_complete_loop (& spi_slow ) ||
241
315
spi_rx_half_start (& spi_slow ) ||
242
316
spi_rx_half_end (& spi_slow ) ||
243
- spi_rx_every_4 (& spi_slow )) {
244
- return ;
317
+ spi_rx_every_4 (& spi_slow ) ||
318
+ spi_async_call (& spi_slow )) {
319
+ goto end ;
245
320
}
246
321
247
322
if (spi_complete_loop (& spi_fast ) ||
248
323
spi_rx_half_start (& spi_fast ) ||
249
324
spi_rx_half_end (& spi_fast ) ||
250
- spi_rx_every_4 (& spi_fast )) {
251
- return ;
325
+ spi_rx_every_4 (& spi_fast ) ||
326
+ spi_async_call (& spi_fast )) {
327
+ goto end ;
252
328
}
253
329
254
330
SYS_LOG_INF ("All tx/rx passed" );
331
+ end :
332
+ k_thread_cancel (async_thread_id );
255
333
}
0 commit comments