rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
tunerstudio_io_serial_ports.cpp
Go to the documentation of this file.
1/**
2 * @file This file initializes the hardware serial ports that run the TS protocol.
3 *
4 * @date Mar 26, 2021
5 */
6
7#include "pch.h"
8
9#if (EFI_PROD_CODE || EFI_SIMULATOR) && EFI_TUNER_STUDIO
10#include "tunerstudio.h"
11#include "tunerstudio_io.h"
12#include "connector_uart_dma.h"
13#if HW_HELLEN
14#include "hellen_meta.h"
15#endif // HW_HELLEN
16
17#ifdef TS_PRIMARY_UxART_PORT
18
19#ifndef EFI_CONSOLE_RX_BRAIN_PIN_MODE
20#define EFI_CONSOLE_RX_BRAIN_PIN_MODE (PAL_MODE_ALTERNATE(EFI_CONSOLE_AF))
21#endif
22
23#ifndef EFI_CONSOLE_TX_BRAIN_PIN_MODE
24#define EFI_CONSOLE_TX_BRAIN_PIN_MODE (PAL_MODE_ALTERNATE(EFI_CONSOLE_AF))
25#endif
26
27#if EFI_TS_PRIMARY_IS_SERIAL
29#elif EFI_USE_UART_DMA
31#else
33#endif
34 primaryChannel(TS_PRIMARY_UxART_PORT);
35
36 struct PrimaryChannelThread : public TunerstudioThread {
37 PrimaryChannelThread() : TunerstudioThread("Primary TS Channel") { }
38
40#if EFI_PROD_CODE
41 // historically the idea was that primary UART has to be very hard-coded as the last line of reliability defense
42 // as of 2022 it looks like sometimes we just need the GPIO on MRE for instance more than we need UART
43 efiSetPadMode("Primary UART RX", EFI_CONSOLE_RX_BRAIN_PIN, EFI_CONSOLE_RX_BRAIN_PIN_MODE);
44 efiSetPadMode("Primary UART TX", EFI_CONSOLE_TX_BRAIN_PIN, EFI_CONSOLE_TX_BRAIN_PIN_MODE);
45#endif /* EFI_PROD_CODE */
46
48
49 return &primaryChannel;
50 }
51 };
52
53 static PrimaryChannelThread primaryChannelThread;
54#endif // defined(TS_PRIMARY_UxART_PORT)
55
56#ifdef TS_SECONDARY_UxART_PORT
57
58#ifndef TS_SERIAL_RX_BRAIN_PIN_MODE
59#define TS_SERIAL_RX_BRAIN_PIN_MODE (PAL_MODE_ALTERNATE(TS_SERIAL_AF))
60#endif
61
62#ifndef TS_SERIAL_TX_BRAIN_PIN_MODE
63#define TS_SERIAL_TX_BRAIN_PIN_MODE (PAL_MODE_ALTERNATE(TS_SERIAL_AF))
64#endif
65
66#if EFI_TS_SECONDARY_IS_SERIAL
68#elif EFI_USE_UART_DMA
70#else
72#endif
73 secondaryChannel(TS_SECONDARY_UxART_PORT);
74
75 struct SecondaryChannelThread : public TunerstudioThread {
76 SecondaryChannelThread() : TunerstudioThread("Secondary TS Channel") { }
77
79#if EFI_PROD_CODE
80 efiSetPadMode("Secondary UART RX", engineConfiguration->binarySerialRxPin, TS_SERIAL_RX_BRAIN_PIN_MODE);
81 efiSetPadMode("Secondary UART TX", engineConfiguration->binarySerialTxPin, TS_SERIAL_TX_BRAIN_PIN_MODE);
82#endif /* EFI_PROD_CODE */
83
85
86 return &secondaryChannel;
87 }
88 };
89
90 static SecondaryChannelThread secondaryChannelThread;
91#endif // defined(TS_SECONDARY_UxART_PORT)
92
94#if defined(TS_PRIMARY_UxART_PORT)
96#endif
97
98#if defined(TS_SECONDARY_UxART_PORT)
99 // do not start thread if not configured - give user a chance to use same peripheral for kline
102 }
103#endif
104}
105
107#if defined(TS_SECONDARY_UxART_PORT)
108 // Prefer secondary channel for bluetooth
109 return &secondaryChannel;
110#elif defined(TS_PRIMARY_UxART_PORT)
111 // Use primary channel for BT if no secondary exists
112 return &primaryChannel;
113#endif
114
115 // no HW serial channels on this board, fail
116 return nullptr;
117}
118
119#endif // EFI_PROD_CODE
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
void start(uint32_t baud) override
virtual TsChannelBase * setupChannel()=0
static constexpr engine_configuration_s * engineConfiguration
bool isBrainPinValid(brain_pin_e brainPin)
SerialTsChannel UartDmaTsChannel UartTsChannel primaryChannel(TS_PRIMARY_UxART_PORT)
static PrimaryChannelThread primaryChannelThread
static SecondaryChannelThread secondaryChannelThread
void startSerialChannels()
SerialTsChannelBase * getBluetoothChannel()
SerialTsChannel UartDmaTsChannel UartTsChannel secondaryChannel(TS_SECONDARY_UxART_PORT)