rusefi/firmware/console/binary/tunerstudio_io_serial_ports...

103 lines
2.9 KiB
C++

/**
* @file This file initializes the hardware serial ports that run the TS protocol.
*
* @date Mar 26, 2021
*/
#include "pch.h"
#if (EFI_PROD_CODE || EFI_SIMULATOR) && EFI_TUNER_STUDIO
#include "tunerstudio.h"
#include "tunerstudio_io.h"
#include "connector_uart_dma.h"
#if HW_HELLEN
#include "hellen_meta.h"
#endif // HW_HELLEN
#ifdef TS_PRIMARY_UxART_PORT
#if EFI_TS_PRIMARY_IS_SERIAL
SerialTsChannel
#elif EFI_USE_UART_DMA
UartDmaTsChannel
#else
UartTsChannel
#endif
primaryChannel(TS_PRIMARY_UxART_PORT);
struct PrimaryChannelThread : public TunerstudioThread {
PrimaryChannelThread() : TunerstudioThread("Primary TS Channel") { }
TsChannelBase* setupChannel() {
#if EFI_PROD_CODE
// historically the idea was that primary UART has to be very hard-coded as the last line of reliability defense
// as of 2022 it looks like sometimes we just need the GPIO on MRE for instance more than we need UART
efiSetPadMode("Primary UART RX", EFI_CONSOLE_RX_BRAIN_PIN, PAL_MODE_ALTERNATE(EFI_CONSOLE_AF));
efiSetPadMode("Primary UART TX", EFI_CONSOLE_TX_BRAIN_PIN, PAL_MODE_ALTERNATE(EFI_CONSOLE_AF));
#endif /* EFI_PROD_CODE */
primaryChannel.start(engineConfiguration->uartConsoleSerialSpeed);
return &primaryChannel;
}
};
static PrimaryChannelThread primaryChannelThread;
#endif // defined(TS_PRIMARY_UxART_PORT)
#ifdef TS_SECONDARY_UxART_PORT
#if EFI_TS_SECONDARY_IS_SERIAL
SerialTsChannel
#elif EFI_USE_UART_DMA
UartDmaTsChannel
#else
UartTsChannel
#endif
secondaryChannel(TS_SECONDARY_UxART_PORT);
struct SecondaryChannelThread : public TunerstudioThread {
SecondaryChannelThread() : TunerstudioThread("Secondary TS Channel") { }
TsChannelBase* setupChannel() {
#if EFI_PROD_CODE
efiSetPadMode("Secondary UART RX", engineConfiguration->binarySerialRxPin, PAL_MODE_ALTERNATE(TS_SERIAL_AF));
efiSetPadMode("Secondary UART TX", engineConfiguration->binarySerialTxPin, PAL_MODE_ALTERNATE(TS_SERIAL_AF));
#endif /* EFI_PROD_CODE */
secondaryChannel.start(engineConfiguration->tunerStudioSerialSpeed);
return &secondaryChannel;
}
};
static SecondaryChannelThread secondaryChannelThread;
#endif // defined(TS_SECONDARY_UxART_PORT)
void startSerialChannels() {
#if defined(TS_PRIMARY_UxART_PORT)
primaryChannelThread.start();
#endif
#if defined(TS_SECONDARY_UxART_PORT)
// do not start thread if not configured - give user a chance to use same peripheral for kline
if (isBrainPinValid(engineConfiguration->binarySerialTxPin)) {
secondaryChannelThread.start();
}
#endif
}
SerialTsChannelBase* getBluetoothChannel() {
#if defined(TS_SECONDARY_UxART_PORT)
// Prefer secondary channel for bluetooth
return &secondaryChannel;
#elif defined(TS_PRIMARY_UxART_PORT)
// Use primary channel for BT if no secondary exists
return &primaryChannel;
#endif
// no HW serial channels on this board, fail
return nullptr;
}
#endif // EFI_PROD_CODE