From c2fb0d8b437595e191ef009f187cae01e9993918 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 29 Jul 2011 10:04:55 -0400 Subject: [PATCH] com: allow run-time allocation of buffers --- flight/AHRS/pios_board.c | 19 ++++-- flight/Bootloaders/CopterControl/pios_board.c | 10 ++- flight/Bootloaders/OpenPilot/pios_board.c | 20 +++++- flight/Bootloaders/PipXtreme/pios_board.c | 10 ++- flight/CopterControl/System/pios_board.c | 46 ++++++++++++-- flight/INS/pios_board.c | 19 +++++- flight/Modules/Telemetry/telemetry.c | 48 +++++++------- flight/OpenPilot/System/pios_board.c | 57 ++++++++++++----- flight/PiOS/Boards/STM32103CB_AHRS.h | 2 - flight/PiOS/Boards/STM32103CB_CC_Rev1.h | 12 ---- .../PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h | 2 - flight/PiOS/Boards/STM3210E_INS.h | 2 - flight/PiOS/Boards/STM3210E_OP.h | 12 ---- flight/PiOS/Common/pios_com.c | 62 ++++++++++++------- flight/PiOS/inc/pios_com.h | 2 +- flight/PipXtreme/pios_board.c | 20 +++++- 16 files changed, 235 insertions(+), 108 deletions(-) diff --git a/flight/AHRS/pios_board.c b/flight/AHRS/pios_board.c index 7de56bf34..aa5b20855 100644 --- a/flight/AHRS/pios_board.c +++ b/flight/AHRS/pios_board.c @@ -246,6 +246,9 @@ static const struct pios_usart_cfg pios_usart_aux_cfg = { #include +#define PIOS_COM_AUX_TX_BUF_LEN 192 +static uint8_t pios_com_aux_tx_buffer[PIOS_COM_AUX_TX_BUF_LEN]; + #endif /* PIOS_INCLUDE_COM */ #if defined(PIOS_INCLUDE_I2C) @@ -370,12 +373,16 @@ void PIOS_Board_Init(void) { /* Communication system */ #if !defined(PIOS_ENABLE_DEBUG_PINS) #if defined(PIOS_INCLUDE_COM) - uint32_t pios_usart_aux_id; - if (PIOS_USART_Init(&pios_usart_aux_id, &pios_usart_aux_cfg)) { - PIOS_DEBUG_Assert(0); - } - if (PIOS_COM_Init(&pios_com_aux_id, &pios_usart_com_driver, pios_usart_aux_id)) { - PIOS_DEBUG_Assert(0); + { + uint32_t pios_usart_aux_id; + if (PIOS_USART_Init(&pios_usart_aux_id, &pios_usart_aux_cfg)) { + PIOS_DEBUG_Assert(0); + } + if (PIOS_COM_Init(&pios_com_aux_id, &pios_usart_com_driver, pios_usart_aux_id, + NULL, 0, + pios_com_aux_tx_buffer, sizeof(pios_com_aux_tx_buffer))) { + PIOS_DEBUG_Assert(0); + } } #endif /* PIOS_INCLUDE_COM */ #endif diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index 10a5c2b78..28a280f4b 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -31,6 +31,12 @@ #include +#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 + +static uint8_t pios_com_telem_usb_rx_buffer[PIOS_COM_TELEM_USB_RX_BUF_LEN]; +static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; + #endif /* PIOS_INCLUDE_COM */ // *********************************************************************************** @@ -83,7 +89,9 @@ void PIOS_Board_Init(void) { PIOS_Assert(0); } #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id)) { + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), + pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); } #endif /* PIOS_INCLUDE_COM */ diff --git a/flight/Bootloaders/OpenPilot/pios_board.c b/flight/Bootloaders/OpenPilot/pios_board.c index 43dafe803..5defbb626 100644 --- a/flight/Bootloaders/OpenPilot/pios_board.c +++ b/flight/Bootloaders/OpenPilot/pios_board.c @@ -184,6 +184,18 @@ const struct pios_usart_cfg pios_usart_telem_cfg = { #include "pios_com_priv.h" +#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 + +static uint8_t pios_com_telem_usb_rx_buffer[PIOS_COM_TELEM_USB_RX_BUF_LEN]; +static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; + +#define PIOS_COM_TELEM_RF_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_RF_TX_BUF_LEN 192 + +static uint8_t pios_com_telem_rf_rx_buffer[PIOS_COM_TELEM_RF_RX_BUF_LEN]; +static uint8_t pios_com_telem_rf_tx_buffer[PIOS_COM_TELEM_RF_TX_BUF_LEN]; + #endif /* PIOS_INCLUDE_COM */ #if defined(PIOS_INCLUDE_USB_HID) @@ -235,7 +247,9 @@ void PIOS_Board_Init(void) { PIOS_DEBUG_Assert(0); } if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, - pios_usart_telem_rf_id)) { + pios_usart_telem_rf_id, + pios_com_telem_rf_rx_buffer, sizeof(pios_com_telem_rf_rx_buffer), + pios_com_telem_rf_tx_buffer, sizeof(pios_com_telem_rf_tx_buffer))) { PIOS_DEBUG_Assert(0); } #endif /* PIOS_INCLUDE_COM */ @@ -246,7 +260,9 @@ void PIOS_Board_Init(void) { uint32_t pios_usb_hid_id; PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id)) { + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), + pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); } #endif /* PIOS_INCLUDE_COM */ diff --git a/flight/Bootloaders/PipXtreme/pios_board.c b/flight/Bootloaders/PipXtreme/pios_board.c index ac22f91f0..83f0f407a 100644 --- a/flight/Bootloaders/PipXtreme/pios_board.c +++ b/flight/Bootloaders/PipXtreme/pios_board.c @@ -31,6 +31,12 @@ #include +#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 + +static uint8_t pios_com_telem_usb_rx_buffer[PIOS_COM_TELEM_USB_RX_BUF_LEN]; +static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; + #endif /* PIOS_INCLUDE_COM */ // *********************************************************************************** @@ -81,7 +87,9 @@ void PIOS_Board_Init(void) { uint32_t pios_usb_hid_id; PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id)) { + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), + pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); } #endif /* PIOS_INCLUDE_COM */ diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index b6bed153a..5717ab2b7 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -522,6 +522,14 @@ static const struct pios_sbus_cfg pios_sbus_cfg = { #include "pios_com_priv.h" +#define PIOS_COM_TELEM_RF_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_RF_TX_BUF_LEN 192 + +#define PIOS_COM_GPS_RX_BUF_LEN 96 + +#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 + #endif /* PIOS_INCLUDE_COM */ #if defined(PIOS_INCLUDE_RTC) @@ -926,7 +934,14 @@ void PIOS_Board_Init(void) { if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_main_cfg)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id)) { + + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id, + rx_buffer, PIOS_COM_TELEM_RF_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_RF_TX_BUF_LEN)) { PIOS_Assert(0); } } @@ -959,7 +974,12 @@ void PIOS_Board_Init(void) { if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_main_cfg)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id)) { + + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_GPS_RX_BUF_LEN); + PIOS_Assert(rx_buffer); + if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id, + rx_buffer, PIOS_COM_GPS_RX_BUF_LEN, + NULL, 0)) { PIOS_Assert(0); } } @@ -1003,7 +1023,13 @@ void PIOS_Board_Init(void) { if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_flexi_cfg)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id)) { + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id, + rx_buffer, PIOS_COM_TELEM_RF_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_RF_TX_BUF_LEN)) { PIOS_Assert(0); } } @@ -1016,7 +1042,11 @@ void PIOS_Board_Init(void) { if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_flexi_cfg)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id)) { + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_GPS_RX_BUF_LEN); + PIOS_Assert(rx_buffer); + if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id, + rx_buffer, PIOS_COM_GPS_RX_BUF_LEN, + NULL, 0)) { PIOS_Assert(0); } } @@ -1140,7 +1170,13 @@ void PIOS_Board_Init(void) { uint32_t pios_usb_hid_id; PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id)) { + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { PIOS_Assert(0); } #endif /* PIOS_INCLUDE_COM */ diff --git a/flight/INS/pios_board.c b/flight/INS/pios_board.c index e95930bd1..ffbf27c45 100644 --- a/flight/INS/pios_board.c +++ b/flight/INS/pios_board.c @@ -346,6 +346,21 @@ static const struct pios_usart_cfg pios_usart_aux_cfg = { #endif /* PIOS_COM_AUX */ +#if defined(PIOS_INCLUDE_COM) + +#include + +#if 0 +#define PIOS_COM_AUX_TX_BUF_LEN 192 +static uint8_t pios_com_aux_tx_buffer[PIOS_COM_AUX_TX_BUF_LEN]; +#endif + +#define PIOS_COM_GPS_RX_BUF_LEN 96 +static uint8_t pios_com_gps_rx_buffer[PIOS_COM_GPS_RX_BUF_LEN]; + + +#endif /* PIOS_INCLUDE_COM */ + #if defined(PIOS_INCLUDE_I2C) #include @@ -517,7 +532,9 @@ void PIOS_Board_Init(void) { if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_cfg)) { PIOS_DEBUG_Assert(0); } - if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id)) { + if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id, + pios_com_gps_rx_buffer, sizeof(pios_com_gps_rx_buffer), + NULL, 0)) { PIOS_DEBUG_Assert(0); } #endif /* PIOS_INCLUDE_GPS */ diff --git a/flight/Modules/Telemetry/telemetry.c b/flight/Modules/Telemetry/telemetry.c index 828467b4d..06581fe1a 100644 --- a/flight/Modules/Telemetry/telemetry.c +++ b/flight/Modules/Telemetry/telemetry.c @@ -318,15 +318,19 @@ static void telemetryRxTask(void *parameters) inputPort = telemetryPort; } - // Block until data are available - uint8_t serial_data[1]; - uint16_t bytes_to_process; + if (inputPort) { + // Block until data are available + uint8_t serial_data[1]; + uint16_t bytes_to_process; - bytes_to_process = PIOS_COM_ReceiveBuffer(inputPort, serial_data, sizeof(serial_data), 500); - if (bytes_to_process > 0) { - for (uint8_t i = 0; i < bytes_to_process; i++) { - UAVTalkProcessInputStream(serial_data[i]); + bytes_to_process = PIOS_COM_ReceiveBuffer(inputPort, serial_data, sizeof(serial_data), 500); + if (bytes_to_process > 0) { + for (uint8_t i = 0; i < bytes_to_process; i++) { + UAVTalkProcessInputStream(serial_data[i]); + } } + } else { + vTaskDelay(5); } } } @@ -351,7 +355,11 @@ static int32_t transmitData(uint8_t * data, int32_t length) outputPort = telemetryPort; } - return PIOS_COM_SendBufferNonBlocking(outputPort, data, length); + if (outputPort) { + return PIOS_COM_SendBufferNonBlocking(outputPort, data, length); + } else { + return -1; + } } /** @@ -507,20 +515,16 @@ static void updateSettings() // Retrieve settings TelemetrySettingsGet(&settings); - // Set port speed - if (settings.Speed == TELEMETRYSETTINGS_SPEED_2400) PIOS_COM_ChangeBaud(telemetryPort, 2400); - else - if (settings.Speed == TELEMETRYSETTINGS_SPEED_4800) PIOS_COM_ChangeBaud(telemetryPort, 4800); - else - if (settings.Speed == TELEMETRYSETTINGS_SPEED_9600) PIOS_COM_ChangeBaud(telemetryPort, 9600); - else - if (settings.Speed == TELEMETRYSETTINGS_SPEED_19200) PIOS_COM_ChangeBaud(telemetryPort, 19200); - else - if (settings.Speed == TELEMETRYSETTINGS_SPEED_38400) PIOS_COM_ChangeBaud(telemetryPort, 38400); - else - if (settings.Speed == TELEMETRYSETTINGS_SPEED_57600) PIOS_COM_ChangeBaud(telemetryPort, 57600); - else - if (settings.Speed == TELEMETRYSETTINGS_SPEED_115200) PIOS_COM_ChangeBaud(telemetryPort, 115200); + if (telemetryPort) { + // Set port speed + if (settings.Speed == TELEMETRYSETTINGS_SPEED_2400) PIOS_COM_ChangeBaud(telemetryPort, 2400); + else if (settings.Speed == TELEMETRYSETTINGS_SPEED_4800) PIOS_COM_ChangeBaud(telemetryPort, 4800); + else if (settings.Speed == TELEMETRYSETTINGS_SPEED_9600) PIOS_COM_ChangeBaud(telemetryPort, 9600); + else if (settings.Speed == TELEMETRYSETTINGS_SPEED_19200) PIOS_COM_ChangeBaud(telemetryPort, 19200); + else if (settings.Speed == TELEMETRYSETTINGS_SPEED_38400) PIOS_COM_ChangeBaud(telemetryPort, 38400); + else if (settings.Speed == TELEMETRYSETTINGS_SPEED_57600) PIOS_COM_ChangeBaud(telemetryPort, 57600); + else if (settings.Speed == TELEMETRYSETTINGS_SPEED_115200) PIOS_COM_ChangeBaud(telemetryPort, 115200); + } } /** diff --git a/flight/OpenPilot/System/pios_board.c b/flight/OpenPilot/System/pios_board.c index dbc860010..822b7a8ae 100644 --- a/flight/OpenPilot/System/pios_board.c +++ b/flight/OpenPilot/System/pios_board.c @@ -454,7 +454,7 @@ void PIOS_RTC_IRQ_Handler (void) #endif -#ifdef PIOS_COM_SPEKTRUM +#if defined(PIOS_INCLUDE_SPEKTRUM) /* * SPEKTRUM USART */ @@ -521,6 +521,14 @@ static const struct pios_spektrum_cfg pios_spektrum_cfg = { #include "pios_com_priv.h" +#define PIOS_COM_TELEM_RF_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_RF_TX_BUF_LEN 192 + +#define PIOS_COM_GPS_RX_BUF_LEN 96 + +#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 + #endif /* PIOS_INCLUDE_COM */ /** @@ -1042,22 +1050,37 @@ void PIOS_Board_Init(void) { /* Initialize the PiOS library */ #if defined(PIOS_INCLUDE_COM) #if defined(PIOS_INCLUDE_TELEMETRY_RF) - uint32_t pios_usart_telem_rf_id; - if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_cfg)) { - PIOS_Assert(0); - } - if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id)) { - PIOS_Assert(0); + { + uint32_t pios_usart_telem_rf_id; + if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_cfg)) { + PIOS_Assert(0); + } + + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id, + rx_buffer, PIOS_COM_TELEM_RF_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_RF_TX_BUF_LEN)) { + PIOS_Assert(0); + } } #endif /* PIOS_INCLUDE_TELEMETRY_RF */ #if defined(PIOS_INCLUDE_GPS) - uint32_t pios_usart_gps_id; - if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_cfg)) { - PIOS_Assert(0); - } - if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id)) { - PIOS_Assert(0); + { + uint32_t pios_usart_gps_id; + if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_cfg)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_GPS_RX_BUF_LEN); + PIOS_Assert(rx_buffer); + if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id, + rx_buffer, PIOS_COM_GPS_RX_BUF_LEN, + NULL, 0)) { + PIOS_Assert(0); + } } #endif /* PIOS_INCLUDE_GPS */ #endif @@ -1150,7 +1173,13 @@ void PIOS_Board_Init(void) { uint32_t pios_usb_hid_id; PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id)) { + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { PIOS_Assert(0); } #endif /* PIOS_INCLUDE_COM */ diff --git a/flight/PiOS/Boards/STM32103CB_AHRS.h b/flight/PiOS/Boards/STM32103CB_AHRS.h index f15333d48..26d88fce1 100644 --- a/flight/PiOS/Boards/STM32103CB_AHRS.h +++ b/flight/PiOS/Boards/STM32103CB_AHRS.h @@ -119,8 +119,6 @@ extern uint32_t pios_i2c_main_adapter_id; // See also pios_board.c //------------------------- #define PIOS_COM_MAX_DEVS 2 -#define PIOS_COM_RX_BUFFER_SIZE 256 -#define PIOS_COM_TX_BUFFER_SIZE 256 extern uint32_t pios_com_aux_id; #define PIOS_COM_AUX (pios_com_aux_id) diff --git a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h index 131e3f138..4a82fcccd 100644 --- a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h @@ -131,8 +131,6 @@ extern uint32_t pios_i2c_main_adapter_id; // See also pios_board.c //------------------------- #define PIOS_COM_MAX_DEVS 3 -#define PIOS_COM_RX_BUFFER_SIZE 192 -#define PIOS_COM_TX_BUFFER_SIZE 192 extern uint32_t pios_com_telem_rf_id; #define PIOS_COM_TELEM_RF (pios_com_telem_rf_id) @@ -146,16 +144,6 @@ extern uint32_t pios_com_gps_id; extern uint32_t pios_com_telem_usb_id; #define PIOS_COM_TELEM_USB (pios_com_telem_usb_id) -#ifdef PIOS_INCLUDE_SPEKTRUM -extern uint32_t pios_com_spektrum_id; -#define PIOS_COM_SPEKTRUM (pios_com_spektrum_id) -#endif - -#ifdef PIOS_INCLUDE_SBUS -extern uint32_t pios_com_sbus_id; -#define PIOS_COM_SBUS (pios_com_sbus_id) -#endif - //------------------------- // ADC // PIOS_ADC_PinGet(0) = Gyro Z diff --git a/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h b/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h index a80ea5b08..7027a42bd 100644 --- a/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h @@ -150,8 +150,6 @@ extern uint32_t pios_spi_port_id; // See also pios_board.c //------------------------- #define PIOS_COM_MAX_DEVS 2 -#define PIOS_COM_RX_BUFFER_SIZE 512 -#define PIOS_COM_TX_BUFFER_SIZE 512 extern uint32_t pios_com_serial_id; #define PIOS_COM_SERIAL (pios_com_serial_id) diff --git a/flight/PiOS/Boards/STM3210E_INS.h b/flight/PiOS/Boards/STM3210E_INS.h index 9f02b7f93..d661e8b96 100644 --- a/flight/PiOS/Boards/STM3210E_INS.h +++ b/flight/PiOS/Boards/STM3210E_INS.h @@ -131,8 +131,6 @@ extern uint32_t pios_i2c_gyro_adapter_id; // See also pios_board.c //------------------------- #define PIOS_COM_MAX_DEVS 2 -#define PIOS_COM_RX_BUFFER_SIZE 256 -#define PIOS_COM_TX_BUFFER_SIZE 256 extern uint32_t pios_com_gps_id; #define PIOS_COM_GPS (pios_com_gps_id) diff --git a/flight/PiOS/Boards/STM3210E_OP.h b/flight/PiOS/Boards/STM3210E_OP.h index 4e47a49c9..97efc88d7 100644 --- a/flight/PiOS/Boards/STM3210E_OP.h +++ b/flight/PiOS/Boards/STM3210E_OP.h @@ -145,8 +145,6 @@ extern uint32_t pios_i2c_main_adapter_id; // See also pios_board.c //------------------------- #define PIOS_COM_MAX_DEVS 4 -#define PIOS_COM_RX_BUFFER_SIZE 512 -#define PIOS_COM_TX_BUFFER_SIZE 512 extern uint32_t pios_com_telem_rf_id; #define PIOS_COM_TELEM_RF (pios_com_telem_rf_id) @@ -163,16 +161,6 @@ extern uint32_t pios_com_aux_id; #define PIOS_COM_DEBUG PIOS_COM_AUX #endif -#ifdef PIOS_INCLUDE_SPEKTRUM -extern uint32_t pios_com_spektrum_id; -#define PIOS_COM_SPEKTRUM (pios_com_spektrum_id) -#endif - -#ifdef PIOS_INCLUDE_SBUS -extern uint32_t pios_com_sbus_id; -#define PIOS_COM_SBUS (pios_com_sbus_id) -#endif - //------------------------- // System Settings //------------------------- diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index 001eeea90..b7a9a67e5 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -55,12 +55,10 @@ struct pios_com_dev { xSemaphoreHandle rx_sem; #endif - // align to 32-bit to try and provide speed improvement; - uint8_t rx_buffer[PIOS_COM_RX_BUFFER_SIZE] __attribute__ ((aligned(4))); - t_fifo_buffer rx; + bool has_rx; + bool has_tx; - // align to 32-bit to try and provide speed improvement; - uint8_t tx_buffer[PIOS_COM_TX_BUFFER_SIZE] __attribute__ ((aligned(4))); + t_fifo_buffer rx; t_fifo_buffer tx; }; @@ -110,12 +108,16 @@ static void PIOS_COM_UnblockTx(struct pios_com_dev * com_dev, bool * need_yield) * \param[in] id * \return < 0 if initialisation failed */ -int32_t PIOS_COM_Init(uint32_t * com_id, const struct pios_com_driver * driver, uint32_t lower_id) +int32_t PIOS_COM_Init(uint32_t * com_id, const struct pios_com_driver * driver, uint32_t lower_id, uint8_t * rx_buffer, uint16_t rx_buffer_len, uint8_t * tx_buffer, uint16_t tx_buffer_len) { PIOS_Assert(com_id); PIOS_Assert(driver); - PIOS_Assert(driver->bind_tx_cb); - PIOS_Assert(driver->bind_rx_cb); + + bool has_rx = (rx_buffer && rx_buffer_len > 0); + bool has_tx = (tx_buffer && tx_buffer_len > 0); + PIOS_Assert(has_rx || has_tx); + PIOS_Assert(driver->bind_tx_cb || !has_tx); + PIOS_Assert(driver->bind_rx_cb || !has_rx); struct pios_com_dev * com_dev; @@ -125,24 +127,30 @@ int32_t PIOS_COM_Init(uint32_t * com_id, const struct pios_com_driver * driver, com_dev->driver = driver; com_dev->lower_id = lower_id; - /* Clear buffer counters */ - fifoBuf_init(&com_dev->rx, com_dev->rx_buffer, sizeof(com_dev->rx_buffer)); - fifoBuf_init(&com_dev->tx, com_dev->tx_buffer, sizeof(com_dev->tx_buffer)); + com_dev->has_rx = has_rx; + com_dev->has_tx = has_tx; + if (has_rx) { + fifoBuf_init(&com_dev->rx, rx_buffer, rx_buffer_len); #if defined(PIOS_INCLUDE_FREERTOS) - /* Create semaphores before binding callbacks */ - vSemaphoreCreateBinary(com_dev->rx_sem); - vSemaphoreCreateBinary(com_dev->tx_sem); -#endif - /* Bind our callbacks into the lower layer */ - (com_dev->driver->bind_rx_cb)(lower_id, PIOS_COM_RxInCallback, (uint32_t)com_dev); - (com_dev->driver->bind_tx_cb)(lower_id, PIOS_COM_TxOutCallback, (uint32_t)com_dev); - - if (com_dev->driver->rx_start) { - /* Start the receiver */ - (com_dev->driver->rx_start)(com_dev->lower_id, - fifoBuf_getFree(&com_dev->rx)); + vSemaphoreCreateBinary(com_dev->rx_sem); +#endif /* PIOS_INCLUDE_FREERTOS */ + (com_dev->driver->bind_rx_cb)(lower_id, PIOS_COM_RxInCallback, (uint32_t)com_dev); + if (com_dev->driver->rx_start) { + /* Start the receiver */ + (com_dev->driver->rx_start)(com_dev->lower_id, + fifoBuf_getFree(&com_dev->rx)); + } } + + if (has_tx) { + fifoBuf_init(&com_dev->tx, tx_buffer, tx_buffer_len); +#if defined(PIOS_INCLUDE_FREERTOS) + vSemaphoreCreateBinary(com_dev->tx_sem); +#endif /* PIOS_INCLUDE_FREERTOS */ + (com_dev->driver->bind_tx_cb)(lower_id, PIOS_COM_TxOutCallback, (uint32_t)com_dev); + } + *com_id = (uint32_t)com_dev; return(0); @@ -188,6 +196,7 @@ static uint16_t PIOS_COM_RxInCallback(uint32_t context, uint8_t * buf, uint16_t bool valid = PIOS_COM_validate(com_dev); PIOS_Assert(valid); + PIOS_Assert(com_dev->has_rx); PIOS_IRQ_Disable(); uint16_t bytes_into_fifo = fifoBuf_putData(&com_dev->rx, buf, buf_len); @@ -213,6 +222,7 @@ static uint16_t PIOS_COM_TxOutCallback(uint32_t context, uint8_t * buf, uint16_t PIOS_Assert(valid); PIOS_Assert(buf); PIOS_Assert(buf_len); + PIOS_Assert(com_dev->has_tx); PIOS_IRQ_Disable(); uint16_t bytes_from_fifo = fifoBuf_getData(&com_dev->tx, buf, buf_len); @@ -273,6 +283,8 @@ int32_t PIOS_COM_SendBufferNonBlocking(uint32_t com_id, const uint8_t *buffer, u return -1; } + PIOS_Assert(com_dev->has_tx); + if (len >= fifoBuf_getFree(&com_dev->tx)) { /* Buffer cannot accept all requested bytes (retry) */ return -2; @@ -311,6 +323,8 @@ int32_t PIOS_COM_SendBuffer(uint32_t com_id, const uint8_t *buffer, uint16_t len return -1; } + PIOS_Assert(com_dev->has_tx); + int32_t rc; do { rc = PIOS_COM_SendBufferNonBlocking(com_id, buffer, len); @@ -442,6 +456,7 @@ uint16_t PIOS_COM_ReceiveBuffer(uint32_t com_id, uint8_t * buf, uint16_t buf_len /* Undefined COM port for this board (see pios_board.c) */ PIOS_Assert(0); } + PIOS_Assert(com_dev->has_rx); check_again: PIOS_IRQ_Disable(); @@ -487,6 +502,7 @@ int32_t PIOS_COM_ReceiveBufferUsed(uint32_t com_id) PIOS_Assert(0); } + PIOS_Assert(com_dev->has_rx); return (fifoBuf_getUsed(&com_dev->rx)); } diff --git a/flight/PiOS/inc/pios_com.h b/flight/PiOS/inc/pios_com.h index 9f6fc2b2b..cbee33735 100644 --- a/flight/PiOS/inc/pios_com.h +++ b/flight/PiOS/inc/pios_com.h @@ -44,7 +44,7 @@ struct pios_com_driver { }; /* Public Functions */ -extern int32_t PIOS_COM_Init(uint32_t * com_id, const struct pios_com_driver * driver, uint32_t lower_id); +extern int32_t PIOS_COM_Init(uint32_t * com_id, const struct pios_com_driver * driver, uint32_t lower_id, uint8_t * rx_buffer, uint16_t rx_buffer_len, uint8_t * tx_buffer, uint16_t tx_buffer_len); extern int32_t PIOS_COM_ChangeBaud(uint32_t com_id, uint32_t baud); extern int32_t PIOS_COM_SendCharNonBlocking(uint32_t com_id, char c); extern int32_t PIOS_COM_SendChar(uint32_t com_id, char c); diff --git a/flight/PipXtreme/pios_board.c b/flight/PipXtreme/pios_board.c index 0f183cfd9..0a69808ad 100644 --- a/flight/PipXtreme/pios_board.c +++ b/flight/PipXtreme/pios_board.c @@ -295,6 +295,18 @@ static const struct pios_usart_cfg pios_usart_serial_cfg = #include +#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 +#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 + +static uint8_t pios_com_telem_usb_rx_buffer[PIOS_COM_TELEM_USB_RX_BUF_LEN]; +static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; + +#define PIOS_COM_SERIAL_RX_BUF_LEN 192 +#define PIOS_COM_SERIAL_TX_BUF_LEN 192 + +static uint8_t pios_com_serial_rx_buffer[PIOS_COM_SERIAL_RX_BUF_LEN]; +static uint8_t pios_com_serial_tx_buffer[PIOS_COM_SERIAL_TX_BUF_LEN]; + #endif /* PIOS_INCLUDE_COM */ // *********************************************************************************** @@ -341,7 +353,9 @@ void PIOS_Board_Init(void) { if (PIOS_USART_Init(&pios_usart_serial_id, &pios_usart_serial_cfg)) { PIOS_DEBUG_Assert(0); } - if (PIOS_COM_Init(&pios_com_serial_id, &pios_usart_com_driver, pios_usart_serial_id)) { + if (PIOS_COM_Init(&pios_com_serial_id, &pios_usart_com_driver, pios_usart_serial_id, + pios_com_serial_rx_buffer, sizeof(pios_com_serial_rx_buffer), + pios_com_serial_tx_buffer, sizeof(pios_com_serial_tx_buffer))) { PIOS_DEBUG_Assert(0); } @@ -349,7 +363,9 @@ void PIOS_Board_Init(void) { uint32_t pios_usb_hid_id; PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id)) { + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), + pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); } #endif /* PIOS_INCLUDE_COM */