Skip to content

Commit ea8fe77

Browse files
committed
sensors: lsm6dsv16x: add attr_get driver API
Add attr_get() driver API Signed-off-by: Armando Visconti <[email protected]>
1 parent 0356695 commit ea8fe77

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed

drivers/sensor/st/lsm6dsv16x/lsm6dsv16x.c

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,149 @@ static int lsm6dsv16x_attr_set(const struct device *dev,
373373
return 0;
374374
}
375375

376+
static int lsm6dsv16x_accel_get_config(const struct device *dev,
377+
enum sensor_channel chan,
378+
enum sensor_attribute attr,
379+
struct sensor_value *val)
380+
{
381+
const struct lsm6dsv16x_config *cfg = dev->config;
382+
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx;
383+
struct lsm6dsv16x_data *data = dev->data;
384+
385+
switch (attr) {
386+
case SENSOR_ATTR_FULL_SCALE:
387+
sensor_degrees_to_rad(lsm6dsv16x_accel_fs_map[data->accel_fs], val);
388+
break;
389+
case SENSOR_ATTR_SAMPLING_FREQUENCY: {
390+
lsm6dsv16x_data_rate_t odr;
391+
int8_t mode;
392+
393+
if (lsm6dsv16x_gy_data_rate_get(ctx, &odr) < 0) {
394+
return -EINVAL;
395+
}
396+
397+
mode = (odr >> 4) & 0xf;
398+
399+
val->val1 = lsm6dsv16x_odr_map[mode][data->accel_freq];
400+
break;
401+
}
402+
case SENSOR_ATTR_CONFIGURATION: {
403+
lsm6dsv16x_xl_mode_t mode;
404+
405+
lsm6dsv16x_xl_mode_get(ctx, &mode);
406+
407+
switch (mode) {
408+
case LSM6DSV16X_XL_HIGH_PERFORMANCE_MD:
409+
val->val1 = 0;
410+
break;
411+
case LSM6DSV16X_XL_HIGH_ACCURACY_ODR_MD:
412+
val->val1 = 1;
413+
break;
414+
case LSM6DSV16X_XL_ODR_TRIGGERED_MD:
415+
val->val1 = 3;
416+
break;
417+
case LSM6DSV16X_XL_LOW_POWER_2_AVG_MD:
418+
val->val1 = 4;
419+
break;
420+
case LSM6DSV16X_XL_LOW_POWER_4_AVG_MD:
421+
val->val1 = 5;
422+
break;
423+
case LSM6DSV16X_XL_LOW_POWER_8_AVG_MD:
424+
val->val1 = 6;
425+
break;
426+
case LSM6DSV16X_XL_NORMAL_MD:
427+
val->val1 = 7;
428+
break;
429+
default:
430+
return -EIO;
431+
}
432+
433+
break;
434+
}
435+
default:
436+
LOG_DBG("Attr attribute not supported.");
437+
return -ENOTSUP;
438+
}
439+
440+
return 0;
441+
}
442+
443+
static int lsm6dsv16x_gyro_get_config(const struct device *dev,
444+
enum sensor_channel chan,
445+
enum sensor_attribute attr,
446+
struct sensor_value *val)
447+
{
448+
const struct lsm6dsv16x_config *cfg = dev->config;
449+
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx;
450+
struct lsm6dsv16x_data *data = dev->data;
451+
452+
switch (attr) {
453+
case SENSOR_ATTR_FULL_SCALE:
454+
sensor_degrees_to_rad(lsm6dsv16x_gyro_fs_map[data->gyro_fs], val);
455+
break;
456+
case SENSOR_ATTR_SAMPLING_FREQUENCY: {
457+
lsm6dsv16x_data_rate_t odr;
458+
int8_t mode;
459+
460+
if (lsm6dsv16x_gy_data_rate_get(ctx, &odr) < 0) {
461+
return -EINVAL;
462+
}
463+
464+
mode = (odr >> 4) & 0xf;
465+
466+
val->val1 = lsm6dsv16x_odr_map[mode][data->gyro_freq];
467+
break;
468+
}
469+
case SENSOR_ATTR_CONFIGURATION: {
470+
lsm6dsv16x_gy_mode_t mode;
471+
472+
lsm6dsv16x_gy_mode_get(ctx, &mode);
473+
474+
switch (mode) {
475+
case LSM6DSV16X_GY_HIGH_PERFORMANCE_MD:
476+
val->val1 = 0;
477+
break;
478+
case LSM6DSV16X_GY_HIGH_ACCURACY_ODR_MD:
479+
val->val1 = 1;
480+
break;
481+
case LSM6DSV16X_GY_SLEEP_MD:
482+
val->val1 = 4;
483+
break;
484+
case LSM6DSV16X_GY_LOW_POWER_MD:
485+
val->val1 = 5;
486+
break;
487+
default:
488+
return -EIO;
489+
}
490+
491+
break;
492+
}
493+
default:
494+
LOG_DBG("Gyro attribute not supported.");
495+
return -ENOTSUP;
496+
}
497+
498+
return 0;
499+
}
500+
501+
static int lsm6dsv16x_attr_get(const struct device *dev,
502+
enum sensor_channel chan,
503+
enum sensor_attribute attr,
504+
struct sensor_value *val)
505+
{
506+
switch (chan) {
507+
case SENSOR_CHAN_ACCEL_XYZ:
508+
return lsm6dsv16x_accel_get_config(dev, chan, attr, val);
509+
case SENSOR_CHAN_GYRO_XYZ:
510+
return lsm6dsv16x_gyro_get_config(dev, chan, attr, val);
511+
default:
512+
LOG_WRN("attr_get() not supported on this channel.");
513+
return -ENOTSUP;
514+
}
515+
516+
return 0;
517+
}
518+
376519
static int lsm6dsv16x_sample_fetch_accel(const struct device *dev)
377520
{
378521
const struct lsm6dsv16x_config *cfg = dev->config;
@@ -775,6 +918,7 @@ static int lsm6dsv16x_channel_get(const struct device *dev,
775918

776919
static const struct sensor_driver_api lsm6dsv16x_driver_api = {
777920
.attr_set = lsm6dsv16x_attr_set,
921+
.attr_get = lsm6dsv16x_attr_get,
778922
#if CONFIG_LSM6DSV16X_TRIGGER
779923
.trigger_set = lsm6dsv16x_trigger_set,
780924
#endif

0 commit comments

Comments
 (0)