Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 81 additions & 79 deletions libraries/SPI/SPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,115 +11,117 @@
/* Serial Peripheral Control Register */
uint8_t SPCR;

arduino::ZephyrSPI::ZephyrSPI(const struct device *spi) : spi_dev(spi) {}
arduino::ZephyrSPI::ZephyrSPI(const struct device *spi) : spi_dev(spi) {
}

uint8_t arduino::ZephyrSPI::transfer(uint8_t data) {
int ret;
uint8_t rx;
const struct spi_buf tx_buf = {.buf = &data, .len = sizeof(data)};
const struct spi_buf_set tx_buf_set = {
.buffers = &tx_buf,
.count = 1,
};
const struct spi_buf rx_buf = {.buf = &rx, .len = sizeof(rx)};
const struct spi_buf_set rx_buf_set = {
.buffers = &rx_buf,
.count = 1,
};

ret = spi_transceive(spi_dev, &config, &tx_buf_set, &rx_buf_set);
if (ret < 0) {
return 0;
}

return rx;
int ret;
uint8_t rx;
const struct spi_buf tx_buf = {.buf = &data, .len = sizeof(data)};
const struct spi_buf_set tx_buf_set = {
.buffers = &tx_buf,
.count = 1,
};
const struct spi_buf rx_buf = {.buf = &rx, .len = sizeof(rx)};
const struct spi_buf_set rx_buf_set = {
.buffers = &rx_buf,
.count = 1,
};

ret = spi_transceive(spi_dev, &config, &tx_buf_set, &rx_buf_set);
if (ret < 0) {
return 0;
}

return rx;
}

uint16_t arduino::ZephyrSPI::transfer16(uint16_t data) {
int ret;
uint16_t rx;
const struct spi_buf tx_buf = {.buf = &data, .len = sizeof(data)};
const struct spi_buf_set tx_buf_set = {
.buffers = &tx_buf,
.count = 1,
};
const struct spi_buf rx_buf = {.buf = &rx, .len = sizeof(rx)};
const struct spi_buf_set rx_buf_set = {
.buffers = &rx_buf,
.count = 1,
};

ret = spi_transceive(spi_dev, &config, &tx_buf_set, &rx_buf_set);
if (ret < 0) {
return 0;
}

return rx;
int ret;
uint16_t rx;
const struct spi_buf tx_buf = {.buf = &data, .len = sizeof(data)};
const struct spi_buf_set tx_buf_set = {
.buffers = &tx_buf,
.count = 1,
};
const struct spi_buf rx_buf = {.buf = &rx, .len = sizeof(rx)};
const struct spi_buf_set rx_buf_set = {
.buffers = &rx_buf,
.count = 1,
};

ret = spi_transceive(spi_dev, &config, &tx_buf_set, &rx_buf_set);
if (ret < 0) {
return 0;
}

return rx;
}

void arduino::ZephyrSPI::transfer(void *buf, size_t count) {
int ret;
const struct spi_buf tx_buf = {.buf = buf, .len = count};
const struct spi_buf_set tx_buf_set = {
.buffers = &tx_buf,
.count = 1,
};

ret = spi_write(spi_dev, &config, &tx_buf_set);
if (ret < 0) {
return;
}

ret = spi_read(spi_dev, &config, &tx_buf_set);
if (ret < 0) {
return;
}
int ret;
const struct spi_buf tx_buf = {.buf = buf, .len = count};
const struct spi_buf_set tx_buf_set = {
.buffers = &tx_buf,
.count = 1,
};

ret = spi_write(spi_dev, &config, &tx_buf_set);
if (ret < 0) {
return;
}

ret = spi_read(spi_dev, &config, &tx_buf_set);
if (ret < 0) {
return;
}
}

void arduino::ZephyrSPI::usingInterrupt(int interruptNumber) {
interrupt[interrupt_pos++] = interruptNumber;
interrupt[interrupt_pos++] = interruptNumber;
}

