agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
spi/spi.h
Go to the documentation of this file.
1 /* Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
2  *
3  * Permission for non-commercial use is hereby granted,
4  * free of charge, without warranty of any kind.
5  */
6 #ifndef ZRTOS_VFS_MODULE_SPI_H
7 #define ZRTOS_VFS_MODULE_SPI_H
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #include <zrtos/vfs_module.h>
13 #include <zrtos/malloc.h>
14 #include <zrtos/cbuffer.h>
15 #include <zrtos/clist.h>
16 #include <zrtos/gpio.h>
17 #include <zrtos/binary.h>
18 #include <zrtos/va.h>
19 
20 typedef enum{
24 
25 typedef enum{
27 
32  /*
33  ,ZRTOS_VFS_MODULE_SPI_CONTROL__CLOCK_RATE_2 = ZRTOS_BINARY__00000100 ///< chip clock/2
34  ,ZRTOS_VFS_MODULE_SPI_CONTROL__CLOCK_RATE_8 = ZRTOS_BINARY__00000101 ///< chip clock/8
35  ,ZRTOS_VFS_MODULE_SPI_CONTROL__CLOCK_RATE_32 = ZRTOS_BINARY__00000110 ///< chip clock/32
36  ,ZRTOS_VFS_MODULE_SPI_CONTROL__CLOCK_RATE_64x = ZRTOS_BINARY__00000111 ///< chip clock/32
37  */
39 
43 
44  ,ZRTOS_VFS_MODULE_SPI_CONTROL__BITORDER_LSB = ZRTOS_BINARY__00100000 ///< send least significant bit (bit 0) first
45  ,ZRTOS_VFS_MODULE_SPI_CONTROL__BITORDER_MSB = ZRTOS_BINARY__00000000 ///< send most significant bit (bit 7) first
47 
48  ,ZRTOS_VFS_MODULE_SPI_CONTROL__PP_0 = ZRTOS_BINARY__00000000 ///< Sample (Rising) Setup (Falling) CPOL=0, CPHA=0
49  ,ZRTOS_VFS_MODULE_SPI_CONTROL__PP_1 = ZRTOS_BINARY__00000100 ///< Setup (Rising) Sample (Falling) CPOL=0, CPHA=1
50  ,ZRTOS_VFS_MODULE_SPI_CONTROL__PP_2 = ZRTOS_BINARY__00001000 ///< Sample (Falling) Setup (Rising) CPOL=1, CPHA=0
51  ,ZRTOS_VFS_MODULE_SPI_CONTROL__PP_3 = ZRTOS_BINARY__00001100 ///< Setup (Falling) Sample (Rising) CPOL=1, CPHA=1
53 
56 
59 
65  zrtos_vfs_module_spi_control_t control;
67  void *data;
69 
79 
82  ,zrtos_gpio_t *gpio
83  ,zrtos_gpio_pin_t pin_sclk
84  ,zrtos_gpio_pin_t pin_mosi
85  ,zrtos_gpio_pin_t pin_miso
86 ){
87  thiz->gpio = gpio;
88  thiz->pin_sclk = pin_sclk;
89  thiz->pin_mosi = pin_mosi;
90  thiz->pin_miso = pin_miso;
91  zrtos_clist__init(&thiz->root);
92  thiz->last = 0;
93  thiz->count = 0;
94  return true;
95 }
96 
98 }
99 
103  ,zrtos_vfs_module_spi_control_t control
105  ,void *data
106 ){
108  thiz->error = ZRTOS_ERROR__SUCCESS;
109  thiz->control = control;
110  thiz->pin_cs = pin_cs;
111  thiz->data = data;
112  if(zrtos_cbuffer__init(&thiz->cbuffer_in)){
113  if(zrtos_cbuffer__init(&thiz->cbuffer_out)){
114  zrtos_clist__push(&ctx->root,&thiz->node);
115  return true;
116  }
118  }
119  return false;
120 }
121 
125 ){
128  zrtos_clist__delete(&ctx->root,&thiz->node);
129 }
130 
133  ,zrtos_vfs_module_spi_control_t control
135  ,void *data
136 ){
139  ,kmalloc(sizeof(zrtos_vfs_module_spi_file_t))
140  );
141  if(thiz){
142  if(!zrtos_vfs_module_spi_file__init(thiz,ctx,control,pin_cs,data)){
143  kfree(thiz);
144  thiz = 0;
145  }
146  }
147  return thiz;
148 }
149 
153 ){
155  kfree(thiz);
156 }
157 
161 ){
162  file->error = zrtos_gpio__set_high(
163  thiz->gpio
164  ,file->pin_cs
165  );
166 }
167 
171 ){
172  file->error = zrtos_gpio__set_low(
173  thiz->gpio
174  ,file->pin_cs
175  );
176 }
177 
181 ){
182  zrtos_gpio_mode_t input;
183  zrtos_gpio_mode_t output;
184 
186  input = ZRTOS_GPIO_MODE__INPUT;
187  output = ZRTOS_GPIO_MODE__OUTPUT;
188  }else{
189  input = ZRTOS_GPIO_MODE__OUTPUT;
190  output = ZRTOS_GPIO_MODE__INPUT;
191  }
192 
194  thiz->gpio
195  ,4
196  ,thiz->pin_miso
197  ,input
198  ,file->pin_cs
199  ,output
200  ,thiz->pin_mosi
201  ,output
202  ,thiz->pin_sclk
203  ,output
204  );
205 }
206 
209  ,void *data
210  ,size_t len
211 ){
212  size_t outlen;
213  zrtos_vfs_module_spi_file_t *last = thiz->last;
214 
215  if(thiz->count == 0
216  || (last && zrtos_error__is_error(last->error))){
217  if(last){
220  &thiz->root
222  );
223  last = thiz->last = 0;
224  thiz->count = 0;
225  }
226 
228  &thiz->root
229  ,node
231  ,node
232  ){
233  if(zrtos_error__is_success(node->error)
235  &node->cbuffer_out
236  ,sizeof(thiz->count)
237  )
239  &node->cbuffer_out
240  ,&thiz->count
241  ,sizeof(thiz->count)
242  ,&outlen
243  ))){
244  if(thiz->last != node){
245  last = thiz->last = node;
247  }
248 
250  break;
251  }
253  }
254 
255  if(last
256  && zrtos_error__is_success(last->error)){
257  thiz->count--;
259  &last->cbuffer_out
260  ,data
261  ,len
262  ,&outlen
263  );
264  }
265 }
266 
269  ,void *data
270  ,size_t len
271 ){
272  zrtos_vfs_module_spi_file_t *last = thiz->last;
273  if(last
274  && zrtos_error__is_success(last->error)){
275  size_t outlen;
277  &last->cbuffer_in
278  ,1
279  ,&outlen
280  ,data
281  ,len
282  );
283  }
284 }
285 
288  ,void *data_in
289  ,void *data_out
290  ,size_t len
291 ){
293  zrtos_vfs_module_spi__transfer_in(thiz,data_in,len);
295  thiz
296  ,data_out
297  ,len
298  );
299  last = thiz->last;
300  return last ? last->error : ZRTOS_ERROR__NODATA;
301 }
302 
304  zrtos_vfs_file_t *thiz
305 ){
306 /*
307  zrtos_error_t ret = ZRTOS_ERROR__NOMEM;
308  zrtos_vfs_module_spi_inode_t *inode_data = ZRTOS_CAST(
309  zrtos_vfs_module_spi_inode_t*
310  ,zrtos_vfs_file__get_inode_data(thiz)
311  );
312  zrtos_vfs_module_spi_file_t *file_data = zrtos_vfs_module_spi_file__new(
313  inode_data
314  ,(zrtos_vfs_module_spi_control_t)0
315  ,0
316  ,0
317  );
318  if(file_data){
319  zrtos_vfs_file__set_data(thiz,file_data);
320  ret = ZRTOS_ERROR__SUCCESS;
321  }
322  return ret;
323 */
324  return ZRTOS_ERROR__SUCCESS;
325 }
326 
328  zrtos_vfs_file_t *thiz
329 ){
330 /*
331  zrtos_vfs_module_spi_inode_t *inode_data = ZRTOS_CAST(
332  zrtos_vfs_module_spi_inode_t*
333  ,zrtos_vfs_file__get_inode_data(thiz)
334  );
335  zrtos_vfs_module_spi_file_t *file_data = ZRTOS_CAST(
336  zrtos_vfs_module_spi_file_t*
337  ,zrtos_vfs_file__get_data(thiz)
338  );
339  zrtos_vfs_module_spi_file__free(file_data,inode_data);
340 */
341  return ZRTOS_ERROR__SUCCESS;
342 }
343 
345  zrtos_vfs_file_t *thiz
346  ,char *path
347  ,void *buf
348  ,size_t len
349  ,zrtos_vfs_offset_t offset
350  ,size_t *outlen
351 ){
355  );
356  return zrtos_cbuffer__get_ex(
357  &file_data->cbuffer_in
358  ,buf
359  ,len
360  ,outlen
361  );
362 }
363 
365  zrtos_vfs_file_t *thiz
366  ,char *path
367  ,void *buf
368  ,size_t len
369  ,zrtos_vfs_offset_t offset
370  ,size_t *out
371 ){
375  );
376  size_t outlen;
377  return zrtos_cbuffer__put_ex(
378  &file_data->cbuffer_out
379  ,1
380  ,&outlen
381  ,buf
382  ,len
383  );
384 }
385 
387  zrtos_vfs_file_t *thiz
388 ){
392  );
393  return zrtos_cbuffer__can_read(&file_data->cbuffer_in);
394 }
395 
397  zrtos_vfs_file_t *thiz
398 ){
402  );
403  return zrtos_cbuffer__can_write(&file_data->cbuffer_out);
404 }
405 
407  zrtos_vfs_file_t *thiz
408  ,char *path
409  ,int request
410  ,va_list args
411 ){
415  );
416  switch(request){
418  file_data->control = zrtos_va__arg(args,zrtos_vfs_module_spi_control_t);
419  break;
421  file_data->pin_cs = zrtos_va__arg(args,zrtos_gpio_pin_t);
422  break;
423  }
424  return ZRTOS_ERROR__SUCCESS;
425 }
426 
427 /*
428 ZRTOS_VFS_PLUGIN__INIT(spi,
429  ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT()
430  ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT()
431  ZRTOS_VFS_PLUGIN__2_ON_MOUNT_DEFAULT()
432  ZRTOS_VFS_PLUGIN__3_ON_UMOUNT_DEFAULT()
433  ZRTOS_VFS_PLUGIN__4_ON_READ(zrtos_vfs_module_spi__on_read)
434  ZRTOS_VFS_PLUGIN__5_ON_WRITE(zrtos_vfs_module_spi__on_write)
435  ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(zrtos_vfs_module_spi__on_can_read)
436  ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(zrtos_vfs_module_spi__on_can_write)
437  ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT()
438  ZRTOS_VFS_PLUGIN__9_ON_IOCTL(zrtos_vfs_module_spi__on_ioctl)
439 );
440 */
441 
442 #ifdef __cplusplus
443 }
444 #endif
445 #endif
#define ZRTOS_CAST(type, value)
Definition: cast.h:18
No data available.
Definition: error.h:85
void zrtos_vfs_module_spi_inode__deinit(zrtos_vfs_module_spi_file_t *thiz)
Definition: spi/spi.h:97
void zrtos_vfs_module_spi__transfer_out(zrtos_vfs_module_spi_inode_t *thiz, void *data, size_t len)
Definition: spi/spi.h:207
#define ZRTOS_TYPES__UINT8_MIN
Definition: types.h:181
#define ZRTOS_BINARY__00001100
Definition: binary.h:59
size_t zrtos_vfs_offset_t
Definition: vfs_plugin.h:49
#define ZRTOS_BINARY__01000000
Definition: binary.h:111
bool zrtos_clist__init(zrtos_clist_t *thiz)
Definition: clist.h:61
bool zrtos_vfs_module_spi_inode__init(zrtos_vfs_module_spi_inode_t *thiz, zrtos_gpio_t *gpio, zrtos_gpio_pin_t pin_sclk, zrtos_gpio_pin_t pin_mosi, zrtos_gpio_pin_t pin_miso)
Definition: spi/spi.h:80
zrtos_error_t zrtos_cbuffer__can_read(zrtos_cbuffer_t *thiz)
Definition: cbuffer.h:373
zrtos_vfs_module_spi_control_t control
Definition: spi/spi.h:65
bool zrtos_clist__delete(zrtos_clist_t *thiz, zrtos_clist_node_t *node)
Definition: clist.h:95
zrtos_error_t zrtos_cbuffer__get_ex(zrtos_cbuffer_t *thiz, void *data, size_t len, size_t *outlen)
Definition: cbuffer.h:336
zrtos_error_t zrtos_vfs_module_spi__on_can_write(zrtos_vfs_file_t *thiz)
Definition: spi/spi.h:396
struct _zrtos_vfs_module_spi_inode_t zrtos_vfs_module_spi_inode_t
void zrtos_cbuffer__deinit(zrtos_cbuffer_t *thiz)
Definition: cbuffer.h:140
zrtos_gpio_mode_t
Definition: gpio.h:24
void zrtos_vfs_module_spi__set_low(zrtos_vfs_module_spi_inode_t *thiz, zrtos_vfs_module_spi_file_t *file)
Definition: spi/spi.h:168
zrtos_gpio_pin_t pin_mosi
Definition: spi/spi.h:73
Setup (Falling) Sample (Rising) CPOL=1, CPHA=1.
Definition: spi/spi.h:51
Sample (Rising) Setup (Falling) CPOL=0, CPHA=0.
Definition: spi/spi.h:48
#define ZRTOS_BINARY__00000011
Definition: binary.h:50
#define ZRTOS_BINARY__00001000
Definition: binary.h:55
#define ZRTOS_BINARY__00000001
Definition: binary.h:48
zrtos_vfs_module_spi_control_t
Definition: spi/spi.h:25
zrtos_arch_gpio_pin_t zrtos_gpio_pin_t
Definition: gpio.h:22
zrtos_error_t zrtos_vfs_module_spi__on_can_read(zrtos_vfs_file_t *thiz)
Definition: spi/spi.h:386
#define ZRTOS_CLIST__EACH_END
Definition: clist.h:173
#define ZRTOS_BINARY__00010000
Definition: binary.h:63
bool zrtos_error__is_error(zrtos_error_t thiz)
Definition: error.h:156
zrtos_vfs_module_spi_file_t * zrtos_vfs_module_spi_file__new(zrtos_vfs_module_spi_inode_t *ctx, zrtos_vfs_module_spi_control_t control, zrtos_gpio_pin_t pin_cs, void *data)
Definition: spi/spi.h:131
zrtos_vfs_module_spi_file_t * last
Definition: spi/spi.h:76
#define ZRTOS_BINARY__10000000
Definition: binary.h:175
struct _zrtos_vfs_module_spi_file_t zrtos_vfs_module_spi_file_t
zrtos_error_t zrtos_vfs_module_spi__on_close(zrtos_vfs_file_t *thiz)
Definition: spi/spi.h:327
void zrtos_vfs_module_spi__transfer_in(zrtos_vfs_module_spi_inode_t *thiz, void *data, size_t len)
Definition: spi/spi.h:267
zrtos_clist_node_t node
Definition: spi/spi.h:61
#define ZRTOS_BINARY__00100000
Definition: binary.h:79
bool zrtos_error__is_success(zrtos_error_t thiz)
Definition: error.h:152
void zrtos_vfs_module_spi__set_high(zrtos_vfs_module_spi_inode_t *thiz, zrtos_vfs_module_spi_file_t *file)
Definition: spi/spi.h:158
void * zrtos_vfs_file__get_data(zrtos_vfs_file_t *thiz)
Definition: vfs_file.h:199
zrtos_vfs_module_spi_ioctl_t
Definition: spi/spi.h:20
zrtos_gpio_pin_t pin_sclk
Definition: spi/spi.h:72
Setup (Rising) Sample (Falling) CPOL=0, CPHA=1.
Definition: spi/spi.h:49
Successful program execution status.
Definition: error.h:22
send most significant bit (bit 7) first
Definition: spi/spi.h:45
zrtos_cbuffer_t cbuffer_in
Definition: spi/spi.h:62
zrtos_error_t zrtos_vfs_module_spi__on_open(zrtos_vfs_file_t *thiz)
Definition: spi/spi.h:303
zrtos_error_t zrtos_vfs_module_spi__on_ioctl(zrtos_vfs_file_t *thiz, char *path, int request, va_list args)
Definition: spi/spi.h:406
bool zrtos_cbuffer__can_read_length(zrtos_cbuffer_t *thiz, size_t length)
Definition: cbuffer.h:382
#define ZRTOS_CLIST__EACH_BEGIN(thiz, node, container, member)
Definition: clist.h:159
send least significant bit (bit 0) first
Definition: spi/spi.h:44
#define ZRTOS_BINARY__00000010
Definition: binary.h:49
zrtos_error_t zrtos_gpio__set_mode_ex(zrtos_gpio_t *thiz,...)
Definition: gpio.h:160
zrtos_cbuffer_t cbuffer_out
Definition: spi/spi.h:63
zrtos_error_t zrtos_cbuffer__put_ex(zrtos_cbuffer_t *thiz, size_t len, size_t *outlen,...)
Definition: cbuffer.h:278
Sample (Falling) Setup (Rising) CPOL=1, CPHA=0.
Definition: spi/spi.h:50
void zrtos_vfs_module_spi_file__deinit(zrtos_vfs_module_spi_file_t *thiz, zrtos_vfs_module_spi_inode_t *ctx)
Definition: spi/spi.h:122
bool zrtos_clist__push(zrtos_clist_t *thiz, zrtos_clist_node_t *node)
Definition: clist.h:85
bool zrtos_cbuffer__init(zrtos_cbuffer_t *thiz)
Definition: cbuffer.h:115
zrtos_gpio_pin_t pin_cs
Definition: spi/spi.h:66
void zrtos_vfs_module_spi_file__free(zrtos_vfs_module_spi_file_t *thiz, zrtos_vfs_module_spi_inode_t *ctx)
Definition: spi/spi.h:150
zrtos_clist_node_t * zrtos_clist_node__get_next_node(zrtos_clist_node_t *node)
Definition: clist.h:38
bool zrtos_clist_node__init(zrtos_clist_node_t *thiz)
Definition: clist.h:33
static uint8_t
Definition: mcp2515.h:159
zrtos_error_t zrtos_gpio__set_high(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin)
Definition: gpio.h:271
#define ZRTOS_TYPES__UINT8_MAX
Definition: types.h:182
zrtos_error_t
Definition: error.h:20
#define ZRTOS_BINARY__00000100
Definition: binary.h:51
zrtos_error_t zrtos_cbuffer__can_write(zrtos_cbuffer_t *thiz)
Definition: cbuffer.h:415
#define ZRTOS_BINARY__00000000
Definition: binary.h:47
void zrtos_vfs_module_spi__transfer_init(zrtos_vfs_module_spi_inode_t *thiz, zrtos_vfs_module_spi_file_t *file)
Definition: spi/spi.h:178
zrtos_error_t zrtos_vfs_module_spi__on_read(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *outlen)
Definition: spi/spi.h:344
zrtos_error_t zrtos_vfs_module_spi__transfer(zrtos_vfs_module_spi_inode_t *thiz, void *data_in, void *data_out, size_t len)
Definition: spi/spi.h:286
zrtos_error_t zrtos_vfs_module_spi__on_write(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: spi/spi.h:364
#define zrtos_va__arg(ap, type)
Definition: va.h:21
void zrtos_clist__set_root(zrtos_clist_t *thiz, zrtos_clist_node_t *node)
Definition: clist.h:29
zrtos_gpio_pin_t pin_miso
Definition: spi/spi.h:74
zrtos_error_t zrtos_gpio__set_low(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin)
Definition: gpio.h:318
bool zrtos_vfs_module_spi_file__init(zrtos_vfs_module_spi_file_t *thiz, zrtos_vfs_module_spi_inode_t *ctx, zrtos_vfs_module_spi_control_t control, zrtos_gpio_pin_t pin_cs, void *data)
Definition: spi/spi.h:100