2
2
3
3
/*
4
4
* Copyright (c) 2017 Intel Corporation
5
+ * Copyright (c) 2023 FTP Technologies
5
6
*
6
7
* SPDX-License-Identifier: Apache-2.0
7
8
*/
@@ -80,41 +81,22 @@ int bmm150_reg_update_byte(const struct device *dev, uint8_t reg,
80
81
return ret ;
81
82
}
82
83
83
- static int bmm150_set_power_mode (const struct device * dev ,
84
- enum bmm150_power_modes mode ,
85
- int state )
84
+ /* Power control = 'bit' */
85
+ static int bmm150_power_control (const struct device * dev , uint8_t bit )
86
86
{
87
- switch (mode ) {
88
- case BMM150_POWER_MODE_SUSPEND :
89
- if (bmm150_reg_update_byte (dev ,
90
- BMM150_REG_POWER ,
91
- BMM150_MASK_POWER_CTL ,
92
- !state ) < 0 ) {
93
- return - EIO ;
94
- }
95
- k_busy_wait (USEC_PER_MSEC * 5U );
96
-
97
- return 0 ;
98
- case BMM150_POWER_MODE_SLEEP :
99
- return bmm150_reg_update_byte (dev ,
100
- BMM150_REG_OPMODE_ODR ,
101
- BMM150_MASK_OPMODE ,
102
- BMM150_MODE_SLEEP <<
103
- BMM150_SHIFT_OPMODE );
104
- break ;
105
- case BMM150_POWER_MODE_NORMAL :
106
- return bmm150_reg_update_byte (dev ,
107
- BMM150_REG_OPMODE_ODR ,
108
- BMM150_MASK_OPMODE ,
109
- BMM150_MODE_NORMAL <<
110
- BMM150_SHIFT_OPMODE );
111
- break ;
112
- }
113
-
114
- return - ENOTSUP ;
87
+ return bmm150_reg_update_byte (dev , BMM150_REG_POWER ,
88
+ BMM150_MASK_POWER_CTL , bit );
89
+ }
115
90
91
+ /* OpMode = 'mode' */
92
+ static int bmm150_opmode (const struct device * dev , uint8_t mode )
93
+ {
94
+ return bmm150_reg_update_byte (dev , BMM150_REG_OPMODE_ODR ,
95
+ BMM150_MASK_OPMODE ,
96
+ mode << BMM150_SHIFT_OPMODE );
116
97
}
117
98
99
+
118
100
static int bmm150_set_odr (const struct device * dev , uint8_t val )
119
101
{
120
102
uint8_t i ;
@@ -515,33 +497,63 @@ static const struct sensor_driver_api bmm150_api_funcs = {
515
497
.channel_get = bmm150_channel_get ,
516
498
};
517
499
518
- static int bmm150_init_chip (const struct device * dev )
500
+ static int bmm150_full_por (const struct device * dev )
519
501
{
520
- struct bmm150_data * data = dev -> data ;
521
- uint8_t chip_id ;
522
- struct bmm150_preset preset ;
502
+ int ret ;
523
503
524
- /* Soft reset chip */
525
- if ( bmm150_reg_update_byte ( dev , BMM150_REG_POWER , BMM150_MASK_SOFT_RESET ,
526
- BMM150_SOFT_RESET ) < 0 ) {
527
- LOG_ERR ("failed reset chip" );
528
- goto err_poweroff ;
504
+ /* Ensure we are not in suspend mode so soft reset is not ignored */
505
+ ret = bmm150_power_control ( dev , 1 );
506
+ if ( ret != 0 ) {
507
+ LOG_ERR ("failed to ensure not in suspend mode: %d" , ret );
508
+ return ret ;
529
509
}
530
510
531
- /* Sleep for 1ms after software reset */
532
- k_sleep (K_MSEC (1 ));
511
+ k_sleep (BMM150_START_UP_TIME );
533
512
534
- /* Suspend mode to sleep mode */
535
- if (bmm150_set_power_mode (dev , BMM150_POWER_MODE_SUSPEND , 0 )
536
- < 0 ) {
537
- LOG_ERR ("failed to bring up device from suspend mode" );
538
- return - EIO ;
513
+ /* Soft reset always brings the device into sleep mode */
514
+ ret = bmm150_reg_update_byte (dev , BMM150_REG_POWER ,
515
+ BMM150_MASK_SOFT_RESET ,
516
+ BMM150_SOFT_RESET );
517
+ if (ret != 0 ) {
518
+ LOG_ERR ("failed soft reset: %d" , ret );
519
+ return ret ;
539
520
}
540
521
541
- /* Sleep for 3ms from suspend to sleep mode */
542
- k_sleep (K_MSEC (3 ));
522
+ /*
523
+ * To perform full POR (after soft reset), bring the device into suspend
524
+ * mode then back into sleep mode, see datasheet section 5.6
525
+ */
526
+ ret = bmm150_power_control (dev , 0 );
527
+ if (ret != 0 ) {
528
+ LOG_ERR ("failed to enter suspend mode: %d" , ret );
529
+ return ret ;
530
+ }
531
+
532
+ k_sleep (BMM150_POR_TIME );
533
+
534
+ /* Full POR - back into sleep mode */
535
+ ret = bmm150_power_control (dev , 1 );
536
+ if (ret != 0 ) {
537
+ LOG_ERR ("failed to go back into sleep mode: %d" , ret );
538
+ return ret ;
539
+ }
540
+
541
+ k_sleep (BMM150_START_UP_TIME );
543
542
544
- /* Read chip ID */
543
+ return 0 ;
544
+ }
545
+
546
+ static int bmm150_init_chip (const struct device * dev )
547
+ {
548
+ struct bmm150_data * data = dev -> data ;
549
+ struct bmm150_preset preset ;
550
+ uint8_t chip_id ;
551
+
552
+ if (bmm150_full_por (dev ) != 0 ) {
553
+ goto err_poweroff ;
554
+ }
555
+
556
+ /* Read chip ID (can only be read in sleep mode)*/
545
557
if (bmm150_reg_read (dev , BMM150_REG_CHIP_ID , & chip_id , 1 ) < 0 ) {
546
558
LOG_ERR ("failed reading chip id" );
547
559
goto err_poweroff ;
@@ -574,9 +586,8 @@ static int bmm150_init_chip(const struct device *dev)
574
586
}
575
587
576
588
/* Set chip normal mode */
577
- if (bmm150_set_power_mode (dev , BMM150_POWER_MODE_NORMAL , 1 )
578
- < 0 ) {
579
- LOG_ERR ("failed to power on device" );
589
+ if (bmm150_opmode (dev , BMM150_MODE_NORMAL ) < 0 ) {
590
+ LOG_ERR ("failed to enter normal mode" );
580
591
}
581
592
582
593
/* Reads the trim registers of the sensor */
@@ -603,8 +614,8 @@ static int bmm150_init_chip(const struct device *dev)
603
614
return 0 ;
604
615
605
616
err_poweroff :
606
- bmm150_set_power_mode ( dev , BMM150_POWER_MODE_NORMAL , 0 );
607
- bmm150_set_power_mode ( dev , BMM150_POWER_MODE_SUSPEND , 1 );
617
+ ( void ) bmm150_power_control ( dev , 0 ); /* Suspend */
618
+
608
619
return - EIO ;
609
620
}
610
621
0 commit comments