void arduino::ZephyrSPI::notUsingInterrupt(int interruptNumber) {
for (size_t i = 0; i < interrupt_pos; ++i) {
if (interrupt[i] == interruptNumber) {
memmove(&interrupt[i], &interrupt[i + 1], interrupt_pos - i - 1);
interrupt_pos--;
break;
}
}
for (size_t i = 0; i < interrupt_pos; ++i) {
if (interrupt[i] == interruptNumber) {
memmove(&interrupt[i], &interrupt[i + 1], interrupt_pos - i - 1);
Comment thread
soburi marked this conversation as resolved.
interrupt_pos--;
break;
}
}
}

void arduino::ZephyrSPI::beginTransaction(SPISettings settings) {
memset(&config, 0, sizeof(config));
config.frequency = settings.getClockFreq();
config.operation = ((settings.getBitOrder() ^ 1) << 4) |
(settings.getDataMode() << 1) | ((SPCR >> MSTR) & 1) |
SPI_WORD_SET(8);
memset(&config, 0, sizeof(config));
config.frequency = settings.getClockFreq();
config.operation = ((settings.getBitOrder() ^ 1) << 4) | (settings.getDataMode() << 1) |
((SPCR >> MSTR) & 1) | SPI_WORD_SET(8);

detachInterrupt();
detachInterrupt();
}

void arduino::ZephyrSPI::endTransaction(void) {
spi_release(spi_dev, &config);
attachInterrupt();
spi_release(spi_dev, &config);
attachInterrupt();
}

void arduino::ZephyrSPI::attachInterrupt() {
for (size_t i = 0; i < interrupt_pos; ++i) {
enableInterrupt(interrupt[i]);
}
for (size_t i = 0; i < interrupt_pos; ++i) {
enableInterrupt(interrupt[i]);
}
}

void arduino::ZephyrSPI::detachInterrupt() {
for (size_t i = 0; i < interrupt_pos; ++i) {
disableInterrupt(interrupt[i]);
}
for (size_t i = 0; i < interrupt_pos; ++i) {
disableInterrupt(interrupt[i]);
}
}

void arduino::ZephyrSPI::begin() {}
void arduino::ZephyrSPI::begin() {
}

void arduino::ZephyrSPI::end() {}
void arduino::ZephyrSPI::end() {
}

#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), spis)
#if (DT_PROP_LEN(DT_PATH(zephyr_user), spis) > 1)
Expand Down
42 changes: 21 additions & 21 deletions libraries/SPI/SPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,42 +16,42 @@
#define CPOL 3
#define MSTR 4
#define DORD 5
#define SPE 6
#define SPE 6
#define SPIE 7

/* Count the number of GPIOs for limit of number of interrupts */
#define INTERRUPT_HELPER(n, p, i) 1
#define INTERRUPT_COUNT \
DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, \
#define INTERRUPT_COUNT \
DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, \
INTERRUPT_HELPER, (+))

namespace arduino {
class ZephyrSPI : public HardwareSPI {
public:
ZephyrSPI(const struct device *spi);
ZephyrSPI(const struct device *spi);

virtual uint8_t transfer(uint8_t data);
virtual uint16_t transfer16(uint16_t data);
virtual void transfer(void *buf, size_t count);
virtual uint8_t transfer(uint8_t data);
virtual uint16_t transfer16(uint16_t data);
virtual void transfer(void *buf, size_t count);

// Transaction Functions
virtual void usingInterrupt(int interruptNumber);
virtual void notUsingInterrupt(int interruptNumber);
virtual void beginTransaction(SPISettings settings);
virtual void endTransaction(void);
// Transaction Functions
virtual void usingInterrupt(int interruptNumber);
virtual void notUsingInterrupt(int interruptNumber);
virtual void beginTransaction(SPISettings settings);
virtual void endTransaction(void);

// SPI Configuration methods
virtual void attachInterrupt();
virtual void detachInterrupt();
// SPI Configuration methods
virtual void attachInterrupt();
virtual void detachInterrupt();

virtual void begin();
virtual void end();
virtual void begin();
virtual void end();

private:
const struct device *spi_dev;
struct spi_config config;
int interrupt[INTERRUPT_COUNT];
size_t interrupt_pos = 0;
const struct device *spi_dev;
struct spi_config config;
int interrupt[INTERRUPT_COUNT];
size_t interrupt_pos = 0;
};

} // namespace arduino
Expand Down
Loading
Loading