| /* Bosch BMG160 gyro driver */ |
| |
| /* |
| * Copyright (c) 2016 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef _BMG160_H_ |
| #define _BMG160_H_ |
| |
| #include <i2c.h> |
| #include <gpio.h> |
| #include <misc/util.h> |
| #include <misc/nano_work.h> |
| |
| /* registers */ |
| #define BMG160_REG_CHIPID 0x00 |
| #define BMG160_REG_RATE_X 0x02 |
| #define BMG160_REG_RATE_Y 0x04 |
| #define BMG160_REG_RATE_Z 0x06 |
| #define BMG160_REG_TEMP 0x08 |
| #define BMG160_REG_INT_STATUS0 0x09 |
| #define BMG160_REG_INT_STATUS1 0x0A |
| #define BMG160_REG_INT_STATUS2 0x0B |
| #define BMG160_REG_INT_STATUS3 0x0C |
| #define BMG160_REG_FIFO_STATUS 0x0E |
| #define BMG160_REG_RANGE 0x0F |
| #define BMG160_REG_BW 0x10 |
| #define BMG160_REG_LPM1 0x11 |
| #define BMG160_REG_LPM2 0x12 |
| #define BMG160_REG_RATE_HBW 0x13 |
| #define BMG160_REG_BGW_SOFTRESET 0x14 |
| #define BMG160_REG_INT_EN0 0x15 |
| #define BMG160_REG_INT_EN1 0x16 |
| #define BMG160_REG_INT_MAP0 0x17 |
| #define BMG160_REG_INT_MAP1 0x18 |
| #define BMG160_REG_INT_MAP2 0x19 |
| #define BMG160_REG_FILTER 0x1A |
| #define BMG160_REG_THRES 0x1B |
| #define BMG160_REG_ANY_EN 0x1C |
| #define BMG160_REG_FIFO_WM 0x1E |
| #define BMG160_REG_INT_RST_LATCH 0x21 |
| #define BMG160_REG_HIGH_TH_X 0x22 |
| #define BMG160_REG_HIGH_DUR_X 0x23 |
| #define BMG160_REG_HIGH_TH_Y 0x24 |
| #define BMG160_REG_HIGH_DUR_Y 0x25 |
| #define BMG160_REG_HIGH_TH_Z 0x26 |
| #define BMG160_REG_HIGH_DUR_Z 0x27 |
| #define BMG160_REG_SOC 0x31 |
| #define BMG160_REG_A_FOC 0x32 |
| #define BMG160_REG_TRIM_NVM_CTRL 0x33 |
| #define BMG160_REG_BGW_SPI3_WDT 0x34 |
| #define BMG160_REG_OFC1 0x36 |
| #define BMG160_REG_OFC2 0x37 |
| #define BMG160_REG_OFC3 0x38 |
| #define BMG160_REG_OFC4 0x39 |
| #define BMG160_REG_TRIM_GP0 0x3A |
| #define BMG160_REG_TRIM_GP1 0x3B |
| #define BMG160_REG_TRIM_BIST 0x3C |
| #define BMG160_REG_TRIM_FIFO_CONFIG0 0x3D |
| #define BMG160_REG_TRIM_FIFO_CONFIG1 0x3E |
| #define BMG160_REG_TRIM_FIFO_DATA 0x3F |
| |
| /* bitfields */ |
| |
| /* BMG160_REG_INT_STATUS0 */ |
| #define BMG160_HIGH_INT BIT(1) |
| #define BMG160_ANY_INT BIT(2) |
| |
| /* BMG160_REG_INT_STATUS1 */ |
| #define BMG160_FIFO_INT BIT(4) |
| #define BMG160_FAST_OFFSET_INT BIT(5) |
| #define BMG160_AUTO_OFFSET_INT BIT(6) |
| #define BMG160_DATA_INT BIT(7) |
| |
| /* BMG160_REG_INT_STATUS2 */ |
| #define BMG160_ANY_FIRST_X BIT(0) |
| #define BMG160_ANY_FIRST_Y BIT(1) |
| #define BMG160_ANY_FIRST_Z BIT(2) |
| #define BMG160_ANY_SIGN BIT(3) |
| |
| /* BMG160_REG_INT_STATUS3 */ |
| #define BMG160_HIGH_FIRST_X BIT(0) |
| #define BMG160_HIGH_FIRST_Y BIT(1) |
| #define BMG160_HIGH_FIRST_Z BIT(2) |
| #define BMG160_HIGH_SIGN BIT(3) |
| |
| /* BMG160_REG_FIFO_STATUS */ |
| #define BMG160_FIFO_FRAME_COUNTER_MASK 0x7F |
| #define BMG160_FIFO_OVERRUN BIT(7) |
| |
| /* BMG160_REG_INT_EN_0 */ |
| #define BMG160_AUTO_OFFSET_EN BIT(2) |
| #define BMG160_FIFO_EN BIT(6) |
| #define BMG160_DATA_EN BIT(7) |
| |
| /* BMG160_REG_INT_EN_1 */ |
| #define BMG160_INT1_LVL BIT(0) |
| #define BMG160_INT1_OD BIT(1) |
| #define BMG160_INT2_LVL BIT(2) |
| #define BMG160_INT2_OD BIT(3) |
| |
| /* BMG160_REG_INT_MAP0 */ |
| #define BMG160_INT1_ANY BIT(1) |
| #define BMG160_INT1_HIGH BIT(3) |
| |
| /* BMG160_REG_INT_MAP1 */ |
| #define BMG160_INT1_DATA BIT(0) |
| #define BMG160_INT1_FAST_OFFSET BIT(1) |
| #define BMG160_INT1_FIFO BIT(2) |
| #define BMG160_INT1_AUTO_OFFSET BIT(3) |
| #define BMG160_INT2_AUTO_OFFSET BIT(4) |
| #define BMG160_INT2_FIFO BIT(5) |
| #define BMG160_INT2_FAST_OFFSET BIT(6) |
| #define BMG160_INT2_DATA BIT(7) |
| |
| /* BMG160_REG_ANY_EN */ |
| #define BMG160_AWAKE_DUR_POS 6 |
| #define BMG160_AWAKE_DUR_MASK (0x3 << 6) |
| #define BMG160_ANY_DURSAMPLE_POS 4 |
| #define BMG160_ANY_DURSAMPLE_MASK (0x3 << 4) |
| #define BMG160_ANY_EN_Z BIT(2) |
| #define BMG160_ANY_EN_Y BIT(1) |
| #define BMG160_ANY_EN_X BIT(0) |
| #define BMG160_ANY_EN_MASK 0x7 |
| |
| /* BMG160_REG_INT_RST_LATCH */ |
| #define BMG160_RESET_INT BIT(7) |
| #define BMG160_OFFSET_RESET BIT(6) |
| #define BMG160_LATCH_STATUS_BIT BIT(4) |
| #define BMG160_LATCH_INT_MASK 0x0F |
| |
| /* BMG160_REG_THRES */ |
| #define BMG160_THRES_MASK 0x7F |
| |
| /* other */ |
| #define BMG160_CHIP_ID 0x0F |
| #define BMG160_RESET 0xB6 |
| |
| #define BMG160_RANGE_TO_SCALE(range_dps) \ |
| ((2 * range_dps * SENSOR_PI) / 180LL / 65536LL) |
| #define BMG160_SCALE_TO_RANGE(scale) \ |
| (((scale * 90LL * 65536LL) + SENSOR_PI / 2) / SENSOR_PI) |
| |
| /* default settings, based on menuconfig options */ |
| #if defined(CONFIG_BMG160_RANGE_RUNTIME) ||\ |
| defined(CONFIG_BMG160_RANGE_2000DPS) |
| # define BMG160_DEFAULT_RANGE 0 |
| #elif defined(CONFIG_BMG160_RANGE_1000DPS) |
| # define BMG160_DEFAULT_RANGE 1 |
| #elif defined(CONFIG_BMG160_RANGE_500DPS) |
| # define BMG160_DEFAULT_RANGE 2 |
| #elif defined(CONFIG_BMG160_RANGE_250DPS) |
| # define BMG160_DEFAULT_RANGE 3 |
| #else |
| # define BMG160_DEFAULT_RANGE 4 |
| #endif |
| |
| #if defined(CONFIG_BMG160_ODR_RUNTIME) ||\ |
| defined(CONFIG_BMG160_ODR_100) |
| # define BMG160_DEFAULT_ODR 5 |
| #elif defined(CONFIG_BMG160_ODR_200) |
| # define BMG160_DEFAULT_ODR 4 |
| #elif defined(CONFIG_BMG160_ODR_400) |
| # define BMG160_DEFAULT_ODR 3 |
| #elif defined(CONFIG_BMG160_ODR_1000) |
| # define BMG160_DEFAULT_ODR 2 |
| #else |
| # define BMG160_DEFAULT_ODR 1 |
| #endif |
| |
| #if defined(CONFIG_BMG160_I2C_SPEED_STANDARD) |
| #define BMG160_BUS_SPEED I2C_SPEED_STANDARD |
| #elif defined(CONFIG_BMG160_I2C_SPEED_FAST) |
| #define BMG160_BUS_SPEED I2C_SPEED_FAST |
| #endif |
| |
| /* end of default settigns */ |
| |
| struct bmg160_device_config { |
| const char *i2c_port; |
| #ifdef CONFIG_BMG160_TRIGGER |
| const char *gpio_port; |
| #endif |
| uint16_t i2c_addr; |
| uint8_t i2c_speed; |
| #ifdef CONFIG_BMG160_TRIGGER |
| uint8_t int_pin; |
| #endif |
| }; |
| |
| struct bmg160_device_data { |
| struct device *i2c; |
| #ifdef CONFIG_BMG160_TRIGGER |
| struct device *gpio; |
| struct gpio_callback gpio_cb; |
| #endif |
| #ifdef CONFIG_BMG160_TRIGGER_OWN_FIBER |
| struct nano_sem trig_sem; |
| #endif |
| struct nano_sem sem; |
| #ifdef CONFIG_BMG160_TRIGGER_GLOBAL_FIBER |
| struct nano_work work; |
| struct device *dev; |
| #endif |
| #ifdef CONFIG_BMG160_TRIGGER |
| sensor_trigger_handler_t anymotion_handler; |
| sensor_trigger_handler_t drdy_handler; |
| #endif |
| int16_t raw_gyro_xyz[3]; |
| uint16_t scale; |
| uint8_t range_idx; |
| |
| int8_t raw_temp; |
| }; |
| |
| int bmg160_trigger_init(struct device *dev); |
| int bmg160_trigger_set(struct device *dev, |
| const struct sensor_trigger *trig, |
| sensor_trigger_handler_t handler); |
| int bmg160_read(struct device *dev, uint8_t reg_addr, uint8_t *data, |
| uint8_t len); |
| int bmg160_read_byte(struct device *dev, uint8_t reg_addr, uint8_t *byte); |
| int bmg160_update_byte(struct device *dev, uint8_t reg_addr, uint8_t mask, |
| uint8_t value); |
| int bmg160_write_byte(struct device *dev, uint8_t reg_addr, uint8_t data); |
| int bmg160_slope_config(struct device *dev, enum sensor_attribute attr, |
| const struct sensor_value *val); |
| |
| #define SYS_LOG_DOMAIN "BMG160" |
| #define SYS_LOG_LEVEL CONFIG_BMG160_SYS_LOG_LEVEL |
| #include <misc/sys_log.h> |
| #endif /* _BMG160_H_ */ |