Просмотр исходного кода

Updated to v3.9.1. Fixed bugs in the sensor configuration. Added examples. Updated the callback interfaces.

Bosch Sensortec 4 лет назад
Родитель
Сommit
3ac7bb6a23
11 измененных файлов с 1902 добавлено и 1366 удалено
  1. 5 5
      LICENSE
  2. 42 793
      README.md
  3. 127 57
      bmi160.c
  4. 367 65
      bmi160.h
  5. 436 446
      bmi160_defs.h
  6. 13 0
      examples/read_chip_id/Makefile
  7. 241 0
      examples/read_chip_id/read_chip_id.c
  8. 13 0
      examples/read_sensor_data/Makefile
  9. 275 0
      examples/read_sensor_data/read_sensor_data.c
  10. 13 0
      examples/tap/Makefile
  11. 370 0
      examples/tap/tap.c

+ 5 - 5
LICENSE

@@ -6,15 +6,15 @@ Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
 modification, are permitted provided that the following conditions are met:
 
 
 1. Redistributions of source code must retain the above copyright
 1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
+    notice, this list of conditions and the following disclaimer.
 
 
 2. Redistributions in binary form must reproduce the above copyright
 2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
 
 
 3. Neither the name of the copyright holder nor the names of its
 3. Neither the name of the copyright holder nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
+    contributors may be used to endorse or promote products derived from
+    this software without specific prior written permission.
 
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

+ 42 - 793
README.md

