capsules_extra/
lsm303xx.rs1#![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
18enum_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
35enum_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
60pub(crate) const SCALE_FACTOR: [u8; 4] = [2, 4, 8, 16];
62
63enum_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
78pub(crate) const RANGE_FACTOR_X_Y: [i16; 8] = [
80    1000, 1100, 855, 670, 450, 400, 330, 230,
82];
83
84pub(crate) const RANGE_FACTOR_Z: [i16; 8] = [
86    1000, 980, 760, 600, 400, 355, 295, 205,
88];
89
90register_bitfields![u8,
91    pub (crate) CTRL_REG1 [
92        ODR OFFSET(4) NUMBITS(4) [],
94        LPEN OFFSET(3) NUMBITS(1) [],
96        ZEN OFFSET(2) NUMBITS(1) [],
98        YEN OFFSET(1) NUMBITS(1) [],
100        XEN OFFSET(0) NUMBITS(1) []
102    ],
103    pub (crate) CTRL_REG4 [
104        BDU OFFSET(7) NUMBITS(2) [],
106        BLE OFFSET(6) NUMBITS(1) [],
108        FS OFFSET(4) NUMBITS(2) [],
110        HR OFFSET(3) NUMBITS(1) [],
112        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}