capsules_extra/
lsm303xx.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! LSM303xx Sensors
6//!
7
8#![allow(non_camel_case_types)]
9
10use enum_primitive::cast::FromPrimitive;
11use enum_primitive::enum_from_primitive;
12
13use kernel::utilities::registers::register_bitfields;
14
15pub const ACCELEROMETER_BASE_ADDRESS: u8 = 0x19;
16pub const MAGNETOMETER_BASE_ADDRESS: u8 = 0x1e;
17
18// Manual page Table 20, page 25
19enum_from_primitive! {
20    #[derive(Clone, Copy, PartialEq)]
21    pub enum Lsm303AccelDataRate {
22        Off = 0,
23        DataRate1Hz = 1,
24        DataRate10Hz = 2,
25        DataRate25Hz = 3,
26        DataRate50Hz = 4,
27        DataRate100Hz = 5,
28        DataRate200Hz = 6,
29        DataRate400Hz = 7,
30        LowPower1620Hz = 8,
31        Normal1344LowPower5376Hz = 9,
32    }
33}
34
35// Manual table 72, page 25
36enum_from_primitive! {
37    #[derive(Clone, Copy, PartialEq)]
38    pub enum Lsm303MagnetoDataRate {
39        DataRate0_75Hz = 0,
40        DataRate1_5Hz = 1,
41        DataRate3_0Hz = 2,
42        DataRate7_5Hz = 3,
43        DataRate15_0Hz = 4,
44        DataRate30_0Hz = 5,
45        DataRate75_0Hz = 6,
46        DataRate220_0Hz = 7,
47    }
48}
49
50enum_from_primitive! {
51    #[derive(Clone, Copy, PartialEq)]
52    pub enum Lsm303Scale {
53        Scale2G = 0,
54        Scale4G = 1,
55        Scale8G = 2,
56        Scale16G = 3
57    }
58}
59
60// Manual table 27, page 27
61pub(crate) const SCALE_FACTOR: [u8; 4] = [2, 4, 8, 16];
62
63// Manual table 75, page 38
64enum_from_primitive! {
65    #[derive(Clone, Copy, PartialEq)]
66    pub enum Lsm303Range {
67        Range1G = 0,
68        Range1_3G = 1,
69        Range1_9G = 2,
70        Range2_5G = 3,
71        Range4_0G = 4,
72        Range4_7G = 5,
73        Range5_6G = 7,
74        Range8_1 = 8,
75    }
76}
77
78// Manual table 75, page 38
79pub(crate) const RANGE_FACTOR_X_Y: [i16; 8] = [
80    1000, // placeholder
81    1100, 855, 670, 450, 400, 330, 230,
82];
83
84// Manual table 75, page 38
85pub(crate) const RANGE_FACTOR_Z: [i16; 8] = [
86    1000, // placeholder
87    980, 760, 600, 400, 355, 295, 205,
88];
89
90register_bitfields![u8,
91    pub (crate) CTRL_REG1 [
92        /// Output data rate
93        ODR OFFSET(4) NUMBITS(4) [],
94        /// Low Power enable
95        LPEN OFFSET(3) NUMBITS(1) [],
96        /// Z enable
97        ZEN OFFSET(2) NUMBITS(1) [],
98        /// Y enable
99        YEN OFFSET(1) NUMBITS(1) [],
100        /// X enable
101        XEN OFFSET(0) NUMBITS(1) []
102    ],
103    pub (crate) CTRL_REG4 [
104        /// Block Data update
105        BDU OFFSET(7) NUMBITS(2) [],
106        /// Big Little Endian
107        BLE OFFSET(6) NUMBITS(1) [],
108        /// Full Scale selection
109        FS OFFSET(4) NUMBITS(2) [],
110        /// High Resolution
111        HR OFFSET(3) NUMBITS(1) [],
112        /// SPI Serial Interface
113        SIM OFFSET(0) NUMBITS(1) []
114    ]
115];
116
117enum_from_primitive! {
118    pub enum AccelerometerRegisters {
119        CTRL_REG1 = 0x20,
120        CTRL_REG4 = 0x23,
121        OUT_X_L_A = 0x28,
122        OUT_X_H_A = 0x29,
123        OUT_Y_L_A = 0x2A,
124        OUT_Y_H_A = 0x2B,
125        OUT_Z_L_A = 0x2C,
126        OUT_Z_H_A = 0x2D,
127    }
128}