@@ -1,793 +1,42 @@
-# BMI160 sensor API
-## Introduction
-This package contains the Bosch Sensortec's BMI160 sensor driver (sensor API)
-
-The sensor driver package includes bmi160.h, bmi160.c and bmi160_defs.h files
-
-## Version
-File          | Version | Date
---------------|---------|---------------
-bmi160.c      |   3.8.1 |   11 Jan 2020
-bmi160.h      |   3.8.1 |   11 Jan 2020
-bmi160_defs.h |   3.8.1 |   11 Jan 2020
-
-## Integration details
-* Integrate bmi160.h, bmi160_defs.h and bmi160.c file in to your project.
-* Include the bmi160.h file in your code like below.
-``` c
-#include "bmi160.h"
-```
-
-## File information
-* bmi160_defs.h : This header file has the constants, macros and datatype declarations.
-* bmi160.h : This header file contains the declarations of the sensor driver APIs.
-* bmi160.c : This source file contains the definitions of the sensor driver APIs.
-
-## Supported sensor interface
-* SPI 4-wire
-* I2C
-
-## Usage guide
-### Initializing the sensor
-To initialize the sensor, you will first need to create a device structure. You 
-can do this by creating an instance of the structure bmi160_dev. Then go on to 
-fill in the various parameters as shown below.
-
-#### Example for SPI 4-Wire
-``` c
-struct bmi160_dev sensor;
-
-/* You may assign a chip select identifier to be handled later */
-sensor.id = 0;
-sensor.interface = BMI160_SPI_INTF;
-sensor.read = user_spi_read;
-sensor.write = user_spi_write;
-sensor.delay_ms = user_delay_ms;
-
-
-int8_t rslt = BMI160_OK;
-rslt = bmi160_init(&sensor);
-/* After the above function call, accel_cfg and gyro_cfg parameters in the device 
-structure are set with default values, found in the datasheet of the sensor */
-```
-
-#### Example for I2C
-``` c
-struct bmi160_dev sensor;
-
-sensor.id = BMI160_I2C_ADDR;
-sensor.interface = BMI160_I2C_INTF;
-sensor.read = user_i2c_read;
-sensor.write = user_i2c_write;
-sensor.delay_ms = user_delay_ms;
-
-int8_t rslt = BMI160_OK;
-rslt = bmi160_init(&sensor);
-/* After the above function call, accel and gyro parameters in the device structure 
-are set with default values, found in the datasheet of the sensor */
-```
-
-### Configuring accel and gyro sensor
-#### Example for configuring accel and gyro sensors in normal mode
-``` c
-
-int8_t rslt = BMI160_OK;
-
-/* Select the Output data rate, range of accelerometer sensor */
-sensor.accel_cfg.odr = BMI160_ACCEL_ODR_1600HZ;
-sensor.accel_cfg.range = BMI160_ACCEL_RANGE_2G;
-sensor.accel_cfg.bw = BMI160_ACCEL_BW_NORMAL_AVG4;
-
-/* Select the power mode of accelerometer sensor */
-sensor.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;
-
-/* Select the Output data rate, range of Gyroscope sensor */
-sensor.gyro_cfg.odr = BMI160_GYRO_ODR_3200HZ;
-sensor.gyro_cfg.range = BMI160_GYRO_RANGE_2000_DPS;
-sensor.gyro_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE;
-
-/* Select the power mode of Gyroscope sensor */
-sensor.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE; 
-
-/* Set the sensor configuration */
-rslt = bmi160_set_sens_conf(&sensor);
-```
-
-### Reading sensor data
-#### Example for reading sensor data
-``` c
-
-int8_t rslt = BMI160_OK;
-struct bmi160_sensor_data accel;
-struct bmi160_sensor_data gyro;
-
-/* To read only Accel data */
-rslt = bmi160_get_sensor_data(BMI160_ACCEL_SEL, &accel, NULL, &sensor);
-
-/* To read only Gyro data */
-rslt = bmi160_get_sensor_data(BMI160_GYRO_SEL, NULL, &gyro, &sensor);
-
-/* To read both Accel and Gyro data */
-bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL), &accel, &gyro, &sensor);
-
-/* To read Accel data along with time */
-rslt = bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_TIME_SEL) , &accel, NULL, &sensor);
-
-/* To read Gyro data along with time */
-rslt = bmi160_get_sensor_data((BMI160_GYRO_SEL | BMI160_TIME_SEL), NULL, &gyro, &sensor);
-
-/* To read both Accel and Gyro data along with time*/
-bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL | BMI160_TIME_SEL), &accel, &gyro, &sensor);
-```
-
-### Setting the power mode of sensors
-#### Example for setting power mode of accel and gyro
-``` c
-
-int8_t rslt = BMI160_OK;
-
-/* Select the power mode */
-sensor.accel_cfg.power = BMI160_ACCEL_SUSPEND_MODE; 
-sensor.gyro_cfg.power = BMI160_GYRO_FASTSTARTUP_MODE; 
-
-/*  Set the Power mode  */
-rslt = bmi160_set_power_mode(&sensor);
-
-/* Select the power mode */
-sensor.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;
-sensor.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE; 
-
-/*  Set the Power mode  */
-rslt = bmi160_set_power_mode(&sensor);
-
-```
-
-### Reading sensor data register
-#### Example for reading Chip Address
-``` c
-
-int8_t rslt = BMI160_OK;
-uint8_t reg_addr = BMI160_CHIP_ID_ADDR;
-uint8_t data;
-uint16_t len = 1;
-rslt = bmi160_get_regs(reg_addr, &data, len, &sensor);
-```
-
-
-### Writing to sensor data register
-#### Example for writing data to any motion threshold register
-``` c
-
-int8_t rslt = BMI160_OK;
-uint8_t reg_addr = BMI160_INT_MOTION_1_ADDR;
-uint8_t data = 20;
-uint16_t len = 1;
-rslt = bmi160_set_regs(reg_addr, &data, len, &sensor);
-```
-
-### Resetting the device using soft-reset
-#### Example for writing soft-reset command to command register
-``` c
-
-int8_t rslt = BMI160_OK;
-rslt = bmi160_soft_reset(&sensor);
-```
-
-
-### Configuring interrupts for sensors
-To configure the sensor interrupts, you will first need to create an interrupt 
-structure. You can do this by creating an instance of the structure bmi160_int_settg.
-Then go on to fill in the various parameters as shown below
-
-
-### Configuring Any-motion Interrupt
-#### Example for configuring Any-motion Interrupt
-Note:- User can check the currently active interrupt(any-motion or sig-motion) by checking the **any_sig_sel** of bmi160_dev structure.
-``` c
-
-struct bmi160_int_settg int_config;
-
-/* Select the Interrupt channel/pin */
-int_config.int_channel = BMI160_INT_CHANNEL_1;// Interrupt channel/pin 1
-
-/* Select the Interrupt type */
-int_config.int_type = BMI160_ACC_ANY_MOTION_INT;// Choosing Any motion interrupt
-/* Select the interrupt channel/pin settings */
-int_config.int_pin_settg.output_en = BMI160_ENABLE;// Enabling interrupt pins to act as output pin
-int_config.int_pin_settg.output_mode = BMI160_DISABLE;// Choosing push-pull mode for interrupt pin
-int_config.int_pin_settg.output_type = BMI160_DISABLE;// Choosing active low output
-int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;// Choosing edge triggered output
-int_config.int_pin_settg.input_en = BMI160_DISABLE;// Disabling interrupt pin to act as input
-int_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_NONE;// non-latched output
-
-/* Select the Any-motion interrupt parameters */
-int_config.int_type_cfg.acc_any_motion_int.anymotion_en = BMI160_ENABLE;// 1- Enable the any-motion, 0- disable any-motion 
-int_config.int_type_cfg.acc_any_motion_int.anymotion_x = BMI160_ENABLE;// Enabling x-axis for any motion interrupt
-int_config.int_type_cfg.acc_any_motion_int.anymotion_y = BMI160_ENABLE;// Enabling y-axis for any motion interrupt
-int_config.int_type_cfg.acc_any_motion_int.anymotion_z = BMI160_ENABLE;// Enabling z-axis for any motion interrupt
-int_config.int_type_cfg.acc_any_motion_int.anymotion_dur = 0;// any-motion duration
-int_config.int_type_cfg.acc_any_motion_int.anymotion_thr = 20;// (2-g range) -> (slope_thr) * 3.91 mg, (4-g range) -> (slope_thr) * 7.81 mg, (8-g range) ->(slope_thr) * 15.63 mg, (16-g range) -> (slope_thr) * 31.25 mg 
-
-/* Set the Any-motion interrupt */
-bmi160_set_int_config(&int_config, &sensor); /* sensor is an instance of the structure bmi160_dev  */
-
-```
-### Configuring Flat Interrupt
-#### Example for configuring Flat Interrupt
-``` c
-
-struct bmi160_int_settg int_config;
-
-/* Select the Interrupt channel/pin */
-int_config.int_channel = BMI160_INT_CHANNEL_1;// Interrupt channel/pin 1
-
-/* Select the Interrupt type */
-int_config.int_type = BMI160_ACC_FLAT_INT;// Choosing flat interrupt
-/* Select the interrupt channel/pin settings */
-int_config.int_pin_settg.output_en = BMI160_ENABLE;// Enabling interrupt pins to act as output pin
-int_config.int_pin_settg.output_mode = BMI160_DISABLE;// Choosing push-pull mode for interrupt pin
-int_config.int_pin_settg.output_type = BMI160_DISABLE;// Choosing active low output
-int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;// Choosing edge triggered output
-int_config.int_pin_settg.input_en = BMI160_DISABLE;// Disabling interrupt pin to act as input
-int_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_NONE;// non-latched output
-
-/* Select the Flat interrupt parameters */
-int_config.int_type_cfg.acc_flat_int.flat_en = BMI160_ENABLE;// 1-enable, 0-disable the flat interrupt
-int_config.int_type_cfg.acc_flat_int.flat_theta = 8;// threshold for detection of flat position in range from 0° to 44.8°.
-int_config.int_type_cfg.acc_flat_int.flat_hy = 1;// Flat hysteresis
-int_config.int_type_cfg.acc_flat_int.flat_hold_time = 1;// Flat hold time (0 -> 0 ms, 1 -> 640 ms, 2 -> 1280 ms, 3 -> 2560 ms)
-
-/* Set the Flat interrupt */
-bmi160_set_int_config(&int_config, &sensor); /* sensor is an instance of the structure bmi160_dev */
-
-```
-
-
-### Configuring Step Detector Interrupt
-#### Example for configuring Step Detector Interrupt
-``` c
-
-struct bmi160_int_settg int_config;
-
-/* Select the Interrupt channel/pin */
-int_config.int_channel = BMI160_INT_CHANNEL_1;// Interrupt channel/pin 1
-
-/* Select the Interrupt type */
-int_config.int_type = BMI160_STEP_DETECT_INT;// Choosing Step Detector interrupt
-/* Select the interrupt channel/pin settings */
-int_config.int_pin_settg.output_en = BMI160_ENABLE;// Enabling interrupt pins to act as output pin
-int_config.int_pin_settg.output_mode = BMI160_DISABLE;// Choosing push-pull mode for interrupt pin
-int_config.int_pin_settg.output_type = BMI160_ENABLE;// Choosing active High output
-int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;// Choosing edge triggered output
-int_config.int_pin_settg.input_en = BMI160_DISABLE;// Disabling interrupt pin to act as input
-int_config.int_pin_settg.latch_dur =BMI160_LATCH_DUR_NONE;// non-latched output
-
-/* Select the Step Detector interrupt parameters, Kindly use the recommended settings for step detector */
-int_config.int_type_cfg.acc_step_detect_int.step_detector_mode = BMI160_STEP_DETECT_NORMAL;
-int_config.int_type_cfg.acc_step_detect_int.step_detector_en = BMI160_ENABLE;// 1-enable, 0-disable the step detector
-
-/* Set the Step Detector interrupt */
-bmi160_set_int_config(&int_config, &sensor); /* sensor is an instance of the structure bmi160_dev */
-
-```
-
-### Configuring Step counter
-To configure the step counter, user need to configure the step detector interrupt as described in above section.
-After configuring step detector, see the below code snippet for user space & ISR
-
-### User space
-``` c
-int8_t rslt = BMI160_OK;
-uint8_t step_enable = 1;//enable the step counter
-
-rslt = bmi160_set_step_counter(step_enable,  &sensor);
-```
-
-### ISR
-``` c
-int8_t rslt = BMI160_OK;
-uint16_t step_count = 0;//stores the step counter value
-
-rslt = bmi160_read_step_counter(&step_count,  &sensor);
-```
-
-### Unmapping Interrupt
-#### Example for unmapping Step Detector Interrupt
-``` c
-struct bmi160_int_settg int_config;
-
-/* Deselect the Interrupt channel/pin */
-int_config.int_channel = BMI160_INT_CHANNEL_NONE;
-/* Select the Interrupt type */
-int_config.int_type = BMI160_STEP_DETECT_INT;// Choosing Step Detector interrupt
-/* Set the Step Detector interrupt */
-bmi160_set_int_config(&int_config, &sensor); /* sensor is an instance of the structure bmi160_dev */
-```
-
-### Reading interrupt status
-#### Example for reading interrupt status for step detector
-``` c
-union bmi160_int_status interrupt;
-enum bmi160_int_status_sel int_status_sel;
-
-/* Interrupt status selection to read all interrupts */
-int_status_sel = BMI160_INT_STATUS_ALL;
-rslt = bmi160_get_int_status(int_status_sel, &interrupt, &sensor);
-if (interrupt.bit.step)
-	printf("Step detector interrupt occured\n");
-```
-
-### Configuring the auxiliary sensor BMM150
-It is assumed that secondary interface of bmi160 has external pull-up resistor in order to access the auxiliary sensor bmm150.
-
-### Accessing auxiliary BMM150 with BMM150 APIs via BMI160 secondary interface.
-
-## Integration details 
-* Integrate the souce codes of BMM150 and BMI160 in project.
-* Include the bmi160.h and bmm150.h file in your code like below.
-* It is mandatory to initialize the bmi160 device structure for primary interface and auxiliary sensor settings.
-* Create two wrapper functions , user_aux_read and user_aux_write in order to match the signature as mentioned below.
-* Invoke the "bmi160_aux_init" API to initialise the secondary interface in BMI160.
-* Invoke the "bmm150_init" API to initialise the BMM150 sensor.
-* Now we can use the BMM150 sensor APIs to access the BMM150 via BMI160.
-
-``` c
-/* main.c file */
-#include "bmi160.h"
-#include "bmm150.h"
-```
-### Initialization of auxiliary sensor BMM150
-```
-
-/* main.c file */
-struct bmm150_dev bmm150;
-
-/* function declaration */
-int8_t user_aux_read(uint8_t id, uint8_t reg_addr, uint8_t *aux_data, uint16_t len);
-int8_t user_aux_write(uint8_t id, uint8_t reg_addr, uint8_t *aux_data, uint16_t len);
-
-/* Configure device structure for auxiliary sensor parameter */
-sensor.aux_cfg.aux_sensor_enable = 1; // auxiliary sensor enable
-sensor.aux_cfg.aux_i2c_addr = BMI160_AUX_BMM150_I2C_ADDR; // auxiliary sensor address
-sensor.aux_cfg.manual_enable = 1; // setup mode enable
-sensor.aux_cfg.aux_rd_burst_len = 2;// burst read of 2 byte
-
-/* Configure the BMM150 device structure by 
-mapping user_aux_read and user_aux_write */
-bmm150.read = user_aux_read;
-bmm150.write = user_aux_write;
-bmm150.id = BMM150_DEFAULT_I2C_ADDRESS; 
-/* Ensure that sensor.aux_cfg.aux_i2c_addr = bmm150.id
-   for proper sensor operation */
-bmm150.delay_ms = delay_ms;
-bmm150.interface = BMM150_I2C_INTF;
-
-/* Initialize the auxiliary sensor interface */
-rslt = bmi160_aux_init(&sensor);
-
-/* Auxiliary sensor is enabled and can be accessed from this point */
-
-/* Configure the desired settings in auxiliary BMM150 sensor 
- * using the bmm150 APIs */
-
-/* Initialising the bmm150 sensor */
-rslt = bmm150_init(&bmm150);
-
-/* Set the power mode and preset mode to enable Mag data sampling */
-bmm150.settings.pwr_mode = BMM150_NORMAL_MODE;
-rslt = bmm150_set_op_mode(&bmm150);
-
-bmm150.settings.preset_mode= BMM150_PRESETMODE_LOWPOWER;
-rslt = bmm150_set_presetmode(&bmm150);
-
-```
-### Wrapper functions
-```
-
-/*wrapper function to match the signature of bmm150.read */
-int8_t user_aux_read(uint8_t id, uint8_t reg_addr, uint8_t *aux_data, uint16_t len)
-{
-	int8_t rslt;
-	
-	/* Discarding the parameter id as it is redundant*/
-        rslt = bmi160_aux_read(reg_addr, aux_data, len, &bmi160);
-
-	return rslt;
-}
-
-/*wrapper function to match the signature of bmm150.write */
-int8_t user_aux_write(uint8_t id, uint8_t reg_addr, uint8_t *aux_data, uint16_t len)
-{
-	int8_t rslt;
-	
-	/* Discarding the parameter id as it is redundant */
-	rslt = bmi160_aux_write(reg_addr, aux_data, len, &bmi160);
-
-	return rslt;
-}
-
-```
-
-### Initialization of auxiliary BMM150 in auto mode
-Any sensor whose data bytes are less than or equal to 8 bytes can be synchronized with the BMI160 
-and read out of Accelerometer + Gyroscope + Auxiliary sensor data of that instance is possible
-which helps in creating less latency fusion data
-
-```
-/* Initialize the Auxiliary BMM150 following the above code 
- * until setting the power mode (Set the power mode as forced mode)
- * and preset mode */
-
-	/* In BMM150 Mag data starts from register address 0x42 */
-	uint8_t aux_addr = 0x42;
-	/* Buffer to store the Mag data from 0x42 to 0x48 */	
-	uint8_t mag_data[8] = {0};
-	
-	uint8_t index;
-		
-	/* Configure the Auxiliary sensor either in auto/manual modes and set the 
-	polling frequency for the Auxiliary interface */	
-	sensor.aux_cfg.aux_odr = 8; /* Represents polling rate in 100 Hz*/
-	rslt = bmi160_config_aux_mode(&sensor)
-	
-	/* Set the auxiliary sensor to auto mode */
-	rslt = bmi160_set_aux_auto_mode(&aux_addr, &sensor);
-
-	/* Reading data from BMI160 data registers */
-	rslt = bmi160_read_aux_data_auto_mode(mag_data, &sensor);
-
-	printf("\n RAW DATA ");
-	for(index = 0 ; index < 8 ; index++)
-	{
-		printf("\n MAG DATA[%d] : %d ", index, mag_data[index]);
-	}
-	
-	/* Compensating the raw mag data available from the BMM150 API */
-	rslt = bmm150_aux_mag_data(mag_data, &bmm150);
-	
-	printf("\n COMPENSATED DATA ");
-	printf("\n MAG DATA X : %d Y : %d Z : %d", bmm150.data.x, bmm150.data.y, bmm150.data.z);
-	
-
-```
-
-### Auxiliary FIFO data parsing
-The Auxiliary sensor data can be stored in FIFO , Here we demonstrate an example for 
-using the Bosch Magnetometer sensor BMM150 and storing its data in FIFO
-
-```
-/* Initialize the Aux BMM150 following the above 
- * code and by creating the Wrapper functions */
-
-	int8_t rslt = 0;
-	uint8_t aux_instance = 0;
-	uint16_t fifo_cnt = 0;
-	uint8_t auto_mode_addr;
-	uint8_t i;
-
-	/* Setup and configure the FIFO buffer */
-	/* Declare memory to store the raw FIFO buffer information */
-	uint8_t fifo_buff[1000] = {0};
-
-	/* Modify the FIFO buffer instance and link to the device instance */
-	struct bmi160_fifo_frame fifo_frame;
-	fifo_frame.data = fifo_buff;
-	fifo_frame.length = 1000;
-	dev->fifo = &fifo_frame;
-
-	/* Declare instances of the sensor data structure to store the parsed FIFO data */
-	struct bmi160_aux_data aux_data[112]; //1000 / 9 bytes per frame ~ 111 data frames
-
-	rslt = bmi160_init(dev);
-	printf("\n BMI160 chip ID is : %d ",dev->chip_id);
-
-	rslt = bmi160_aux_init(dev);
-
-	rslt = bmm150_init(&bmm150);
-	printf("\n BMM150 CHIP ID : %d",bmm150.chip_id);
-
-	bmm150.settings.preset_mode = BMM150_PRESETMODE_LOWPOWER;
-	rslt = bmm150_set_presetmode(&bmm150);
-
-	bmm150.settings.pwr_mode = BMM150_FORCED_MODE;
-	rslt = bmm150_set_op_mode(&bmm150);
-
-	/* Enter the data register of BMM150 to "auto_mode_addr" here it is 0x42 */
-	auto_mode_addr = 0x42;
-	printf("\n ENTERING AUX. AUTO MODE ");
-	dev->aux_cfg.aux_odr = BMI160_AUX_ODR_25HZ;
-	rslt = bmi160_set_aux_auto_mode(&auto_mode_addr, dev);
-
-
-	/* Disable other FIFO settings */
-	rslt = bmi160_set_fifo_config(BMI160_FIFO_CONFIG_1_MASK , BMI160_DISABLE, dev);
-
-	/* Enable the required FIFO settings */
-	rslt = bmi160_set_fifo_config(BMI160_FIFO_AUX | BMI160_FIFO_HEADER, BMI160_ENABLE, dev);
-
-	/* Delay for the FIFO to get filled */
-	dev->delay_ms(400);
-
-
-	printf("\n FIFO DATA REQUESTED (in bytes): %d",dev->fifo->length);
-	rslt = bmi160_get_fifo_data(dev);
-	printf("\n FIFO DATA AVAILABLE (in bytes): %d",dev->fifo->length);
-
-	/* Print the raw FIFO data obtained */
-	for(fifo_cnt = 0; fifo_cnt < dev->fifo->length ; fifo_cnt++) {
-		printf("\n FIFO DATA [%d] IS : %x  ",fifo_cnt ,dev->fifo->data[fifo_cnt]);
-	}
-
-	printf("\n\n----------------------------------------------------\n");
-
-	/* Set the number of required sensor data instances */
-	aux_instance = 150;
-
-	/* Extract the aux data , 1frame = 8 data bytes */
-	printf("\n AUX DATA REQUESTED TO BE EXTRACTED (in frames): %d",aux_instance);
-	rslt = bmi160_extract_aux(aux_data, &aux_instance, dev);
-	printf("\n AUX DATA ACTUALLY EXTRACTED (in frames): %d",aux_instance);
-
-	/* Printing the raw aux data */
-	for (i = 0; i < aux_instance; i++) {
-		printf("\n Aux data[%d] : %x",i,aux_data[i].data[0]);
-		printf("\n Aux data[%d] : %x",i,aux_data[i].data[1]);
-		printf("\n Aux data[%d] : %x",i,aux_data[i].data[2]);
-		printf("\n Aux data[%d] : %x",i,aux_data[i].data[3]);
-		printf("\n Aux data[%d] : %x",i,aux_data[i].data[4]);
-		printf("\n Aux data[%d] : %x",i,aux_data[i].data[5]);
-		printf("\n Aux data[%d] : %x",i,aux_data[i].data[6]);
-		printf("\n Aux data[%d] : %x",i,aux_data[i].data[7]);
-	}
-
-	printf("\n\n----------------------------------------------------\n");
-
-	/* Compensate the raw mag data using BMM150 API */
-	for (i = 0; i < aux_instance; i++) {
-		printf("\n----------------------------------------------------");
-		printf("\n Aux data[%d] : %x , %x , %x , %x , %x , %x , %x , %x",i
-					,aux_data[i].data[0],aux_data[i].data[1]
-					,aux_data[i].data[2],aux_data[i].data[3]
-					,aux_data[i].data[4],aux_data[i].data[5]
-					,aux_data[i].data[6],aux_data[i].data[7]);
-
-		/* Compensated mag data using BMM150 API */
-		rslt = bmm150_aux_mag_data(&aux_data[i].data[0], &bmm150);
-
-		/* Printing the  Compensated mag data */
-		if (rslt == BMM150_OK) {
-			printf("\n MAG DATA COMPENSATION USING BMM150 APIs");
-			printf("\n COMPENSATED DATA ");
-			printf("\n MAG DATA X : %d	Y : %d      Z : %d"
-				, bmm150.data.x, bmm150.data.y, bmm150.data.z);
-
-		} else {
-			printf("\n MAG DATA COMPENSATION IN BMM150 API is FAILED ");
-		}
-		printf("\n----------------------------------------------------\n");
-	}
-
-```
-
-## Self-test  
-#### Example for performing accel self test
-```
-/* Call the "bmi160_init" API as a prerequisite before performing self test
- * since invoking self-test will reset the sensor */
-
-	rslt = bmi160_perform_self_test(BMI160_ACCEL_ONLY, sen);
-	/* Utilize the enum BMI160_GYRO_ONLY instead of BMI160_ACCEL_ONLY
-	   to perform self test for gyro */
-	if (rslt == BMI160_OK) {
-		printf("\n ACCEL SELF TEST RESULT SUCCESS);
-	} else {
-		printf("\n ACCEL SELF TEST RESULT FAIL);
-	}
-```
-
-
-## FIFO 
-#### Example for reading FIFO and extracting Gyro data in Header mode
-```
-/* An example to read the Gyro data in header mode along with sensor time (if available)
- * Configure the gyro sensor as prerequisite and follow the below example to read and
- * obtain the gyro data from FIFO */
-int8_t fifo_gyro_header_time_data(struct bmi160_dev *dev)
-{
-	int8_t rslt = 0;
-
-	/* Declare memory to store the raw FIFO buffer information */
-	uint8_t fifo_buff[300];
-	
-	/* Modify the FIFO buffer instance and link to the device instance */
-	struct bmi160_fifo_frame fifo_frame;
-	fifo_frame.data = fifo_buff;
-	fifo_frame.length = 300;
-	dev->fifo = &fifo_frame;
-	uint16_t index = 0;
-	
-	/* Declare instances of the sensor data structure to store the parsed FIFO data */
-	struct bmi160_sensor_data gyro_data[42]; // 300 bytes / ~7bytes per frame ~ 42 data frames
-	uint8_t gyro_frames_req = 42; 
-	uint8_t gyro_index;
-	
-	/* Configure the sensor's FIFO settings */
-	rslt = bmi160_set_fifo_config(BMI160_FIFO_GYRO | BMI160_FIFO_HEADER | BMI160_FIFO_TIME,
-					BMI160_ENABLE, dev);
-					
-	if (rslt == BMI160_OK) {
-		/* At ODR of 100 Hz ,1 frame gets updated in 1/100 = 0.01s
-		i.e. for 42 frames we need 42 * 0.01 = 0.42s = 420ms delay */
-		dev->delay_ms(420); 
-	
-		/* Read data from the sensor's FIFO and store it the FIFO buffer,"fifo_buff" */
-		printf("\n USER REQUESTED FIFO LENGTH : %d\n",dev->fifo->length);
-		rslt = bmi160_get_fifo_data(dev);
-
-		if (rslt == BMI160_OK) {
-			printf("\n AVAILABLE FIFO LENGTH : %d\n",dev->fifo->length);
-			/* Print the raw FIFO data */
-			for (index = 0; index < dev->fifo->length; index++) {
-				printf("\n FIFO DATA INDEX[%d] = %d", index,
-					dev->fifo->data[index]);
-			}
-			/* Parse the FIFO data to extract gyro data from the FIFO buffer */
-			printf("\n REQUESTED GYRO DATA FRAMES : %d\n ",gyro_frames_req);
-			rslt = bmi160_extract_gyro(gyro_data, &gyro_frames_req, dev);
-
-			if (rslt == BMI160_OK) {
-				printf("\n AVAILABLE GYRO DATA FRAMES : %d\n ",gyro_frames_req);
-				
-				/* Print the parsed gyro data from the FIFO buffer */
-				for (gyro_index = 0; gyro_index < gyro_frames_req; gyro_index++) {
-					printf("\nFIFO GYRO FRAME[%d]",gyro_index);
-					printf("\nGYRO X-DATA : %d \t Y-DATA : %d \t Z-DATA : %d"
-						,gyro_data[gyro_index].x ,gyro_data[gyro_index].y
-						,gyro_data[gyro_index].z);
-				}
-				/* Print the special FIFO frame data like sensortime */
-				printf("\n SENSOR TIME DATA : %d \n",dev->fifo->sensor_time);
-				printf("SKIPPED FRAME COUNT : %d",dev->fifo->skipped_frame_count);
-			} else {
-				printf("\n Gyro data extraction failed");
-			}
-		} else {
-			printf("\n Reading FIFO data failed");
-		}
-	} else {
-		printf("\n Setting FIFO configuration failed");
-	}
-
-	return rslt;
-}
-```
-
-## FOC and offset compensation
-> FOC shouldnot be used in Low-power mode
-#### Example for configuring FOC for accel and gyro
-```
-/* An example for configuring FOC for accel and gyro data */
-int8_t start_foc(struct bmi160_dev *dev)
-{
-	int8_t rslt = 0;
-	/* FOC configuration structure */
-	struct bmi160_foc_conf foc_conf;
-	/* Structure to store the offsets */
-	struct bmi160_offsets offsets;
-	
-	/* Enable FOC for accel with target values of z = 1g ; x,y as 0g */
-	foc_conf.acc_off_en = BMI160_ENABLE;
-	foc_conf.foc_acc_x  = BMI160_FOC_ACCEL_0G;
-	foc_conf.foc_acc_y  = BMI160_FOC_ACCEL_0G;
-	foc_conf.foc_acc_z  = BMI160_FOC_ACCEL_POSITIVE_G;
-	
-	/* Enable FOC for gyro */
-	foc_conf.foc_gyr_en = BMI160_ENABLE;
-	foc_conf.gyro_off_en = BMI160_ENABLE;
-
-	rslt = bmi160_start_foc(&foc_conf, &offsets, sen);
-	
-	if (rslt == BMI160_OK) {
-		printf("\n FOC DONE SUCCESSFULLY ");
-		printf("\n OFFSET VALUES AFTER FOC : ");
-		printf("\n OFFSET VALUES ACCEL X : %d ",offsets.off_acc_x);
-		printf("\n OFFSET VALUES ACCEL Y : %d ",offsets.off_acc_y);
-		printf("\n OFFSET VALUES ACCEL Z : %d ",offsets.off_acc_z);
-		printf("\n OFFSET VALUES GYRO  X : %d ",offsets.off_gyro_x);
-		printf("\n OFFSET VALUES GYRO  Y : %d ",offsets.off_gyro_y);
-		printf("\n OFFSET VALUES GYRO  Z : %d ",offsets.off_gyro_z);	
-	}
-	
-	/* After start of FOC offsets will be updated automatically and 
-	 * the data will be very much close to the target values of measurement */
-
-	return rslt;
-}
-```
-
-#### Example for updating the offsets manually
-> The offsets set by this method will be reset on soft-reset/POR 
-```
-/* An example for updating manual offsets to sensor */
-int8_t write_offsets(struct bmi160_dev *dev)
-{
-	int8_t rslt = 0;
-	/* FOC configuration structure */
-	struct bmi160_foc_conf foc_conf;
-	/* Structure to store the offsets */
-	struct bmi160_offsets offsets;
-	
-	/* Enable offset update for accel */
-	foc_conf.acc_off_en = BMI160_ENABLE;
-
-	/* Enable offset update for gyro */
-	foc_conf.gyro_off_en = BMI160_ENABLE;
-	
-	/* offset values set by user */
-	offsets.off_acc_x = 0x10;
-	offsets.off_acc_y = 0x10;
-	offsets.off_acc_z = 0x10;
-	offsets.off_gyro_x = 0x10;
-	offsets.off_gyro_y = 0x10;
-	offsets.off_gyro_z = 0x10;
-
-	rslt = bmi160_set_offsets(&foc_conf, &offsets, sen);
-	
-	/* After offset setting the data read from the 
-	 * sensor will have the corresponding offset */
-	
-	return rslt;
-}
-```
-
-#### Example for updating the offsets into NVM
-> The offsets set by this method will be present in NVM and will be 
-> restored on POR/soft-reset
-```
-/* An example for updating manual offsets to sensor */
-int8_t write_offsets_nvm(struct bmi160_dev *dev)
-{
-	int8_t rslt = 0;
-	/* FOC configuration structure */
-	struct bmi160_foc_conf foc_conf;
-	/* Structure to store the offsets */
-	struct bmi160_offsets offsets;
-	
-	/* Enable offset update for accel */
-	foc_conf.acc_off_en = BMI160_ENABLE;
-
-	/* Enable offset update for gyro */
-	foc_conf.gyro_off_en = BMI160_ENABLE;
-	
-	/* offset values set by user as per their reference 
-	 * Resolution of accel = 3.9mg/LSB 
-	 * Resolution of gyro  = (0.061degrees/second)/LSB */
-	offsets.off_acc_x = 10;
-	offsets.off_acc_y = -15;
-	offsets.off_acc_z = 20;
-	offsets.off_gyro_x = 30;
-	offsets.off_gyro_y = -35;
-	offsets.off_gyro_z = -40;
-
-	rslt = bmi160_set_offsets(&foc_conf, &offsets, sen);
-	 
-	if (rslt == BMI160_OK) {
-		/* Update the NVM */
-		rslt = bmi160_update_nvm(dev);
-	}
-	
-	/* After this procedure the offsets are written to 
-	 * NVM and restored on POR/soft-reset 
-	 * The set values can be removed to ideal case by 
-	 * invoking the following APIs
-	 *     - bmi160_start_foc()	 
-	 *     - bmi160_update_nvm()
-	 */
-
-	return rslt;
-}
-```
-
-
-
-## Copyright (C) 2016 - 2017 Bosch Sensortec GmbH
+# BMI160 Sensor API
+
+### Sensor overview
+
+The small, low power BMI160 is a low noise 16-bit IMU designed for mobile applications such as AR or indoor navigation, providing highly accurate sensor data and real-time sensor data. The low current consumption of BMI160 enables always-on applications in battery-driven devices. This sensor features a configurable on-chip interrupt engine which provides motion-based gesture recognition and context awareness as always-on background functions.
+
+### Target Application
+- Augmented reality and immersive gaming
+- Indoor navigation
+- 3D-scanning / indoor mapping
+- Advanced gesture recognition
+- Immersive gaming
+- 9-axis motion detection
+- Air mouse applications and pointers
+- Pedometer / step counting
+- Advanced system power management for mobile applications
+- Optical image stabilization of camera modules
+- Free-fall detection and warranty logging
+
+### Features
+- Any-motion detection (accelerometer)
+- Significant motion detection (accelerometer)
+- Step detector (accelerometer)
+- Tap sensing (accelerometer)
+- Orientation recognition (accelerometer)
+- Flat detection (accelerometer)
+- Low-G / Free-fall detection (accelerometer)
+- High-G detection (accelerometer)
+- Slow-motion alert / No-motion interrupt (accelerometer)
+- Data ready detection (accelerometer, gyroscope and external sensors)
+- PMU trigger (gyroscope)
+- FIFO interrupts ((accelerometer, gyroscope and external sensors)
+
+### Important links
+
+- [BMI160 product page](https://www.bosch-sensortec.com/products/motion-sensors/imus/bmi160/)
+- [BMI160 datasheet](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmi160-ds000.pdf)
+- [BMI160 shuttle board flyer](https://www.bosch-sensortec.com/media/boschsensortec/downloads/shuttle_board_flyer/bst-dhw-fl022.pdf)
+- [Community support page](https://community.bosch-sensortec.com)
+
+---
+#### Copyright (C) 2020 Bosch Sensortec GmbH

+ 127 - 57
bmi160.c

@@ -30,17 +30,12 @@
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * POSSIBILITY OF SUCH DAMAGE.
 *
 *
-* @file bmi160.c
-* @date 10/01/2020
-* @version  3.8.1
+* @file       bmi160.c
+* @date       2021-03-12
+* @version    v3.9.1
 *
 *
 */
 */
 
 
-/*!
- * @defgroup bmi160
- * @brief
- * @{*/
-
 #include "bmi160.h"
 #include "bmi160.h"
 
 
 /* Below look up table follows the enum bmi160_int_types.
 /* Below look up table follows the enum bmi160_int_types.
@@ -228,6 +223,16 @@ static int8_t null_ptr_check(const struct bmi160_dev *dev);
  */
  */
 static int8_t set_accel_conf(struct bmi160_dev *dev);
 static int8_t set_accel_conf(struct bmi160_dev *dev);
 
 
+/*!
+ * @brief This API gets the accel configuration.
+ *
+ * @param[out] dev         : Structure instance of bmi160_dev.
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / -ve value -> Error.
+ */
+static int8_t get_accel_conf(struct bmi160_dev *dev);
+
 /*!
 /*!
  * @brief This API check the accel configuration.
  * @brief This API check the accel configuration.
  *
  *
@@ -288,6 +293,16 @@ static int8_t check_invalid_settg(const struct bmi160_dev *dev);
  */
  */
 static int8_t set_gyro_conf(struct bmi160_dev *dev);
 static int8_t set_gyro_conf(struct bmi160_dev *dev);
 
 
+/*!
+ * @brief This API get the gyro configuration.
+ *
+ * @param[out] dev         : Structure instance of bmi160_dev.
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / -ve value -> Error.
+ */
+static int8_t get_gyro_conf(struct bmi160_dev *dev);
+
 /*!
 /*!
  * @brief This API check the gyro configuration.
  * @brief This API check the gyro configuration.
  *
  *
@@ -1361,15 +1376,6 @@ int8_t bmi160_get_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const stru
 {
 {
     int8_t rslt = BMI160_OK;
     int8_t rslt = BMI160_OK;
 
 
-    /* Variable to define temporary length */
-    uint16_t temp_len = len + dev->dummy_byte;
-
-    /* Variable to define temporary buffer */
-    uint8_t temp_buf[temp_len];
-
-    /* Variable to define loop */
-    uint16_t indx = 0;
-
     /* Null-pointer check */
     /* Null-pointer check */
     if ((dev == NULL) || (dev->read == NULL))
     if ((dev == NULL) || (dev->read == NULL))
     {
     {
@@ -1382,25 +1388,12 @@ int8_t bmi160_get_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const stru
     else
     else
     {
     {
         /* Configuring reg_addr for SPI Interface */
         /* Configuring reg_addr for SPI Interface */
-        if (dev->interface == BMI160_SPI_INTF)
+        if (dev->intf == BMI160_SPI_INTF)
         {
         {
             reg_addr = (reg_addr | BMI160_SPI_RD_MASK);
             reg_addr = (reg_addr | BMI160_SPI_RD_MASK);
         }
         }
-        rslt = dev->read(dev->id, reg_addr, temp_buf, temp_len);
 
 
-        if (rslt == BMI160_OK)
-        {
-            /* Read the data from the position next to dummy byte */
-            while (indx < len)
-            {
-                data[indx] = temp_buf[indx];
-                indx++;
-            }
-        }
-        else
-        {
-            rslt = BMI160_E_COM_FAIL;
-        }
+        rslt = dev->read(dev->id, reg_addr, data, len);
     }
     }
 
 
     return rslt;
     return rslt;
@@ -1427,10 +1420,11 @@ int8_t bmi160_set_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const stru
     else
     else
     {
     {
         /* Configuring reg_addr for SPI Interface */
         /* Configuring reg_addr for SPI Interface */
-        if (dev->interface == BMI160_SPI_INTF)
+        if (dev->intf == BMI160_SPI_INTF)
         {
         {
             reg_addr = (reg_addr & BMI160_SPI_WR_MASK);
             reg_addr = (reg_addr & BMI160_SPI_WR_MASK);
         }
         }
+
         if ((dev->prev_accel_cfg.power == BMI160_ACCEL_NORMAL_MODE) ||
         if ((dev->prev_accel_cfg.power == BMI160_ACCEL_NORMAL_MODE) ||
             (dev->prev_gyro_cfg.power == BMI160_GYRO_NORMAL_MODE))
             (dev->prev_gyro_cfg.power == BMI160_GYRO_NORMAL_MODE))
         {
         {
@@ -1454,6 +1448,7 @@ int8_t bmi160_set_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const stru
 
 
             }
             }
         }
         }
+
         if (rslt != BMI160_OK)
         if (rslt != BMI160_OK)
         {
         {
             rslt = BMI160_E_COM_FAIL;
             rslt = BMI160_E_COM_FAIL;
@@ -1477,19 +1472,9 @@ int8_t bmi160_init(struct bmi160_dev *dev)
     /* Null-pointer check */
     /* Null-pointer check */
     rslt = null_ptr_check(dev);
     rslt = null_ptr_check(dev);
 
 
-    /* An extra dummy byte is read during SPI read */
-    if (dev->interface == BMI160_SPI_INTF)
-    {
-        dev->dummy_byte = 1;
-    }
-    else
-    {
-        dev->dummy_byte = 0;
-    }
-
     /* Dummy read of 0x7F register to enable SPI Interface
     /* Dummy read of 0x7F register to enable SPI Interface
      * if SPI is used */
      * if SPI is used */
-    if ((rslt == BMI160_OK) && (dev->interface == BMI160_SPI_INTF))
+    if ((rslt == BMI160_OK) && (dev->intf == BMI160_SPI_INTF))
     {
     {
         rslt = bmi160_get_regs(BMI160_SPI_COMM_TEST_ADDR, &data, 1, dev);
         rslt = bmi160_get_regs(BMI160_SPI_COMM_TEST_ADDR, &data, 1, dev);
     }
     }
@@ -1504,6 +1489,7 @@ int8_t bmi160_init(struct bmi160_dev *dev)
             /* Read chip_id */
             /* Read chip_id */
             rslt = bmi160_get_regs(BMI160_CHIP_ID_ADDR, &dev->chip_id, 1, dev);
             rslt = bmi160_get_regs(BMI160_CHIP_ID_ADDR, &dev->chip_id, 1, dev);
         }
         }
+
         if ((rslt == BMI160_OK) && (dev->chip_id == BMI160_CHIP_ID))
         if ((rslt == BMI160_OK) && (dev->chip_id == BMI160_CHIP_ID))
         {
         {
             dev->any_sig_sel = BMI160_BOTH_ANY_SIG_MOTION_DISABLED;
             dev->any_sig_sel = BMI160_BOTH_ANY_SIG_MOTION_DISABLED;
@@ -1539,12 +1525,13 @@ int8_t bmi160_soft_reset(struct bmi160_dev *dev)
         /* Reset the device */
         /* Reset the device */
         rslt = bmi160_set_regs(BMI160_COMMAND_REG_ADDR, &data, 1, dev);
         rslt = bmi160_set_regs(BMI160_COMMAND_REG_ADDR, &data, 1, dev);
         dev->delay_ms(BMI160_SOFT_RESET_DELAY_MS);
         dev->delay_ms(BMI160_SOFT_RESET_DELAY_MS);
-        if ((rslt == BMI160_OK) && (dev->interface == BMI160_SPI_INTF))
+        if ((rslt == BMI160_OK) && (dev->intf == BMI160_SPI_INTF))
         {
         {
             /* Dummy read of 0x7F register to enable SPI Interface
             /* Dummy read of 0x7F register to enable SPI Interface
              * if SPI is used */
              * if SPI is used */
             rslt = bmi160_get_regs(BMI160_SPI_COMM_TEST_ADDR, &data, 1, dev);
             rslt = bmi160_get_regs(BMI160_SPI_COMM_TEST_ADDR, &data, 1, dev);
         }
         }
+
         if (rslt == BMI160_OK)
         if (rslt == BMI160_OK)
         {
         {
             /* Update the default parameters */
             /* Update the default parameters */
@@ -1589,6 +1576,30 @@ int8_t bmi160_set_sens_conf(struct bmi160_dev *dev)
     return rslt;
     return rslt;
 }
 }
 
 
+/*!
+ * @brief This API gets accel and gyro configurations.
+ */
+int8_t bmi160_get_sens_conf(struct bmi160_dev *dev)
+{
+    int8_t rslt = BMI160_OK;
+
+    /* Null-pointer check */
+    if ((dev == NULL) || (dev->delay_ms == NULL))
+    {
+        rslt = BMI160_E_NULL_PTR;
+    }
+    else
+    {
+        rslt = get_accel_conf(dev);
+        if (rslt == BMI160_OK)
+        {
+            rslt = get_gyro_conf(dev);
+        }
+    }
+
+    return rslt;
+}
+
 /*!
 /*!
  * @brief This API sets the power mode of the sensor.
  * @brief This API sets the power mode of the sensor.
  */
  */
@@ -1680,6 +1691,7 @@ int8_t bmi160_get_sensor_data(uint8_t select_sensor,
                 {
                 {
                     rslt = get_accel_data(len, accel, dev);
                     rslt = get_accel_data(len, accel, dev);
                 }
                 }
+
                 break;
                 break;
             case BMI160_GYRO_ONLY:
             case BMI160_GYRO_ONLY:
 
 
@@ -1692,6 +1704,7 @@ int8_t bmi160_get_sensor_data(uint8_t select_sensor,
                 {
                 {
                     rslt = get_gyro_data(len, gyro, dev);
                     rslt = get_gyro_data(len, gyro, dev);
                 }
                 }
+
                 break;
                 break;
             case BMI160_BOTH_ACCEL_AND_GYRO:
             case BMI160_BOTH_ACCEL_AND_GYRO:
 
 
@@ -1704,6 +1717,7 @@ int8_t bmi160_get_sensor_data(uint8_t select_sensor,
                 {
                 {
                     rslt = get_accel_gyro_data(len, accel, gyro, dev);
                     rslt = get_accel_gyro_data(len, accel, gyro, dev);
                 }
                 }
+
                 break;
                 break;
             default:
             default:
                 rslt = BMI160_E_INVALID_INPUT;
                 rslt = BMI160_E_INVALID_INPUT;
@@ -1830,6 +1844,7 @@ int8_t bmi160_set_step_counter(uint8_t step_cnt_enable, const struct bmi160_dev
             {
             {
                 data &= ~BMI160_STEP_COUNT_EN_BIT_MASK;
                 data &= ~BMI160_STEP_COUNT_EN_BIT_MASK;
             }
             }
+
             rslt = bmi160_set_regs(BMI160_INT_STEP_CONFIG_1_ADDR, &data, 1, dev);
             rslt = bmi160_set_regs(BMI160_INT_STEP_CONFIG_1_ADDR, &data, 1, dev);
         }
         }
     }
     }
@@ -2166,6 +2181,7 @@ int8_t bmi160_get_fifo_data(struct bmi160_dev const *dev)
                  * more data than available in FIFO */
                  * more data than available in FIFO */
                 dev->fifo->length = bytes_to_read;
                 dev->fifo->length = bytes_to_read;
             }
             }
+
             if ((dev->fifo->fifo_time_enable == BMI160_FIFO_TIME_ENABLE) &&
             if ((dev->fifo->fifo_time_enable == BMI160_FIFO_TIME_ENABLE) &&
                 (bytes_to_read + BMI160_FIFO_BYTES_OVERREAD <= user_fifo_len))
                 (bytes_to_read + BMI160_FIFO_BYTES_OVERREAD <= user_fifo_len))
             {
             {
@@ -2682,14 +2698,17 @@ int8_t bmi160_get_int_status(enum bmi160_int_status_sel int_status_sel,
         {
         {
             rslt = bmi160_get_regs(BMI160_INT_STATUS_ADDR, &int_status->data[0], 1, dev);
             rslt = bmi160_get_regs(BMI160_INT_STATUS_ADDR, &int_status->data[0], 1, dev);
         }
         }
+
         if (int_status_sel & BMI160_INT_STATUS_1)
         if (int_status_sel & BMI160_INT_STATUS_1)
         {
         {
             rslt = bmi160_get_regs(BMI160_INT_STATUS_ADDR + 1, &int_status->data[1], 1, dev);
             rslt = bmi160_get_regs(BMI160_INT_STATUS_ADDR + 1, &int_status->data[1], 1, dev);
         }
         }
+
         if (int_status_sel & BMI160_INT_STATUS_2)
         if (int_status_sel & BMI160_INT_STATUS_2)
         {
         {
             rslt = bmi160_get_regs(BMI160_INT_STATUS_ADDR + 2, &int_status->data[2], 1, dev);
             rslt = bmi160_get_regs(BMI160_INT_STATUS_ADDR + 2, &int_status->data[2], 1, dev);
         }
         }
+
         if (int_status_sel & BMI160_INT_STATUS_3)
         if (int_status_sel & BMI160_INT_STATUS_3)
         {
         {
             rslt = bmi160_get_regs(BMI160_INT_STATUS_ADDR + 3, &int_status->data[3], 1, dev);
             rslt = bmi160_get_regs(BMI160_INT_STATUS_ADDR + 3, &int_status->data[3], 1, dev);
@@ -3160,6 +3179,26 @@ static int8_t set_accel_conf(struct bmi160_dev *dev)
     return rslt;
     return rslt;
 }
 }
 
 
+/*!
+ * @brief This API gets the accel configuration.
+ */
+static int8_t get_accel_conf(struct bmi160_dev *dev)
+{
+    int8_t rslt;
+    uint8_t data[2] = { 0 };
+
+    /* Get accel configurations */
+    rslt = bmi160_get_regs(BMI160_ACCEL_CONFIG_ADDR, data, 2, dev);
+    if (rslt == BMI160_OK)
+    {
+        dev->accel_cfg.odr = (data[0] & BMI160_ACCEL_ODR_MASK);
+        dev->accel_cfg.bw = (data[0] & BMI160_ACCEL_BW_MASK) >> BMI160_ACCEL_BW_POS;
+        dev->accel_cfg.range = (data[1] & BMI160_ACCEL_RANGE_MASK);
+    }
+
+    return rslt;
+}
+
 /*!
 /*!
  * @brief This API check the accel configuration.
  * @brief This API check the accel configuration.
  */
  */
@@ -3194,7 +3233,7 @@ static int8_t process_accel_odr(uint8_t *data, const struct bmi160_dev *dev)
     uint8_t temp = 0;
     uint8_t temp = 0;
     uint8_t odr = 0;
     uint8_t odr = 0;
 
 
-    if (dev->accel_cfg.odr <= BMI160_ACCEL_ODR_MAX)
+    if (dev->accel_cfg.odr <= BMI160_ACCEL_ODR_1600HZ)
     {
     {
         if (dev->accel_cfg.odr != dev->prev_accel_cfg.odr)
         if (dev->accel_cfg.odr != dev->prev_accel_cfg.odr)
         {
         {
@@ -3222,7 +3261,7 @@ static int8_t process_accel_bw(uint8_t *data, const struct bmi160_dev *dev)
     uint8_t temp = 0;
     uint8_t temp = 0;
     uint8_t bw = 0;
     uint8_t bw = 0;
 
 
-    if (dev->accel_cfg.bw <= BMI160_ACCEL_BW_MAX)
+    if (dev->accel_cfg.bw <= BMI160_ACCEL_BW_RES_AVG128)
     {
     {
         if (dev->accel_cfg.bw != dev->prev_accel_cfg.bw)
         if (dev->accel_cfg.bw != dev->prev_accel_cfg.bw)
         {
         {
@@ -3230,7 +3269,7 @@ static int8_t process_accel_bw(uint8_t *data, const struct bmi160_dev *dev)
             temp = *data & ~BMI160_ACCEL_BW_MASK;
             temp = *data & ~BMI160_ACCEL_BW_MASK;
 
 
             /* Adding bandwidth */
             /* Adding bandwidth */
-            *data = temp | ((bw << 4) & BMI160_ACCEL_ODR_MASK);
+            *data = temp | ((bw << 4) & BMI160_ACCEL_BW_MASK);
         }
         }
     }
     }
     else
     else
@@ -3250,7 +3289,7 @@ static int8_t process_accel_range(uint8_t *data, const struct bmi160_dev *dev)
     uint8_t temp = 0;
     uint8_t temp = 0;
     uint8_t range = 0;
     uint8_t range = 0;
 
 
-    if (dev->accel_cfg.range <= BMI160_ACCEL_RANGE_MAX)
+    if (dev->accel_cfg.range <= BMI160_ACCEL_RANGE_16G)
     {
     {
         if (dev->accel_cfg.range != dev->prev_accel_cfg.range)
         if (dev->accel_cfg.range != dev->prev_accel_cfg.range)
         {
         {
@@ -3328,6 +3367,26 @@ static int8_t set_gyro_conf(struct bmi160_dev *dev)
     return rslt;
     return rslt;
 }
 }
 
 
+/*!
+ * @brief This API gets the gyro configuration.
+ */
+static int8_t get_gyro_conf(struct bmi160_dev *dev)
+{
+    int8_t rslt;
+    uint8_t data[2] = { 0 };
+
+    /* Get accel configurations */
+    rslt = bmi160_get_regs(BMI160_GYRO_CONFIG_ADDR, data, 2, dev);
+    if (rslt == BMI160_OK)
+    {
+        dev->gyro_cfg.odr = (data[0] & BMI160_GYRO_ODR_MASK);
+        dev->gyro_cfg.bw = (data[0] & BMI160_GYRO_BW_MASK) >> BMI160_GYRO_BW_POS;
+        dev->gyro_cfg.range = (data[1] & BMI160_GYRO_RANGE_MASK);
+    }
+
+    return rslt;
+}
+
 /*!
 /*!
  * @brief This API check the gyro configuration.
  * @brief This API check the gyro configuration.
  */
  */
@@ -3362,7 +3421,7 @@ static int8_t process_gyro_odr(uint8_t *data, const struct bmi160_dev *dev)
     uint8_t temp = 0;
     uint8_t temp = 0;
     uint8_t odr = 0;
     uint8_t odr = 0;
 
 
-    if (dev->gyro_cfg.odr <= BMI160_GYRO_ODR_MAX)
+    if (dev->gyro_cfg.odr <= BMI160_GYRO_ODR_3200HZ)
     {
     {
         if (dev->gyro_cfg.odr != dev->prev_gyro_cfg.odr)
         if (dev->gyro_cfg.odr != dev->prev_gyro_cfg.odr)
         {
         {
@@ -3390,7 +3449,7 @@ static int8_t process_gyro_bw(uint8_t *data, const struct bmi160_dev *dev)
     uint8_t temp = 0;
     uint8_t temp = 0;
     uint8_t bw = 0;
     uint8_t bw = 0;
 
 
-    if (dev->gyro_cfg.bw <= BMI160_GYRO_BW_MAX)
+    if (dev->gyro_cfg.bw <= BMI160_GYRO_BW_NORMAL_MODE)
     {
     {
         bw = (uint8_t)dev->gyro_cfg.bw;
         bw = (uint8_t)dev->gyro_cfg.bw;
         temp = *data & ~BMI160_GYRO_BW_MASK;
         temp = *data & ~BMI160_GYRO_BW_MASK;
@@ -3415,15 +3474,15 @@ static int8_t process_gyro_range(uint8_t *data, const struct bmi160_dev *dev)
     uint8_t temp = 0;
     uint8_t temp = 0;
     uint8_t range = 0;
     uint8_t range = 0;
 
 
-    if (dev->gyro_cfg.range <= BMI160_GYRO_RANGE_MAX)
+    if (dev->gyro_cfg.range <= BMI160_GYRO_RANGE_125_DPS)
     {
     {
         if (dev->gyro_cfg.range != dev->prev_gyro_cfg.range)
         if (dev->gyro_cfg.range != dev->prev_gyro_cfg.range)
         {
         {
             range = (uint8_t)dev->gyro_cfg.range;
             range = (uint8_t)dev->gyro_cfg.range;
-            temp = *data & ~BMI160_GYRO_RANGE_MSK;
+            temp = *data & ~BMI160_GYRO_RANGE_MASK;
 
 
             /* Adding range */
             /* Adding range */
-            *data = temp | (range & BMI160_GYRO_RANGE_MSK);
+            *data = temp | (range & BMI160_GYRO_RANGE_MASK);
         }
         }
     }
     }
     else
     else
@@ -3457,6 +3516,7 @@ static int8_t set_accel_pwr(struct bmi160_dev *dev)
                 {
                 {
                     dev->delay_ms(BMI160_ACCEL_DELAY_MS);
                     dev->delay_ms(BMI160_ACCEL_DELAY_MS);
                 }
                 }
+
                 dev->prev_accel_cfg.power = dev->accel_cfg.power;
                 dev->prev_accel_cfg.power = dev->accel_cfg.power;
             }
             }
         }
         }
@@ -3545,6 +3605,7 @@ static int8_t set_gyro_pwr(struct bmi160_dev *dev)
             {
             {
                 /* do nothing */
                 /* do nothing */
             }
             }
+
             dev->prev_gyro_cfg.power = dev->gyro_cfg.power;
             dev->prev_gyro_cfg.power = dev->gyro_cfg.power;
         }
         }
     }
     }
@@ -4058,6 +4119,7 @@ static int8_t enable_no_motion_int(const struct bmi160_acc_no_motion_int_cfg *no
             /* Adding No_motion x axis */
             /* Adding No_motion x axis */
             data = temp | (1 & BMI160_NO_MOTION_X_INT_EN_MASK);
             data = temp | (1 & BMI160_NO_MOTION_X_INT_EN_MASK);
         }
         }
+
         if (no_mot_int_cfg->no_motion_y == 1)
         if (no_mot_int_cfg->no_motion_y == 1)
         {
         {
             temp = data & ~BMI160_NO_MOTION_Y_INT_EN_MASK;
             temp = data & ~BMI160_NO_MOTION_Y_INT_EN_MASK;
@@ -4065,6 +4127,7 @@ static int8_t enable_no_motion_int(const struct bmi160_acc_no_motion_int_cfg *no
             /* Adding No_motion x axis */
             /* Adding No_motion x axis */
             data = temp | ((1 << 1) & BMI160_NO_MOTION_Y_INT_EN_MASK);
             data = temp | ((1 << 1) & BMI160_NO_MOTION_Y_INT_EN_MASK);
         }
         }
+
         if (no_mot_int_cfg->no_motion_z == 1)
         if (no_mot_int_cfg->no_motion_z == 1)
         {
         {
             temp = data & ~BMI160_NO_MOTION_Z_INT_EN_MASK;
             temp = data & ~BMI160_NO_MOTION_Z_INT_EN_MASK;
@@ -4514,6 +4577,7 @@ static int8_t config_tap_param(const struct bmi160_int_settg *int_config,
              * double tap interrupt */
              * double tap interrupt */
             data = temp | (dur & BMI160_TAP_DUR_MASK);
             data = temp | (dur & BMI160_TAP_DUR_MASK);
         }
         }
+
         shock = (uint8_t)tap_int_cfg->tap_shock;
         shock = (uint8_t)tap_int_cfg->tap_shock;
         temp = data & ~BMI160_TAP_SHOCK_DUR_MASK;
         temp = data & ~BMI160_TAP_SHOCK_DUR_MASK;
         data = temp | ((shock << 6) & BMI160_TAP_SHOCK_DUR_MASK);
         data = temp | ((shock << 6) & BMI160_TAP_SHOCK_DUR_MASK);
@@ -4675,6 +4739,7 @@ static int8_t extract_aux_read(uint16_t map_len,
                 {
                 {
                     aux_data[count + read_count] = data[read_count];
                     aux_data[count + read_count] = data[read_count];
                 }
                 }
+
                 reg_addr += (uint8_t)map_len;
                 reg_addr += (uint8_t)map_len;
                 count += (uint8_t)map_len;
                 count += (uint8_t)map_len;
             }
             }
@@ -5049,6 +5114,7 @@ static int8_t config_int_out_ctrl(const struct bmi160_int_settg *int_config, con
             temp = data & ~BMI160_INT2_EDGE_CTRL_MASK;
             temp = data & ~BMI160_INT2_EDGE_CTRL_MASK;
             data = temp | ((intr_pin_sett->edge_ctrl << 4) & BMI160_INT2_EDGE_CTRL_MASK);
             data = temp | ((intr_pin_sett->edge_ctrl << 4) & BMI160_INT2_EDGE_CTRL_MASK);
         }
         }
+
         rslt = bmi160_set_regs(BMI160_INT_OUT_CTRL_ADDR, &data, 1, dev);
         rslt = bmi160_set_regs(BMI160_INT_OUT_CTRL_ADDR, &data, 1, dev);
     }
     }
 
 
@@ -5467,6 +5533,7 @@ static void get_accel_len_to_parse(uint16_t *data_index,
          * so we update the data index as complete */
          * so we update the data index as complete */
         *data_index = dev->fifo->length;
         *data_index = dev->fifo->length;
     }
     }
+
     if (*data_read_length > dev->fifo->length)
     if (*data_read_length > dev->fifo->length)
     {
     {
         /* Handling the case where more data is requested
         /* Handling the case where more data is requested
@@ -5712,6 +5779,7 @@ static void get_gyro_len_to_parse(uint16_t *data_index,
          * so we update the data index as complete */
          * so we update the data index as complete */
         *data_index = dev->fifo->length;
         *data_index = dev->fifo->length;
     }
     }
+
     if (*data_read_length > dev->fifo->length)
     if (*data_read_length > dev->fifo->length)
     {
     {
         /* Handling the case where more data is requested
         /* Handling the case where more data is requested
@@ -5961,6 +6029,7 @@ static void get_aux_len_to_parse(uint16_t *data_index,
          * so we update the data index as complete */
          * so we update the data index as complete */
         *data_index = dev->fifo->length;
         *data_index = dev->fifo->length;
     }
     }
+
     if (*data_read_length > dev->fifo->length)
     if (*data_read_length > dev->fifo->length)
     {
     {
         /* Handling the case where more data is requested
         /* Handling the case where more data is requested
@@ -6313,7 +6382,7 @@ static int8_t configure_offset_enable(const struct bmi160_foc_conf *foc_conf, st
 static int8_t trigger_foc(struct bmi160_offsets *offset, struct bmi160_dev const *dev)
 static int8_t trigger_foc(struct bmi160_offsets *offset, struct bmi160_dev const *dev)
 {
 {
     int8_t rslt;
     int8_t rslt;
-    uint8_t foc_status;
+    uint8_t foc_status = BMI160_ENABLE;
     uint8_t cmd = BMI160_START_FOC_CMD;
     uint8_t cmd = BMI160_START_FOC_CMD;
     uint8_t timeout = 0;
     uint8_t timeout = 0;
     uint8_t data_array[20];
     uint8_t data_array[20];
@@ -6324,6 +6393,7 @@ static int8_t trigger_foc(struct bmi160_offsets *offset, struct bmi160_dev const
     {
     {
         /* Check the FOC status*/
         /* Check the FOC status*/
         rslt = get_foc_status(&foc_status, dev);
         rslt = get_foc_status(&foc_status, dev);
+
         if ((rslt != BMI160_OK) || (foc_status != BMI160_ENABLE))
         if ((rslt != BMI160_OK) || (foc_status != BMI160_ENABLE))
         {
         {
             while ((foc_status != BMI160_ENABLE) && (timeout < 11))
             while ((foc_status != BMI160_ENABLE) && (timeout < 11))
@@ -6336,6 +6406,7 @@ static int8_t trigger_foc(struct bmi160_offsets *offset, struct bmi160_dev const
                 rslt = get_foc_status(&foc_status, dev);
                 rslt = get_foc_status(&foc_status, dev);
                 timeout++;
                 timeout++;
             }
             }
+
             if ((rslt == BMI160_OK) && (foc_status == BMI160_ENABLE))
             if ((rslt == BMI160_OK) && (foc_status == BMI160_ENABLE))
             {
             {
                 /* Get offset values from sensor */
                 /* Get offset values from sensor */
@@ -6347,6 +6418,7 @@ static int8_t trigger_foc(struct bmi160_offsets *offset, struct bmi160_dev const
                 rslt = BMI160_FOC_FAILURE;
                 rslt = BMI160_FOC_FAILURE;
             }
             }
         }
         }
+
         if (rslt == BMI160_OK)
         if (rslt == BMI160_OK)
         {
         {
             /* Read registers 0x04-0x17 */
             /* Read registers 0x04-0x17 */
@@ -6356,5 +6428,3 @@ static int8_t trigger_foc(struct bmi160_offsets *offset, struct bmi160_dev const
 
 
     return rslt;
     return rslt;
 }
 }
-
-/** @}*/

+ 367 - 65
bmi160.h

@@ -30,16 +30,15 @@
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * POSSIBILITY OF SUCH DAMAGE.
 *
 *
-* @file bmi160.h
-* @date 10/01/2020
-* @version  3.8.1
+* @file       bmi160.h
+* @date       2021-03-12
+* @version    v3.9.1
 *
 *
 */
 */
 
 
 /*!
 /*!
- * @defgroup bmi160
- * @brief
- * @{*/
+ * @defgroup bmi160 BMI160
+ */
 
 
 #ifndef BMI160_H_
 #ifndef BMI160_H_
 #define BMI160_H_
 #define BMI160_H_
@@ -60,8 +59,19 @@ extern "C" {
 
 
 /*********************** User function prototypes ************************/
 /*********************** User function prototypes ************************/
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiInit Initialization
+ * @brief Initialize the sensor and device structure
+ */
+
 /*!
 /*!
- *  @brief This API is the entry point for sensor.It performs
+ * \ingroup bmi160ApiInit
+ * \page bmi160_api_bmi160_init bmi160_init
+ * \code
+ * int8_t bmi160_init(struct bmi160_dev *dev);
+ * \endcode
+ * @details This API is the entry point for sensor.It performs
  *  the selection of I2C/SPI read mechanism according to the
  *  the selection of I2C/SPI read mechanism according to the
  *  selected interface and reads the chip-id of bmi160 sensor.
  *  selected interface and reads the chip-id of bmi160 sensor.
  *
  *
@@ -69,12 +79,24 @@ extern "C" {
  *  @note : Refer user guide for detailed info.
  *  @note : Refer user guide for detailed info.
  *
  *
  *  @return Result of API execution status
  *  @return Result of API execution status
- *  @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_init(struct bmi160_dev *dev);
 int8_t bmi160_init(struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiRegs Registers
+ * @brief Read data from the given register address of sensor
+ */
+
 /*!
 /*!
- * @brief This API reads the data from the given register address of sensor.
+ * \ingroup bmi160ApiRegs
+ * \page bmi160_api_bmi160_get_regs bmi160_get_regs
+ * \code
+ * int8_t bmi160_get_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API reads the data from the given register address of sensor.
  *
  *
  * @param[in] reg_addr  : Register address from where the data to be read
  * @param[in] reg_addr  : Register address from where the data to be read
  * @param[out] data     : Pointer to data buffer to store the read data.
  * @param[out] data     : Pointer to data buffer to store the read data.
@@ -86,12 +108,18 @@ int8_t bmi160_init(struct bmi160_dev *dev);
  * Register address - 0x24(BMI160_FIFO_DATA_ADDR)
  * Register address - 0x24(BMI160_FIFO_DATA_ADDR)
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_get_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const struct bmi160_dev *dev);
 int8_t bmi160_get_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API writes the given data to the register address
+ * \ingroup bmi160ApiRegs
+ * \page bmi160_api_bmi160_set_regs bmi160_set_regs
+ * \code
+ * int8_t bmi160_set_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API writes the given data to the register address
  * of sensor.
  * of sensor.
  *
  *
  * @param[in] reg_addr  : Register address from where the data to be written.
  * @param[in] reg_addr  : Register address from where the data to be written.
@@ -101,45 +129,104 @@ int8_t bmi160_get_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const stru
  * @param[in] dev       : Structure instance of bmi160_dev.
  * @param[in] dev       : Structure instance of bmi160_dev.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_set_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const struct bmi160_dev *dev);
 int8_t bmi160_set_regs(uint8_t reg_addr, uint8_t *data, uint16_t len, const struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiSoftreset Soft reset
+ * @brief Perform soft reset of the sensor
+ */
+
 /*!
 /*!
- * @brief This API resets and restarts the device.
+ * \ingroup bmi160ApiSoftreset
+ * \page bmi160_api_bmi160_soft_reset bmi160_soft_reset
+ * \code
+ * int8_t bmi160_soft_reset(struct bmi160_dev *dev);
+ * \endcode
+ * @details This API resets and restarts the device.
  * All register values are overwritten with default parameters.
  * All register values are overwritten with default parameters.
  *
  *
  * @param[in] dev  : Structure instance of bmi160_dev.
  * @param[in] dev  : Structure instance of bmi160_dev.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error.
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_soft_reset(struct bmi160_dev *dev);
 int8_t bmi160_soft_reset(struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiConfig Configuration
+ * @brief Configuration of the sensor
+ */
+
 /*!
 /*!
- * @brief This API configures the power mode, range and bandwidth
+ * \ingroup bmi160ApiConfig
+ * \page bmi160_api_bmi160_set_sens_conf bmi160_set_sens_conf
+ * \code
+ * int8_t bmi160_set_sens_conf(struct bmi160_dev *dev);
+ * \endcode
+ * @details This API configures the power mode, range and bandwidth
  * of sensor.
  * of sensor.
  *
  *
  * @param[in] dev    : Structure instance of bmi160_dev.
  * @param[in] dev    : Structure instance of bmi160_dev.
  * @note : Refer user guide for detailed info.
  * @note : Refer user guide for detailed info.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error.
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_set_sens_conf(struct bmi160_dev *dev);
 int8_t bmi160_set_sens_conf(struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API sets the power mode of the sensor.
+ * \ingroup bmi160ApiConfig
+ * \page bmi160_api_bmi160_get_sens_conf bmi160_get_sens_conf
+ * \code
+ * int8_t bmi160_get_sens_conf(struct bmi160_dev *dev);
+ * \endcode
+ * @details This API gets accel and gyro configurations.
+ *
+ * @param[out] dev    : Structure instance of bmi160_dev.
+ * @note : Refer user guide for detailed info.
+ *
+ * @return Result of API execution status
+ * @retval Zero Success
+ * @retval Negative Error
+ */
+int8_t bmi160_get_sens_conf(struct bmi160_dev *dev);
+
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiPowermode Power mode
+ * @brief Set / Get power mode of the sensor
+ */
+
+/*!
+ * \ingroup bmi160ApiPowermode
+ * \page bmi160_api_bmi160_set_power_mode bmi160_set_power_mode
+ * \code
+ * int8_t bmi160_set_power_mode(struct bmi160_dev *dev);
+ * \endcode
+ * @details This API sets the power mode of the sensor.
  *
  *
  * @param[in] dev  : Structure instance of bmi160_dev.
  * @param[in] dev  : Structure instance of bmi160_dev.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error.
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_set_power_mode(struct bmi160_dev *dev);
 int8_t bmi160_set_power_mode(struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API gets the power mode of the sensor.
+ * \ingroup bmi160ApiPowermode
+ * \page bmi160_api_bmi160_get_power_mode bmi160_get_power_mode
+ * \code
+ * int8_t bmi160_get_power_mode(struct bmi160_pmu_status *pmu_status, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API gets the power mode of the sensor.
  *
  *
  * @param[in] power_mode  : Power mode of the sensor
  * @param[in] power_mode  : Power mode of the sensor
  * @param[in] dev         : Structure instance of bmi160_dev
  * @param[in] dev         : Structure instance of bmi160_dev
@@ -160,12 +247,28 @@ int8_t bmi160_set_power_mode(struct bmi160_dev *dev);
  *  - BMI160_ACCEL_PMU_LOW_POWER
  *  - BMI160_ACCEL_PMU_LOW_POWER
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error.
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_get_power_mode(struct bmi160_pmu_status *pmu_status, const struct bmi160_dev *dev);
 int8_t bmi160_get_power_mode(struct bmi160_pmu_status *pmu_status, const struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiData Sensor Data
+ * @brief Read sensor data
+ */
+
 /*!
 /*!
- * @brief This API reads sensor data, stores it in
+ * \ingroup bmi160ApiData
+ * \page bmi160_api_bmi160_get_sensor_data bmi160_get_sensor_data
+ * \code
+ * int8_t bmi160_get_sensor_data(uint8_t select_sensor,
+ *                             struct bmi160_sensor_data *accel,
+ *                             struct bmi160_sensor_data *gyro,
+ *                             const struct bmi160_dev *dev);
+ *
+ * \endcode
+ * @details This API reads sensor data, stores it in
  * the bmi160_sensor_data structure pointer passed by the user.
  * the bmi160_sensor_data structure pointer passed by the user.
  * The user can ask for accel data ,gyro data or both sensor
  * The user can ask for accel data ,gyro data or both sensor
  * data using bmi160_select_sensor enum
  * data using bmi160_select_sensor enum
@@ -177,15 +280,27 @@ int8_t bmi160_get_power_mode(struct bmi160_pmu_status *pmu_status, const struct
  * @note : Refer user guide for detailed info.
  * @note : Refer user guide for detailed info.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success  / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_get_sensor_data(uint8_t select_sensor,
 int8_t bmi160_get_sensor_data(uint8_t select_sensor,
                               struct bmi160_sensor_data *accel,
                               struct bmi160_sensor_data *accel,
                               struct bmi160_sensor_data *gyro,
                               struct bmi160_sensor_data *gyro,
                               const struct bmi160_dev *dev);
                               const struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiInt Interrupt configuration
+ * @brief Set interrupt configuration of the sensor
+ */
+
 /*!
 /*!
- * @brief This API configures the necessary interrupt based on
+ * \ingroup bmi160ApiInt
+ * \page bmi160_api_bmi160_set_int_config bmi160_set_int_config
+ * \code
+ * int8_t bmi160_set_int_config(struct bmi160_int_settg *int_config, struct bmi160_dev *dev);
+ * \endcode
+ * @details This API configures the necessary interrupt based on
  *  the user settings in the bmi160_int_settg structure instance.
  *  the user settings in the bmi160_int_settg structure instance.
  *
  *
  * @param[in] int_config  : Structure instance of bmi160_int_settg.
  * @param[in] int_config  : Structure instance of bmi160_int_settg.
@@ -193,36 +308,66 @@ int8_t bmi160_get_sensor_data(uint8_t select_sensor,
  * @note : Refer user guide for detailed info.
  * @note : Refer user guide for detailed info.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_set_int_config(struct bmi160_int_settg *int_config, struct bmi160_dev *dev);
 int8_t bmi160_set_int_config(struct bmi160_int_settg *int_config, struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiStepC Step counter
+ * @brief Step counter operations
+ */
+
 /*!
 /*!
- * @brief This API enables the step counter feature.
+ * \ingroup bmi160ApiStepC
+ * \page bmi160_api_bmi160_set_step_counter bmi160_set_step_counter
+ * \code
+ * int8_t bmi160_set_step_counter(uint8_t step_cnt_enable, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API enables the step counter feature.
  *
  *
  * @param[in] step_cnt_enable   : value to enable or disable
  * @param[in] step_cnt_enable   : value to enable or disable
  * @param[in] dev       : Structure instance of bmi160_dev.
  * @param[in] dev       : Structure instance of bmi160_dev.
  * @note : Refer user guide for detailed info.
  * @note : Refer user guide for detailed info.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_set_step_counter(uint8_t step_cnt_enable, const struct bmi160_dev *dev);
 int8_t bmi160_set_step_counter(uint8_t step_cnt_enable, const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API reads the step counter value.
+ * \ingroup bmi160ApiStepC
+ * \page bmi160_api_bmi160_read_step_counter bmi160_read_step_counter
+ * \code
+ * int8_t bmi160_read_step_counter(uint16_t *step_val, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API reads the step counter value.
  *
  *
  * @param[in] step_val    : Pointer to store the step counter value.
  * @param[in] step_val    : Pointer to store the step counter value.
  * @param[in] dev         : Structure instance of bmi160_dev.
  * @param[in] dev         : Structure instance of bmi160_dev.
  * @note : Refer user guide for detailed info.
  * @note : Refer user guide for detailed info.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_read_step_counter(uint16_t *step_val, const struct bmi160_dev *dev);
 int8_t bmi160_read_step_counter(uint16_t *step_val, const struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiAux Auxiliary sensor
+ * @brief Auxiliary sensor operations
+ */
+
 /*!
 /*!
- * @brief This API reads the mention no of byte of data from the given
+ * \ingroup bmi160ApiAux
+ * \page bmi160_api_bmi160_aux_read bmi160_aux_read
+ * \code
+ * int8_t bmi160_aux_read(uint8_t reg_addr, uint8_t *aux_data, uint16_t len, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API reads the mention no of byte of data from the given
  * register address of auxiliary sensor.
  * register address of auxiliary sensor.
  *
  *
  * @param[in] reg_addr    : Address of register to read.
  * @param[in] reg_addr    : Address of register to read.
@@ -232,12 +377,18 @@ int8_t bmi160_read_step_counter(uint16_t *step_val, const struct bmi160_dev *dev
  * @note : Refer user guide for detailed info.
  * @note : Refer user guide for detailed info.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_aux_read(uint8_t reg_addr, uint8_t *aux_data, uint16_t len, const struct bmi160_dev *dev);
 int8_t bmi160_aux_read(uint8_t reg_addr, uint8_t *aux_data, uint16_t len, const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API writes the mention no of byte of data to the given
+ * \ingroup bmi160ApiAux
+ * \page bmi160_api_bmi160_aux_write bmi160_aux_write
+ * \code
+ * int8_t bmi160_aux_write(uint8_t reg_addr, uint8_t *aux_data, uint16_t len, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API writes the mention no of byte of data to the given
  * register address of auxiliary sensor.
  * register address of auxiliary sensor.
  *
  *
  * @param[in] reg_addr    : Address of register to write.
  * @param[in] reg_addr    : Address of register to write.
@@ -247,24 +398,36 @@ int8_t bmi160_aux_read(uint8_t reg_addr, uint8_t *aux_data, uint16_t len, const
  * @note : Refer user guide for detailed info.
  * @note : Refer user guide for detailed info.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_aux_write(uint8_t reg_addr, uint8_t *aux_data, uint16_t len, const struct bmi160_dev *dev);
 int8_t bmi160_aux_write(uint8_t reg_addr, uint8_t *aux_data, uint16_t len, const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API initialize the auxiliary sensor
+ * \ingroup bmi160ApiAux
+ * \page bmi160_api_bmi160_aux_init bmi160_aux_init
+ * \code
+ * int8_t bmi160_aux_init(const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API initialize the auxiliary sensor
  * in order to access it.
  * in order to access it.
  *
  *
  * @param[in] dev         : Structure instance of bmi160_dev.
  * @param[in] dev         : Structure instance of bmi160_dev.
  * @note : Refer user guide for detailed info.
  * @note : Refer user guide for detailed info.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_aux_init(const struct bmi160_dev *dev);
 int8_t bmi160_aux_init(const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API is used to setup the auxiliary sensor of bmi160 in auto mode
+ * \ingroup bmi160ApiAux
+ * \page bmi160_api_bmi160_set_aux_auto_mode bmi160_set_aux_auto_mode
+ * \code
+ * int8_t bmi160_set_aux_auto_mode(uint8_t *data_addr, struct bmi160_dev *dev);
+ * \endcode
+ * @details This API is used to setup the auxiliary sensor of bmi160 in auto mode
  * Thus enabling the auto update of 8 bytes of data from auxiliary sensor
  * Thus enabling the auto update of 8 bytes of data from auxiliary sensor
  * to BMI160 register address 0x04 to 0x0B
  * to BMI160 register address 0x04 to 0x0B
  *
  *
@@ -278,6 +441,7 @@ int8_t bmi160_aux_init(const struct bmi160_dev *dev);
  *         dev->aux_cfg.aux_odr to the required value from the table
  *         dev->aux_cfg.aux_odr to the required value from the table
  *         before calling this API
  *         before calling this API
  *
  *
+ *@verbatim
  *   dev->aux_cfg.aux_odr  |   Auxiliary ODR (Hz)
  *   dev->aux_cfg.aux_odr  |   Auxiliary ODR (Hz)
  *  -----------------------|-----------------------
  *  -----------------------|-----------------------
  *  BMI160_AUX_ODR_0_78HZ  |        25/32
  *  BMI160_AUX_ODR_0_78HZ  |        25/32
@@ -291,27 +455,40 @@ int8_t bmi160_aux_init(const struct bmi160_dev *dev);
  *  BMI160_AUX_ODR_200HZ   |        200
  *  BMI160_AUX_ODR_200HZ   |        200
  *  BMI160_AUX_ODR_400HZ   |        400
  *  BMI160_AUX_ODR_400HZ   |        400
  *  BMI160_AUX_ODR_800HZ   |        800
  *  BMI160_AUX_ODR_800HZ   |        800
+ *@endverbatim
  *
  *
  * @note : Other values of  dev->aux_cfg.aux_odr are reserved and not for use
  * @note : Other values of  dev->aux_cfg.aux_odr are reserved and not for use
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success  / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_set_aux_auto_mode(uint8_t *data_addr, struct bmi160_dev *dev);
 int8_t bmi160_set_aux_auto_mode(uint8_t *data_addr, struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API configures the 0x4C register and settings like
+ * \ingroup bmi160ApiAux
+ * \page bmi160_api_bmi160_config_aux_mode bmi160_config_aux_mode
+ * \code
+ * int8_t bmi160_config_aux_mode(const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API configures the 0x4C register and settings like
  * Auxiliary sensor manual enable/ disable and aux burst read length.
  * Auxiliary sensor manual enable/ disable and aux burst read length.
  *
  *
  * @param[in] dev    : Structure instance of bmi160_dev.
  * @param[in] dev    : Structure instance of bmi160_dev.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success  / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_config_aux_mode(const struct bmi160_dev *dev);
 int8_t bmi160_config_aux_mode(const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- * @brief This API is used to read the raw uncompensated auxiliary sensor
+ * \ingroup bmi160ApiAux
+ * \page bmi160_api_bmi160_read_aux_data_auto_mode bmi160_read_aux_data_auto_mode
+ * \code
+ * int8_t bmi160_read_aux_data_auto_mode(uint8_t *aux_data, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API is used to read the raw uncompensated auxiliary sensor
  * data of 8 bytes from BMI160 register address 0x04 to 0x0B
  * data of 8 bytes from BMI160 register address 0x04 to 0x0B
  *
  *
  * @param[in] aux_data       : Pointer to user array of length 8 bytes
  * @param[in] aux_data       : Pointer to user array of length 8 bytes
@@ -319,24 +496,38 @@ int8_t bmi160_config_aux_mode(const struct bmi160_dev *dev);
  *                             length 8 bytes
  *                             length 8 bytes
  * @param[in] dev        : Structure instance of bmi160_dev
  * @param[in] dev        : Structure instance of bmi160_dev
  *
  *
- * @return Result of API execution status
  * @retval zero -> Success  / -ve value -> Error
  * @retval zero -> Success  / -ve value -> Error
+ * @retval Zero Success
+ * @retval Negative Error
  */
  */
 int8_t bmi160_read_aux_data_auto_mode(uint8_t *aux_data, const struct bmi160_dev *dev);
 int8_t bmi160_read_aux_data_auto_mode(uint8_t *aux_data, const struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiSelfTest Self test
+ * @brief Perform self test of the sensor
+ */
+
 /*!
 /*!
- * @brief This is used to perform self test of accel/gyro of the BMI160 sensor
+ * \ingroup bmi160ApiSelfTest
+ * \page bmi160_api_bmi160_perform_self_test bmi160_perform_self_test
+ * \code
+ * int8_t bmi160_perform_self_test(uint8_t select_sensor, struct bmi160_dev *dev);
+ * \endcode
+ * @details This is used to perform self test of accel/gyro of the BMI160 sensor
  *
  *
  * @param[in] select_sensor  : enum to choose accel or gyro for self test
  * @param[in] select_sensor  : enum to choose accel or gyro for self test
  * @param[in] dev            : Structure instance of bmi160_dev
  * @param[in] dev            : Structure instance of bmi160_dev
  *
  *
  * @note self test can be performed either for accel/gyro at any instant.
  * @note self test can be performed either for accel/gyro at any instant.
  *
  *
+ *@verbatim
  *     value of select_sensor       |  Inference
  *     value of select_sensor       |  Inference
  *----------------------------------|--------------------------------
  *----------------------------------|--------------------------------
  *   BMI160_ACCEL_ONLY              | Accel self test enabled
  *   BMI160_ACCEL_ONLY              | Accel self test enabled
  *   BMI160_GYRO_ONLY               | Gyro self test enabled
  *   BMI160_GYRO_ONLY               | Gyro self test enabled
  *   BMI160_BOTH_ACCEL_AND_GYRO     | NOT TO BE USED
  *   BMI160_BOTH_ACCEL_AND_GYRO     | NOT TO BE USED
+ *@endverbatim
  *
  *
  * @note The return value of this API gives us the result of self test.
  * @note The return value of this API gives us the result of self test.
  *
  *
@@ -344,18 +535,25 @@ int8_t bmi160_read_aux_data_auto_mode(uint8_t *aux_data, const struct bmi160_dev
  * set the desired settings after performing the self test.
  * set the desired settings after performing the self test.
  *
  *
  * @return Result of API execution status
  * @return Result of API execution status
- * @retval zero -> Success  / -ve value -> Error / +ve value -> Self-test fail
- *
- *   Return value                  |   Result of self test
- * --------------------------------|---------------------------------
- *  BMI160_OK                      |  Self test success
- *  BMI160_W_GYRO_SELF_TEST_FAIL   |  Gyro self test fail
- *  BMI160_W_ACCEl_SELF_TEST_FAIL  |  Accel self test fail
+ * @retval  BMI160_OK                       Self test success
+ * @retval  BMI160_W_GYRO_SELF_TEST_FAIL    Gyro self test fail
+ * @retval  BMI160_W_ACCEl_SELF_TEST_FAIL   Accel self test fail
  */
  */
 int8_t bmi160_perform_self_test(uint8_t select_sensor, struct bmi160_dev *dev);
 int8_t bmi160_perform_self_test(uint8_t select_sensor, struct bmi160_dev *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiFIFO FIFO
+ * @brief FIFO operations of the sensor
+ */
+
 /*!
 /*!
- *  @brief This API reads data from the fifo buffer.
+ * \ingroup bmi160ApiFIFO
+ * \page bmi160_api_bmi160_get_fifo_data bmi160_get_fifo_data
+ * \code
+ * int8_t bmi160_get_fifo_data(struct bmi160_dev const *dev);
+ * \endcode
+ * @details This API reads data from the fifo buffer.
  *
  *
  *  @note User has to allocate the FIFO buffer along with
  *  @note User has to allocate the FIFO buffer along with
  *  corresponding fifo length from his side before calling this API
  *  corresponding fifo length from his side before calling this API
@@ -368,13 +566,18 @@ int8_t bmi160_perform_self_test(uint8_t select_sensor, struct bmi160_dev *dev);
  *  @param[in] dev     : Structure instance of bmi160_dev.
  *  @param[in] dev     : Structure instance of bmi160_dev.
  *
  *
  *  @return Result of API execution status
  *  @return Result of API execution status
- *  @retval zero -> Success / -ve value -> Error
- *
+ *  @retval Zero Success
+ *  @retval Negative Error
  */
  */
 int8_t bmi160_get_fifo_data(struct bmi160_dev const *dev);
 int8_t bmi160_get_fifo_data(struct bmi160_dev const *dev);
 
 
 /*!
 /*!
- *  @brief This API writes fifo_flush command to command register.This
+ * \ingroup bmi160ApiFIFO
+ * \page bmi160_api_bmi160_set_fifo_flush bmi160_set_fifo_flush
+ * \code
+ * int8_t bmi160_set_fifo_flush(const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API writes fifo_flush command to command register.This
  *  action clears all data in the Fifo without changing fifo configuration
  *  action clears all data in the Fifo without changing fifo configuration
  *  settings.
  *  settings.
  *
  *
@@ -387,13 +590,21 @@ int8_t bmi160_get_fifo_data(struct bmi160_dev const *dev);
  */
  */
 int8_t bmi160_set_fifo_flush(const struct bmi160_dev *dev);
 int8_t bmi160_set_fifo_flush(const struct bmi160_dev *dev);
 
 
-/*! @brief This API sets the FIFO configuration in the sensor.
+/*!
+ * \ingroup bmi160ApiFIFO
+ * \page bmi160_api_bmi160_set_fifo_config bmi160_set_fifo_config
+ * \code
+ * int8_t bmi160_set_fifo_config(uint8_t config, uint8_t enable, struct bmi160_dev const *dev);
+ * \endcode
+ * @details This API sets the FIFO configuration in the sensor.
  *
  *
  *  @param[in] config : variable used to specify the FIFO
  *  @param[in] config : variable used to specify the FIFO
  *  configurations which are to be enabled or disabled in the sensor.
  *  configurations which are to be enabled or disabled in the sensor.
  *
  *
  *  @note : User can set either set one or more or all FIFO configurations
  *  @note : User can set either set one or more or all FIFO configurations
  *  by ORing the below mentioned macros.
  *  by ORing the below mentioned macros.
+ *
+ *@verbatim
  *      config                  |   Value
  *      config                  |   Value
  *      ------------------------|---------------------------
  *      ------------------------|---------------------------
  *      BMI160_FIFO_TIME        |   0x02
  *      BMI160_FIFO_TIME        |   0x02
@@ -401,8 +612,9 @@ int8_t bmi160_set_fifo_flush(const struct bmi160_dev *dev);
  *      BMI160_FIFO_TAG_INT1    |   0x08
  *      BMI160_FIFO_TAG_INT1    |   0x08
  *      BMI160_FIFO_HEADER      |   0x10
  *      BMI160_FIFO_HEADER      |   0x10
  *      BMI160_FIFO_AUX         |   0x20
  *      BMI160_FIFO_AUX         |   0x20
- *      BMI160_FIFO_ACCEL   |   0x40
+ *      BMI160_FIFO_ACCEL       |   0x40
  *      BMI160_FIFO_GYRO        |   0x80
  *      BMI160_FIFO_GYRO        |   0x80
+ *@endverbatim
  *
  *
  *  @param[in] enable : Parameter used to enable or disable the above
  *  @param[in] enable : Parameter used to enable or disable the above
  *  FIFO configuration
  *  FIFO configuration
@@ -415,7 +627,13 @@ int8_t bmi160_set_fifo_flush(const struct bmi160_dev *dev);
  */
  */
 int8_t bmi160_set_fifo_config(uint8_t config, uint8_t enable, struct bmi160_dev const *dev);
 int8_t bmi160_set_fifo_config(uint8_t config, uint8_t enable, struct bmi160_dev const *dev);
 
 
-/*! @brief This API is used to configure the down sampling ratios of
+/*!
+ * \ingroup bmi160ApiFIFO
+ * \page bmi160_api_bmi160_set_fifo_down bmi160_set_fifo_down
+ * \code
+ * int8_t bmi160_set_fifo_down(uint8_t fifo_down, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API is used to configure the down sampling ratios of
  *  the accel and gyro data for FIFO.Also, it configures filtered or
  *  the accel and gyro data for FIFO.Also, it configures filtered or
  *  pre-filtered data for the fifo for accel and gyro.
  *  pre-filtered data for the fifo for accel and gyro.
  *
  *
@@ -424,6 +642,8 @@ int8_t bmi160_set_fifo_config(uint8_t config, uint8_t enable, struct bmi160_dev
  *
  *
  *  @note The user must select one among the following macros to
  *  @note The user must select one among the following macros to
  *  select down-sampling ratio for accel
  *  select down-sampling ratio for accel
+ *
+ *@verbatim
  *      config                               |   Value
  *      config                               |   Value
  *      -------------------------------------|---------------------------
  *      -------------------------------------|---------------------------
  *      BMI160_ACCEL_FIFO_DOWN_ZERO          |   0x00
  *      BMI160_ACCEL_FIFO_DOWN_ZERO          |   0x00
@@ -434,10 +654,12 @@ int8_t bmi160_set_fifo_config(uint8_t config, uint8_t enable, struct bmi160_dev
  *      BMI160_ACCEL_FIFO_DOWN_FIVE          |   0x50
  *      BMI160_ACCEL_FIFO_DOWN_FIVE          |   0x50
  *      BMI160_ACCEL_FIFO_DOWN_SIX           |   0x60
  *      BMI160_ACCEL_FIFO_DOWN_SIX           |   0x60
  *      BMI160_ACCEL_FIFO_DOWN_SEVEN         |   0x70
  *      BMI160_ACCEL_FIFO_DOWN_SEVEN         |   0x70
+ *@endverbatim
  *
  *
  *  @note The user must select one among the following macros to
  *  @note The user must select one among the following macros to
  *  select down-sampling ratio for gyro
  *  select down-sampling ratio for gyro
  *
  *
+ *@verbatim
  *      config                               |   Value
  *      config                               |   Value
  *      -------------------------------------|---------------------------
  *      -------------------------------------|---------------------------
  *      BMI160_GYRO_FIFO_DOWN_ZERO           |   0x00
  *      BMI160_GYRO_FIFO_DOWN_ZERO           |   0x00
@@ -448,16 +670,23 @@ int8_t bmi160_set_fifo_config(uint8_t config, uint8_t enable, struct bmi160_dev
  *      BMI160_GYRO_FIFO_DOWN_FIVE           |   0x05
  *      BMI160_GYRO_FIFO_DOWN_FIVE           |   0x05
  *      BMI160_GYRO_FIFO_DOWN_SIX            |   0x06
  *      BMI160_GYRO_FIFO_DOWN_SIX            |   0x06
  *      BMI160_GYRO_FIFO_DOWN_SEVEN          |   0x07
  *      BMI160_GYRO_FIFO_DOWN_SEVEN          |   0x07
+ *@endverbatim
  *
  *
  *  @note The user can enable filtered accel data by the following macro
  *  @note The user can enable filtered accel data by the following macro
+ *
+ *@verbatim
  *      config                               |   Value
  *      config                               |   Value
  *      -------------------------------------|---------------------------
  *      -------------------------------------|---------------------------
  *      BMI160_ACCEL_FIFO_FILT_EN            |   0x80
  *      BMI160_ACCEL_FIFO_FILT_EN            |   0x80
+ *@endverbatim
  *
  *
  *  @note The user can enable filtered gyro data by the following macro
  *  @note The user can enable filtered gyro data by the following macro
+ *
+ *@verbatim
  *      config                               |   Value
  *      config                               |   Value
  *      -------------------------------------|---------------------------
  *      -------------------------------------|---------------------------
  *      BMI160_GYRO_FIFO_FILT_EN             |   0x08
  *      BMI160_GYRO_FIFO_FILT_EN             |   0x08
+ *@endverbatim
  *
  *
  *  @note : By ORing the above mentioned macros, the user can select
  *  @note : By ORing the above mentioned macros, the user can select
  *  the required FIFO down config settings
  *  the required FIFO down config settings
@@ -472,7 +701,12 @@ int8_t bmi160_set_fifo_config(uint8_t config, uint8_t enable, struct bmi160_dev
 int8_t bmi160_set_fifo_down(uint8_t fifo_down, const struct bmi160_dev *dev);
 int8_t bmi160_set_fifo_down(uint8_t fifo_down, const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- *  @brief This API sets the FIFO watermark level in the sensor.
+ * \ingroup bmi160ApiFIFO
+ * \page bmi160_api_bmi160_set_fifo_wm bmi160_set_fifo_wm
+ * \code
+ * int8_t bmi160_set_fifo_wm(uint8_t fifo_wm, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API sets the FIFO watermark level in the sensor.
  *
  *
  *  @note The FIFO watermark is issued when the FIFO fill level is
  *  @note The FIFO watermark is issued when the FIFO fill level is
  *  equal or above the watermark level and units of watermark is 4 bytes.
  *  equal or above the watermark level and units of watermark is 4 bytes.
@@ -488,7 +722,13 @@ int8_t bmi160_set_fifo_down(uint8_t fifo_down, const struct bmi160_dev *dev);
 int8_t bmi160_set_fifo_wm(uint8_t fifo_wm, const struct bmi160_dev *dev);
 int8_t bmi160_set_fifo_wm(uint8_t fifo_wm, const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- *  @brief This API parses and extracts the accelerometer frames from
+ * \ingroup bmi160ApiFIFO
+ * \page bmi160_api_bmi160_extract_accel bmi160_extract_accel
+ * \code
+ * int8_t bmi160_extract_accel(struct bmi160_sensor_data *accel_data, uint8_t *accel_length, struct bmi160_dev const
+ **dev);
+ * \endcode
+ * @details This API parses and extracts the accelerometer frames from
  *  FIFO data read by the "bmi160_get_fifo_data" API and stores it in
  *  FIFO data read by the "bmi160_get_fifo_data" API and stores it in
  *  the "accel_data" structure instance.
  *  the "accel_data" structure instance.
  *
  *
@@ -513,7 +753,12 @@ int8_t bmi160_set_fifo_wm(uint8_t fifo_wm, const struct bmi160_dev *dev);
 int8_t bmi160_extract_accel(struct bmi160_sensor_data *accel_data, uint8_t *accel_length, struct bmi160_dev const *dev);
 int8_t bmi160_extract_accel(struct bmi160_sensor_data *accel_data, uint8_t *accel_length, struct bmi160_dev const *dev);
 
 
 /*!
 /*!
- *  @brief This API parses and extracts the gyro frames from
+ * \ingroup bmi160ApiFIFO
+ * \page bmi160_api_bmi160_extract_gyro bmi160_extract_gyro
+ * \code
+ * int8_t bmi160_extract_gyro(struct bmi160_sensor_data *gyro_data, uint8_t *gyro_length, struct bmi160_dev const *dev);
+ * \endcode
+ * @details This API parses and extracts the gyro frames from
  *  FIFO data read by the "bmi160_get_fifo_data" API and stores it in
  *  FIFO data read by the "bmi160_get_fifo_data" API and stores it in
  *  the "gyro_data" structure instance.
  *  the "gyro_data" structure instance.
  *
  *
@@ -538,7 +783,12 @@ int8_t bmi160_extract_accel(struct bmi160_sensor_data *accel_data, uint8_t *acce
 int8_t bmi160_extract_gyro(struct bmi160_sensor_data *gyro_data, uint8_t *gyro_length, struct bmi160_dev const *dev);
 int8_t bmi160_extract_gyro(struct bmi160_sensor_data *gyro_data, uint8_t *gyro_length, struct bmi160_dev const *dev);
 
 
 /*!
 /*!
- *  @brief This API parses and extracts the aux frames from
+ * \ingroup bmi160ApiFIFO
+ * \page bmi160_api_bmi160_extract_aux bmi160_extract_aux
+ * \code
+ * int8_t bmi160_extract_aux(struct bmi160_aux_data *aux_data, uint8_t *aux_len, struct bmi160_dev const *dev);
+ * \endcode
+ * @details This API parses and extracts the aux frames from
  *  FIFO data read by the "bmi160_get_fifo_data" API and stores it in
  *  FIFO data read by the "bmi160_get_fifo_data" API and stores it in
  *  the bmi160_aux_data structure instance.
  *  the bmi160_aux_data structure instance.
  *
  *
@@ -562,8 +812,19 @@ int8_t bmi160_extract_gyro(struct bmi160_sensor_data *gyro_data, uint8_t *gyro_l
  */
  */
 int8_t bmi160_extract_aux(struct bmi160_aux_data *aux_data, uint8_t *aux_len, struct bmi160_dev const *dev);
 int8_t bmi160_extract_aux(struct bmi160_aux_data *aux_data, uint8_t *aux_len, struct bmi160_dev const *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiFOC FOC
+ * @brief Start FOC of accel and gyro sensors
+ */
+
 /*!
 /*!
- *  @brief This API starts the FOC of accel and gyro
+ * \ingroup bmi160ApiFOC
+ * \page bmi160_api_bmi160_start_foc bmi160_start_foc
+ * \code
+ * int8_t bmi160_start_foc(const struct bmi160_foc_conf *foc_conf,
+ * \endcode
+ * @details This API starts the FOC of accel and gyro
  *
  *
  *  @note FOC should not be used in low-power mode of sensor
  *  @note FOC should not be used in low-power mode of sensor
  *
  *
@@ -605,8 +866,19 @@ int8_t bmi160_start_foc(const struct bmi160_foc_conf *foc_conf,
                         struct bmi160_offsets *offset,
                         struct bmi160_offsets *offset,
                         struct bmi160_dev const *dev);
                         struct bmi160_dev const *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiOffsets Offsets
+ * @brief Set / Get offset values of accel and gyro sensors
+ */
+
 /*!
 /*!
- *  @brief This API reads and stores the offset values of accel and gyro
+ * \ingroup bmi160ApiOffsets
+ * \page bmi160_api_bmi160_get_offsets bmi160_get_offsets
+ * \code
+ * int8_t bmi160_get_offsets(struct bmi160_offsets *offset, const struct bmi160_dev *dev);
+ * \endcode
+ * @details This API reads and stores the offset values of accel and gyro
  *
  *
  *  @param[in,out] offset : Structure instance of bmi160_offsets in which
  *  @param[in,out] offset : Structure instance of bmi160_offsets in which
  *                          the offset values are read and stored
  *                          the offset values are read and stored
@@ -619,7 +891,14 @@ int8_t bmi160_start_foc(const struct bmi160_foc_conf *foc_conf,
 int8_t bmi160_get_offsets(struct bmi160_offsets *offset, const struct bmi160_dev *dev);
 int8_t bmi160_get_offsets(struct bmi160_offsets *offset, const struct bmi160_dev *dev);
 
 
 /*!
 /*!
- *  @brief This API writes the offset values of accel and gyro to
+ * \ingroup bmi160ApiOffsets
+ * \page bmi160_api_bmi160_set_offsets bmi160_set_offsets
+ * \code
+ * int8_t bmi160_set_offsets(const struct bmi160_foc_conf *foc_conf,
+ *                         const struct bmi160_offsets *offset,
+ *                         struct bmi160_dev const *dev);
+ * \endcode
+ * @details This API writes the offset values of accel and gyro to
  *  the sensor but these values will be reset on POR or soft reset.
  *  the sensor but these values will be reset on POR or soft reset.
  *
  *
  *  @param[in] foc_conf    : Structure instance of bmi160_foc_conf which
  *  @param[in] foc_conf    : Structure instance of bmi160_foc_conf which
@@ -645,8 +924,19 @@ int8_t bmi160_set_offsets(const struct bmi160_foc_conf *foc_conf,
                           const struct bmi160_offsets *offset,
                           const struct bmi160_offsets *offset,
                           struct bmi160_dev const *dev);
                           struct bmi160_dev const *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiNVM NVM
+ * @brief Write image registers values to NVM
+ */
+
 /*!
 /*!
- *  @brief This API writes the image registers values to NVM which is
+ * \ingroup bmi160ApiNVM
+ * \page bmi160_api_bmi160_update_nvm bmi160_update_nvm
+ * \code
+ * int8_t bmi160_update_nvm(struct bmi160_dev const *dev);
+ * \endcode
+ * @details This API writes the image registers values to NVM which is
  *  stored even after POR or soft reset
  *  stored even after POR or soft reset
  *
  *
  *  @param[in] dev         : Structure instance of bmi160_dev.
  *  @param[in] dev         : Structure instance of bmi160_dev.
@@ -657,8 +947,21 @@ int8_t bmi160_set_offsets(const struct bmi160_foc_conf *foc_conf,
  */
  */
 int8_t bmi160_update_nvm(struct bmi160_dev const *dev);
 int8_t bmi160_update_nvm(struct bmi160_dev const *dev);
 
 
+/**
+ * \ingroup bmi160
+ * \defgroup bmi160ApiInts Interrupt status
+ * @brief Read interrupt status from the sensor
+ */
+
 /*!
 /*!
- *  @brief This API gets the interrupt status from the sensor.
+ * \ingroup bmi160ApiInts
+ * \page bmi160_api_bmi160_get_int_status bmi160_get_int_status
+ * \code
+ * int8_t bmi160_get_int_status(enum bmi160_int_status_sel int_status_sel,
+ *                            union bmi160_int_status *int_status,
+ *                            struct bmi160_dev const *dev);
+ * \endcode
+ * @details This API gets the interrupt status from the sensor.
  *
  *
  *  @param[in] int_status_sel       : Enum variable to select either individual or all the
  *  @param[in] int_status_sel       : Enum variable to select either individual or all the
  *  interrupt status bits.
  *  interrupt status bits.
@@ -680,4 +983,3 @@ int8_t bmi160_get_int_status(enum bmi160_int_status_sel int_status_sel,
 #endif
 #endif
 
 
 #endif /* BMI160_H_ */
 #endif /* BMI160_H_ */
-/** @}*/

Разница между файлами не показана из-за своего большого размера
+ 436 - 446
bmi160_defs.h


+ 13 - 0
examples/read_chip_id/Makefile

@@ -0,0 +1,13 @@
+COINES_INSTALL_PATH ?= ../../../..
+
+EXAMPLE_FILE ?= read_chip_id.c
+
+API_LOCATION ?= ../..
+
+C_SRCS += \
+$(API_LOCATION)/bmi160.c
+
+INCLUDEPATHS += \
+$(API_LOCATION)
+
+include $(COINES_INSTALL_PATH)/coines.mk

+ 241 - 0
examples/read_chip_id/read_chip_id.c

@@ -0,0 +1,241 @@
+/**
+ * Copyright (C) 2018 Bosch Sensortec GmbH
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * @file    bmi160_read_chip_id.c
+ * @brief   Sample file how to read bmi160 sensor chip ID using LIB COINES
+ *
+ */
+
+/*********************************************************************/
+/* system header files */
+/*********************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+/*********************************************************************/
+/* own header files */
+/*********************************************************************/
+#include "coines.h"
+#include "bmi160.h"
+
+/*********************************************************************/
+/* local macro definitions */
+/*! i2c interface communication, 1 - Enable; 0- Disable */
+#define BMI160_INTERFACE_I2C  1
+
+/*! spi interface communication, 1 - Enable; 0- Disable */
+#define BMI160_INTERFACE_SPI  0
+
+#if (!((BMI160_INTERFACE_I2C == 1) && (BMI160_INTERFACE_SPI == 0)) && \
+    (!((BMI160_INTERFACE_I2C == 0) && (BMI160_INTERFACE_SPI == 1))))
+#error "Invalid value given for the macros BMI160_INTERFACE_I2C / BMI160_INTERFACE_SPI"
+#endif
+
+/*! bmi160 shuttle id */
+#define BMI160_SHUTTLE_ID     0x38
+
+/*! bmi160 Device address */
+#define BMI160_DEV_ADDR       BMI160_I2C_ADDR
+
+/*********************************************************************/
+/* global variables */
+/*********************************************************************/
+
+/*! @brief This structure containing relevant bmi160 info */
+struct bmi160_dev bmi160dev;
+
+/*! @brief variable to hold the bmi160 accel data */
+struct bmi160_sensor_data bmi160_accel;
+
+/*! @brief variable to hold the bmi160 gyro data */
+struct bmi160_sensor_data bmi160_gyro;
+
+/*********************************************************************/
+/* static function declarations */
+/*********************************************************************/
+
+/*!
+ * @brief   internal API is used to initialize the sensor interface
+ */
+static void init_sensor_interface(void);
+
+/*!
+ * @brief   This internal API is used to initialize the bmi160 sensor with default
+ */
+static void init_bmi160(void);
+
+/*!
+ * @brief   This internal API is used to initialize the sensor driver interface
+ */
+static void init_bmi160_sensor_driver_interface(void);
+
+/*********************************************************************/
+/* functions */
+/*********************************************************************/
+
+/*!
+ *  @brief This internal API is used to initialize the sensor interface depending
+ *   on selection either SPI or I2C.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_sensor_interface(void)
+{
+    /* Switch VDD for sensor off */
+    coines_set_shuttleboard_vdd_vddio_config(0, 0);
+
+    /* wait until the sensor goes off */
+    coines_delay_msec(10);
+#if BMI160_INTERFACE_I2C == 1
+
+    /* SDO pin is made low for selecting I2C address 0x68 */
+    coines_set_pin_config(COINES_SHUTTLE_PIN_15, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_LOW);
+
+    /* set the sensor interface as I2C */
+    coines_config_i2c_bus(COINES_I2C_BUS_0, COINES_I2C_FAST_MODE);
+    coines_delay_msec(10);
+
+    /* CSB pin is made high for selecting I2C protocol*/
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_HIGH);
+#endif
+#if BMI160_INTERFACE_SPI == 1
+
+    /* CSB pin is made low for selecting SPI protocol*/
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_LOW);
+
+    coines_delay_msec(10);
+    coines_config_spi_bus(COINES_SPI_BUS_0, COINES_SPI_SPEED_5_MHZ, COINES_SPI_MODE3);
+#endif
+    coines_delay_msec(10);
+
+    /* Switch VDD for sensor on */
+    coines_set_shuttleboard_vdd_vddio_config(3300, 3300);
+
+#if BMI160_INTERFACE_SPI == 1
+    coines_delay_msec(10);
+
+    /* CSB pin is made high for selecting SPI protocol
+     * Note: CSB has to see rising after power up, to switch to SPI protocol */
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_HIGH);
+#endif
+}
+
+/*!
+ *  @brief This internal API is used to initializes the bmi160 sensor
+ *  settings like power mode and OSRS settings.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_bmi160(void)
+{
+    int8_t rslt;
+
+    rslt = bmi160_init(&bmi160dev);
+
+    if (rslt == BMI160_OK)
+    {
+        printf("BMI160 initialization success !\n");
+        printf("Chip ID 0x%X\n", bmi160dev.chip_id);
+    }
+    else
+    {
+        printf("BMI160 initialization failure !\n");
+        exit(COINES_E_FAILURE);
+    }
+}
+
+/*!
+ *  @brief This internal API is used to set the sensor driver interface to
+ *  read/write the data.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_bmi160_sensor_driver_interface(void)
+{
+#if BMI160_INTERFACE_I2C == 1
+
+    /* I2C setup */
+
+    /* link read/write/delay function of host system to appropriate
+     * bmi160 function call prototypes */
+    bmi160dev.write = coines_write_i2c;
+    bmi160dev.read = coines_read_i2c;
+    bmi160dev.delay_ms = coines_delay_msec;
+
+    /* set correct i2c address */
+    bmi160dev.id = BMI160_DEV_ADDR;
+    bmi160dev.intf = BMI160_I2C_INTF;
+#endif
+#if BMI160_INTERFACE_SPI == 1
+
+    /* SPI setup */
+
+    /* link read/write/delay function of host system to appropriate
+     *  bmi160 function call prototypes */
+    bmi160dev.write = coines_write_spi;
+    bmi160dev.read = coines_read_spi;
+    bmi160dev.delay_ms = coines_delay_msec;
+    bmi160dev.id = COINES_SHUTTLE_PIN_7;
+    bmi160dev.intf = BMI160_SPI_INTF;
+#endif
+}
+
+/*!
+ *  @brief Main Function where the execution getting started to test the code.
+ *
+ *  @param[in] argc
+ *  @param[in] argv
+ *
+ *  @return status
+ *
+ */
+int main(int argc, char *argv[])
+{
+    struct coines_board_info board_info;
+    int16_t rslt;
+
+    init_bmi160_sensor_driver_interface();
+
+    rslt = coines_open_comm_intf(COINES_COMM_INTF_USB);
+
+    if (rslt < 0)
+    {
+        printf(
+            "\n Unable to connect with Application Board ! \n" " 1. Check if the board is connected and powered on. \n" " 2. Check if Application Board USB driver is installed. \n"
+            " 3. Check if board is in use by another application. (Insufficient permissions to access USB) \n");
+        exit(rslt);
+    }
+
+    rslt = coines_get_board_info(&board_info);
+
+    if (rslt == COINES_SUCCESS)
+    {
+        if (board_info.shuttle_id != BMI160_SHUTTLE_ID)
+        {
+
+            printf("! Warning invalid sensor shuttle \n ," "This application will not support this sensor \n");
+            exit(COINES_E_FAILURE);
+        }
+    }
+
+    init_sensor_interface();
+
+    /* After sensor init introduce 200 msec sleep */
+    coines_delay_msec(200);
+    init_bmi160();
+    coines_close_comm_intf(COINES_COMM_INTF_USB);
+
+    return EXIT_SUCCESS;
+}

+ 13 - 0
examples/read_sensor_data/Makefile

@@ -0,0 +1,13 @@
+COINES_INSTALL_PATH ?= ../../../..
+
+EXAMPLE_FILE ?= read_sensor_data.c
+
+API_LOCATION ?= ../..
+
+C_SRCS += \
+$(API_LOCATION)/bmi160.c
+
+INCLUDEPATHS += \
+$(API_LOCATION)
+
+include $(COINES_INSTALL_PATH)/coines.mk

+ 275 - 0
examples/read_sensor_data/read_sensor_data.c

@@ -0,0 +1,275 @@
+/**
+ * Copyright (C) 2018 Bosch Sensortec GmbH
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * @file    bmi160_read_sensor_data.c
+ * @brief   Sample file to read BMI160 sensor data using COINES library
+ *
+ */
+
+/*********************************************************************/
+/* system header files */
+/*********************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+/*********************************************************************/
+/* own header files */
+/*********************************************************************/
+#include "coines.h"
+#include "bmi160.h"
+
+/*********************************************************************/
+/* local macro definitions */
+/*! I2C interface communication, 1 - Enable; 0- Disable */
+#define BMI160_INTERFACE_I2C  1
+
+/*! SPI interface communication, 1 - Enable; 0- Disable */
+#define BMI160_INTERFACE_SPI  0
+
+#if (!((BMI160_INTERFACE_I2C == 1) && (BMI160_INTERFACE_SPI == 0)) && \
+    (!((BMI160_INTERFACE_I2C == 0) && (BMI160_INTERFACE_SPI == 1))))
+#error "Invalid value given for the macros BMI160_INTERFACE_I2C / BMI160_INTERFACE_SPI"
+#endif
+
+/*! bmi160 shuttle id */
+#define BMI160_SHUTTLE_ID     0x38
+
+/*! bmi160 Device address */
+#define BMI160_DEV_ADDR       BMI160_I2C_ADDR
+
+/*********************************************************************/
+/* global variables */
+/*********************************************************************/
+
+/*! @brief This structure containing relevant bmi160 info */
+struct bmi160_dev bmi160dev;
+
+/*! @brief variable to hold the bmi160 accel data */
+struct bmi160_sensor_data bmi160_accel;
+
+/*! @brief variable to hold the bmi160 gyro data */
+struct bmi160_sensor_data bmi160_gyro;
+
+/*********************************************************************/
+/* static function declarations */
+/*********************************************************************/
+
+/*!
+ * @brief   internal API is used to initialize the sensor interface
+ */
+static void init_sensor_interface(void);
+
+/*!
+ * @brief   This internal API is used to initialize the bmi160 sensor with default
+ */
+static void init_bmi160(void);
+
+/*!
+ * @brief   This internal API is used to initialize the sensor driver interface
+ */
+static void init_bmi160_sensor_driver_interface(void);
+
+/*********************************************************************/
+/* functions */
+/*********************************************************************/
+
+/*!
+ *  @brief This internal API is used to initialize the sensor interface depending
+ *   on selection either SPI or I2C.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_sensor_interface(void)
+{
+    /* Switch VDD for sensor off */
+    coines_set_shuttleboard_vdd_vddio_config(0, 0);
+
+    /* wait until the sensor goes off */
+    coines_delay_msec(10);
+#if BMI160_INTERFACE_I2C == 1
+
+    /* SDO pin is made low for selecting I2C address 0x68 */
+    coines_set_pin_config(COINES_SHUTTLE_PIN_15, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_LOW);
+
+    /* set the sensor interface as I2C */
+    coines_config_i2c_bus(COINES_I2C_BUS_0, COINES_I2C_FAST_MODE);
+    coines_delay_msec(10);
+
+    /* CSB pin is made high for selecting I2C protocol*/
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_HIGH);
+#endif
+#if BMI160_INTERFACE_SPI == 1
+
+    /* CSB pin is made low for selecting SPI protocol*/
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_LOW);
+
+    coines_delay_msec(10);
+    coines_config_spi_bus(COINES_SPI_BUS_0, COINES_SPI_SPEED_5_MHZ, COINES_SPI_MODE3);
+#endif
+    coines_delay_msec(10);
+
+    /* Switch VDD for sensor on */
+    coines_set_shuttleboard_vdd_vddio_config(3300, 3300);
+
+#if BMI160_INTERFACE_SPI == 1
+    coines_delay_msec(10);
+
+    /* CSB pin is made high for selecting SPI protocol
+     * Note: CSB has to see rising after power up, to switch to SPI protocol */
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_HIGH);
+#endif
+}
+
+/*!
+ *  @brief This internal API is used to initializes the bmi160 sensor
+ *  settings like power mode and OSRS settings.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_bmi160(void)
+{
+    int8_t rslt;
+
+    rslt = bmi160_init(&bmi160dev);
+
+    if (rslt == BMI160_OK)
+    {
+        printf("BMI160 initialization success !\n");
+        printf("Chip ID 0x%X\n", bmi160dev.chip_id);
+    }
+    else
+    {
+        printf("BMI160 initialization failure !\n");
+        exit(COINES_E_FAILURE);
+    }
+
+    /* Select the Output data rate, range of accelerometer sensor */
+    bmi160dev.accel_cfg.odr = BMI160_ACCEL_ODR_1600HZ;
+    bmi160dev.accel_cfg.range = BMI160_ACCEL_RANGE_16G;
+    bmi160dev.accel_cfg.bw = BMI160_ACCEL_BW_NORMAL_AVG4;
+
+    /* Select the power mode of accelerometer sensor */
+    bmi160dev.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;
+
+    /* Select the Output data rate, range of Gyroscope sensor */
+    bmi160dev.gyro_cfg.odr = BMI160_GYRO_ODR_3200HZ;
+    bmi160dev.gyro_cfg.range = BMI160_GYRO_RANGE_2000_DPS;
+    bmi160dev.gyro_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE;
+
+    /* Select the power mode of Gyroscope sensor */
+    bmi160dev.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE;
+
+    /* Set the sensor configuration */
+    rslt = bmi160_set_sens_conf(&bmi160dev);
+}
+
+/*!
+ *  @brief This internal API is used to set the sensor driver interface to
+ *  read/write the data.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_bmi160_sensor_driver_interface(void)
+{
+#if BMI160_INTERFACE_I2C == 1
+
+    /* I2C setup */
+
+    /* link read/write/delay function of host system to appropriate
+     * bmi160 function call prototypes */
+    bmi160dev.write = coines_write_i2c;
+    bmi160dev.read = coines_read_i2c;
+    bmi160dev.delay_ms = coines_delay_msec;
+
+    /* set correct i2c address */
+    bmi160dev.id = BMI160_DEV_ADDR;
+    bmi160dev.intf = BMI160_I2C_INTF;
+#endif
+#if BMI160_INTERFACE_SPI == 1
+
+    /* SPI setup */
+
+    /* link read/write/delay function of host system to appropriate
+     *  bmi160 function call prototypes */
+    bmi160dev.write = coines_write_spi;
+    bmi160dev.read = coines_read_spi;
+    bmi160dev.delay_ms = coines_delay_msec;
+    bmi160dev.id = COINES_SHUTTLE_PIN_7;
+    bmi160dev.intf = BMI160_SPI_INTF;
+#endif
+}
+
+/*!
+ *  @brief Main Function where the execution getting started to test the code.
+ *
+ *  @param[in] argc
+ *  @param[in] argv
+ *
+ *  @return status
+ *
+ */
+int main(int argc, char *argv[])
+{
+    struct coines_board_info board_info;
+    int16_t rslt;
+    int times_to_read = 0;
+
+    init_bmi160_sensor_driver_interface();
+
+    rslt = coines_open_comm_intf(COINES_COMM_INTF_USB);
+
+    if (rslt < 0)
+    {
+        printf(
+            "\n Unable to connect with Application Board ! \n" " 1. Check if the board is connected and powered on. \n" " 2. Check if Application Board USB driver is installed. \n"
+            " 3. Check if board is in use by another application. (Insufficient permissions to access USB) \n");
+        exit(rslt);
+    }
+
+    rslt = coines_get_board_info(&board_info);
+
+    if (rslt == COINES_SUCCESS)
+    {
+        if (board_info.shuttle_id != BMI160_SHUTTLE_ID)
+        {
+
+            printf("! Warning invalid sensor shuttle \n ," "This application will not support this sensor \n");
+            exit(COINES_E_FAILURE);
+        }
+    }
+
+    init_sensor_interface();
+
+    /* After sensor init introduce 200 msec sleep */
+    coines_delay_msec(200);
+    init_bmi160();
+
+    while (times_to_read < 100)
+    {
+        /* To read both Accel and Gyro data */
+        bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL), &bmi160_accel, &bmi160_gyro, &bmi160dev);
+
+        printf("ax:%d\tay:%d\taz:%d\n", bmi160_accel.x, bmi160_accel.y, bmi160_accel.z);
+        printf("gx:%d\tgy:%d\tgz:%d\n", bmi160_gyro.x, bmi160_gyro.y, bmi160_gyro.z);
+        fflush(stdout);
+
+        coines_delay_msec(10);
+        times_to_read = times_to_read + 1;
+    }
+
+    coines_close_comm_intf(COINES_COMM_INTF_USB);
+
+    return EXIT_SUCCESS;
+}

+ 13 - 0
examples/tap/Makefile

@@ -0,0 +1,13 @@
+COINES_INSTALL_PATH ?= ../../../..
+
+EXAMPLE_FILE ?= tap.c
+
+API_LOCATION ?= ../..
+
+C_SRCS += \
+$(API_LOCATION)/bmi160.c
+
+INCLUDEPATHS += \
+$(API_LOCATION)
+
+include $(COINES_INSTALL_PATH)/coines.mk

+ 370 - 0
examples/tap/tap.c

@@ -0,0 +1,370 @@
+/**
+ * Copyright (C) 2018 Bosch Sensortec GmbH
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * @file    bmi160_read_sensor_data.c
+ * @brief   Sample file to read BMI160 sensor data using COINES library
+ *
+ */
+
+/*********************************************************************/
+/* system header files */
+/*********************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+/*********************************************************************/
+/* own header files */
+/*********************************************************************/
+#include "coines.h"
+#include "bmi160.h"
+
+/*********************************************************************/
+/* local macro definitions */
+/*! i2c interface communication, 1 - Enable; 0- Disable */
+#define BMI160_INTERFACE_I2C  0
+
+/*! spi interface communication, 1 - Enable; 0- Disable */
+#define BMI160_INTERFACE_SPI  1
+
+#if (!((BMI160_INTERFACE_I2C == 1) && (BMI160_INTERFACE_SPI == 0)) && \
+    (!((BMI160_INTERFACE_I2C == 0) && (BMI160_INTERFACE_SPI == 1))))
+#error "Invalid value given for the macros BMI160_INTERFACE_I2C / BMI160_INTERFACE_SPI"
+#endif
+
+/*! bmi160 shuttle id */
+#define BMI160_SHUTTLE_ID     0x38
+
+/*! bmi160 Device address */
+#define BMI160_DEV_ADDR       BMI160_I2C_ADDR
+
+/*********************************************************************/
+/* global variables */
+/*********************************************************************/
+
+/*! @brief This structure containing relevant bmi160 info */
+struct bmi160_dev bmi160dev;
+
+/*! @brief variable to hold the bmi160 accel data */
+struct bmi160_sensor_data bmi160_accel;
+
+/*! @brief variable to hold the bmi160 gyro data */
+struct bmi160_sensor_data bmi160_gyro;
+
+/*********************************************************************/
+/* static function declarations */
+/*********************************************************************/
+
+/*!
+ * @brief   internal API is used to initialize the sensor interface
+ */
+static void init_sensor_interface(void);
+
+/*!
+ * @brief   This internal API is used to initialize the bmi160 sensor with default
+ */
+static void init_bmi160(void);
+
+/*!
+ * @brief   This internal API is used to initialize the sensor driver interface
+ */
+static void init_bmi160_sensor_driver_interface(void);
+
+/*!
+ * @brief   This internal API is used to set tap configurations
+ */
+static int8_t set_tap_config(uint8_t feature_enable);
+
+/*********************************************************************/
+/* functions */
+/*********************************************************************/
+
+/*!
+ *  @brief This internal API is used to initialize the sensor interface depending
+ *   on selection either SPI or I2C.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_sensor_interface(void)
+{
+    /* Switch VDD for sensor off */
+    coines_set_shuttleboard_vdd_vddio_config(0, 0);
+
+    /* wait until the sensor goes off */
+    coines_delay_msec(10);
+#if BMI160_INTERFACE_I2C == 1
+
+    /* SDO pin is made low for selecting I2C address 0x68 */
+    coines_set_pin_config(COINES_SHUTTLE_PIN_15, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_LOW);
+
+    /* set the sensor interface as I2C */
+    coines_config_i2c_bus(COINES_I2C_BUS_0, COINES_I2C_FAST_MODE);
+    coines_delay_msec(10);
+
+    /* CSB pin is made high for selecting I2C protocol*/
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_HIGH);
+#endif
+#if BMI160_INTERFACE_SPI == 1
+
+    /* CSB pin is made low for selecting SPI protocol*/
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_LOW);
+
+    coines_delay_msec(10);
+    coines_config_spi_bus(COINES_SPI_BUS_0, COINES_SPI_SPEED_5_MHZ, COINES_SPI_MODE3);
+#endif
+    coines_delay_msec(10);
+
+    /* Switch VDD for sensor on */
+    coines_set_shuttleboard_vdd_vddio_config(3300, 3300);
+
+#if BMI160_INTERFACE_SPI == 1
+    coines_delay_msec(10);
+
+    /* CSB pin is made high for selecting SPI protocol
+     * Note: CSB has to see rising after power up, to switch to SPI protocol */
+    coines_set_pin_config(COINES_SHUTTLE_PIN_7, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_HIGH);
+#endif
+}
+
+/*!
+ *  @brief This internal API is used to initializes the bmi160 sensor
+ *  settings like power mode and OSRS settings.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_bmi160(void)
+{
+    int8_t rslt;
+
+    rslt = bmi160_init(&bmi160dev);
+
+    if (rslt == BMI160_OK)
+    {
+        printf("BMI160 initialization success !\n");
+        printf("Chip ID 0x%X\n", bmi160dev.chip_id);
+    }
+    else
+    {
+        printf("BMI160 initialization failure !\n");
+        exit(COINES_E_FAILURE);
+    }
+
+    /* Select the Output data rate, range of accelerometer sensor */
+    bmi160dev.accel_cfg.odr = BMI160_ACCEL_ODR_100HZ;
+    bmi160dev.accel_cfg.range = BMI160_ACCEL_RANGE_8G;
+    bmi160dev.accel_cfg.bw = BMI160_ACCEL_BW_NORMAL_AVG4;
+
+    /* Select the power mode of accelerometer sensor */
+    bmi160dev.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;
+
+    /* Set the sensor configuration */
+    rslt = bmi160_set_sens_conf(&bmi160dev);
+}
+
+/*!
+ *  @brief This internal API is used to set the sensor driver interface to
+ *  read/write the data.
+ *
+ *  @param[in] void
+ *
+ *  @return void
+ *
+ */
+static void init_bmi160_sensor_driver_interface(void)
+{
+#if BMI160_INTERFACE_I2C == 1
+
+    /* I2C setup */
+
+    /* link read/write/delay function of host system to appropriate
+     * bmi160 function call prototypes */
+    bmi160dev.write = coines_write_i2c;
+    bmi160dev.read = coines_read_i2c;
+    bmi160dev.delay_ms = coines_delay_msec;
+
+    /* set correct i2c address */
+    bmi160dev.id = BMI160_DEV_ADDR;
+    bmi160dev.intf = BMI160_I2C_INTF;
+#endif
+#if BMI160_INTERFACE_SPI == 1
+
+    /* SPI setup */
+
+    /* link read/write/delay function of host system to appropriate
+     *  bmi160 function call prototypes */
+    bmi160dev.write = coines_write_spi;
+    bmi160dev.read = coines_read_spi;
+    bmi160dev.delay_ms = coines_delay_msec;
+    bmi160dev.id = COINES_SHUTTLE_PIN_7;
+    bmi160dev.intf = BMI160_SPI_INTF;
+#endif
+}
+
+/*!
+ *  @brief Main Function where the execution getting started to test the code.
+ *
+ *  @param[in] argc
+ *  @param[in] argv
+ *
+ *  @return status
+ *
+ */
+int main(int argc, char *argv[])
+{
+    struct coines_board_info board_info;
+    int16_t rslt;
+
+    init_bmi160_sensor_driver_interface();
+
+    rslt = coines_open_comm_intf(COINES_COMM_INTF_USB);
+
+    if (rslt < 0)
+    {
+        printf(
+            "\n Unable to connect with Application Board ! \n" " 1. Check if the board is connected and powered on. \n" " 2. Check if Application Board USB driver is installed. \n"
+            " 3. Check if board is in use by another application. (Insufficient permissions to access USB) \n");
+        exit(rslt);
+    }
+
+    rslt = coines_get_board_info(&board_info);
+
+    if (rslt == COINES_SUCCESS)
+    {
+        if (board_info.shuttle_id != BMI160_SHUTTLE_ID)
+        {
+
+            printf("! Warning invalid sensor shuttle \n ," "This application will not support this sensor \n");
+            exit(COINES_E_FAILURE);
+        }
+    }
+
+    init_sensor_interface();
+
+    /* after sensor init introduce 200 msec sleep */
+    coines_delay_msec(200);
+    init_bmi160();
+
+    rslt = set_tap_config(BMI160_ENABLE);
+    if (rslt == BMI160_OK)
+    {
+        union bmi160_int_status int_status;
+        uint8_t loop = 0;
+        uint32_t last_time = 0;
+        uint32_t current_time = 0;
+
+        printf("Do Single or Double Tap the board\n");
+        fflush(stdout);
+
+        memset(int_status.data, 0x00, sizeof(int_status.data));
+
+        while (loop < 10)
+        {
+            /* Read interrupt status */
+            rslt = bmi160_get_int_status(BMI160_INT_STATUS_ALL, &int_status, &bmi160dev);
+            current_time = coines_get_millis();
+
+            /* Enters only if the obtained interrupt is single-tap */
+            if (rslt == BMI160_OK)
+            {
+                /* Enters only if the obtained interrupt is single-tap */
+                if (int_status.bit.s_tap)
+                {
+                    printf("Single tap, iter:%d, time:%d ms, delta:%d ms, int_status:0x%x\n",
+                           loop++,
+                           current_time,
+                           current_time - last_time,
+                           int_status.data[0]);
+                }
+                /* Enters only if the obtained interrupt is double-tap */
+                else if (int_status.bit.d_tap)
+                {
+                    printf("Double tap, iter:%d, time:%d ms, delta:%d ms, int_status:0x%x\n",
+                           loop++,
+                           current_time,
+                           current_time - last_time,
+                           int_status.data[0]);
+                }
+
+                fflush(stdout);
+            }
+            else
+            {
+                break;
+            }
+
+            memset(int_status.data, 0x00, sizeof(int_status.data));
+            last_time = current_time;
+        }
+
+        /* Disable tap feature */
+        printf("\nDisable tap test...\n");
+        rslt = set_tap_config(BMI160_DISABLE);
+        printf("bmi160_set_int_config(tap enable) status:%d\n", rslt);
+
+        fflush(stdout);
+    }
+
+    coines_close_comm_intf(COINES_COMM_INTF_USB);
+
+    return EXIT_SUCCESS;
+}
+
+static int8_t set_tap_config(uint8_t feature_enable)
+{
+    int8_t rslt = BMI160_OK;
+    struct bmi160_int_settg int_config;
+
+    if (feature_enable > 0)
+    {
+        /* Select the Interrupt channel/pin */
+        int_config.int_channel = BMI160_INT_CHANNEL_1; /* Interrupt channel/pin 1 */
+
+        /* Select the interrupt channel/pin settings */
+        int_config.int_pin_settg.output_en = BMI160_ENABLE; /* Enabling interrupt pins to act as output pin */
+        int_config.int_pin_settg.output_mode = BMI160_DISABLE; /* Choosing push-pull mode for interrupt pin */
+        int_config.int_pin_settg.output_type = BMI160_ENABLE; /* Choosing active low output */
+        int_config.int_pin_settg.edge_ctrl = BMI160_DISABLE; /* Choosing edge triggered output */
+        int_config.int_pin_settg.input_en = BMI160_DISABLE; /* Disabling interrupt pin to act as input */
+        int_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_NONE; /* non-latched output */
+
+        /* Select the Interrupt type */
+        int_config.int_type = BMI160_ACC_SINGLE_TAP_INT; /* Choosing tap interrupt */
+
+        /* Select the Any-motion interrupt parameters */
+        int_config.int_type_cfg.acc_tap_int.tap_en = BMI160_ENABLE; /* 1- Enable tap, 0- disable tap */
+        int_config.int_type_cfg.acc_tap_int.tap_thr = 2; /* Set tap threshold */
+        int_config.int_type_cfg.acc_tap_int.tap_dur = 2; /* Set tap duration */
+        int_config.int_type_cfg.acc_tap_int.tap_shock = 0; /* Set tap shock value */
+        int_config.int_type_cfg.acc_tap_int.tap_quiet = 0; /* Set tap quiet duration */
+        int_config.int_type_cfg.acc_tap_int.tap_data_src = 1; /* data source 0 : filter or 1 : pre-filter */
+
+        /* Set the Any-motion interrupt */
+        rslt = bmi160_set_int_config(&int_config, &bmi160dev); /* sensor is an instance of the structure bmi160_dev  */
+        printf("bmi160_set_int_config(tap enable) status:%d\n", rslt);
+    }
+    else
+    {
+        /* Select the Interrupt channel/pin */
+        int_config.int_channel = BMI160_INT_CHANNEL_1;
+        int_config.int_pin_settg.output_en = BMI160_DISABLE; /* Disabling interrupt pins to act as output pin */
+        int_config.int_pin_settg.edge_ctrl = BMI160_DISABLE; /* Choosing edge triggered output */
+
+        /* Select the Interrupt type */
+        int_config.int_type = BMI160_ACC_SINGLE_TAP_INT; /* Choosing Tap interrupt */
+        int_config.int_type_cfg.acc_tap_int.tap_en = BMI160_DISABLE; /* 1- Enable tap, 0- disable tap */
+
+        /* Set the Data ready interrupt */
+        rslt = bmi160_set_int_config(&int_config, &bmi160dev); /* sensor is an instance of the structure bmi160_dev */
+        printf("bmi160_set_int_config(tap disable) status:%d\n", rslt);
+    }
+
+    return rslt;
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов