Merge pull request #15422 from OpenNuvoton/nuvoton_eadc_extend_sample_time

Nuvoton: Enable configurability for extending sampling time for ADC/EADC
pull/15423/head
Martin Kojtal 2023-05-16 16:29:06 +01:00 committed by GitHub
commit 8779918cf0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 225 additions and 1 deletions

View File

@ -25,6 +25,7 @@
#include "PeripheralPins.h"
#include "gpio_api.h"
#include "nu_modutil.h"
#include "hal/PinNameAliases.h"
static uint32_t eadc_modinit_mask = 0;
@ -47,6 +48,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
{ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
};
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
/* Structure for extending sampling time on per-pin basis */
struct nu_eadc_extsmpt {
PinName pin;
uint32_t value;
};
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
};
#endif
void analogin_init(analogin_t *obj, PinName pin)
{
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@ -92,6 +105,18 @@ void analogin_init(analogin_t *obj, PinName pin)
// Configure the sample module Nmod for analog input channel Nch and software trigger source
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
// Extend sampling time in EADC clocks on per-pin basis
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
if (eadc_extsmpt_pos->pin == pin) {
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
break;
}
}
#endif
eadc_modinit_mask |= 1 << chn;
}

View File

@ -24,6 +24,7 @@
#include "pinmap.h"
#include "PeripheralPins.h"
#include "nu_modutil.h"
#include "hal/PinNameAliases.h"
static uint32_t eadc_modinit_mask = 0;
@ -46,6 +47,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
{ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC_INT0_IRQn, NULL},
};
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
/* Structure for extending sampling time on per-pin basis */
struct nu_eadc_extsmpt {
PinName pin;
uint32_t value;
};
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
};
#endif
void analogin_init(analogin_t *obj, PinName pin)
{
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@ -90,6 +103,18 @@ void analogin_init(analogin_t *obj, PinName pin)
*/
EADC_SetExtendSampleTime(eadc_base, chn, 10);
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
// Extend sampling time in EADC clocks on per-pin basis
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
if (eadc_extsmpt_pos->pin == pin) {
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
break;
}
}
#endif
eadc_modinit_mask |= 1 << chn;
}

View File

@ -23,6 +23,7 @@
#include "pinmap.h"
#include "PeripheralPins.h"
#include "nu_modutil.h"
#include "hal/PinNameAliases.h"
static uint32_t eadc_modinit_mask = 0;
@ -45,6 +46,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
{ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
};
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
/* Structure for extending sampling time on per-pin basis */
struct nu_eadc_extsmpt {
PinName pin;
uint32_t value;
};
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
};
#endif
void analogin_init(analogin_t *obj, PinName pin)
{
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@ -81,6 +94,18 @@ void analogin_init(analogin_t *obj, PinName pin)
// Configure the sample module Nmod for analog input channel Nch and software trigger source
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
// Extend sampling time in EADC clocks on per-pin basis
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
if (eadc_extsmpt_pos->pin == pin) {
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
break;
}
}
#endif
eadc_modinit_mask |= 1 << chn;
}

View File

@ -22,6 +22,7 @@
#include "pinmap.h"
#include "PeripheralPins.h"
#include "nu_modutil.h"
#include "hal/PinNameAliases.h"
static uint32_t eadc_modinit_mask = 0;
@ -44,6 +45,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
{ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, ADC00_IRQn, NULL},
};
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
/* Structure for extending sampling time on per-pin basis */
struct nu_eadc_extsmpt {
PinName pin;
uint32_t value;
};
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
};
#endif
void analogin_init(analogin_t *obj, PinName pin)
{
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@ -80,7 +93,19 @@ void analogin_init(analogin_t *obj, PinName pin)
// Configure the sample module Nmod for analog input channel Nch and software trigger source
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
// Extend sampling time in EADC clocks on per-pin basis
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
if (eadc_extsmpt_pos->pin == pin) {
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
break;
}
}
#endif
eadc_modinit_mask |= 1 << chn;
}

View File

@ -25,6 +25,7 @@
#include "PeripheralPins.h"
#include "gpio_api.h"
#include "nu_modutil.h"
#include "hal/PinNameAliases.h"
static uint32_t eadc_modinit_mask = 0;
@ -84,6 +85,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
{ADC_2_15, EADC2_MODULE, CLK_CLKSEL0_EADC2SEL_HCLK, CLK_CLKDIV5_EADC2(8), EADC2_RST, EADC20_IRQn, NULL},
};
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
/* Structure for extending sampling time on per-pin basis */
struct nu_eadc_extsmpt {
PinName pin;
uint32_t value;
};
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
};
#endif
void analogin_init(analogin_t *obj, PinName pin)
{
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@ -126,6 +139,18 @@ void analogin_init(analogin_t *obj, PinName pin)
// Configure the sample module Nmod for analog input channel Nch and software trigger source
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
// Extend sampling time in EADC clocks on per-pin basis
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
if (eadc_extsmpt_pos->pin == pin) {
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
break;
}
}
#endif
eadc_modinit_mask |= 1 << chn;
}

