From ec75c47b73b0304f8bc6bf2e8f0ffd89a5a4f00f Mon Sep 17 00:00:00 2001 From: dron0gus Date: Tue, 16 Apr 2019 16:23:24 +0300 Subject: [PATCH] Smart gpios fixes - now without cleanup of smart_gpio.cpp (#758) * smart_gpio.cpp: check _add return values And occupy gpiochip's pin range if disabled of failed. So base will align with enum. * TLE8888: cleanup, move high level code to smart_gpio.cpp * smart_gpio.cpp: fix compilation when BOARD_EXT_GPIOCHIPS == 0 * board-subaru: fix compilation after latest smart_gpio updates * tle8888: now we have all 28 pins supported --- firmware/config/boards/subaru-ej20gn/board.h | 10 +-- .../config/boards/subaru-ej20gn/efifeatures.h | 4 ++ firmware/hw_layer/drivers/gpio/core.c | 8 ++- firmware/hw_layer/drivers/gpio/tle8888.c | 66 +------------------ firmware/hw_layer/drivers/gpio/tle8888.h | 6 +- firmware/hw_layer/smart_gpio.cpp | 62 ++++++++++++++--- 6 files changed, 70 insertions(+), 86 deletions(-) diff --git a/firmware/config/boards/subaru-ej20gn/board.h b/firmware/config/boards/subaru-ej20gn/board.h index 22de544fd6..382c844c69 100644 --- a/firmware/config/boards/subaru-ej20gn/board.h +++ b/firmware/config/boards/subaru-ej20gn/board.h @@ -27,13 +27,15 @@ */ #define BOARD_NAME "Subaru EJ20G/STM32F765 for RusEFI" +#undef BOARD_TLE6240_COUNT #define BOARD_TLE6240_COUNT 1 +#undef BOARD_MC33972_COUNT #define BOARD_MC33972_COUNT 1 +#undef BOARD_TLE8888_COUNT +#define BOARD_TLE8888_COUNT 0 -#define BOARD_EXT_GPIOCHIPS (BOARD_TLE6240_COUNT + BOARD_MC33972_COUNT) - -/* additional space for pins on gpioext */ -#define BOARD_EXT_PINREPOPINS (16 + 22) +#undef BOARD_EXT_GPIOCHIPS +#define BOARD_EXT_GPIOCHIPS (BOARD_TLE6240_COUNT + BOARD_MC33972_COUNT + BOARD_TLE8888_COUNT) /* * Board oscillators-related settings. diff --git a/firmware/config/boards/subaru-ej20gn/efifeatures.h b/firmware/config/boards/subaru-ej20gn/efifeatures.h index 4d7bb41524..595f536573 100644 --- a/firmware/config/boards/subaru-ej20gn/efifeatures.h +++ b/firmware/config/boards/subaru-ej20gn/efifeatures.h @@ -25,6 +25,10 @@ /* do not use serial device for console */ #undef TS_SERIAL_DEVICE +/* additional space for pins on gpioext */ +#undef BOARD_EXT_PINREPOPINS +#define BOARD_EXT_PINREPOPINS (16 + 22) + #undef EFI_RTC #define EFI_RTC FALSE diff --git a/firmware/hw_layer/drivers/gpio/core.c b/firmware/hw_layer/drivers/gpio/core.c index 2ba027a532..813ebbf737 100644 --- a/firmware/hw_layer/drivers/gpio/core.c +++ b/firmware/hw_layer/drivers/gpio/core.c @@ -317,9 +317,11 @@ const char *gpiochips_getPinName(unsigned int pin) return NULL; } -/** - * @return result code - */ +void gpiochip_use_gpio_base(int size) +{ + (void)size; +} + int gpiochip_register(const char *name, struct gpiochip_ops *ops, size_t size, void *priv) { (void)name; (void)ops; (void)size; (void)priv; diff --git a/firmware/hw_layer/drivers/gpio/tle8888.c b/firmware/hw_layer/drivers/gpio/tle8888.c index b81b44549d..fced3c2ad5 100644 --- a/firmware/hw_layer/drivers/gpio/tle8888.c +++ b/firmware/hw_layer/drivers/gpio/tle8888.c @@ -14,29 +14,20 @@ #include "global.h" +#include "gpio/tle8888.h" + #if (BOARD_TLE8888_COUNT > 0) -/* to be moved to smart_gpio.cpp */ -#include "engine_configuration.h" -/* to be moved to smart_gpio.cpp */ -EXTERN_CONFIG; -#include "smart_gpio.h" - #include "hardware.h" -#include "efi_gpio.h" #include "gpio/gpio_ext.h" -#include "gpio/tle8888.h" #include "pin_repository.h" #include "rfiutil.h" -#include "mpu_util.h" #if EFI_TUNER_STUDIO #include "tunerstudio.h" extern TunerStudioOutputChannels tsOutputChannels; #endif /* EFI_TUNER_STUDIO */ -#if (BOARD_TLE8888_COUNT > 0) - /* * TODO list: */ @@ -526,57 +517,4 @@ int tle8888_add(unsigned int index, const struct tle8888_config *cfg) return -1; } -#endif /* BOARD_TLE8888_COUNT */ - -/*********TO BE REMOVED FROM THIS FILE***************/ - -/* this should be in board file */ -static struct tle8888_config tle8888_cfg = { - .spi_bus = NULL, - .spi_config = { - .circular = false, - .end_cb = NULL, - .ssport = GPIOF, - .sspad = 0U, - .cr1 = - SPI_CR1_16BIT_MODE | - SPI_CR1_SSM | - SPI_CR1_SSI | - SPI_CR1_LSBFIRST | //LSB first - ((3 << SPI_CR1_BR_Pos) & SPI_CR1_BR) | // div = 16 - SPI_CR1_MSTR | - SPI_CR1_CPHA | - 0, - .cr2 = SPI_CR2_16BIT_MODE - }, - .direct_io = { - [0] = {.port = NULL, .pad = 0, .output = 9}, - [1] = {.port = NULL, .pad = 0, .output = 10}, - [2] = {.port = NULL, .pad = 0, .output = 11}, - [3] = {.port = NULL, .pad = 0, .output = 12}, - }, -}; - -void initTle8888(DECLARE_ENGINE_PARAMETER_SIGNATURE) -{ - if (engineConfiguration->tle8888_cs == GPIO_UNASSIGNED) { - return; - } - - // todo: reuse initSpiCs method? - tle8888_cfg.spi_config.ssport = getHwPort(DRIVER_NAME " CS", engineConfiguration->tle8888_cs); - tle8888_cfg.spi_config.sspad = getHwPin(DRIVER_NAME " CS", engineConfiguration->tle8888_cs); - - tle8888_cfg.spi_bus = getSpiDevice(engineConfiguration->tle8888spiDevice); - if (tle8888_cfg.spi_bus == NULL) { - // error already reported - return; - } - - int chipBase = tle8888_add(0, &tle8888_cfg); - efiAssertVoid(OBD_PCM_Processor_Fault, chipBase == TLE8888_PIN_1, "tle8888"); -} - -/*********TO BE REMOVED FROM THIS FILE ENDS***********/ - #endif /* (BOARD_TLE8888_COUNT > 0) */ diff --git a/firmware/hw_layer/drivers/gpio/tle8888.h b/firmware/hw_layer/drivers/gpio/tle8888.h index 9050fee302..1c3702a83d 100644 --- a/firmware/hw_layer/drivers/gpio/tle8888.h +++ b/firmware/hw_layer/drivers/gpio/tle8888.h @@ -13,8 +13,7 @@ #include #include "efifeatures.h" -// todo: did we forget some outputs? should it be 28? -#define TLE8888_OUTPUTS 24 +#define TLE8888_OUTPUTS 28 /* 4 misc channels */ #define TLE8888_DIRECT_MISC 4 /* 4 IGN channels - INJ1..4 - IN1..4 @@ -47,9 +46,6 @@ extern "C" { #endif /* __cplusplus */ -/* cleanup !!!! */ -void initTle8888(DECLARE_ENGINE_PARAMETER_SIGNATURE); - /** * @return return gpio chip base */ diff --git a/firmware/hw_layer/smart_gpio.cpp b/firmware/hw_layer/smart_gpio.cpp index 70dbc4de4b..32b15a392d 100644 --- a/firmware/hw_layer/smart_gpio.cpp +++ b/firmware/hw_layer/smart_gpio.cpp @@ -100,34 +100,76 @@ struct mc33972_config mc33972 = { }; #endif /* (BOARD_MC33972_COUNT > 0) */ +#if (BOARD_TLE8888_COUNT > 0) +/* this is homeless tle8888, please find better place for it */ +static struct tle8888_config tle8888_cfg = { + .spi_bus = NULL, + .spi_config = { + .circular = false, + .end_cb = NULL, + .ssport = GPIOF, + .sspad = 0U, + .cr1 = + SPI_CR1_16BIT_MODE | + SPI_CR1_SSM | + SPI_CR1_SSI | + SPI_CR1_LSBFIRST | //LSB first + ((3 << SPI_CR1_BR_Pos) & SPI_CR1_BR) | // div = 16 + SPI_CR1_MSTR | + SPI_CR1_CPHA | + 0, + .cr2 = SPI_CR2_16BIT_MODE + }, + .direct_io = { + [0] = {.port = NULL, .pad = 0, .output = 9}, + [1] = {.port = NULL, .pad = 0, .output = 10}, + [2] = {.port = NULL, .pad = 0, .output = 11}, + [3] = {.port = NULL, .pad = 0, .output = 12}, + }, +}; +#endif + void initSmartGpio() { + int ret; #if (BOARD_TLE6240_COUNT > 0) tle6240.spi_bus = getSpiDevice(engineConfiguration->tle6240spiDevice); - tle6240_add(0, &tle6240); -#elif (BOARD_EXT_GPIOCHIPS > 0) - gpiochip_use_gpio_base(TLE6240_OUTPUTS); + ret = tle6240_add(0, &tle6240); + if (ret < 0) #endif /* (BOARD_TLE6240_COUNT > 0) */ + /* whenever chip is disabled or error returned - occupy its gpio range */ + gpiochip_use_gpio_base(TLE6240_OUTPUTS); #if (BOARD_MC33972_COUNT > 0) mc33972.spi_bus = getSpiDevice(engineConfiguration->mc33972spiDevice); // todo: propogate 'basePinOffset' parameter - mc33972_add(0, &mc33972); -#elif (BOARD_EXT_GPIOCHIPS > 0) - gpiochip_use_gpio_base(MC33972_INPUTS); + ret = mc33972_add(0, &mc33972); + if (ret < 0) #endif /* (BOARD_MC33972_COUNT > 0) */ - + /* whenever chip is disabled or error returned - occupy its gpio range */ + gpiochip_use_gpio_base(MC33972_INPUTS); #if (BOARD_TLE8888_COUNT > 0) if (engineConfiguration->tle8888_cs != GPIO_UNASSIGNED) { static OutputPin tle8888Cs; -// // SPI pins are enabled in initSpiModules() + // SPI pins are enabled in initSpiModules() tle8888Cs.initPin("tle8888 CS", engineConfiguration->tle8888_cs, &engineConfiguration->tle8888_csPinMode); - } - initTle8888(PASS_ENGINE_PARAMETER_SIGNATURE); + // todo: reuse initSpiCs method? + tle8888_cfg.spi_config.ssport = getHwPort("tle8888 CS", engineConfiguration->tle8888_cs); + tle8888_cfg.spi_config.sspad = getHwPin("tle8888 CS", engineConfiguration->tle8888_cs); + tle8888_cfg.spi_bus = getSpiDevice(engineConfiguration->tle8888spiDevice); + + /* spi_bus == null checked in _add function */ + ret = tle8888_add(0, &tle8888_cfg); + + efiAssertVoid(OBD_PCM_Processor_Fault, ret == TLE8888_PIN_1, "tle8888"); + } + if (ret < 0) #endif /* (BOARD_TLE6240_COUNT > 0) */ + /* whenever chip is disabled or error returned - occupy its gpio range */ + gpiochip_use_gpio_base(TLE8888_OUTPUTS); #if (BOARD_EXT_GPIOCHIPS > 0) /* external chip init */