@@ -676,7 +676,8 @@ static int bmm350_channel_get(const struct device *dev, enum sensor_channel chan
676
676
677
677
return 0 ;
678
678
}
679
- static uint8_t acc_odr_to_reg (const struct sensor_value * val )
679
+
680
+ static uint8_t mag_odr_to_reg (const struct sensor_value * val )
680
681
{
681
682
double odr = sensor_value_to_double ((struct sensor_value * )val );
682
683
@@ -706,7 +707,7 @@ static uint8_t acc_odr_to_reg(const struct sensor_value *val)
706
707
return reg ;
707
708
}
708
709
709
- static uint8_t acc_osr_to_reg (const struct sensor_value * val )
710
+ static uint8_t mag_osr_to_reg (const struct sensor_value * val )
710
711
{
711
712
switch (val -> val1 ) {
712
713
case 0 :
@@ -767,6 +768,7 @@ int8_t bmm350_set_odr_performance(enum bmm350_data_rates odr,
767
768
768
769
return rslt ;
769
770
}
771
+
770
772
static int set_mag_odr_osr (const struct device * dev , const struct sensor_value * odr ,
771
773
const struct sensor_value * osr )
772
774
{
@@ -792,10 +794,10 @@ static int set_mag_odr_osr(const struct device *dev, const struct sensor_value *
792
794
}
793
795
794
796
if (odr ) {
795
- odr_bits = acc_odr_to_reg (odr );
797
+ odr_bits = mag_odr_to_reg (odr );
796
798
}
797
799
if (osr ) {
798
- osr_bits = acc_osr_to_reg (osr );
800
+ osr_bits = mag_osr_to_reg (osr );
799
801
if (osr_bits == 0xFF ) {
800
802
LOG_ERR ("unsupported oversampling rate" );
801
803
return - EINVAL ;
@@ -836,8 +838,125 @@ static int bmm350_attr_set(const struct device *dev, enum sensor_channel chan,
836
838
837
839
return 0 ;
838
840
}
841
+
842
+ void mag_reg_to_odr (uint8_t bits , struct sensor_value * val )
843
+ {
844
+ switch (bits ) {
845
+ case BMM350_DATA_RATE_1_5625HZ :
846
+ val -> val1 = 1 ;
847
+ val -> val2 = 562500 ;
848
+ break ;
849
+ case BMM350_DATA_RATE_3_125HZ :
850
+ val -> val1 = 3 ;
851
+ val -> val2 = 125000 ;
852
+ break ;
853
+ case BMM350_DATA_RATE_6_25HZ :
854
+ val -> val1 = 6 ;
855
+ val -> val2 = 250000 ;
856
+ break ;
857
+ case BMM350_DATA_RATE_12_5HZ :
858
+ val -> val1 = 12 ;
859
+ val -> val2 = 500000 ;
860
+ break ;
861
+ case BMM350_DATA_RATE_25HZ :
862
+ val -> val1 = 25 ;
863
+ val -> val2 = 0 ;
864
+ break ;
865
+ case BMM350_DATA_RATE_50HZ :
866
+ val -> val1 = 50 ;
867
+ val -> val2 = 0 ;
868
+ break ;
869
+ case BMM350_DATA_RATE_100HZ :
870
+ val -> val1 = 100 ;
871
+ val -> val2 = 0 ;
872
+ break ;
873
+ case BMM350_DATA_RATE_200HZ :
874
+ val -> val1 = 200 ;
875
+ val -> val2 = 0 ;
876
+ break ;
877
+ case BMM350_DATA_RATE_400HZ :
878
+ val -> val1 = 400 ;
879
+ val -> val2 = 0 ;
880
+ break ;
881
+ default :
882
+ val -> val1 = 0 ;
883
+ val -> val2 = 0 ;
884
+ break ;
885
+ }
886
+ }
887
+
888
+ void mag_reg_to_osr (uint8_t bits , struct sensor_value * val )
889
+ {
890
+ val -> val2 = 0 ;
891
+
892
+ switch (bits ) {
893
+ case BMM350_NO_AVERAGING :
894
+ val -> val1 = 1 ;
895
+ break ;
896
+ case BMM350_AVERAGING_2 :
897
+ val -> val1 = 2 ;
898
+ break ;
899
+ case BMM350_AVERAGING_4 :
900
+ val -> val1 = 4 ;
901
+ break ;
902
+ case BMM350_AVERAGING_8 :
903
+ val -> val1 = 8 ;
904
+ break ;
905
+ default :
906
+ val -> val1 = 0 ;
907
+ break ;
908
+ }
909
+ }
910
+
911
+ static int get_mag_odr_osr (const struct device * dev , struct sensor_value * odr ,
912
+ struct sensor_value * osr )
913
+ {
914
+ int ret ;
915
+ uint8_t rx_buf [3 ] = {0x00 };
916
+ uint8_t osr_bits ;
917
+ uint8_t odr_bits ;
918
+
919
+ /* read current state */
920
+ ret = bmm350_reg_read (dev , BMM350_REG_PMU_CMD_AGGR_SET , & rx_buf [0 ], 3 );
921
+ if (ret < 0 ) {
922
+ LOG_ERR ("failed to read PMU_CMD_AGGR_SET" );
923
+ return - EIO ;
924
+ }
925
+ osr_bits = ((rx_buf [2 ] & BMM350_AVG_MSK ) >> BMM350_AVG_POS );
926
+ odr_bits = ((rx_buf [2 ] & BMM350_ODR_MSK ) >> BMM350_ODR_POS );
927
+
928
+ if (odr ) {
929
+ mag_reg_to_odr (odr_bits , odr );
930
+ }
931
+ if (osr ) {
932
+ mag_reg_to_osr (osr_bits , osr );
933
+ }
934
+
935
+ return 0 ;
936
+ }
937
+
938
+ static int bmm350_attr_get (const struct device * dev , enum sensor_channel chan ,
939
+ enum sensor_attribute attr , struct sensor_value * val )
940
+ {
941
+ int ret ;
942
+
943
+ switch (attr ) {
944
+ case SENSOR_ATTR_SAMPLING_FREQUENCY :
945
+ ret = get_mag_odr_osr (dev , val , NULL );
946
+ break ;
947
+ case SENSOR_ATTR_OVERSAMPLING :
948
+ ret = get_mag_odr_osr (dev , NULL , val );
949
+ break ;
950
+ default :
951
+ ret = - EINVAL ;
952
+ }
953
+
954
+ return ret ;
955
+ }
956
+
839
957
static DEVICE_API (sensor , bmm350_api_funcs ) = {
840
958
.attr_set = bmm350_attr_set ,
959
+ .attr_get = bmm350_attr_get ,
841
960
.sample_fetch = bmm350_sample_fetch ,
842
961
.channel_get = bmm350_channel_get ,
843
962
#ifdef CONFIG_BMM350_TRIGGER
0 commit comments