|
|
|
@ -151,6 +151,7 @@ static int read_id_dn(int *id, uint32_t gpio_drive, uint32_t gpio_sense, int adc
@@ -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
@@ -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,12 +235,102 @@ static int read_id_dn(int *id, uint32_t gpio_drive, uint32_t gpio_sense, int adc
@@ -235,12 +235,102 @@ 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); |
|
|
|
|
return rv; |
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
{ |
|
|
|
|