drivers: adc: Introduce the adc_sequence_options::user_data field
Introduce the field that can be used to associate a given sampling sequence with any other data needed in the sampling-done callback function. Adjust one ADC API test case that uses a sequence callback so that it checks if this introduced field is propagated as expected. Also clarify in the description of the `sequence` parameter of the callback function that this parameter is not supposed to be supplied to the CONTAINER_OF() macro, to avoid any further confusion in that regard. Signed-off-by: Andrzej Głąbek <andrzej.glabek@nordicsemi.no>
This commit is contained in:
parent
3b89f4a474
commit
f234c5f876
2 changed files with 28 additions and 2 deletions
|
@ -218,8 +218,15 @@ enum adc_action {
|
||||||
*
|
*
|
||||||
* @param dev Pointer to the device structure for the driver
|
* @param dev Pointer to the device structure for the driver
|
||||||
* instance.
|
* instance.
|
||||||
* @param sequence Pointer to the sequence structure that triggered the
|
* @param sequence Pointer to the sequence structure that triggered
|
||||||
* sampling.
|
* the sampling. This parameter points to a copy of
|
||||||
|
* the structure that was supplied to the call that
|
||||||
|
* started the sampling sequence, thus it cannot be
|
||||||
|
* used with the CONTAINER_OF() macro to retrieve
|
||||||
|
* some other data associated with the sequence.
|
||||||
|
* Instead, the adc_sequence_options::user_data field
|
||||||
|
* should be used for such purpose.
|
||||||
|
*
|
||||||
* @param sampling_index Index (0-65535) of the sampling done.
|
* @param sampling_index Index (0-65535) of the sampling done.
|
||||||
*
|
*
|
||||||
* @returns Action to be performed by the driver. See @ref adc_action.
|
* @returns Action to be performed by the driver. See @ref adc_action.
|
||||||
|
@ -249,6 +256,12 @@ struct adc_sequence_options {
|
||||||
*/
|
*/
|
||||||
adc_sequence_callback callback;
|
adc_sequence_callback callback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to user data. It can be used to associate the sequence
|
||||||
|
* with any other data that is needed in the callback function.
|
||||||
|
*/
|
||||||
|
void *user_data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of extra samplings to perform (the total number of samplings
|
* Number of extra samplings to perform (the total number of samplings
|
||||||
* is 1 + extra_samplings).
|
* is 1 + extra_samplings).
|
||||||
|
|
|
@ -452,10 +452,18 @@ void test_adc_asynchronous_call(void)
|
||||||
/*
|
/*
|
||||||
* test_adc_sample_with_interval
|
* test_adc_sample_with_interval
|
||||||
*/
|
*/
|
||||||
|
static uint32_t my_sequence_identifier = 0x12345678;
|
||||||
|
static void *user_data = &my_sequence_identifier;
|
||||||
|
|
||||||
static enum adc_action sample_with_interval_callback(const struct device *dev,
|
static enum adc_action sample_with_interval_callback(const struct device *dev,
|
||||||
const struct adc_sequence *sequence,
|
const struct adc_sequence *sequence,
|
||||||
uint16_t sampling_index)
|
uint16_t sampling_index)
|
||||||
{
|
{
|
||||||
|
if (sequence->options->user_data != &my_sequence_identifier) {
|
||||||
|
user_data = sequence->options->user_data;
|
||||||
|
return ADC_ACTION_FINISH;
|
||||||
|
}
|
||||||
|
|
||||||
TC_PRINT("%s: sampling %d\n", __func__, sampling_index);
|
TC_PRINT("%s: sampling %d\n", __func__, sampling_index);
|
||||||
return ADC_ACTION_CONTINUE;
|
return ADC_ACTION_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -466,6 +474,7 @@ static int test_task_with_interval(void)
|
||||||
const struct adc_sequence_options options = {
|
const struct adc_sequence_options options = {
|
||||||
.interval_us = 100 * 1000UL,
|
.interval_us = 100 * 1000UL,
|
||||||
.callback = sample_with_interval_callback,
|
.callback = sample_with_interval_callback,
|
||||||
|
.user_data = user_data,
|
||||||
.extra_samplings = 4,
|
.extra_samplings = 4,
|
||||||
};
|
};
|
||||||
const struct adc_sequence sequence = {
|
const struct adc_sequence sequence = {
|
||||||
|
@ -485,6 +494,10 @@ static int test_task_with_interval(void)
|
||||||
ret = adc_read(adc_dev, &sequence);
|
ret = adc_read(adc_dev, &sequence);
|
||||||
zassert_equal(ret, 0, "adc_read() failed with code %d", ret);
|
zassert_equal(ret, 0, "adc_read() failed with code %d", ret);
|
||||||
|
|
||||||
|
zassert_equal(user_data, sequence.options->user_data,
|
||||||
|
"Invalid user data: %p, expected: %p",
|
||||||
|
user_data, sequence.options->user_data);
|
||||||
|
|
||||||
check_samples(1 + options.extra_samplings);
|
check_samples(1 + options.extra_samplings);
|
||||||
|
|
||||||
return TC_PASS;
|
return TC_PASS;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue