Difference between revisions of "Zephyr drivers"
m (Add notes about driver API sensor_attr_set()) |
m (WIP: Adding Bosch BMI323 code examples) |
||
| Line 43: | Line 43: | ||
. . . whose typedef is at https://github.com/zephyrproject-rtos/zephyr/blob/main/include/zephyr/drivers/sensor.h#L431. | . . . whose typedef is at https://github.com/zephyrproject-rtos/zephyr/blob/main/include/zephyr/drivers/sensor.h#L431. | ||
| − | Bosch sensor driver for the BMI323 implements its sensor attribute setter in bmi323.c as follows | + | Bosch sensor driver for the BMI323 implements its sensor attribute setter in bmi323.c as follows in two places. The first place is a sensor API struct which the driver declares. This API struct organizes |
<pre> | <pre> | ||
| Line 53: | Line 53: | ||
.channel_get = bosch_bmi323_driver_api_channel_get, | .channel_get = bosch_bmi323_driver_api_channel_get, | ||
}; | }; | ||
| + | </pre> | ||
| + | <pre> | ||
| + | static int bosch_bmi323_driver_api_attr_set(const struct device *dev, enum sensor_channel chan, | ||
| + | enum sensor_attribute attr, | ||
| + | const struct sensor_value *val) | ||
| + | { | ||
| + | struct bosch_bmi323_data *data = (struct bosch_bmi323_data *)dev->data; | ||
| + | int ret; | ||
| + | |||
| + | k_mutex_lock(&data->lock, K_FOREVER); | ||
| + | |||
| + | switch (chan) { | ||
| + | case SENSOR_CHAN_ACCEL_XYZ: | ||
| + | switch (attr) { | ||
| + | case SENSOR_ATTR_SAMPLING_FREQUENCY: | ||
| + | ret = bosch_bmi323_driver_api_set_acc_odr(dev, val); | ||
| + | |||
| + | break; | ||
| + | |||
| + | case SENSOR_ATTR_FULL_SCALE: | ||
| + | ret = bosch_bmi323_driver_api_set_acc_full_scale(dev, val); | ||
| + | |||
| + | break; | ||
| + | |||
| + | case SENSOR_ATTR_FEATURE_MASK: | ||
| + | ret = bosch_bmi323_driver_api_set_acc_feature_mask(dev, val); | ||
| + | |||
| + | break; | ||
| + | |||
| + | default: | ||
| + | ret = -ENODEV; | ||
| + | |||
| + | break; | ||
| + | } | ||
| + | |||
| + | break; | ||
| + | |||
| + | case SENSOR_CHAN_GYRO_XYZ: | ||
| + | switch (attr) { | ||
| + | case SENSOR_ATTR_SAMPLING_FREQUENCY: | ||
| + | ret = bosch_bmi323_driver_api_set_gyro_odr(dev, val); | ||
| + | |||
| + | break; | ||
| + | |||
| + | case SENSOR_ATTR_FULL_SCALE: | ||
| + | ret = bosch_bmi323_driver_api_set_gyro_full_scale(dev, val); | ||
| + | |||
| + | break; | ||
| + | |||
| + | case SENSOR_ATTR_FEATURE_MASK: | ||
| + | ret = bosch_bmi323_driver_api_set_gyro_feature_mask(dev, val); | ||
| + | |||
| + | break; | ||
| + | |||
| + | default: | ||
| + | ret = -ENODEV; | ||
| + | |||
| + | break; | ||
| + | } | ||
| + | |||
| + | break; | ||
| + | |||
| + | default: | ||
| + | ret = -ENODEV; | ||
| + | |||
| + | break; | ||
| + | } | ||
| + | |||
| + | k_mutex_unlock(&data->lock); | ||
| + | |||
| + | return ret; | ||
| + | } | ||
</pre> | </pre> | ||
Revision as of 23:20, 21 February 2026
Keywords: sensor interrupts : sensor triggers : Zephyr triggers : sensor interrupt support
OVERVIEW
This page a stash point to hold Zephyr driver notes. Zephyr RTOS project includes a range of types of drivers. First type referenced by this page will be Zephyr's sensor drivers.
^ Zephyr Sensor Model
Zephyr 4.3.0 device driver documentation:
Zephyr 4.3.0 sensor model:
"Sensor attribute get" function prototype. This prototype reveals Zephyr's enumerations for sensor yyy . . .
Zephyr's sensor model plays a big role in the design of sensor drivers for this RTOS. Zephyr's [... sensor.h] header defines many things. Two important enums from this header file are:
_ Sensor channel enum _
_ Sensor attribute enum _
Sensor channels generally correspond to readings of a quantity in specific units, like degrees centigrade and acceleration in the x-axis. Sensor attributes generally corrrespond to configuration settings for a sensor, where these settings modify the way in which readings are taken and reported.
For a Zephyr driver to support configuration of a sensor's attributes, it must implement a function of the form:
sensor_attr_set()
int sensor_attr_set(const struct device* dev,
enum sensor_channel chan,
enum sensor_attribute attr,
const struct sensor_value* val)
. . . whose typedef is at https://github.com/zephyrproject-rtos/zephyr/blob/main/include/zephyr/drivers/sensor.h#L431.
Bosch sensor driver for the BMI323 implements its sensor attribute setter in bmi323.c as follows in two places. The first place is a sensor API struct which the driver declares. This API struct organizes
static DEVICE_API(sensor, bosch_bmi323_api) = {
.attr_set = bosch_bmi323_driver_api_attr_set,
.attr_get = bosch_bmi323_driver_api_attr_get,
.trigger_set = bosch_bmi323_driver_api_trigger_set,
.sample_fetch = bosch_bmi323_driver_api_sample_fetch,
.channel_get = bosch_bmi323_driver_api_channel_get,
};
static int bosch_bmi323_driver_api_attr_set(const struct device *dev, enum sensor_channel chan,
enum sensor_attribute attr,
const struct sensor_value *val)
{
struct bosch_bmi323_data *data = (struct bosch_bmi323_data *)dev->data;
int ret;
k_mutex_lock(&data->lock, K_FOREVER);
switch (chan) {
case SENSOR_CHAN_ACCEL_XYZ:
switch (attr) {
case SENSOR_ATTR_SAMPLING_FREQUENCY:
ret = bosch_bmi323_driver_api_set_acc_odr(dev, val);
break;
case SENSOR_ATTR_FULL_SCALE:
ret = bosch_bmi323_driver_api_set_acc_full_scale(dev, val);
break;
case SENSOR_ATTR_FEATURE_MASK:
ret = bosch_bmi323_driver_api_set_acc_feature_mask(dev, val);
break;
default:
ret = -ENODEV;
break;
}
break;
case SENSOR_CHAN_GYRO_XYZ:
switch (attr) {
case SENSOR_ATTR_SAMPLING_FREQUENCY:
ret = bosch_bmi323_driver_api_set_gyro_odr(dev, val);
break;
case SENSOR_ATTR_FULL_SCALE:
ret = bosch_bmi323_driver_api_set_gyro_full_scale(dev, val);
break;
case SENSOR_ATTR_FEATURE_MASK:
ret = bosch_bmi323_driver_api_set_gyro_feature_mask(dev, val);
break;
default:
ret = -ENODEV;
break;
}
break;
default:
ret = -ENODEV;
break;
}
k_mutex_unlock(&data->lock);
return ret;
}
^ References
1. https://github.com/zephyrproject-rtos/zephyr/issues/30133