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;