View File

@ -25,6 +25,7 @@
#include "PeripheralPins.h"
#include "gpio_api.h"
#include "nu_modutil.h"
#include "hal/PinNameAliases.h"
static uint32_t eadc_modinit_mask = 0;
@ -66,6 +67,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
{ADC_1_15, EADC1_MODULE, 0, CLK_CLKDIV2_EADC1(8), EADC1_RST, EADC10_IRQn, NULL},
};
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
/* Structure for extending sampling time on per-pin basis */
struct nu_eadc_extsmpt {
PinName pin;
uint32_t value;
};
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
};
#endif
void analogin_init(analogin_t *obj, PinName pin)
{
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@ -102,6 +115,18 @@ void analogin_init(analogin_t *obj, PinName pin)
// Configure the sample module Nmod for analog input channel Nch and software trigger source
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
// Extend sampling time in EADC clocks on per-pin basis
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
if (eadc_extsmpt_pos->pin == pin) {
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
break;
}
}
#endif
eadc_modinit_mask |= 1 << chn;
}

View File

@ -23,6 +23,7 @@
#include "pinmap.h"
#include "PeripheralPins.h"
#include "nu_modutil.h"
#include "hal/PinNameAliases.h"
static uint32_t adc_modinit_mask = 0;
@ -41,6 +42,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
{ADC_0_11, ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_ADC_CLK_DIVIDER(1), ADC_RST, ADC_IRQn, NULL},
};
#if defined(MBED_CONF_TARGET_ADC_SMPLCNT_LIST)
/* Structure for extending sampling time on per-pin basis */
struct nu_eadc_smplcnt {
PinName pin;
uint32_t value;
};
static struct nu_eadc_smplcnt eadc_smplcnt_arr[] = {
MBED_CONF_TARGET_ADC_SMPLCNT_LIST
};
#endif
void analogin_init(analogin_t *obj, PinName pin)
{
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@ -82,6 +95,18 @@ void analogin_init(analogin_t *obj, PinName pin)
adc_base->CHEN |= 1 << chn;
}
#if defined(MBED_CONF_TARGET_ADC_SMPLCNT_LIST)
// Extend sampling time in EADC clocks on per-pin basis
struct nu_eadc_smplcnt *eadc_extsmpt_pos = eadc_smplcnt_arr;
struct nu_eadc_smplcnt *eadc_extsmpt_end = eadc_smplcnt_arr + sizeof (eadc_smplcnt_arr) / sizeof (eadc_smplcnt_arr[0]);
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
if (eadc_extsmpt_pos->pin == pin) {
ADC_SetExtraSampleTime(adc_base, chn, eadc_extsmpt_pos->value);
break;
}
}
#endif
adc_modinit_mask |= 1 << chn;
}

View File

@ -22,6 +22,7 @@
#include "pinmap.h"
#include "PeripheralPins.h"
#include "nu_modutil.h"
#include "hal/PinNameAliases.h"
static uint32_t eadc_modinit_mask = 0;
@ -45,6 +46,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
{ADC_1_7, EADC_MODULE, CLK_CLKSEL1_ADCSEL_PLL, CLK_CLKDIV0_ADC(5), ADC_RST, EADC0_IRQn, NULL}
};
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
/* Structure for extending sampling time on per-pin basis */
struct nu_eadc_extsmpt {
PinName pin;
uint32_t value;
};
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
};
#endif
void analogin_init(analogin_t *obj, PinName pin)
{
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@ -82,6 +95,18 @@ void analogin_init(analogin_t *obj, PinName pin)
// Configure the sample module Nmod for analog input channel Nch and software trigger source
EADC_ConfigSampleModule(eadc_base, smp_mod, EADC_SOFTWARE_TRIGGER, smp_chn);
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
// Extend sampling time in EADC clocks on per-pin basis
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
if (eadc_extsmpt_pos->pin == pin) {
EADC_SetExtendSampleTime(eadc_base, smp_mod, eadc_extsmpt_pos->value);
break;
}
}
#endif
eadc_modinit_mask |= 1 << smp_mod;
}

View File

@ -7179,6 +7179,9 @@
"gpio-irq-debounce-sample-rate": {
"help": "Select GPIO IRQ debounce sample rate: GPIO_DBCTL_DBCLKSEL_1, GPIO_DBCTL_DBCLKSEL_2, GPIO_DBCTL_DBCLKSEL_4, ..., or GPIO_DBCTL_DBCLKSEL_32768",
"value": "GPIO_DBCTL_DBCLKSEL_16"
},
"eadc-extsmpt-list": {
"help": "For EADC, comma separated {pin, value} list to extend sampling time in EADC clocks on per-pin basis. Value must be in the range [0, 255]."
}
},
"inherits": [
@ -7293,6 +7296,9 @@
"gpio-irq-debounce-sample-rate": {
"help": "Select GPIO IRQ debounce sample rate: GPIO_DBCTL_DBCLKSEL_1, GPIO_DBCTL_DBCLKSEL_2, GPIO_DBCTL_DBCLKSEL_4, ..., or GPIO_DBCTL_DBCLKSEL_32768",
"value": "GPIO_DBCTL_DBCLKSEL_16"
},
"eadc-extsmpt-list": {
"help": "For EADC, comma separated {pin, value} list to extend sampling time in EADC clocks on per-pin basis. Value must be in the range [0, 255]."
}
},
"inherits": [
@ -7415,6 +7421,9 @@
"help": "Select GPIO IRQ debounce sample rate: GPIO_DBCLKSEL_1, GPIO_DBCLKSEL_2, GPIO_DBCLKSEL_4, ..., or GPIO_DBCLKSEL_32768",
"value": "GPIO_DBCLKSEL_16"
},
"adc-smplcnt-list": {
"help": "For ADC, comma separated {pin, value} list to extend sampling time in ADC clocks on per-pin basis. Value must be in the range [0, 15]."
},
"clock-pll": {
"help": "Choose clock source to clock PLL: NU_HXT_PLL or NU_HIRC_PLL",
"macro_name": "NU_CLOCK_PLL",
@ -7554,6 +7563,9 @@
"help": "Select GPIO IRQ debounce sample rate: GPIO_DBCTL_DBCLKSEL_1, GPIO_DBCTL_DBCLKSEL_2, GPIO_DBCTL_DBCLKSEL_4, ..., or GPIO_DBCTL_DBCLKSEL_32768",
"value": "GPIO_DBCTL_DBCLKSEL_16"
},
"eadc-extsmpt-list": {
"help": "For EADC, comma separated {pin, value} list to extend sampling time in EADC clocks on per-pin basis. Value must be in the range [0, 255]."
},
"exclude-uno-spi-from-fpga-ci-test-shield-test": {
"help": "Exclude UNO SPI pins (D8/D9/D10/D11/D12/D13) from FPGA CI Test Shield test for wiring to on-board SPI flash",
"options": [false, true],
@ -7746,6 +7758,9 @@
"help": "Select GPIO IRQ debounce sample rate: GPIO_DBCTL_DBCLKSEL_1, GPIO_DBCTL_DBCLKSEL_2, GPIO_DBCTL_DBCLKSEL_4, ..., or GPIO_DBCTL_DBCLKSEL_32768",
"value": "GPIO_DBCTL_DBCLKSEL_16"
},
"eadc-extsmpt-list": {
"help": "For EADC, comma separated {pin, value} list to extend sampling time in EADC clocks on per-pin basis. Value must be in the range [0, 255]."
},
"usb-device-hsusbd": {
"help": "Select high-speed USB device or not",
"value": 0
@ -8109,6 +8124,9 @@
"gpio-irq-debounce-sample-rate": {
"help": "Select GPIO IRQ debounce sample rate: GPIO_DBCTL_DBCLKSEL_1, GPIO_DBCTL_DBCLKSEL_2, GPIO_DBCTL_DBCLKSEL_4, ..., or GPIO_DBCTL_DBCLKSEL_32768",
"value": "GPIO_DBCTL_DBCLKSEL_16"
},
"eadc-extsmpt-list": {
"help": "For EADC, comma separated {pin, value} list to extend sampling time in EADC clocks on per-pin basis. Value must be in the range [0, 255]."
}
},
"overrides": {
@ -8256,6 +8274,9 @@
"help": "Select GPIO IRQ debounce sample rate: GPIO_DBCTL_DBCLKSEL_1, GPIO_DBCTL_DBCLKSEL_2, GPIO_DBCTL_DBCLKSEL_4, ..., or GPIO_DBCTL_DBCLKSEL_32768",
"value": "GPIO_DBCTL_DBCLKSEL_16"
},
"eadc-extsmpt-list": {
"help": "For EADC, comma separated {pin, value} list to extend sampling time in EADC clocks on per-pin basis. Value must be in the range [0, 255]."
},
"hxt-enable": {
"help": "Enable external high-speed crystal (HXT)",
"value": 0,
@ -9201,6 +9222,9 @@
"gpio-irq-debounce-sample-rate": {
"help": "Select GPIO IRQ debounce sample rate: GPIO_DBCTL_DBCLKSEL_1, GPIO_DBCTL_DBCLKSEL_2, GPIO_DBCTL_DBCLKSEL_4, ..., or GPIO_DBCTL_DBCLKSEL_32768",
"value": "GPIO_DBCTL_DBCLKSEL_16"
},
"eadc-extsmpt-list": {
"help": "For EADC, comma separated {pin, value} list to extend sampling time in EADC clocks on per-pin basis. Value must be in the range [0, 255]."
}
},
"inherits": [