2015-07-10 06:01:56 -07:00
|
|
|
/**
|
|
|
|
* @file io_pins.cpp
|
2017-04-21 10:36:51 -07:00
|
|
|
* @brief his file is about general input/output utility methods, not much EFI-specifics
|
|
|
|
*
|
2015-07-10 06:01:56 -07:00
|
|
|
*
|
|
|
|
* @date Jan 24, 2013
|
2018-01-20 17:55:31 -08:00
|
|
|
* @author Andrey Belomutskiy, (c) 2012-2018
|
2015-07-10 06:01:56 -07:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <board.h>
|
2018-09-16 19:26:57 -07:00
|
|
|
#include "global.h"
|
2015-07-10 06:01:56 -07:00
|
|
|
#include "io_pins.h"
|
|
|
|
#include "efiGpio.h"
|
|
|
|
|
|
|
|
#include "pin_repository.h"
|
|
|
|
#include "status_loop.h"
|
|
|
|
#include "engine_configuration.h"
|
|
|
|
#include "console_io.h"
|
|
|
|
|
2017-04-21 09:01:44 -07:00
|
|
|
EXTERN_ENGINE;
|
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
#if EFI_ENGINE_CONTROL || defined(__DOXYGEN__)
|
|
|
|
#include "main_trigger_callback.h"
|
|
|
|
#endif /* EFI_ENGINE_CONTROL */
|
|
|
|
|
|
|
|
static LoggingWithStorage logger("io_pins");
|
|
|
|
|
2016-11-03 20:02:58 -07:00
|
|
|
extern EnginePins enginePins;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2018-11-16 04:40:06 -08:00
|
|
|
#if defined(STM32F4XX) || defined(STM32F7XX)
|
2016-02-04 09:01:41 -08:00
|
|
|
static ioportid_t PORTS[] = { GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH };
|
2015-07-10 06:01:56 -07:00
|
|
|
#else
|
2016-02-04 09:01:41 -08:00
|
|
|
static ioportid_t PORTS[] = { GPIOA, GPIOB, GPIOC, GPIOD, GPIOF};
|
2015-07-10 06:01:56 -07:00
|
|
|
#endif
|
|
|
|
|
2017-07-28 11:27:37 -07:00
|
|
|
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin) {
|
2015-07-10 06:01:56 -07:00
|
|
|
if (brainPin == GPIO_UNASSIGNED)
|
|
|
|
return GPIO_NULL;
|
|
|
|
if (brainPin > GPIO_UNASSIGNED || brainPin < 0) {
|
2017-07-28 11:32:51 -07:00
|
|
|
firmwareError(CUSTOM_ERR_INVALID_PIN, "%s: Invalid brain_pin_e: %d", msg, brainPin);
|
2015-07-10 06:01:56 -07:00
|
|
|
return GPIO_NULL;
|
|
|
|
}
|
|
|
|
return PORTS[brainPin / PORT_SIZE];
|
|
|
|
}
|
|
|
|
|
2017-07-28 11:27:37 -07:00
|
|
|
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin) {
|
2015-07-10 06:01:56 -07:00
|
|
|
if (brainPin == GPIO_UNASSIGNED)
|
|
|
|
return EFI_ERROR_CODE;
|
|
|
|
if (brainPin > GPIO_UNASSIGNED || brainPin < 0) {
|
2017-07-28 11:27:37 -07:00
|
|
|
firmwareError(CUSTOM_ERR_INVALID_PIN, "%s: Invalid brain_pin_e: %d", msg, brainPin);
|
2015-07-10 06:01:56 -07:00
|
|
|
return EFI_ERROR_CODE;
|
|
|
|
}
|
|
|
|
return brainPin % PORT_SIZE;
|
|
|
|
}
|
|
|
|
|
2017-05-15 02:03:40 -07:00
|
|
|
bool efiReadPin(brain_pin_e pin) {
|
2017-07-28 11:27:37 -07:00
|
|
|
return palReadPad(getHwPort("readPin", pin), getHwPin("readPin", pin));
|
2017-05-15 02:03:40 -07:00
|
|
|
}
|
|
|
|
|
2017-04-21 13:30:14 -07:00
|
|
|
/**
|
|
|
|
* This method would set an error condition if pin is already used
|
|
|
|
*/
|
2017-05-15 05:40:54 -07:00
|
|
|
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode) {
|
2017-07-28 11:27:37 -07:00
|
|
|
ioportid_t port = getHwPort(msg, brainPin);
|
|
|
|
ioportmask_t pin = getHwPin(msg, brainPin);
|
2017-04-21 17:12:11 -07:00
|
|
|
|
2017-04-21 13:30:14 -07:00
|
|
|
if (port == GPIO_NULL) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
scheduleMsg(&logger, "%s on %s%d", msg, portname(port), pin);
|
|
|
|
|
|
|
|
bool wasUsed = markUsed(port, pin, msg);
|
|
|
|
if (wasUsed) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
palSetPadMode(port, pin, mode);
|
|
|
|
}
|
|
|
|
|
|
|
|
iomode_t getInputMode(pin_input_mode_e mode) {
|
|
|
|
switch (mode) {
|
|
|
|
case PI_PULLUP:
|
|
|
|
return PAL_MODE_INPUT_PULLUP;
|
|
|
|
case PI_PULLDOWN:
|
|
|
|
return PAL_MODE_INPUT_PULLDOWN;
|
|
|
|
case PI_DEFAULT:
|
|
|
|
default:
|
|
|
|
return PAL_MODE_INPUT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-30 12:43:33 -07:00
|
|
|
#if HAL_USE_ICU || defined(__DOXYGEN__)
|
2017-04-21 13:30:14 -07:00
|
|
|
void efiIcuStart(ICUDriver *icup, const ICUConfig *config) {
|
2018-07-25 20:03:04 -07:00
|
|
|
efiAssertVoid(CUSTOM_ERR_6679, (icup->state == ICU_STOP) || (icup->state == ICU_READY),
|
2017-04-21 13:30:14 -07:00
|
|
|
"input already used?");
|
|
|
|
|
|
|
|
icuStart(icup, config);
|
|
|
|
}
|
2017-05-30 12:46:02 -07:00
|
|
|
#endif /* HAL_USE_ICU */
|