Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 33 additions & 7 deletions drivers/adc/adc_sam0.c
Copy link
Member

@decsny decsny Aug 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please make the commit title clear that this is specific to sam, ie it should start with drivers: adc_sam0:

Original file line number Diff line number Diff line change
Expand Up @@ -343,26 +343,52 @@ static int start_read(const struct device *dev,
switch (sequence->resolution) {
case 8:
if (sequence->oversampling) {
LOG_ERR("Oversampling requires 12 bit resolution");
LOG_ERR("Oversampling requires minimum 13 bit resolution");
return -EINVAL;
}

ADC_RESSEL(adc) = ADC_RESSEL_8BIT;
break;
case 10:
if (sequence->oversampling) {
LOG_ERR("Oversampling requires 12 bit resolution");
LOG_ERR("Oversampling requires minimum 13 bit resolution");
return -EINVAL;
}

ADC_RESSEL(adc) = ADC_RESSEL_10BIT;
break;
case 12:
if (sequence->oversampling) {
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
} else {
ADC_RESSEL(adc) = ADC_RESSEL_12BIT;
LOG_ERR("Oversampling requires minimum 13 bit resolution");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_12BIT;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ADC resolution is 12bit max.
image

However, if you want to Accumulate, Average or Oversampling, see
image

Check below sections:
45.6.2.9 Accumulation
45.6.2.10 Averaging
45.6.2.11 Oversampling and Decimation

This change must work for all sam0 series.

This possible it related to #76963

break;
case 13:
if (sequence->oversampling != 2U) {
LOG_ERR("13 bit resolution requires an oversampling of 2");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
break;
case 14:
if (sequence->oversampling != 4U) {
LOG_ERR("14 bit resolution requires an oversampling of 4");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
break;
case 15:
if (sequence->oversampling != 6U) {
LOG_ERR("15 bit resolution requires an oversampling of 6");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
break;
case 16:
if (sequence->oversampling != 8U) {
LOG_ERR("16 bit resolution requires an oversampling of 8");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
break;
default:
LOG_ERR("ADC resolution value %d is not valid",
Expand Down
Loading