15
#include <drivers/char_dev.h>
16
#include <drivers/spi.h>
17
#include <embox/unit.h>
18
#include <framework/mod/options.h>
22
#if SPI_REGISTRY_SZ > 0
23
struct spi_device spi_device0 __attribute__((weak));
25
#if SPI_REGISTRY_SZ > 1
26
struct spi_device spi_device1 __attribute__((weak));
28
#if SPI_REGISTRY_SZ > 2
29
struct spi_device spi_device2 __attribute__((weak));
31
#if SPI_REGISTRY_SZ > 3
32
struct spi_device spi_device3 __attribute__((weak));
34
#if SPI_REGISTRY_SZ > 4
35
struct spi_device spi_device4 __attribute__((weak));
37
#if SPI_REGISTRY_SZ > 5
38
struct spi_device spi_device5 __attribute__((weak));
42
struct spi_device *spi_device_registry[SPI_REGISTRY_SZ] = {
43
#if SPI_REGISTRY_SZ > 0
46
#if SPI_REGISTRY_SZ > 1
49
#if SPI_REGISTRY_SZ > 1
52
#if SPI_REGISTRY_SZ > 1
55
#if SPI_REGISTRY_SZ > 1
58
#if SPI_REGISTRY_SZ > 1
69
static int spi_init(void) {
70
struct spi_device *dev;
72
for (int i = 0; i < SPI_REGISTRY_SZ; i++) {
73
dev = spi_device_registry[i];
81
if (dev->spi_ops->init) {
82
dev->spi_ops->init(dev);
85
log_warning("SPI%d has no init funcion", i);
91
EMBOX_UNIT_INIT(spi_init);
96
struct spi_device *spi_dev_by_id(int id) {
97
if (id < 0 || id >= SPI_REGISTRY_SZ) {
101
if (spi_device_registry[id]->spi_ops != NULL) {
102
return spi_device_registry[id];
112
int spi_dev_id(struct spi_device *dev) {
113
for (int i = 0; i < SPI_REGISTRY_SZ; i++) {
114
if (dev == spi_device_registry[i]
115
&& spi_device_registry[i]->spi_ops != NULL) {
120
log_error("Wrong SPI device pointer: %p", dev);
134
int spi_transfer(struct spi_device *dev, uint8_t *in, uint8_t *out, int cnt) {
136
assert(dev->spi_ops);
139
if (dev->spi_ops->transfer == NULL) {
140
log_debug("Transfer operation is not supported for SPI%d",
145
return dev->spi_ops->transfer(dev, in, out, cnt);
151
int spi_select(struct spi_device *dev, int cs) {
153
assert(dev->spi_ops);
155
if (dev->spi_ops->select == NULL) {
156
log_debug("Select operation is not supported for SPI%d",
161
return dev->spi_ops->select(dev, cs);
167
static int spi_set_mode(struct spi_device *dev, bool is_master) {
169
assert(dev->spi_ops);
171
if (dev->spi_ops->set_mode == NULL) {
172
log_debug("SPI mode setting is not supported for SPI%d",
177
dev->is_master = is_master;
179
return dev->spi_ops->set_mode(dev, is_master);
182
int spi_set_master_mode(struct spi_device *dev) {
183
return spi_set_mode(dev, true);
186
int spi_set_slave_mode(struct spi_device *dev) {
187
return spi_set_mode(dev, false);