Hardware Abstraction Layer for FreeRTOS
spi.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Author: Andreas Werner <kernel@andy89.org>
4  * Date: 2016
5  */
6 #ifndef SPI_H_
7 #define SPI_H_
8 #include <stdint.h>
9 #include <stdbool.h>
10 #include <system.h>
11 #include <FreeRTOS.h>
12 #include <semphr.h>
13 #include <hal.h>
14 
29 #define SPI_OPT_GPIO_DIS 0xFF
30 
34 #define SPI_OPT_CS_DIS 0x7
35 
39 struct spi_opt {
43  bool lsb;
48  bool cpol;
53  bool cpha;
58  uint8_t cs;
69  uint16_t gpio;
75  uint8_t size;
79  uint32_t wdelay;
83  uint32_t cs_hold;
87  uint32_t cs_delay;
91  uint32_t baudrate;
92 };
97 enum spi_mode {
114  SPI_SLAVE
115 };
120 struct spi;
125 struct spi_slave;
126 #ifdef CONFIG_SPI_MULTI
127 
131 struct spi_ops {
132  struct spi *(*spi_init)(uint32_t index, enum spi_mode mode, struct spi_opt *opt);
133  int32_t (*spi_deinit)(struct spi *spi);
134  int32_t (*spi_setCallback)(struct spi *spi, bool (*callback)(struct spi_slave *slave, void *data), void *data);
135 
136  struct spi_slave *(*spiSlave_init)(struct spi *spi, struct spi_opt *options);
137  int32_t (*spiSlave_deinit)(struct spi_slave *slave);
138  int32_t (*spiSlave_transfer)(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len, TickType_t waittime);
139  int32_t (*spiSlave_send)(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime);
140  int32_t (*spiSlave_recv)(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime);
141 
142  int32_t (*spiSlave_transferISR)(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len);
143  int32_t (*spiSlave_sendISR)(struct spi_slave *slave, uint16_t *data, uint32_t len);
144  int32_t (*spiSlave_recvISR)(struct spi_slave *slave, uint16_t *data, uint32_t len);
145  };
146 #endif
147 
151 struct spi_generic {
156  bool init;
157 #ifdef CONFIG_INSTANCE_NAME
158 
161  const char *name;
162 #endif
163 #ifdef CONFIG_SPI_THREAD_SAVE
164 
168 #endif
169 #ifdef CONFIG_SPI_MULTI
170 
173  const struct spi_ops *ops;
174 #endif
175 };
176 
185  struct spi *spi;
186 };
187 
188 #ifndef CONFIG_SPI_MULTI
189 
198 struct spi *spi_init(uint32_t index, enum spi_mode mode, struct spi_opt *opt);
206 int32_t spi_deinit(struct spi *spi);
215 int32_t spi_setCallback(struct spi *spi, bool (*callback)(struct spi_slave *slave, void *data), void *data);
235 struct spi_slave *spiSlave_init(struct spi *spi, struct spi_opt *options);
241 int32_t spiSlave_deinit(struct spi_slave *slave);
252 int32_t spiSlave_transfer(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len, TickType_t waittime);
261 int32_t spiSlave_send(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime);
270 int32_t spiSlave_recv(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime);
280 int32_t spiSlave_transferISR(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len);
288 int32_t spiSlave_sendISR(struct spi_slave *slave, uint16_t *data, uint32_t len);
296 int32_t spiSlave_recvISR(struct spi_slave *slave, uint16_t *data, uint32_t len);
298 #else
299 inline struct spi *spi_init(uint32_t index, enum spi_mode mode, struct spi_opt *opt) {
301  struct spi_generic *s = (struct spi_generic *) HAL_GET_DEV(spi, index);
302  if (s == NULL) {
303  return NULL;
304  }
305  return s->ops->spi_init(index, mode, opt);
306 }
307 inline int32_t spi_deinit(struct spi *spi) {
308  struct spi_generic *s = (struct spi_generic *) spi;
309  return s->ops->spi_deinit(spi);
310 }
311 inline int32_t spi_setCallback(struct spi *spi, bool (*callback)(struct spi_slave *slave, void *data), void *data) {
312  struct spi_generic *s = (struct spi_generic *) spi;
313  return s->ops->spi_setCallback(spi, callback, data);
314 }
315 
316 inline struct spi_slave *spiSlave_init(struct spi *spi, struct spi_opt *options) {
317  struct spi_generic *s = (struct spi_generic *) spi;
318  return s->ops->spiSlave_init(spi, options);
319 }
320 inline int32_t spiSlave_deinit(struct spi_slave *slave) {
321  struct spi_slave_generic *sp = (struct spi_slave_generic *) slave;
322  struct spi_generic *s = (struct spi_generic *) sp->spi;
323  return s->ops->spiSlave_deinit(slave);
324 }
325 inline int32_t spiSlave_transfer(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len, TickType_t waittime) {
326  struct spi_slave_generic *sp = (struct spi_slave_generic *) slave;
327  struct spi_generic *s = (struct spi_generic *) sp->spi;
328  return s->ops->spiSlave_transfer(slave, sendData, recvData, len, waittime);
329 }
330 inline int32_t spiSlave_send(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime) {
331  struct spi_slave_generic *sp = (struct spi_slave_generic *) slave;
332  struct spi_generic *s = (struct spi_generic *) sp->spi;
333  return s->ops->spiSlave_send(slave, data, len, waittime);
334 }
335 inline int32_t spiSlave_recv(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime) {
336  struct spi_slave_generic *sp = (struct spi_slave_generic *) slave;
337  struct spi_generic *s = (struct spi_generic *) sp->spi;
338  return s->ops->spiSlave_recv(slave, data, len, waittime);
339 }
340 
341 inline int32_t spiSlave_transferISR(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len) {
342  struct spi_slave_generic *sp = (struct spi_slave_generic *) slave;
343  struct spi_generic *s = (struct spi_generic *) sp->spi;
344  return s->ops->spiSlave_transferISR(slave, sendData, recvData, len);
345 }
346 inline int32_t spiSlave_sendISR(struct spi_slave *slave, uint16_t *data, uint32_t len) {
347  struct spi_slave_generic *sp = (struct spi_slave_generic *) slave;
348  struct spi_generic *s = (struct spi_generic *) sp->spi;
349  return s->ops->spiSlave_sendISR(slave, data, len);
350 }
351 inline int32_t spiSlave_recvISR(struct spi_slave *slave, uint16_t *data, uint32_t len) {
352  struct spi_slave_generic *sp = (struct spi_slave_generic *) slave;
353  struct spi_generic *s = (struct spi_generic *) sp->spi;
354  return s->ops->spiSlave_recvISR(slave, data, len);
355 }
356 #endif
357 #endif
spiSlave_deinit
int32_t spiSlave_deinit(struct spi_slave *slave)
spiSlave_transferISR
int32_t spiSlave_transferISR(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len)
spiSlave_recvISR
int32_t spiSlave_recvISR(struct spi_slave *slave, uint16_t *data, uint32_t len)
OS_DEFINE_MUTEX_RECURSIVE
#define OS_DEFINE_MUTEX_RECURSIVE(name)
Definition: os.h:59
SPI_3WIRE_CS
@ SPI_3WIRE_CS
Definition: spi.h:105
hal.h
SPI_3WIRE_CS_PCS
@ SPI_3WIRE_CS_PCS
Definition: spi.h:109
spi_opt::cpha
bool cpha
Definition: spi.h:53
spi_opt::size
uint8_t size
Definition: spi.h:75
spi_opt::wdelay
uint32_t wdelay
Definition: spi.h:79
HAL_DEFINE_GLOBAL_ARRAY
#define HAL_DEFINE_GLOBAL_ARRAY(gns)
Definition: hal.h:149
spi_opt::gpio
uint16_t gpio
Definition: spi.h:69
spiSlave_send
int32_t spiSlave_send(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime)
spi_opt::cs_hold
uint32_t cs_hold
Definition: spi.h:83
spi_mode
spi_mode
Definition: spi.h:97
spi_slave_generic
Definition: spi.h:181
spiSlave_transfer
int32_t spiSlave_transfer(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len, TickType_t waittime)
HAL_GET_DEV
#define HAL_GET_DEV(gns, index)
Definition: hal.h:182
SPI_3WIRE
@ SPI_3WIRE
Definition: spi.h:101
spiSlave_sendISR
int32_t spiSlave_sendISR(struct spi_slave *slave, uint16_t *data, uint32_t len)
spi_opt::baudrate
uint32_t baudrate
Definition: spi.h:91
SPI_SLAVE
@ SPI_SLAVE
Definition: spi.h:114
spi_opt
Definition: spi.h:39
spi_opt::cs_delay
uint32_t cs_delay
Definition: spi.h:87
spi_generic
Definition: spi.h:151
spi_opt::lsb
bool lsb
Definition: spi.h:43
system.h
spiSlave_init
struct spi_slave * spiSlave_init(struct spi *spi, struct spi_opt *options)
spi_deinit
int32_t spi_deinit(struct spi *spi)
spi_opt::cpol
bool cpol
Definition: spi.h:48
spi_opt::csLowInactive
bool csLowInactive
Definition: spi.h:62
spi_init
struct spi * spi_init(uint32_t index, enum spi_mode mode, struct spi_opt *opt)
spi_slave_generic::spi
struct spi * spi
Definition: spi.h:185
spi_generic::init
bool init
Definition: spi.h:156
spi_setCallback
int32_t spi_setCallback(struct spi *spi, bool(*callback)(struct spi_slave *slave, void *data), void *data)
spiSlave_recv
int32_t spiSlave_recv(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime)
spi_opt::cs
uint8_t cs
Definition: spi.h:58