From 1e7dfe227aded5b952ef2b005cbcf550ac62f55c Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Mon, 24 Aug 2020 15:01:48 -0700 Subject: [PATCH] stm32_common:board_hw_rev_ver Use Analog resistor detection When the VER_DRIVE and REV_DRIVE are the same GPIO we need to use Analog detection. --- .../board_hw_info/board_hw_rev_ver.c | 94 ++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/platforms/nuttx/src/px4/stm/stm32_common/board_hw_info/board_hw_rev_ver.c b/platforms/nuttx/src/px4/stm/stm32_common/board_hw_info/board_hw_rev_ver.c index e6ed57e471..c6a7ca5492 100644 --- a/platforms/nuttx/src/px4/stm/stm32_common/board_hw_info/board_hw_rev_ver.c +++ b/platforms/nuttx/src/px4/stm/stm32_common/board_hw_info/board_hw_rev_ver.c @@ -151,6 +151,7 @@ static int read_id_dn(int *id, uint32_t gpio_drive, uint32_t gpio_sense, int adc { int rv = -EIO; const unsigned int samples = 16; +#if GPIO_HW_REV_DRIVE != GPIO_HW_VER_DRIVE /* * Step one is there resistors? * @@ -206,7 +207,6 @@ static int read_id_dn(int *id, uint32_t gpio_drive, uint32_t gpio_sense, int adc if ((high ^ low) && low == 0) { - /* Yes - Fire up the ADC (it has once control) */ if (px4_arch_adc_init(HW_REV_VER_ADC_BASE) == OK) { @@ -235,13 +235,103 @@ static int read_id_dn(int *id, uint32_t gpio_drive, uint32_t gpio_sense, int adc rv = OK; } +#else /* GPIO_HW_REV_DRIVE == GPIO_HW_VER_DRIVE */ + + /* + * Step one is there resistors? + * + * With the common REV/VER Drive we have to look at the ADC values. + * to determine if the R's are hooked up. This is because the + * the REV and VER pairs will influence each other and not make + * digital thresholds. + * + * I.E + * + * VDD + * 442K + * REV is a Float + * 24.9K + * Drive as input + * 442K + * VER is 0. + * 24.9K + * VDD + * + * This is 466K up and 442K down. + * + * Driving VER Low and reading DRIVE will result in approximately mid point + * values not a digital Low. + */ + + uint32_t dn_sum = 0; + uint16_t dn = 0; + uint16_t high = 0; + uint16_t low = 0; + + /* Turn the drive lines to digital outputs High */ + + stm32_configgpio(gpio_drive); + + up_udelay(100); /* About 10 TC assuming 485 K */ + + for (unsigned av = 0; av < samples; av++) { + if (px4_arch_adc_init(HW_REV_VER_ADC_BASE) == OK) { + dn = px4_arch_adc_sample(HW_REV_VER_ADC_BASE, adc_channel); + + if (dn == 0xffff) { + break; + } + + dn_sum += dn; + } + } + + if (dn != 0xffff) { + high = dn_sum / samples; + } + + /* Turn the drive lines to digital outputs LOW */ + + stm32_configgpio(gpio_drive ^ GPIO_OUTPUT_SET); + + up_udelay(100); /* About 10 TC assuming 485 K */ + + dn_sum = 0; + + for (unsigned av = 0; av < samples; av++) { + + dn = px4_arch_adc_sample(HW_REV_VER_ADC_BASE, adc_channel); + + if (dn == 0xffff) { + break; + } + + dn_sum += dn; + } + + if (dn != 0xffff) { + low = dn_sum / samples; + } + + if ((high > low) && high > px4_arch_adc_dn_fullcount() - 100) { + + *id = low; + rv = OK; + + } else { + /* No - No Resistors is ID 0 */ + *id = 0; + rv = OK; + } + +#endif /* GPIO_HW_REV_DRIVE != GPIO_HW_VER_DRIVE */ + /* Turn the drive lines to digital outputs High */ stm32_configgpio(gpio_drive); return rv; } - static int determine_hw_info(int *revision, int *version) { int dn;