agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
w5500_socket.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_VFS_MODULE_W5500_SOCKET_H
8 #define ZRTOS_VFS_MODULE_W5500_SOCKET_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/vfs_module.h>
16 
18 
19 #define ZRTOS_VFS_MODULE_W5500_SOCKET__TX_BUFFER_BASE 0x4000
20 #define ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_BASE 0x6000
21 #define ZRTOS_VFS_MODULE_W5500_SOCKET__TX_BUFFER_MASK 0x07FF
22 #define ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_MASK 0x07FF
23 #define ZRTOS_VFS_MODULE_W5500_SOCKET__TX_BUFFER_SIZE 2048
24 #define ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_SIZE 2048
25 #define ZRTOS_VFS_MODULE_W5500_SOCKET__TX_BUFFER_ADDR(n)\
26  (\
27  ZRTOS_VFS_MODULE_W5500_SOCKET__TX_BUFFER_BASE\
28  + (ZRTOS_VFS_MODULE_W5500_SOCKET__TX_BUFFER_SIZE * (n))\
29  )
30 #define ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_ADDR(n)\
31  (\
32  ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_BASE\
33  + (ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_SIZE * (n))\
34  )
35 
36 #define ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL__GET(addr,len)\
37  ((addr << 8) | (0x00 << 6) | len)
38 #define ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL__SET(addr,len)\
39  ((addr << 8) | (0x01 << 6) | len)
40 
44 
47 
49 
51 
54 
57 
60 
63 
66 
69 
72 
75 
78 
80 
82 
85 
87 
90 
92 
95 
98 
100  ,ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL__GET_KEEP_ALIVE_TIMER = ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL__GET(0x2F,1)
102 
103 #undef ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL__GET
104 #undef ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL__SET
105 
106 typedef struct{
109 
110 typedef struct{
113 
115  zrtos_vfs_fd_t fd
116  ,uint8_t n
117  ,uint16_t src
118  ,uint8_t *dest
119  ,uint16_t len
120 ){
121  uint16_t size;
122  uint16_t src_mask;
123  uint16_t addr;
124  size_t l;
125  uint8_t ctl = _W5500_SPI_READ_;
126 
130 
131  do{
133  fd
134  ,3
135  ,addr
136  ,sizeof(addr)
137  ,&ctl
138  ,sizeof(ctl)
139  ,dest
140  ,l
141  );
142  dest += l;
144  l = len - l;
145  }while(zrtos_error__is_success(ret) && l);
146 
147  return ret;
148 }
149 
151  zrtos_vfs_file_t *thiz
152  ,char *path
153  ,void *buf
154  ,size_t len
155  ,zrtos_vfs_offset_t offset
156  ,size_t *out
157 ){
161  );
165  );
167  uint16_t ptr;
168  uint16_t rx_len;
169  uint16_t rx_base_addr;
170 
172  inode_data->fd
173  ,(Sn_RX_RSR(0)>>8)
174  ,(WIZCHIP_SREG_BLOCK(file_data->fd) << 3) | _W5500_SPI_READ_
175  ,&rx_len
176  )))
178  inode_data->fd
179  ,Sn_RX_RD(0)>>8
180  ,(WIZCHIP_SREG_BLOCK(file_data->fd) << 3) | _W5500_SPI_READ_
181  ,ptr
182  )))){
183  rx_len = ZRTOS_TYPES__MIN(len,rx_len);
185  inode_data->fd
186  ,file_data->fd
187  ,ptr
188  ,buf
189  ,rx_len
190  )))){
191  ptr += rx_len;
193  file_data->w5500->fd
194  ,Sn_RX_RD(0)>>8
195  ,(WIZCHIP_SREG_BLOCK(file_data->fd) << 3) | _W5500_SPI_WRITE_
196  ,ptr
197  );
198  }
199  }
200 
201  return ret;
202 }
203 
205  zrtos_vfs_file_t *thiz
206  ,char *path
207  ,void *buf
208  ,size_t len
209  ,zrtos_vfs_offset_t offset
210  ,size_t *out
211 ){
212 /*
213  zrtos_vfs_module_w5500_socket_inode_t *file_data = ZRTOS_CAST(
214  zrtos_vfs_module_w5500_socket_inode_t*
215  ,zrtos_vfs_file__get_inode_data(thiz)
216  );
217  zrtos_error_t ret;
218  uint16_t ptr;
219  ret = zrtos_vfs_module_w5500__spi_transfer_uint16(
220  zrtos_vfs_fd_t fd
221  ,uint16_t addr
222  ,uint8_t ctl
223  ,&ptr
224  );
225 
226  ret = zrtos_vfs_module_w5500__spi_transfer(
227  zrtos_vfs_fd_t fd
228  ,uint16_t addr
229  ,uint8_t ctl
230  ,uint16_t *val
231  );
232  ptr +=
233  ret = zrtos_vfs_module_w5500__spi_transfer_uint16(
234  zrtos_vfs_fd_t fd
235  ,uint16_t addr
236  ,uint8_t ctl
237  ,&ptr
238  );
239 
240  uint16_t ptr = readSnTX_WR(s);
241  uint8_t cntl_byte = (0x14+(s<<5));
242  ptr += data_offset;
243  write(ptr, cntl_byte, data, len);
244  ptr += len;
245  writeSnTX_WR(s, ptr);
246 
247  return zrtos_vfs_module_sram__rw(
248  thiz
249  ,path
250  ,buf
251  ,len
252  ,offset
253  ,out
254  ,true
255  );
256 */
257 }
258 
260  zrtos_vfs_file_t *thiz
261  ,char *path
262  ,uint16_t addr
263 ){
264  zrtos_error_t ret;
268  );
269  uint16_t val;
270 
272  inode_data->fd
273  ,addr
274  ,(WIZCHIP_SREG_BLOCK(inode_data->num) << 3) | _W5500_SPI_READ_
275  ,&val
276  )))
277  ){
278  ret = val > 0
281  ;
282  }
283 
284  return ret;
285 }
286 
288  zrtos_vfs_file_t *thiz
289  ,char *path
290 ){
292  thiz
293  ,path
294  ,(Sn_RX_RSR(0)>>8)
295  );
296 }
297 
299  zrtos_vfs_file_t *thiz
300  ,char *path
301 ){
303  thiz
304  ,path
305  ,(Sn_TX_FSR(0)>>8)
306  );
307 }
308 
310  return (
311  (addr + length < 0x14)
312  || ((addr == 0x15 || addr == 0x16) && length == 1)
313  || (addr >= 0x1E && (addr + length < 0x30))
314  );
315 }
316 
318  zrtos_vfs_file_t *thiz
319  ,char *path
320  ,int request
321  ,va_list args
322 ){
326  );
330  );
332  inode_data->fd
333  ,path
334  ,request
335  ,args
336  ,WIZCHIP_SREG_BLOCK(file_data->fd)
338  );
339 }
340 
341 ZRTOS_VFS_PLUGIN__INIT(w5500_socket,
352 );
353 
354 #ifdef __cplusplus
355 }
356 #endif
357 #endif
#define ZRTOS_CAST(type, value)
Definition: cast.h:18
zrtos_error_t rtos_vfs_module_w5500_socket__on_can_read_write_helper(zrtos_vfs_file_t *thiz, char *path, uint16_t addr)
Definition: w5500_socket.h:259
bool zrtos_vfs_module_w5500_socket__on_ioctl_helper_validate_addr(uint16_t addr, size_t length)
Definition: w5500_socket.h:309
#define ZRTOS_VFS_PLUGIN__4_ON_READ_DEFAULT()
Definition: vfs_plugin.h:216
#define ZRTOS_VFS_PLUGIN__3_ON_UMOUNT_DEFAULT()
Definition: vfs_plugin.h:199
Try again.
Definition: error.h:35
size_t zrtos_vfs_offset_t
Definition: vfs_plugin.h:49
ZRTOS_VFS_PLUGIN__INIT(w5500_socket, ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT() ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT() ZRTOS_VFS_PLUGIN__2_ON_MOUNT_DEFAULT() ZRTOS_VFS_PLUGIN__3_ON_UMOUNT_DEFAULT() ZRTOS_VFS_PLUGIN__4_ON_READ_DEFAULT(rtos_vfs_module_w5500_socket__on_read) ZRTOS_VFS_PLUGIN__5_ON_WRITE_DEFAULT(rtos_vfs_module_w5500_socket__on_write) ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(rtos_vfs_module_w5500_socket__on_can_read) ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(rtos_vfs_module_w5500_socket__on_can_write) ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT() ZRTOS_VFS_PLUGIN__9_ON_IOCTL(zrtos_vfs_module_w5500_socket__on_ioctl))
#define ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT()
Definition: vfs_plugin.h:148
zrtos_error_t rtos_vfs_module_w5500_socket__read_data(zrtos_vfs_fd_t fd, uint8_t n, uint16_t src, uint8_t *dest, uint16_t len)
Definition: w5500_socket.h:114
zrtos_error_t rtos_vfs_module_w5500_socket__on_write(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: w5500_socket.h:204
#define ZRTOS_VFS_PLUGIN__5_ON_WRITE_DEFAULT()
Definition: vfs_plugin.h:238
#define ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT()
Definition: vfs_plugin.h:294
#define ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT()
Definition: vfs_plugin.h:165
zrtos_error_t zrtos_vfs_module_w5500__on_ioctl_helper(zrtos_vfs_fd_t fd, char *path, int request, va_list args, uint8_t ctl_bsb, bool(*validate)(uint16_t addr, size_t length))
Definition: w5500.h:221
#define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(callback)
Definition: vfs_plugin.h:259
zrtos_vfs_module_w5500_inode_t * w5500
Definition: w5500_socket.h:111
#define ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_MASK
Definition: w5500_socket.h:22
#define ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL__SET(addr, len)
Definition: w5500_socket.h:38
#define ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_SIZE
Definition: w5500_socket.h:24
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
#define ZRTOS_TYPES__MIN(a, b)
Definition: types.h:78
zrtos_error_t rtos_vfs_module_w5500_socket__on_read(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: w5500_socket.h:150
zrtos_error_t zrtos_vfs_module_w5500_socket__on_ioctl(zrtos_vfs_file_t *thiz, char *path, int request, va_list args)
Definition: w5500_socket.h:317
void * zrtos_vfs_file__get_data(zrtos_vfs_file_t *thiz)
Definition: vfs_file.h:199
#define ZRTOS_VFS_PLUGIN__9_ON_IOCTL(callback)
Definition: vfs_plugin.h:318
Successful program execution status.
Definition: error.h:22
#define ZRTOS_VFS_MODULE_W5500_SOCKET__RX_BUFFER_ADDR(n)
Definition: w5500_socket.h:30
zrtos_error_t zrtos_vfs_module_w5500__spi_transfer_uint16(zrtos_vfs_fd_t fd, uint16_t addr, uint8_t ctl, uint16_t *val)
Definition: w5500.h:149
zrtos_error_t zrtos_vfs_fd__spi_transfer(zrtos_vfs_fd_t fd, size_t len,...)
Definition: vfs_fd.h:113
#define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(callback)
Definition: vfs_plugin.h:276
struct _ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL_t ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL_t
static uint8_t
Definition: mcp2515.h:159
zrtos_error_t rtos_vfs_module_w5500_socket__on_can_write(zrtos_vfs_file_t *thiz, char *path)
Definition: w5500_socket.h:298
zrtos_error_t
Definition: error.h:20
#define ZRTOS_VFS_MODULE_W5500_SOCKET_IOCTL__GET(addr, len)
Definition: w5500_socket.h:36
zrtos_error_t rtos_vfs_module_w5500_socket__on_can_read(zrtos_vfs_file_t *thiz, char *path)
Definition: w5500_socket.h:287
#define ZRTOS_VFS_PLUGIN__2_ON_MOUNT_DEFAULT()
Definition: vfs_plugin.h:182