agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
w5500.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_H
8 #define ZRTOS_VFS_MODULE_W5500_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/vfs_module.h>
16 
18 
19 #ifndef ZRTOS_VFS_MODULE_W5500__CFG_STARTUP_DELAY
20 #define ZRTOS_VFS_MODULE_W5500__CFG_STARTUP_DELAY 600
21 #endif
22 
23 //W5500 should support up to 33,3Mhz
24 #ifndef ZRTOS_VFS_MODULE_W5500__CFG_SPI_CLOCK_RATE
25 #if ZRTOS_ARCH__CPU_CLOCK_HZ <= 4000000L
26 #define ZRTOS_VFS_MODULE_W5500__CFG_SPI_CLOCK_RATE\
27  ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__CLOCK_RATE_4
28 #elif ZRTOS_ARCH__CPU_CLOCK_HZ <= 16000000L
29 #define ZRTOS_VFS_MODULE_W5500__CFG_SPI_CLOCK_RATE\
30  ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__CLOCK_RATE_16
31 #elif ZRTOS_ARCH__CPU_CLOCK_HZ <= 64000000L
32 #define ZRTOS_VFS_MODULE_W5500__CFG_SPI_CLOCK_RATE\
33  ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__CLOCK_RATE_64
34 #elif ZRTOS_ARCH__CPU_CLOCK_HZ <= 128000000L
35 #define ZRTOS_VFS_MODULE_W5500__CFG_SPI_CLOCK_RATE\
36  ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__CLOCK_RATE_128
37 #else
38 #error "not supported cpu clock"
39 #endif
40 #endif
41 
42 #define ZRTOS_VFS_MODULE_W5500__CFG_SPI_CONTROL\
43  (ZRTOS_VFS_MODULE_W5500__CFG_SPI_CLOCK_RATE\
44  |ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__MODE_MASTER\
45  |ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__BITORDER_MSB\
46  |ZRTOS_VFS_MODULE_SPI_SYNC_CONTROL__PP_0)
47 
48 typedef enum{
51 
52 typedef enum{
56 
57 #define ZRTOS_VFS_MODULE_W5500_IOCTL__GET(addr,len)\
58  ((addr << 8) | (0x00 << 6) | len)
59 #define ZRTOS_VFS_MODULE_W5500_IOCTL__SET(addr,len)\
60  ((addr << 8) | (0x01 << 6) | len)
61 
65 
68 
71 
74 
77 
80 
83 
86 
89 
92 
95 
98 
101 
104 
107 
110 
113 
115 
117 
120 
121  ,ZRTOS_VFS_MODULE_W5500_IOCTL__GET_CHIP_VERSION = ZRTOS_VFS_MODULE_W5500_IOCTL__GET(0x39,1)
123 
124 #undef ZRTOS_VFS_MODULE_W5500_IOCTL__GET
125 #undef ZRTOS_VFS_MODULE_W5500_IOCTL__SET
126 
130 
132  zrtos_vfs_fd_t fd
133  ,uint16_t addr
134  ,uint8_t ctl
135  ,uint8_t *val
136 ){
138  fd
139  ,3
140  ,&addr
141  ,sizeof(addr)
142  ,&ctl
143  ,sizeof(ctl)
144  ,val
145  ,sizeof(*val)
146  );
147 }
148 
150  zrtos_vfs_fd_t fd
151  ,uint16_t addr
152  ,uint8_t ctl
153  ,uint16_t *val
154 ){
156  fd
157  ,3
158  ,&addr
159  ,sizeof(addr)
160  ,&ctl
161  ,sizeof(ctl)
162  ,val
163  ,sizeof(*val)
164  );
165 }
166 
168  zrtos_vfs_fd_t fd
169 ){
170  zrtos_error_t ret;
171  size_t llimit = 1;
172  uint16_t cmd = zrtos_types__htobe16(MR);
173  uint8_t ctl = _W5500_SPI_WRITE_;
174  uint8_t mode = MR_RST;
175 
176  for(size_t l = 2;l--;){
177  while(llimit-- && zrtos_error__is_success((ret = zrtos_vfs_fd__spi_transfer(
178  inode_data->fd
179  ,3
180  ,&cmd
181  ,sizeof(cmd)
182  ,&ctl
183  ,sizeof(ctl)
184  ,&mode
185  ,sizeof(mode)
186  ))) && (mode & MR_RST) != 0){
187  continue;
188  }
189 
190  ctl = _W5500_SPI_READ_;
191  llimit = ZRTOS_TYPES__SIZE_MAX;
192  }
193 
194  return zrtos_error__is_success(ret)
195  ? (
196  (mode & MR_RST) == 0
199  )
200  : ret
201  ;
202 }
203 
207  ,zrtos_vfs_dentry__get_data(thiz)
208  );
209 
211 
212  return zrtos_vfs_module_w5500__reset(inode_data->fd);
213 }
214 
216  return ZRTOS_ERROR__SUCCESS;
217 }
218 
219 ZRTOS_ASSERT__STATIC(sizeof(int) >= sizeof(uint16_t));
220 
222  zrtos_vfs_fd_t fd
223  ,char *path
224  ,int request
225  ,va_list args
226  ,uint8_t ctl_bsb
227  ,bool (*validate)(uint16_t addr,size_t length)
228 ){
229  zrtos_error_t ret;
230  uint16_t req = ZRTOS_CAST__REINTERPRET(
231  int
232  ,request
233  );
234  uint16_t addr;
235  uint8_t ctl;
236  size_t length;
237  void *value = zrtos_va__arg_ptr(
238  args
239  ,void*
240  );
241  size_t value_length = zrtos_va__arg_ptr(
242  args
243  ,size_t
244  );
245 
246  length = req & 0xF;
247  req >>= 4;
248  ctl = req & 0xF | ctl_bsb;
249  req >>= 4;
250  addr = zrtos_types__htobe16(req);
251 
252  //@todo verify endianness
253  if(length == value_length
254  && validate(addr,length)
255  ){
257  fd
258  ,3
259  ,&addr
260  ,sizeof(addr)
261  ,&ctl
262  ,sizeof(ctl)
263  ,value
264  ,value_length
265  );
266  }else{
267  ret = ZRTOS_ERROR__INVAL;
268  }
269 
270  return ret;
271 }
272 
274  return (
275  (addr + length < 0x2F)
276  || (addr == 0x39 && length == 1)
277  );
278 }
279 
281  zrtos_vfs_file_t *thiz
282  ,char *path
283  ,int request
284  ,va_list args
285 ){
289  );
291  inode_data->fd
292  ,path
293  ,request
294  ,args
295  ,0
297  );
298 }
299 
311 );
312 
313 
314 #ifdef __cplusplus
315 }
316 #endif
317 #endif
#define ZRTOS_CAST(type, value)
Definition: cast.h:18
bool zrtos_vfs_module_w5500_socket__on_ioctl_helper_validate_addr(uint16_t addr, size_t length)
Definition: w5500_socket.h:309
ZRTOS_VFS_MODULE_W5500_IOCTL__SET_SOCKET_INTERRUPT
Definition: w5500.h:87
#define ZRTOS_VFS_PLUGIN__4_ON_READ_DEFAULT()
Definition: vfs_plugin.h:216
#define ZRTOS_CAST__REINTERPRET(type, value)
Definition: cast.h:19
ZRTOS_VFS_MODULE_W5500_IOCTL__SET_SOURCE_MAC_ADDRESS
Definition: w5500.h:72
Try again.
Definition: error.h:35
#define ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT()
Definition: vfs_plugin.h:148
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_INTERRUPT_LOW_LEVEL_TIMER
Definition: w5500.h:79
ZRTOS_VFS_MODULE_W5500_IOCTL__SET_SOURCE_IP_ADDRESS
Definition: w5500.h:75
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_SOCKET_INTERRUPT_MASK
Definition: w5500.h:91
#define zrtos_types__htobe16(x)
Definition: types.h:233
#define ZRTOS_VFS_MODULE_W5500_IOCTL__SET(addr, len)
Definition: w5500.h:59
ZRTOS_VFS_MODULE_W5500_IOCTL__SET_SOCKET_INTERRUPT_MASK
Definition: w5500.h:90
struct _zrtos_vfs_module_w5500_ioctl_t zrtos_vfs_module_w5500_ioctl_t
#define ZRTOS_VFS_PLUGIN__5_ON_WRITE_DEFAULT()
Definition: vfs_plugin.h:238
#define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE_DEFAULT()
Definition: vfs_plugin.h:277
#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
struct _zrtos_vfs_module_w5500_inode_t zrtos_vfs_module_w5500_inode_t
#define ZRTOS_VFS_PLUGIN__3_ON_UMOUNT(callback)
Definition: vfs_plugin.h:198
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_PPP_DESTINATION_MAC
Definition: w5500.h:106
#define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ_DEFAULT()
Definition: vfs_plugin.h:260
ZRTOS_VFS_MODULE_W5500_IOCTL__SET_PPP_LCP_MAGIC_NUMBER
Definition: w5500.h:102
ZRTOS_VFS_MODULE_W5500_IOCTL__SET_PPP_MAXIMUM_SEGMENT_SIZE
Definition: w5500.h:111
#define ZRTOS_TYPES__SIZE_MAX
Definition: types.h:170
ZRTOS_ASSERT__STATIC(sizeof(int) >=sizeof(uint16_t))
#define ZRTOS_VFS_PLUGIN__2_ON_MOUNT(callback)
Definition: vfs_plugin.h:181
ZRTOS_VFS_MODULE_W5500_IOCTL__SET_PPP_DESTINATION_MAC
Definition: w5500.h:105
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_MODULE_W5500_IOCTL__GET(addr, len)
Definition: w5500.h:57
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_SOURCE_IP_ADDRESS
Definition: w5500.h:76
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_VFS_PLUGIN__9_ON_IOCTL(callback)
Definition: vfs_plugin.h:318
Successful program execution status.
Definition: error.h:22
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_SOCKET_INTERRUPT
Definition: w5500.h:88
#define zrtos_va__arg_ptr(ap, type)
Definition: va.h:26
zrtos_vfs_module_w5500_ctl_t
Definition: w5500.h:52
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_VFS_MODULE_W5500_IOCTL__SET_PPP_LCP_REQUEST_TIMER
Definition: w5500.h:99
Invalid argument.
Definition: error.h:46
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_SOURCE_MAC_ADDRESS
Definition: w5500.h:73
bool zrtos_vfs_module_w5500__on_ioctl_helper_validate_addr(uint16_t addr, size_t length)
Definition: w5500.h:273
zrtos_error_t zrtos_vfs_module_w5500__reset(zrtos_vfs_fd_t fd)
Definition: w5500.h:167
zrtos_error_t zrtos_vfs_fd__spi_transfer(zrtos_vfs_fd_t fd, size_t len,...)
Definition: vfs_fd.h:113
ZRTOS_VFS_PLUGIN__INIT(w5500, ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT() ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT() ZRTOS_VFS_PLUGIN__2_ON_MOUNT(zrtos_vfs_module_w5500__on_mount) ZRTOS_VFS_PLUGIN__3_ON_UMOUNT(zrtos_vfs_module_w5500__on_umount) ZRTOS_VFS_PLUGIN__4_ON_READ_DEFAULT() ZRTOS_VFS_PLUGIN__5_ON_WRITE_DEFAULT() ZRTOS_VFS_PLUGIN__6_ON_CAN_READ_DEFAULT() ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE_DEFAULT() ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT() ZRTOS_VFS_PLUGIN__9_ON_IOCTL(zrtos_vfs_module_w5500__on_ioctl))
zrtos_error_t zrtos_vfs_module_w5500__on_ioctl(zrtos_vfs_file_t *thiz, char *path, int request, va_list args)
Definition: w5500.h:280
zrtos_vfs_module_w5500_mode_t
Definition: w5500.h:48
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_PPP_LCP_REQUEST_TIMER
Definition: w5500.h:100
zrtos_error_t zrtos_vfs_module_w5500__on_umount(zrtos_vfs_dentry_t *thiz)
Definition: w5500.h:215
static uint8_t
Definition: mcp2515.h:159
zrtos_error_t
Definition: error.h:20
void zrtos_gpio__delay_milliseconds(uint16_t ms)
Definition: gpio.h:512
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_PPP_MAXIMUM_SEGMENT_SIZE
Definition: w5500.h:112
zrtos_error_t zrtos_vfs_module_w5500__spi_transfer_uint8(zrtos_vfs_fd_t fd, uint16_t addr, uint8_t ctl, uint8_t *val)
Definition: w5500.h:131
zrtos_error_t zrtos_vfs_module_w5500__on_mount(zrtos_vfs_dentry_t *thiz)
Definition: w5500.h:204
ZRTOS_VFS_MODULE_W5500_IOCTL__SET_INTERRUPT_LOW_LEVEL_TIMER
Definition: w5500.h:78
ZRTOS_VFS_MODULE_W5500_IOCTL__GET_PPP_LCP_MAGIC_NUMBER
Definition: w5500.h:103
#define ZRTOS_VFS_MODULE_W5500__CFG_STARTUP_DELAY
Definition: w5500.h:20