From ba52a93ac9fd5d4ebe3c1e1451df7022206e9f77 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Wed, 12 Feb 2025 11:50:31 +0800 Subject: [PATCH] drivers: adc: Add support for Apollo510 ADC This commit adds support for Apollo510 SoC in ambiq adc driver Signed-off-by: Hao Luo --- .../apollo510_evb/apollo510_evb-pinctrl.dtsi | 7 ++++ boards/ambiq/apollo510_evb/apollo510_evb.dts | 6 ++++ boards/ambiq/apollo510_evb/apollo510_evb.yaml | 1 + drivers/adc/adc_ambiq.c | 14 ++++---- dts/arm/ambiq/ambiq_apollo510.dtsi | 11 ++++++ .../adc/adc_dt/boards/apollo510_evb.overlay | 34 +++++++++++++++++++ .../adc/adc_api/boards/apollo510_evb.overlay | 32 +++++++++++++++++ 7 files changed, 98 insertions(+), 7 deletions(-) create mode 100644 samples/drivers/adc/adc_dt/boards/apollo510_evb.overlay create mode 100644 tests/drivers/adc/adc_api/boards/apollo510_evb.overlay diff --git a/boards/ambiq/apollo510_evb/apollo510_evb-pinctrl.dtsi b/boards/ambiq/apollo510_evb/apollo510_evb-pinctrl.dtsi index 44b0f89f6f7..2f1472fc061 100644 --- a/boards/ambiq/apollo510_evb/apollo510_evb-pinctrl.dtsi +++ b/boards/ambiq/apollo510_evb/apollo510_evb-pinctrl.dtsi @@ -24,6 +24,13 @@ }; }; + adc0_default: adc0_default{ + group1 { + pinmux = , ; + drive-strength = "0.1"; + }; + }; + i2c0_default: i2c0_default { group1 { pinmux = , ; diff --git a/boards/ambiq/apollo510_evb/apollo510_evb.dts b/boards/ambiq/apollo510_evb/apollo510_evb.dts index af527d187ab..4d4b898629c 100644 --- a/boards/ambiq/apollo510_evb/apollo510_evb.dts +++ b/boards/ambiq/apollo510_evb/apollo510_evb.dts @@ -89,6 +89,12 @@ pinctrl-names = "default"; }; +&adc0 { + pinctrl-0 = <&adc0_default>; + pinctrl-names = "default"; + status = "disabled"; +}; + &counter0 { status = "disabled"; }; diff --git a/boards/ambiq/apollo510_evb/apollo510_evb.yaml b/boards/ambiq/apollo510_evb/apollo510_evb.yaml index b56ef04fcb1..0fc5bf37037 100644 --- a/boards/ambiq/apollo510_evb/apollo510_evb.yaml +++ b/boards/ambiq/apollo510_evb/apollo510_evb.yaml @@ -9,6 +9,7 @@ toolchain: - gnuarmemb supported: - uart + - adc - watchdog - counter - gpio diff --git a/drivers/adc/adc_ambiq.c b/drivers/adc/adc_ambiq.c index 5af7b1301b1..ac8f7793f07 100644 --- a/drivers/adc/adc_ambiq.c +++ b/drivers/adc/adc_ambiq.c @@ -52,7 +52,7 @@ static int adc_ambiq_set_resolution(am_hal_adc_slot_prec_e *prec, uint8_t adc_re case 12: *prec = AM_HAL_ADC_SLOT_12BIT; break; -#if !defined(CONFIG_SOC_SERIES_APOLLO4X) +#if defined(CONFIG_SOC_SERIES_APOLLO3X) case 14: *prec = AM_HAL_ADC_SLOT_14BIT; break; @@ -80,7 +80,7 @@ static int adc_ambiq_slot_config(const struct device *dev, const struct adc_sequ ADCSlotConfig.eChannel = channel; ADCSlotConfig.bWindowCompare = false; ADCSlotConfig.bEnabled = true; -#if defined(CONFIG_SOC_SERIES_APOLLO4X) +#if !defined(CONFIG_SOC_SERIES_APOLLO3X) ADCSlotConfig.ui32TrkCyc = AM_HAL_ADC_MIN_TRKCYC; #endif if (AM_HAL_STATUS_SUCCESS != @@ -101,8 +101,6 @@ static void adc_ambiq_isr(const struct device *dev) /* Read the interrupt status. */ am_hal_adc_interrupt_status(data->adcHandle, &ui32IntMask, true); - /* Clear the ADC interrupt.*/ - am_hal_adc_interrupt_clear(data->adcHandle, ui32IntMask); /* * If we got a conversion completion interrupt (which should be our only @@ -119,6 +117,8 @@ static void adc_ambiq_isr(const struct device *dev) am_hal_adc_disable(data->adcHandle); adc_context_on_sampling_done(&data->ctx, dev); } + /* Clear the ADC interrupt.*/ + am_hal_adc_interrupt_clear(data->adcHandle, ui32IntMask); } static int adc_ambiq_check_buffer_size(const struct adc_sequence *sequence, uint8_t active_channels) @@ -280,9 +280,9 @@ static int adc_ambiq_init(const struct device *dev) /* Initialize the ADC and get the handle*/ if (AM_HAL_STATUS_SUCCESS != - am_hal_adc_initialize((cfg->base - ADC_BASE) / (cfg->size * 4), &data->adcHandle)) { + am_hal_adc_initialize(0, &data->adcHandle)) { ret = -ENODEV; - LOG_ERR("Faile to initialize ADC, code:%d", ret); + LOG_ERR("Failed to initialize ADC, code:%d", ret); return ret; } @@ -292,7 +292,7 @@ static int adc_ambiq_init(const struct device *dev) /* Set up the ADC configuration parameters. These settings are reasonable * for accurate measurements at a low sample rate. */ -#if !defined(CONFIG_SOC_SERIES_APOLLO4X) +#if defined(CONFIG_SOC_SERIES_APOLLO3X) ADCConfig.eClock = AM_HAL_ADC_CLKSEL_HFRC; ADCConfig.eReference = AM_HAL_ADC_REFSEL_INT_1P5; #else diff --git a/dts/arm/ambiq/ambiq_apollo510.dtsi b/dts/arm/ambiq/ambiq_apollo510.dtsi index 805a6adc144..82de07aaec6 100644 --- a/dts/arm/ambiq/ambiq_apollo510.dtsi +++ b/dts/arm/ambiq/ambiq_apollo510.dtsi @@ -549,6 +549,17 @@ status = "disabled"; }; + adc0: adc@ADC_BASE_NAME { + compatible = "ambiq,adc"; + reg = ; + interrupts = <19 0>; + interrupt-names = "ADC"; + channel-count = <10>; + internal-vref-mv = <1190>; + status = "disabled"; + #io-channel-cells = <1>; + }; + pinctrl: pin-controller@GPIO_BASE_NAME { compatible = "ambiq,apollo5-pinctrl"; reg = ; diff --git a/samples/drivers/adc/adc_dt/boards/apollo510_evb.overlay b/samples/drivers/adc/adc_dt/boards/apollo510_evb.overlay new file mode 100644 index 00000000000..d77bb43e078 --- /dev/null +++ b/samples/drivers/adc/adc_dt/boards/apollo510_evb.overlay @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2025 Ambiq Micro Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ +/ { + zephyr,user { + io-channels = <&adc0 4>, <&adc0 7>; + }; +}; + +&adc0 { + status = "okay"; + interrupt-parent = <&nvic>; + interrupts = <19 0>; + #address-cells = <1>; + #size-cells = <0>; + + channel@4 { + reg = <4>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; + + channel@7 { + reg = <7>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +}; diff --git a/tests/drivers/adc/adc_api/boards/apollo510_evb.overlay b/tests/drivers/adc/adc_api/boards/apollo510_evb.overlay new file mode 100644 index 00000000000..7121e92ee66 --- /dev/null +++ b/tests/drivers/adc/adc_api/boards/apollo510_evb.overlay @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2025 Ambiq Micro Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ +/ { + zephyr,user { + io-channels = <&adc0 4>, <&adc0 7>; + }; +}; + +&adc0 { + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; + + channel@4 { + reg = <4>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; + + channel@7 { + reg = <7>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +};