2020-05-11 09:17:42 -07:00
|
|
|
/**
|
|
|
|
* @file serial_hw.cpp
|
|
|
|
* @brief SERIAL bus low level code
|
|
|
|
*
|
|
|
|
* @date Apr 17, 2020
|
|
|
|
* @author Konstantin Smola, (c) 2020
|
|
|
|
*/
|
|
|
|
|
2021-08-03 19:05:01 -07:00
|
|
|
#include "pch.h"
|
2020-05-11 09:17:42 -07:00
|
|
|
|
|
|
|
#if EFI_AUX_SERIAL
|
|
|
|
|
|
|
|
#include "serial.h"
|
|
|
|
#include "serial_hw.h"
|
|
|
|
#include "string.h"
|
|
|
|
#include "mpu_util.h"
|
|
|
|
|
|
|
|
static bool isSerialEnabled = false;
|
|
|
|
static bool isSerialTXEnabled = false;
|
|
|
|
static bool isSerialRXEnabled = false;
|
|
|
|
|
|
|
|
static SerialConfig uartCfg;
|
|
|
|
static SerialRead serialRead;
|
|
|
|
|
2021-11-15 04:02:34 -08:00
|
|
|
static void auxInfo() {
|
2020-05-11 09:17:42 -07:00
|
|
|
if (!isSerialEnabled) {
|
2021-04-19 05:11:59 -07:00
|
|
|
efiPrintf("AUX Serial is not enabled, please enable & restart");
|
2020-05-11 09:17:42 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-17 00:54:21 -08:00
|
|
|
efiPrintf("AUX Serial TX %s", hwPortname(engineConfiguration->auxSerialTxPin));
|
|
|
|
efiPrintf("AUX Serial RX %s", hwPortname(engineConfiguration->auxSerialRxPin));
|
2020-05-11 09:17:42 -07:00
|
|
|
}
|
|
|
|
|
2021-11-16 01:15:29 -08:00
|
|
|
void enableAuxSerial() {
|
2021-11-17 00:54:21 -08:00
|
|
|
engineConfiguration->auxSerialTxPin = engineConfiguration->auxSerialTxPin;
|
|
|
|
engineConfiguration->auxSerialRxPin = engineConfiguration->auxSerialRxPin;
|
|
|
|
engineConfiguration->auxSerialSpeed = engineConfiguration->auxSerialSpeed;
|
2020-05-11 09:17:42 -07:00
|
|
|
|
|
|
|
uartCfg.speed = engineConfiguration->auxSerialSpeed;
|
|
|
|
sdStart(AUX_SERIAL_DEVICE, &uartCfg);
|
|
|
|
|
2021-04-19 05:11:59 -07:00
|
|
|
efiPrintf("AUX Serial started");
|
2020-05-11 09:17:42 -07:00
|
|
|
}
|
|
|
|
|
2021-11-16 01:15:29 -08:00
|
|
|
void stopAuxSerialPins() {
|
2020-11-26 07:55:39 -08:00
|
|
|
efiSetPadUnused(activeConfiguration.auxSerialTxPin);
|
|
|
|
efiSetPadUnused(activeConfiguration.auxSerialRxPin);
|
2020-05-11 09:17:42 -07:00
|
|
|
}
|
|
|
|
|
2021-11-16 01:15:29 -08:00
|
|
|
void startAuxSerialPins() {
|
2021-11-17 00:54:21 -08:00
|
|
|
if (engineConfiguration->auxSerialTxPin)
|
|
|
|
efiSetPadMode("AuxSerial TX", engineConfiguration->auxSerialTxPin, PAL_MODE_ALTERNATE(8));
|
|
|
|
if (engineConfiguration->auxSerialRxPin)
|
|
|
|
efiSetPadMode("AuxSerial RX", engineConfiguration->auxSerialRxPin, PAL_MODE_ALTERNATE(8));
|
2020-05-11 09:17:42 -07:00
|
|
|
|
|
|
|
enableAuxSerial();
|
|
|
|
}
|
|
|
|
|
|
|
|
void initAuxSerial(void) {
|
|
|
|
addConsoleAction("auxinfo", auxInfo);
|
|
|
|
|
|
|
|
isSerialEnabled =
|
2021-11-17 00:54:21 -08:00
|
|
|
(engineConfiguration->auxSerialTxPin) || // we need at least one pin set
|
|
|
|
(engineConfiguration->auxSerialRxPin);
|
2020-05-11 09:17:42 -07:00
|
|
|
|
2021-11-17 00:54:21 -08:00
|
|
|
isSerialRXEnabled = engineConfiguration->auxSerialRxPin;
|
|
|
|
isSerialTXEnabled = engineConfiguration->auxSerialTxPin;
|
2020-05-11 09:17:42 -07:00
|
|
|
|
|
|
|
// exit if no pin is configured
|
|
|
|
if (!isSerialEnabled)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Validate pins
|
2021-11-17 00:54:21 -08:00
|
|
|
if (isSerialTXEnabled && !isValidSerialTxPin(engineConfiguration->auxSerialTxPin)) {
|
2021-11-11 18:29:18 -08:00
|
|
|
firmwareError(OBD_PCM_Processor_Fault, "unexpected aux TX pin");
|
2020-05-11 09:17:42 -07:00
|
|
|
return;
|
2021-11-11 18:29:18 -08:00
|
|
|
}
|
2020-05-11 09:17:42 -07:00
|
|
|
|
2021-11-17 00:54:21 -08:00
|
|
|
if (isSerialRXEnabled && !isValidSerialRxPin(engineConfiguration->auxSerialRxPin)) {
|
2021-11-11 18:29:18 -08:00
|
|
|
firmwareError(OBD_PCM_Processor_Fault, "unexpected aux RX pin");
|
2020-05-11 09:17:42 -07:00
|
|
|
return;
|
2021-11-11 18:29:18 -08:00
|
|
|
}
|
2020-05-11 09:17:42 -07:00
|
|
|
|
|
|
|
startAuxSerialPins();
|
|
|
|
|
|
|
|
if (isSerialRXEnabled)
|
|
|
|
serialRead.Start();
|
|
|
|
}
|
|
|
|
|
2020-11-26 07:55:39 -08:00
|
|
|
#endif // EFI_AUX_SERIAL
|