[spi] update spi_slave_hs for generic device (and chimu_spi)

This commit is contained in:
Gautier Hattenberger
2015-03-17 11:59:33 +01:00
parent c3ef7aefed
commit 42086aa5ef
6 changed files with 51 additions and 21 deletions
+1 -1
View File
@@ -13,7 +13,7 @@
<define name="USE_AHRS"/> <define name="USE_AHRS"/>
<define name="USE_INS_MODULE"/> <define name="USE_INS_MODULE"/>
<define name="USE_SPI"/> <define name="USE_SPI"/>
<define name="INS_LINK" value="SpiSlave"/> <define name="INS_LINK" value="spi_slave_hs"/>
<define name="USE_USB_HIGH_PCLK" /> <define name="USE_USB_HIGH_PCLK" />
<file name="ahrs_chimu_spi.c"/> <file name="ahrs_chimu_spi.c"/>
<file name="imu_chimu.c"/> <file name="imu_chimu.c"/>
@@ -38,6 +38,7 @@
#include "pprz_debug.h" #include "pprz_debug.h"
#include "armVIC.h" #include "armVIC.h"
struct spi_slave_hs spi_slave_hs;
/* High Speed SPI Slave Circular Buffer */ /* High Speed SPI Slave Circular Buffer */
uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx; 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 #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) void spi_slave_hs_init(void)
{ {
@@ -129,6 +160,14 @@ void spi_slave_hs_init(void)
// Enable Receive interrupt // Enable Receive interrupt
SetBit(SSPIMSC, RXIM); 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;
} }
/* /*
@@ -32,7 +32,14 @@
#define SPI_SLAVE_HS_ARCH_H #define SPI_SLAVE_HS_ARCH_H
#include "std.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() { \ #define SpiEnable() { \
SetBit(SSPCR1, SSE); \ SetBit(SSPCR1, SSE); \
@@ -48,29 +55,11 @@
extern uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx; 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]; 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 #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_insert_idx, spi_slave_hs_tx_extract_idx;
extern uint8_t spi_slave_hs_tx_buffer[SPI_SLAVE_HS_TX_BUFFER_SIZE]; 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 #endif
+1
View File
@@ -365,6 +365,7 @@ extern bool_t spi_slave_wait(struct spi_periph *p);
/** @}*/ /** @}*/
#if SPI_SLAVE_HS #if SPI_SLAVE_HS
#include "mcu_periph/spi_slave_hs_arch.h"
extern void spi_slave_hs_init(void); extern void spi_slave_hs_init(void);
#endif #endif
+1
View File
@@ -77,6 +77,7 @@ void parse_ins_buffer(uint8_t);
#ifndef SITL #ifndef SITL
#include "mcu_periph/uart.h" #include "mcu_periph/uart.h"
#include "mcu_periph/spi.h"
#define InsSend1(c) InsLinkDevice->transmit(InsLinkDevice->periph, c) #define InsSend1(c) InsLinkDevice->transmit(InsLinkDevice->periph, c)
#define InsUartSend1(c) InsSend1(c) #define InsUartSend1(c) InsSend1(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.check_free_space = (check_free_space_t) sdlog_check_free_space;
chibios_sdlog.device.transmit = (transmit_t) sdlog_transmit; chibios_sdlog.device.transmit = (transmit_t) sdlog_transmit;
chibios_sdlog.device.send_message = (send_message_t) sdlog_send; 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.char_available = (char_available_t) null_function; // write only
chibios_sdlog.device.getchar = (getchar_t) null_function; // read only chibios_sdlog.device.getchar = (getchar_t) null_function; // write only
if (sdLogInit (NULL) != SDLOG_OK) if (sdLogInit (NULL) != SDLOG_OK)
goto error; goto error;