diff --git a/cores/arduino/Arduino.h b/cores/arduino/Arduino.h index 470cc112..1b7bd953 100644 --- a/cores/arduino/Arduino.h +++ b/cores/arduino/Arduino.h @@ -101,6 +101,9 @@ enum digitalPins { enum analogPins { DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS) }; +// We provide analogReadResolution APIs +void analogReadResolution(int bits); + #endif #ifdef CONFIG_DAC diff --git a/cores/arduino/zephyrCommon.cpp b/cores/arduino/zephyrCommon.cpp index 3da342ab..3192d554 100644 --- a/cores/arduino/zephyrCommon.cpp +++ b/cores/arduino/zephyrCommon.cpp @@ -368,10 +368,24 @@ void analogReference(uint8_t mode) } } +// Note: We can not update the arduino_adc structure as it is read only... +static int read_resolution = 10; + +void analogReadResolution(int bits) +{ + read_resolution = bits; +} + +int analogReadResolution() +{ + return read_resolution; +} + + int analogRead(pin_size_t pinNumber) { int err; - int16_t buf; + uint16_t buf; struct adc_sequence seq = { .buffer = &buf, .buffer_size = sizeof(buf) }; size_t idx = analog_pin_index(pinNumber); @@ -401,7 +415,13 @@ int analogRead(pin_size_t pinNumber) return err; } - return buf; + /* + * If necessary map the return value to the + * number of bits the user has asked for + */ + if (read_resolution == seq.resolution) return buf; + if (read_resolution < seq.resolution) return buf >> (seq.resolution - read_resolution); + return buf << (read_resolution - seq.resolution) ; } #endif diff --git a/loader/boards/arduino_giga_r1_m7.overlay b/loader/boards/arduino_giga_r1_m7.overlay index 03c2ae54..10c3caa8 100644 --- a/loader/boards/arduino_giga_r1_m7.overlay +++ b/loader/boards/arduino_giga_r1_m7.overlay @@ -206,70 +206,70 @@ zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@8 { reg = <8>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@9 { reg = <9>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@5 { reg = <5>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@d { reg = <13>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@c { reg = <12>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@a { reg = <10>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@10 { reg = <16>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@12 { reg = <18>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@13 { reg = <19>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; /* PA0_C and PA1_C */ channel@0 { @@ -277,14 +277,14 @@ zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@1 { reg = <1>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; }; @@ -304,14 +304,14 @@ zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; channel@1 { reg = <1>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = ; - zephyr,resolution = <12>; + zephyr,resolution = <16>; }; };