Home | History | Annotate | Download | only in st_lsm6dsm
      1 /*
      2  * Copyright (C) 2016-2017 STMicroelectronics
      3  *
      4  * Author: Denis Ciocca <denis.ciocca (at) st.com>
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *    http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 
     19     <---------- Introduction ---------->
     20 
     21 In order to build the driver for a platform some macros (see Macros list) must
     22 be defined into variant.h file. [variant/{VARIANT_NAME}/inc/variant/variant.h]
     23 Those macros define specific configuration that is platform dependent (SPI bus,
     24 SPI frequency, etc).
     25 
     26 Optional FLAGS (FLAGS list) can be used to enable specific features using
     27 variant makefile. [variant/{VARIANT_NAME}/{VARIANT_NAME}.mk]
     28 Those flags modify @ compile time the behavior of the driver enabling for
     29 example i2c master support or calibration libraries.
     30 
     31 
     32     <---------- Macros list ---------->
     33 
     34 #define LSM6DSM_SPI_SLAVE_BUS_ID                    1                           /* SPI bus ID, on STM32F4xx indicate SPI2 */
     35 #define LSM6DSM_SPI_SLAVE_FREQUENCY_HZ              8000000                     /* SPI frequency in Hz */
     36 #define LSM6DSM_SPI_SLAVE_CS_GPIO                   GPIO_PB(12)                 /* SPI NSS pin, on STM32F4xx indicate NSS of SPI2 */
     37 
     38 #define LSM6DSM_INT_IRQ                             EXTI2_IRQn
     39 #define LSM6DSM_INT1_GPIO                           GPIO_PB(6)                  /* LSM6DSM INT1 is required, here connected to STM32F4xx PB6 */
     40 
     41 #define LSM6DSM_ACCEL_GYRO_ROT_MATRIX               1, 0, 0, 0, 1, 0, 0, 0, 1   /* Accelerometer and gyroscope axis orientation */
     42 #define LSM6DSM_MAGN_ROT_MATRIX                     1, 0, 0, 0, 1, 0, 0, 0, 1   /* Magnetometer axis orientation [MUST be set if a magn sensor is enabled] */
     43 
     44 #define LSM6DSM_LIS3MDL_I2C_ADDRESS                 0x1e                        /* STM LIS3MDL I2C address */
     45 #define LSM6DSM_LPS22HB_I2C_ADDRESS                 0x5d                        /* STM LPS22HB I2C address */
     46 
     47 
     48     <---------- FLAGS list ---------->
     49 
     50 - LSM6DSM_DBG_ENABLED                       /* Enable debug messages */
     51 - LSM6DSM_ACCEL_CALIB_ENABLED               /* Enable accelerometer bias calibration */
     52 - LSM6DSM_GYRO_CALIB_ENABLED                /* Enable gyroscope bias calibration */
     53 - LSM6DSM_OVERTEMP_CALIB_ENABLED            /* Enable gyroscope over temperature bias calibration [Require LSM6DSM_GYRO_CALIB_ENABLED] */
     54 - LSM6DSM_MAGN_CALIB_ENABLED                /* Enable magnetometer offset calibration */
     55 
     56 - LSM6DSM_I2C_MASTER_USE_INTERNAL_PULLUP    /* Use internal pull-up resistors for I2C master interface */
     57 
     58 /* Magnetometer sensor (only one per time can be used) */
     59 - LSM6DSM_I2C_MASTER_LIS3MDL                /* Enable STM LIS3MDL magn sensor */
     60 - LSM6DSM_I2C_MASTER_LSM303AGR              /* Enable STM LSM303AGR magn sensor */
     61 - LSM6DSM_I2C_MASTER_AK09916                /* Enable AKM AK09916 magn sensor */
     62 
     63 /* Barometer sensor (only one per time can be used) */
     64 - LSM6DSM_I2C_MASTER_LPS22HB                /* Enable STM LPS22HB pressure sensor */
     65 
     66 Example: variant/nucleo/nucleo.mk
     67 
     68 FLAGS += -DLSM6DSM_DBG_ENABLED -DLSM6DSM_ACCEL_CALIB_ENABLED -DLSM6DSM_GYRO_CALIB_ENABLED -DLSM6DSM_OVERTEMP_CALIB_ENABLED
     69 FLAGS += -DLSM6DSM_I2C_MASTER_LSM303AGR -DLSM6DSM_I2C_MASTER_USE_INTERNAL_PULLUP -DLSM6DSM_MAGN_CALIB_ENABLED
     70 
     71 
     72     <---------- ROT_MATRIX macro explanation ---------->
     73 
     74 Sensors orientation can be modified through rotation matrices. Accelerometer and gyroscope are sharing same
     75 configuration (LSM6DSM_ACCEL_GYRO_ROT_MATRIX), magnetometer sensor different one (LSM6DSM_MAGN_ROT_MATRIX).
     76 It is following standard rule of matrices moltiplications.
     77 Here an example:
     78 
     79                        [r11 r12 r13]
     80 [x" y" z"] = [x y z] * [r21 r22 r23] = [(x*r11 + y*r21 + z*r31) (x*r12 + y*r22 + z*r32) (x*r13 + y*r23 + z*r33)]
     81                        [r31 r32 r33]
     82 
     83 where x,y,z are sensors output and x",y",z" are android coordinate system data.
     84 Matrix is so defined:
     85 #define LSM6DSM_ACCEL_GYRO_ROT_MATRIX                   r11,r12,r13,r21,r22,r23,r31,r32,r33
     86 
     87 r** can only be: 0 or 1 or -1.
     88 
     89 
     90     <---------- Supported features ---------->
     91 
     92 > Accel & Gyro data;
     93 > Accel bias calibration through accel_cal lib;
     94 > Gyro bias calibration through gyro_cal & gyro_stillnes_detect libs;
     95 > Step detector & counter;
     96 > Significant motion;
     97 > Magnetometer sensor connected through I2C master interface (LIS3MDL, LSM303AGR, AK09916);
     98 > Magnetometer calibration though mag_cal lib;
     99 > Pressure sensor connected through I2C master interface (LPS22HB);
    100