agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
spi_sync.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_SYNC_H
7 #define ZRTOS_VFS_MODULE_SPI_SYNC_H
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #include <zrtos/vfs_module.h>
13 #include <zrtos/gpio.h>
14 #include <zrtos/binary.h>
15 #include <zrtos/va.h>
16 #include <zrtos/task_mutex.h>
17 
18 typedef enum{
20 
25  /*
26  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__CLOCK_RATE_2 = ZRTOS_BINARY__00000100 ///< chip clock/2
27  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__CLOCK_RATE_8 = ZRTOS_BINARY__00000101 ///< chip clock/8
28  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__CLOCK_RATE_32 = ZRTOS_BINARY__00000110 ///< chip clock/32
29  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__CLOCK_RATE_64x = ZRTOS_BINARY__00000111 ///< chip clock/32
30  */
32 
36 
37  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__BITORDER_LSB = ZRTOS_BINARY__00100000 ///< send least significant bit (bit 0) first
38  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__BITORDER_MSB = ZRTOS_BINARY__00000000 ///< send most significant bit (bit 7) first
40 
41  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__PP_0 = ZRTOS_BINARY__00000000 ///< Sample (Rising) Setup (Falling) CPOL=0, CPHA=0
42  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__PP_1 = ZRTOS_BINARY__00000100 ///< Setup (Rising) Sample (Falling) CPOL=0, CPHA=1
43  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__PP_2 = ZRTOS_BINARY__00001000 ///< Sample (Falling) Setup (Rising) CPOL=1, CPHA=0
44  ,ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__PP_3 = ZRTOS_BINARY__00001100 ///< Setup (Falling) Sample (Rising) CPOL=1, CPHA=1
46 
48 
51 
53  zrtos_vfs_module_spi_sync_control_t control;
56 
65 
68  ,zrtos_gpio_t *gpio
69  ,zrtos_gpio_pin_t pin_sclk
70  ,zrtos_gpio_pin_t pin_mosi
71  ,zrtos_gpio_pin_t pin_miso
72 ){
73  thiz->gpio = gpio;
74  thiz->pin_sclk = pin_sclk;
75  thiz->pin_mosi = pin_mosi;
76  thiz->pin_miso = pin_miso;
77  thiz->count = 0;
78  return zrtos_task_mutex__init(&thiz->mutex);
79 }
80 
82 }
83 
87  ,zrtos_vfs_module_spi_sync_control_t control
89  ,void *data
90 ){
91  thiz->control = control;
92  thiz->pin_cs = pin_cs;
93  thiz->data = data;
94  return true;
95 }
96 
98  zrtos_vfs_file_t *thiz
99 ){
103  );
107  );
109  inode_data->gpio
110  ,file_data->pin_cs
112  );
113 
114  return zrtos_error__is_success(ret)
116  inode_data->gpio
117  ,file_data->pin_cs
118  )
119  : ret
120  ;
121 }
122 
124  zrtos_vfs_file_t *thiz
125 ){
127 }
128 
129 
134  );
136  inode_data->gpio
137  ,3
138  ,inode_data->pin_miso
140  ,inode_data->pin_mosi
142  ,inode_data->pin_sclk
144  );
145 }
146 
148  return ZRTOS_ERROR__SUCCESS;
149 }
150 
152  zrtos_vfs_file_t *thiz
153  ,char *path
154  ,void *buf
155  ,size_t len
156  ,zrtos_vfs_offset_t offset
157  ,size_t *out
158  ,zrtos_error_t (*callback)(
161  ,void *buf
162  ,size_t len
163  ,size_t *l
164  )
165 ){
169  );
173  );
174  uint8_t *data = ZRTOS_CAST(uint8_t*,buf);
175  zrtos_error_t ret = zrtos_task_mutex__lock(inode_data->mutex);
176  if(zrtos_error__is_success(ret)){
177  *out = len;
178  while(len){
179  if(inode_data->count == 0){
180  ret = zrtos_gpio__set_low(
181  inode_data->gpio
182  ,file_data->pin_cs
183  );
184  inode_data->count = *data++;
185  len--;
186  }
187 
188  while(len && inode_data->count && zrtos_error__is_success(ret)){
189  //transfer
190  size_t l;
191  ret = callback(inode_data,file_data,buf,len,l);
192  buf += l;
193  len -= l;
194  inode_data->count -= l;
195  }
196 
197  if(inode_data->count == 0){
198  ret = zrtos_gpio__set_high(
199  inode_data->gpio
200  ,file_data->pin_cs
201  );
202  }
203  }
204  zrtos_task_mutex__unlock(inode_data->mutex);
205  }
206  return ret;
207 }
208 
209 /*
210 zrtos_error_t zrtos_vfs_module_spi_sync__on_write(
211  zrtos_vfs_file_t *thiz
212  ,char *path
213  ,void *buf
214  ,size_t len
215  ,zrtos_vfs_offset_t offset
216  ,size_t *out
217 ){
218  return zrtos_vfs_module_spi_sync__on_write_helper(
219  thiz
220  ,path
221  ,buf
222  ,len
223  ,offset
224  ,out
225  ,zrtos_error_t (*callback)(
226  zrtos_vfs_module_spi_sync_inode_t *inode_data
227  ,zrtos_vfs_module_spi_sync_file_t *file_data
228  ,void *buf
229  ,size_t len
230  ,size_t l
231  )
232  );
233 }
234 
235 
236 ZRTOS_VFS_PLUGIN__INIT(spi,
237  ZRTOS_VFS_PLUGIN__0_ON_OPEN(zrtos_vfs_module_spi_sync_sync__on_open)
238  ZRTOS_VFS_PLUGIN__1_ON_CLOSE(zrtos_vfs_module_spi_sync_sync__on_close)
239  ZRTOS_VFS_PLUGIN__2_ON_MOUNT(zrtos_vfs_module_spi_sync_sync__on_mount)
240  ZRTOS_VFS_PLUGIN__3_ON_UMOUNT(zrtos_vfs_module_spi_sync_sync__on_umount)
241  ZRTOS_VFS_PLUGIN__4_ON_READ_DEFAULT()
242  ZRTOS_VFS_PLUGIN__5_ON_WRITE(zrtos_vfs_module_spi_sync_sync__on_write)
243  ZRTOS_VFS_PLUGIN__6_ON_CAN_READ_DEFAULT()
244  ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE_DEFAULT()
245  ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT()
246  ZRTOS_VFS_PLUGIN__9_ON_IOCTL_DEFAULT()
247 );
248 */
249 
250 #ifdef __cplusplus
251 }
252 #endif
253 #endif
#define ZRTOS_CAST(type, value)
Definition: cast.h:18
zrtos_task_mutex_t mutex
Definition: spi_sync.h:62
#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
zrtos_vfs_module_spi_sync_control_t
Definition: spi_sync.h:18
zrtos_error_t zrtos_gpio__set_mode(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin, zrtos_gpio_mode_t mode)
Definition: gpio.h:130
#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_arch_gpio_pin_t zrtos_gpio_pin_t
Definition: gpio.h:22
send least significant bit (bit 0) first
Definition: spi_sync.h:37
#define ZRTOS_BINARY__00010000
Definition: binary.h:63
zrtos_error_t zrtos_vfs_module_spi_sync__on_write_helper(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out, zrtos_error_t(*callback)(zrtos_vfs_module_spi_sync_inode_t *inode_data, zrtos_vfs_module_spi_sync_file_t *file_data, void *buf, size_t len, size_t *l))
Definition: spi_sync.h:151
int zrtos_task_mutex__unlock(zrtos_task_mutex_t *thiz)
Definition: task_mutex.h:62
zrtos_error_t zrtos_vfs_module_spi_sync__on_open(zrtos_vfs_file_t *thiz)
Definition: spi_sync.h:97
Setup (Falling) Sample (Rising) CPOL=1, CPHA=1.
Definition: spi_sync.h:44
Setup (Rising) Sample (Falling) CPOL=0, CPHA=1.
Definition: spi_sync.h:42
#define ZRTOS_BINARY__00100000
Definition: binary.h:79
zrtos_error_t zrtos_vfs_module_spi_sync__on_mount(zrtos_vfs_dentry_t *thiz)
Definition: spi_sync.h:130
void * zrtos_vfs_file__get_inode_data(zrtos_vfs_file_t *thiz)
Definition: vfs_file.h:191
bool zrtos_error__is_success(zrtos_error_t thiz)
Definition: error.h:152
int zrtos_task_mutex__lock(zrtos_task_mutex_t *thiz)
Definition: task_mutex.h:44
Sample (Rising) Setup (Falling) CPOL=0, CPHA=0.
Definition: spi_sync.h:41
struct _zrtos_vfs_module_spi_sync_file_t zrtos_vfs_module_spi_sync_file_t
void * zrtos_vfs_file__get_data(zrtos_vfs_file_t *thiz)
Definition: vfs_file.h:199
bool zrtos_vfs_module_spi_sync_inode__init(zrtos_vfs_module_spi_sync_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_sync.h:66
Successful program execution status.
Definition: error.h:22
bool zrtos_task_mutex__init(zrtos_task_mutex_t *thiz)
Definition: task_mutex.h:24
bool zrtos_vfs_module_spi_sync_file__init(zrtos_vfs_module_spi_sync_file_t *thiz, zrtos_vfs_module_spi_sync_inode_t *ctx, zrtos_vfs_module_spi_sync_control_t control, zrtos_gpio_pin_t pin_cs, void *data)
Definition: spi_sync.h:84
zrtos_vfs_module_spi_sync_control_t control
Definition: spi_sync.h:53
#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_error_t zrtos_vfs_module_spi_sync__on_umount(zrtos_vfs_dentry_t *thiz)
Definition: spi_sync.h:147
zrtos_error_t zrtos_vfs_module_spi_sync__on_close(zrtos_vfs_file_t *thiz)
Definition: spi_sync.h:123
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
send most significant bit (bit 7) first
Definition: spi_sync.h:38
zrtos_error_t
Definition: error.h:20
#define ZRTOS_BINARY__00000100
Definition: binary.h:51
#define ZRTOS_BINARY__00000000
Definition: binary.h:47
Sample (Falling) Setup (Rising) CPOL=1, CPHA=0.
Definition: spi_sync.h:43
void zrtos_vfs_module_spi_sync_inode__deinit(zrtos_vfs_module_spi_sync_file_t *thiz)
Definition: spi_sync.h:81
zrtos_error_t zrtos_gpio__set_low(zrtos_gpio_t *thiz, zrtos_gpio_pin_t pin)
Definition: gpio.h:318
struct _zrtos_vfs_module_spi_sync_inode_t zrtos_vfs_module_spi_sync_inode_t