@@ -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+
376519static 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
776919static 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