From 7eb3c7122f58ac989255a459eb47e7d9f67b5cac Mon Sep 17 00:00:00 2001 From: rusefi Date: Fri, 16 Aug 2019 22:41:19 -0400 Subject: [PATCH] TLE8888 should be re-initialized every time we get +12 volts #901 refactoring: extracting method --- firmware/hw_layer/drivers/gpio/tle8888.c | 50 +++++++++++++++--------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/firmware/hw_layer/drivers/gpio/tle8888.c b/firmware/hw_layer/drivers/gpio/tle8888.c index 1442b9414e..b57ac0461d 100644 --- a/firmware/hw_layer/drivers/gpio/tle8888.c +++ b/firmware/hw_layer/drivers/gpio/tle8888.c @@ -338,30 +338,17 @@ int tle8888_writePad(void *data, brain_pin_e pin, int value) { return 0; } -int tle8888_chip_init(void * data) -{ +/** + * @return 0 for valid configuration, -1 for invalid configuration + */ +static int tle8888SpiStartupExchange(void * data) { struct tle8888_priv *chip = (struct tle8888_priv *)data; const struct tle8888_config *cfg = chip->cfg; - int ret = 0; - /* mark pins used */ - // we do not initialize CS pin so we should not be marking it used - i'm sad - //ret = gpio_pin_markUsed(cfg->spi_config.ssport, cfg->spi_config.sspad, DRIVER_NAME " CS"); - if (cfg->reset.port != NULL) - ret |= gpio_pin_markUsed(cfg->reset.port, cfg->reset.pad, DRIVER_NAME " RST"); - for (int i = 0; i < TLE8888_DIRECT_MISC; i++) - if (cfg->direct_io[i].port) - ret |= gpio_pin_markUsed(cfg->direct_io[i].port, cfg->direct_io[i].pad, DRIVER_NAME " DIRECT IO"); - - if (ret) { - ret = -1; - goto err_gpios; - } - chThdSleepMilliseconds(3); /* Software reset */ // first packet: 0x335=821 > 0xFD=253 - uint16_t response; + uint16_t response = 0; tle8888_spi_rw(chip, CMD_SR, &response); if (response == 253) { // I've seen this response on red board @@ -445,6 +432,33 @@ int tle8888_chip_init(void * data) /* enable outputs */ tle8888_spi_rw(chip, CMD_OE_SET, NULL); + return 0; +} + +int tle8888_chip_init(void * data) { + struct tle8888_priv *chip = (struct tle8888_priv *)data; + const struct tle8888_config *cfg = chip->cfg; + + int ret = 0; + /* mark pins used */ + // we do not initialize CS pin so we should not be marking it used - i'm sad + //ret = gpio_pin_markUsed(cfg->spi_config.ssport, cfg->spi_config.sspad, DRIVER_NAME " CS"); + if (cfg->reset.port != NULL) + ret |= gpio_pin_markUsed(cfg->reset.port, cfg->reset.pad, DRIVER_NAME " RST"); + for (int i = 0; i < TLE8888_DIRECT_MISC; i++) + if (cfg->direct_io[i].port) + ret |= gpio_pin_markUsed(cfg->direct_io[i].port, cfg->direct_io[i].pad, DRIVER_NAME " DIRECT IO"); + + if (ret) { + ret = -1; + goto err_gpios; + } + + ret = tle8888SpiStartupExchange(data); + if (ret) { + return ret; + } + err_gpios: /* unmark pins */