diff --git a/conf/modules/ahrs_chimu_spi.xml b/conf/modules/ahrs_chimu_spi.xml
index dd57db80cc..3b512906a2 100644
--- a/conf/modules/ahrs_chimu_spi.xml
+++ b/conf/modules/ahrs_chimu_spi.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
index 1c202e2969..7e46b28357 100644
--- a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
+++ b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
@@ -38,6 +38,7 @@
#include "pprz_debug.h"
#include "armVIC.h"
+struct spi_slave_hs spi_slave_hs;
/* High Speed SPI Slave Circular Buffer */
uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx;
@@ -103,6 +104,36 @@ static void SSP_ISR(void) __attribute__((naked));
#endif
+// Functions for the generic device API
+static int spi_slave_hs_check_free_space(struct spi_slave_hs *p __attribute__((unused)), uint8_t len __attribute__((unused)))
+{
+ return TRUE;
+}
+
+static void spi_slave_hs_transmit(struct spi_slave_hs *p __attribute__((unused)), uint8_t byte)
+{
+ uint8_t temp = (spi_slave_hs_tx_insert_idx + 1) % SPI_SLAVE_HS_TX_BUFFER_SIZE;
+ if (temp != spi_slave_hs_tx_extract_idx) /* there is room left */
+ {
+ spi_slave_hs_tx_buffer[spi_slave_hs_tx_insert_idx] = byte;
+ spi_slave_hs_tx_insert_idx = temp;
+ }
+}
+
+static void spi_slave_hs_send(struct spi_slave_hs *p __attribute__((unused))) { }
+
+static int spi_slave_hs_char_available(struct spi_slave_hs *p __attribute__((unused)))
+{
+ return spi_slave_hs_rx_insert_idx != spi_slave_hs_rx_extract_idx;
+}
+
+static uint8_t spi_slave_hs_getch(struct spi_slave_hs *p __attribute__((unused)))
+{
+ uint8_t ret = spi_slave_hs_rx_buffer[spi_slave_hs_rx_extract_idx];
+ spi_slave_hs_rx_extract_idx = (spi_slave_hs_rx_extract_idx + 1)%SPI_SLAVE_HS_RX_BUFFER_SIZE;
+ return ret;
+}
+
void spi_slave_hs_init(void)
{
@@ -129,6 +160,14 @@ void spi_slave_hs_init(void)
// Enable Receive interrupt
SetBit(SSPIMSC, RXIM);
+ // Configure generic device
+ spi_slave_hs.device.periph = (void *)(&spi_slave_hs);
+ spi_slave_hs.device.check_free_space = (check_free_space_t) spi_slave_hs_check_free_space;
+ spi_slave_hs.device.transmit = (transmit_t) spi_slave_hs_transmit;
+ spi_slave_hs.device.send_message = (send_message_t) spi_slave_hs_send;
+ spi_slave_hs.device.char_available = (char_available_t) spi_slave_hs_char_available;
+ spi_slave_hs.device.getchar = (getchar_t) spi_slave_hs_getch;
+
}
/*
diff --git a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.h b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.h
index 957931742c..f695de20e9 100644
--- a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.h
+++ b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.h
@@ -32,7 +32,14 @@
#define SPI_SLAVE_HS_ARCH_H
#include "std.h"
+#include "mcu_periph/link_device.h"
+struct spi_slave_hs {
+ /** Generic device interface */
+ struct link_device device;
+};
+
+extern struct spi_slave_hs spi_slave_hs;
#define SpiEnable() { \
SetBit(SSPCR1, SSE); \
@@ -48,29 +55,11 @@
extern uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx;
extern uint8_t spi_slave_hs_rx_buffer[SPI_SLAVE_HS_RX_BUFFER_SIZE];
-#define SpiSlaveChAvailable() (spi_slave_hs_rx_insert_idx != spi_slave_hs_rx_extract_idx)
-
-#define SpiSlaveGetch() ({\
- uint8_t ret = spi_slave_hs_rx_buffer[spi_slave_hs_rx_extract_idx]; \
- spi_slave_hs_rx_extract_idx = (spi_slave_hs_rx_extract_idx + 1)%SPI_SLAVE_HS_RX_BUFFER_SIZE; \
- ret; \
- })
#define SPI_SLAVE_HS_TX_BUFFER_SIZE 64
extern uint8_t spi_slave_hs_tx_insert_idx, spi_slave_hs_tx_extract_idx;
extern uint8_t spi_slave_hs_tx_buffer[SPI_SLAVE_HS_TX_BUFFER_SIZE];
-#define SpiSlaveTransmit(data) {\
- uint8_t temp = (spi_slave_hs_tx_insert_idx + 1) % SPI_SLAVE_HS_TX_BUFFER_SIZE; \
- if (temp != spi_slave_hs_tx_extract_idx) /* there is room left */ \
- { \
- spi_slave_hs_tx_buffer[spi_slave_hs_tx_insert_idx] = (uint8_t)data; \
- spi_slave_hs_tx_insert_idx = temp; \
- } \
- }
-
-
-
#endif
diff --git a/sw/airborne/mcu_periph/spi.h b/sw/airborne/mcu_periph/spi.h
index 29c940552c..b09b222828 100644
--- a/sw/airborne/mcu_periph/spi.h
+++ b/sw/airborne/mcu_periph/spi.h
@@ -365,6 +365,7 @@ extern bool_t spi_slave_wait(struct spi_periph *p);
/** @}*/
#if SPI_SLAVE_HS
+#include "mcu_periph/spi_slave_hs_arch.h"
extern void spi_slave_hs_init(void);
#endif
diff --git a/sw/airborne/modules/ins/ins_module.h b/sw/airborne/modules/ins/ins_module.h
index 8f6416413a..cbc952d762 100644
--- a/sw/airborne/modules/ins/ins_module.h
+++ b/sw/airborne/modules/ins/ins_module.h
@@ -77,6 +77,7 @@ void parse_ins_buffer(uint8_t);
#ifndef SITL
#include "mcu_periph/uart.h"
+#include "mcu_periph/spi.h"
#define InsSend1(c) InsLinkDevice->transmit(InsLinkDevice->periph, c)
#define InsUartSend1(c) InsSend1(c)
diff --git a/sw/airborne/subsystems/chibios-libopencm3/chibios_sdlog.c b/sw/airborne/subsystems/chibios-libopencm3/chibios_sdlog.c
index 3d3122dc71..030ac643af 100644
--- a/sw/airborne/subsystems/chibios-libopencm3/chibios_sdlog.c
+++ b/sw/airborne/subsystems/chibios-libopencm3/chibios_sdlog.c
@@ -87,8 +87,8 @@ bool_t chibios_logInit(const bool_t binaryFile)
chibios_sdlog.device.check_free_space = (check_free_space_t) sdlog_check_free_space;
chibios_sdlog.device.transmit = (transmit_t) sdlog_transmit;
chibios_sdlog.device.send_message = (send_message_t) sdlog_send;
- chibios_sdlog.device.char_available = (char_available_t) null_function; // read only
- chibios_sdlog.device.getchar = (getchar_t) null_function; // read only
+ chibios_sdlog.device.char_available = (char_available_t) null_function; // write only
+ chibios_sdlog.device.getchar = (getchar_t) null_function; // write only
if (sdLogInit (NULL) != SDLOG_OK)
goto error;