Repository: incubator-mynewt-core Updated Branches: refs/heads/sensors_branch 7fdea4768 -> 7b7941e97
First pass at LSM303DLHC sensor driver Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/f720b6e4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/f720b6e4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/f720b6e4 Branch: refs/heads/sensors_branch Commit: f720b6e405855ffe720fa86a204a7056f0525963 Parents: 7fdea47 Author: microbuilder <[email protected]> Authored: Thu Dec 22 12:24:02 2016 +0100 Committer: microbuilder <[email protected]> Committed: Thu Dec 22 12:24:02 2016 +0100 ---------------------------------------------------------------------- .../lsm303dlhc/include/lsm303dlhc/lsm303dlhc.h | 90 +++++ hw/drivers/sensors/lsm303dlhc/pkg.yml | 24 ++ hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c | 398 +++++++++++++++++++ .../sensors/lsm303dlhc/src/lsm303dlhc_priv.h | 88 ++++ hw/drivers/sensors/lsm303dlhc/syscfg.yml | 32 ++ 5 files changed, 632 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f720b6e4/hw/drivers/sensors/lsm303dlhc/include/lsm303dlhc/lsm303dlhc.h ---------------------------------------------------------------------- diff --git a/hw/drivers/sensors/lsm303dlhc/include/lsm303dlhc/lsm303dlhc.h b/hw/drivers/sensors/lsm303dlhc/include/lsm303dlhc/lsm303dlhc.h new file mode 100644 index 0000000..c5e9601 --- /dev/null +++ b/hw/drivers/sensors/lsm303dlhc/include/lsm303dlhc/lsm303dlhc.h @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 __SENSOR_LSM303DLHC_H__ +#define __SENSOR_LSM303DLHC_H__ + +#include "os/os.h" +#include "os/os_dev.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum lsm303dlhc_accel_range { + LSM303DLHC_ACCEL_RANGE_2 = 0x00 << 4, /* +/- 2g */ + LSM303DLHC_ACCEL_RANGE_4 = 0x01 << 4, /* +/- 4g */ + LSM303DLHC_ACCEL_RANGE_8 = 0x02 << 4, /* +/- 8g */ + LSM303DLHC_ACCEL_RANGE_16 = 0x03 << 4, /* +/- 16g */ +}; + +enum lsm303dlhc_accel_rate { + LSM303DLHC_ACCEL_RATE_POWER_DOWN = 0x00 << 4, + LSM303DLHC_ACCEL_RATE_1 = 0x01 << 4, + LSM303DLHC_ACCEL_RATE_10 = 0x02 << 4, + LSM303DLHC_ACCEL_RATE_25 = 0x03 << 4, + LSM303DLHC_ACCEL_RATE_50 = 0x04 << 4, + LSM303DLHC_ACCEL_RATE_100 = 0x05 << 4, + LSM303DLHC_ACCEL_RATE_200 = 0x06 << 4, + LSM303DLHC_ACCEL_RATE_400 = 0x07 << 4, + LSM303DLHC_ACCEL_RATE_1620 = 0x08 << 4 +}; + +enum lsm303dlhc_mag_gain { + LSM303DLHC_MAG_GAIN_1_3 = 0x20 << 5, /* +/- 1.3 gauss */ + LSM303DLHC_MAG_GAIN_1_9 = 0x40 << 5, /* +/- 1.9 gauss */ + LSM303DLHC_MAG_GAIN_2_5 = 0x60 << 5, /* +/- 2.5 gauss */ + LSM303DLHC_MAG_GAIN_4_0 = 0x80 << 5, /* +/- 4.0 gauss */ + LSM303DLHC_MAG_GAIN_4_7 = 0xA0 << 5, /* +/- 4.7 gauss */ + LSM303DLHC_MAG_GAIN_5_6 = 0xC0 << 5, /* +/- 5.6 gauss */ + LSM303DLHC_MAG_GAIN_8_1 = 0xE0 << 5 /* +/- 8.1 gauss */ +}; + +enum lsm303dlhc_mag_rate { + LSM303DLHC_MAG_RATE_0_7 = 0x00 << 2, /* 0.75 Hz */ + LSM303DLHC_MAG_RATE_1_5 = 0x01 << 2, /* 1.5 Hz */ + LSM303DLHC_MAG_RATE_3_0 = 0x02 << 2, /* 3.0 Hz */ + LSM303DLHC_MAG_RATE_7_5 = 0x03 << 2, /* 7.5 Hz */ + LSM303DLHC_MAG_RATE_15 = 0x04 << 2, /* 15 Hz */ + LSM303DLHC_MAG_RATE_30 = 0x05 << 2, /* 30 Hz */ + LSM303DLHC_MAG_RATE_75 = 0x06 << 2, /* 75 Hz */ + LSM303DLHC_MAG_RATE_220 = 0x07 << 2 /* 220 Hz */ +}; + +struct lsm303dlhc_cfg { + enum lsm303dlhc_accel_range accel_range; + enum lsm303dlhc_accel_rate accel_rate; + uint16_t sample_itvl; +}; + +struct lsm303dlhc { + struct os_dev dev; + struct sensor sensor; + struct lsm303dlhc_cfg cfg; + os_time_t last_read_time; +}; + +int lsm303dlhc_init(struct os_dev *, void *); +int lsm303dlhc_config(struct lsm303dlhc *, struct lsm303dlhc_cfg *); + +#ifdef __cplusplus +} +#endif + +#endif /* __SENSOR_LSM303DLHC_H__ */ http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f720b6e4/hw/drivers/sensors/lsm303dlhc/pkg.yml ---------------------------------------------------------------------- diff --git a/hw/drivers/sensors/lsm303dlhc/pkg.yml b/hw/drivers/sensors/lsm303dlhc/pkg.yml new file mode 100644 index 0000000..d15d371 --- /dev/null +++ b/hw/drivers/sensors/lsm303dlhc/pkg.yml @@ -0,0 +1,24 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# + +pkg.name: hw/drivers/sensors/lsm303dlhc +pkg.description: Driver for the LSM303DLHC 3 axis accel/mag +pkg.author: "Adafruit Industries" +pkg.homepage: "http://www.adafruit.com" +pkg.keywords: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f720b6e4/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c ---------------------------------------------------------------------- diff --git a/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c b/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c new file mode 100644 index 0000000..a4f4996 --- /dev/null +++ b/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c @@ -0,0 +1,398 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * resarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include <string.h> +#include <errno.h> +#include <assert.h> + +#include "defs/error.h" +#include "os/os.h" +#include "sysinit/sysinit.h" +#include "hal/hal_i2c.h" +#include "sensor/sensor.h" +#include "sensor/accel.h" +#include "lsm303dlhc/lsm303dlhc.h" +#include "lsm303dlhc_priv.h" + +#if MYNEWT_VAL(LSM303DLHC_LOG) +#include "log/log.h" +#endif + +#if MYNEWT_VAL(LSM303DLHC_STATS) +#include "stats/stats.h" +#endif + +#if MYNEWT_VAL(LSM303DLHC_STATS) +/* Define the stats section and records */ +STATS_SECT_START(lsm303dlhc_stat_section) + STATS_SECT_ENTRY(samples_acc_2g) + STATS_SECT_ENTRY(samples_acc_4g) + STATS_SECT_ENTRY(samples_acc_8g) + STATS_SECT_ENTRY(samples_acc_16g) + STATS_SECT_ENTRY(errors) +STATS_SECT_END + +/* Define stat names for querying */ +STATS_NAME_START(lsm303dlhc_stat_section) + STATS_NAME(lsm303dlhc_stat_section, samples_acc_2g) + STATS_NAME(lsm303dlhc_stat_section, samples_acc_4g) + STATS_NAME(lsm303dlhc_stat_section, samples_acc_8g) + STATS_NAME(lsm303dlhc_stat_section, samples_acc_16g) + STATS_NAME(lsm303dlhc_stat_section, errors) +STATS_NAME_END(lsm303dlhc_stat_section) + +/* Global variable used to hold stats data */ +STATS_SECT_DECL(lsm303dlhc_stat_section) g_lsm303dlhcstats; +#endif + +#if MYNEWT_VAL(LSM303DLHC_LOG) +#define LOG_MODULE_LSM303DLHC (303) +#define LSM303DLHC_INFO(...) LOG_INFO(&_log, LOG_MODULE_LSM303DLHC, __VA_ARGS__) +#define LSM303DLHC_ERR(...) LOG_ERROR(&_log, LOG_MODULE_LSM303DLHC, __VA_ARGS__) +static struct log _log; +#else +#define LSM303DLHC_INFO(...) +#define LSM303DLHC_ERR(...) +#endif + +/* Exports for the sensor interface. + */ +static void *lsm303dlhc_sensor_get_interface(struct sensor *, sensor_type_t); +static int lsm303dlhc_sensor_read(struct sensor *, sensor_type_t, + sensor_data_func_t, void *, uint32_t); +static int lsm303dlhc_sensor_get_config(struct sensor *, sensor_type_t, + struct sensor_cfg *); + +static const struct sensor_driver g_lsm303dlhc_sensor_driver = { + lsm303dlhc_sensor_get_interface, + lsm303dlhc_sensor_read, + lsm303dlhc_sensor_get_config +}; + +/** + * Writes a single byte to the specified register + * + * @param The I2C address to use + * @param The register address to write to + * @param The value to write + * + * @return 0 on success, non-zero error on failure. + */ +int +lsm303dlhc_write8(uint8_t addr, uint8_t reg, uint32_t value) +{ + int rc; + uint8_t payload[2] = { reg, value & 0xFF }; + + struct hal_i2c_master_data data_struct = { + .address = addr, + .len = 2, + .buffer = payload + }; + + rc = hal_i2c_master_write(MYNEWT_VAL(LSM303DLHC_I2CBUS), &data_struct, + OS_TICKS_PER_SEC / 10, 1); + if (rc) { + LSM303DLHC_ERR("Failed to write to 0x%02X:0x%02X with value 0x%02X\n", + addr, reg, value); + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, errors); + #endif + } + + return rc; +} + +/** + * Reads a single byte from the specified register + * + * @param The I2C address to use + * @param The register address to read from + * @param Pointer to where the register value should be written + * + * @return 0 on success, non-zero error on failure. + */ +int +lsm303dlhc_read8(uint8_t addr, uint8_t reg, uint8_t *value) +{ + int rc; + uint8_t payload; + + struct hal_i2c_master_data data_struct = { + .address = addr, + .len = 1, + .buffer = &payload + }; + + /* Register write */ + payload = reg; + rc = hal_i2c_master_write(MYNEWT_VAL(LSM303DLHC_I2CBUS), &data_struct, + OS_TICKS_PER_SEC / 10, 1); + if (rc) { + LSM303DLHC_ERR("I2C access failed at address 0x%02X\n", addr); + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, errors); + #endif + goto error; + } + + /* Read one byte back */ + payload = 0; + rc = hal_i2c_master_read(MYNEWT_VAL(LSM303DLHC_I2CBUS), &data_struct, + OS_TICKS_PER_SEC / 10, 1); + *value = payload; + if (rc) { + LSM303DLHC_ERR("Failed to read from 0x%02X:0x%02X\n", addr, reg); + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, errors); + #endif + } + +error: + return rc; +} + +int +lsm303dlhc_read48(uint8_t addr, uint8_t reg, int16_t *x, int16_t*y, int16_t *z) +{ + int rc; + uint8_t payload[7] = { reg | 0x80, 0, 0, 0, 0, 0, 0 }; + + struct hal_i2c_master_data data_struct = { + .address = addr, + .len = 1, + .buffer = payload + }; + + /* Register write */ + rc = hal_i2c_master_write(MYNEWT_VAL(LSM303DLHC_I2CBUS), &data_struct, + OS_TICKS_PER_SEC / 10, 1); + if (rc) { + LSM303DLHC_ERR("I2C access failed at address 0x%02X\n", addr); + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, errors); + #endif + goto error; + } + + /* Read six bytes back */ + memset(payload, 0, sizeof(payload)); + data_struct.len = 6; + rc = hal_i2c_master_read(MYNEWT_VAL(LSM303DLHC_I2CBUS), &data_struct, + OS_TICKS_PER_SEC / 10, 1); + + /* Shift 12-bit left-aligned accel values into 16-bit int */ + *x = ((int16_t)(payload[0] | (payload[1] << 8))) >> 4; + *y = ((int16_t)(payload[2] | (payload[3] << 8))) >> 4; + *z = ((int16_t)(payload[4] | (payload[5] << 8))) >> 4; + + if (rc) { + LSM303DLHC_ERR("Failed to read from 0x%02X:0x%02X\n", addr, reg); + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, errors); + #endif + goto error; + } + + /* ToDo: Log raw reads */ + // console_printf("0x%04X\n", (uint16_t)payload[0] | ((uint16_t)payload[1] << 8)); + +error: + return rc; +} + +/** + * Expects to be called back through os_dev_create(). + * + * @param The device object associated with this accellerometer + * @param Argument passed to OS device init, unused + * + * @return 0 on success, non-zero error on failure. + */ +int +lsm303dlhc_init(struct os_dev *dev, void *arg) +{ + struct lsm303dlhc *lsm; + struct sensor *sensor; + int rc; + + lsm = (struct lsm303dlhc *) dev; + + #if MYNEWT_VAL(LSM303DLHC_LOG) + log_register("lsm303dlhc", &_log, &log_console_handler, NULL, LOG_SYSLEVEL); + #endif + + sensor = &lsm->sensor; + + #if MYNEWT_VAL(LSM303DLHC_STATS) + /* Initialise the stats entry */ + rc = stats_init( + STATS_HDR(g_lsm303dlhcstats), + STATS_SIZE_INIT_PARMS(g_lsm303dlhcstats, STATS_SIZE_32), + STATS_NAME_INIT_PARMS(lsm303dlhc_stat_section)); + SYSINIT_PANIC_ASSERT(rc == 0); + /* Register the entry with the stats registry */ + rc = stats_register("lsm303dlhc", STATS_HDR(g_lsm303dlhcstats)); + SYSINIT_PANIC_ASSERT(rc == 0); + #endif + + rc = sensor_init(sensor, dev); + if (rc != 0) { + goto err; + } + + rc = sensor_set_driver(sensor, SENSOR_TYPE_ACCELEROMETER, + (struct sensor_driver *) &g_lsm303dlhc_sensor_driver); + if (rc != 0) { + goto err; + } + + rc = sensor_mgr_register(sensor); + if (rc != 0) { + goto err; + } + + return (0); +err: + return (rc); +} + +int +lsm303dlhc_config(struct lsm303dlhc *lsm, struct lsm303dlhc_cfg *cfg) +{ + int rc; + + /* Overwrite the configuration associated with this generic accelleromter. */ + memcpy(&lsm->cfg, cfg, sizeof(*cfg)); + + /* Set data rate (or power down) and enable XYZ output */ + rc = lsm303dlhc_write8(LSM303DLHC_ADDR_ACCEL, + LSM303DLHC_REGISTER_ACCEL_CTRL_REG1_A, + lsm->cfg.accel_rate | 0x07); + if (rc != 0) { + goto err; + } + + /* Set scale */ + rc = lsm303dlhc_write8(LSM303DLHC_ADDR_ACCEL, + LSM303DLHC_REGISTER_ACCEL_CTRL_REG4_A, + lsm->cfg.accel_range); + if (rc != 0) { + goto err; + } + +err: + return (rc); +} + +static void * +lsm303dlhc_sensor_get_interface(struct sensor *sensor, sensor_type_t type) +{ + return (NULL); +} + +static int +lsm303dlhc_sensor_read(struct sensor *sensor, sensor_type_t type, + sensor_data_func_t data_func, void *data_arg, uint32_t timeout) +{ + struct lsm303dlhc *lsm; + struct sensor_accel_data sad; + int rc; + int16_t x, y, z; + float mg_lsb; + + /* If the read isn't looking for accel data, then don't do anything. */ + if (!(type & SENSOR_TYPE_ACCELEROMETER)) { + rc = SYS_EINVAL; + goto err; + } + + lsm = (struct lsm303dlhc *) SENSOR_GET_DEVICE(sensor); + + x = y = z = 0; + lsm303dlhc_read48(LSM303DLHC_ADDR_ACCEL, + LSM303DLHC_REGISTER_ACCEL_OUT_X_L_A, + &x, &y, &z); + + /* Determine mg per lsb based on range */ + switch(lsm->cfg.accel_range) { + case LSM303DLHC_ACCEL_RANGE_2: + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, samples_acc_2g); + #endif + mg_lsb = 0.001F; + break; + case LSM303DLHC_ACCEL_RANGE_4: + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, samples_acc_4g); + #endif + mg_lsb = 0.002F; + break; + case LSM303DLHC_ACCEL_RANGE_8: + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, samples_acc_8g); + #endif + mg_lsb = 0.004F; + break; + case LSM303DLHC_ACCEL_RANGE_16: + #if MYNEWT_VAL(LSM303DLHC_STATS) + STATS_INC(g_lsm303dlhcstats, samples_acc_16g); + #endif + mg_lsb = 0.012F; + break; + default: + LSM303DLHC_ERR("Unknown accel range: 0x%02X. Assuming +/-2G.\n", + lsm->cfg.accel_range); + mg_lsb = 0.001F; + break; + } + + /* Convert from mg to Earth gravity in m/s^2 */ + sad.sad_x = (float)x * mg_lsb * 9.80665F; + sad.sad_y = (float)y * mg_lsb * 9.80665F; + sad.sad_z = (float)z * mg_lsb * 9.80665F; + + /* Call data function */ + rc = data_func(sensor, data_arg, &sad); + if (rc != 0) { + goto err; + } + + return (0); +err: + return (rc); +} + +static int +lsm303dlhc_sensor_get_config(struct sensor *sensor, sensor_type_t type, + struct sensor_cfg *cfg) +{ + int rc; + + if (type != SENSOR_TYPE_ACCELEROMETER) { + rc = SYS_EINVAL; + goto err; + } + + cfg->sc_valtype = SENSOR_VALUE_TYPE_FLOAT_TRIPLET; + + return (0); +err: + return (rc); +} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f720b6e4/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h ---------------------------------------------------------------------- diff --git a/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h b/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h new file mode 100644 index 0000000..5983096 --- /dev/null +++ b/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 __LSM303DLHC_PRIV_H__ +#define __LSM303DLHC_PRIV_H__ + +#define LSM303DLHC_ADDR_ACCEL (0x19) /* 0011001 */ +#define LSM303DLHC_ADDR_MAG (0x1E) /* 0011110 */ + +#ifdef __cplusplus +extern "C" { +#endif + +enum lsm303dlhc_registers_accel { /* DEFAULT TYPE */ + LSM303DLHC_REGISTER_ACCEL_CTRL_REG1_A = 0x20, /* 00000111 rw */ + LSM303DLHC_REGISTER_ACCEL_CTRL_REG2_A = 0x21, /* 00000000 rw */ + LSM303DLHC_REGISTER_ACCEL_CTRL_REG3_A = 0x22, /* 00000000 rw */ + LSM303DLHC_REGISTER_ACCEL_CTRL_REG4_A = 0x23, /* 00000000 rw */ + LSM303DLHC_REGISTER_ACCEL_CTRL_REG5_A = 0x24, /* 00000000 rw */ + LSM303DLHC_REGISTER_ACCEL_CTRL_REG6_A = 0x25, /* 00000000 rw */ + LSM303DLHC_REGISTER_ACCEL_REFERENCE_A = 0x26, /* 00000000 r */ + LSM303DLHC_REGISTER_ACCEL_STATUS_REG_A = 0x27, /* 00000000 r */ + LSM303DLHC_REGISTER_ACCEL_OUT_X_L_A = 0x28, + LSM303DLHC_REGISTER_ACCEL_OUT_X_H_A = 0x29, + LSM303DLHC_REGISTER_ACCEL_OUT_Y_L_A = 0x2A, + LSM303DLHC_REGISTER_ACCEL_OUT_Y_H_A = 0x2B, + LSM303DLHC_REGISTER_ACCEL_OUT_Z_L_A = 0x2C, + LSM303DLHC_REGISTER_ACCEL_OUT_Z_H_A = 0x2D, + LSM303DLHC_REGISTER_ACCEL_FIFO_CTRL_REG_A = 0x2E, + LSM303DLHC_REGISTER_ACCEL_FIFO_SRC_REG_A = 0x2F, + LSM303DLHC_REGISTER_ACCEL_INT1_CFG_A = 0x30, + LSM303DLHC_REGISTER_ACCEL_INT1_SOURCE_A = 0x31, + LSM303DLHC_REGISTER_ACCEL_INT1_THS_A = 0x32, + LSM303DLHC_REGISTER_ACCEL_INT1_DURATION_A = 0x33, + LSM303DLHC_REGISTER_ACCEL_INT2_CFG_A = 0x34, + LSM303DLHC_REGISTER_ACCEL_INT2_SOURCE_A = 0x35, + LSM303DLHC_REGISTER_ACCEL_INT2_THS_A = 0x36, + LSM303DLHC_REGISTER_ACCEL_INT2_DURATION_A = 0x37, + LSM303DLHC_REGISTER_ACCEL_CLICK_CFG_A = 0x38, + LSM303DLHC_REGISTER_ACCEL_CLICK_SRC_A = 0x39, + LSM303DLHC_REGISTER_ACCEL_CLICK_THS_A = 0x3A, + LSM303DLHC_REGISTER_ACCEL_TIME_LIMIT_A = 0x3B, + LSM303DLHC_REGISTER_ACCEL_TIME_LATENCY_A = 0x3C, + LSM303DLHC_REGISTER_ACCEL_TIME_WINDOW_A = 0x3D +}; + +enum lsm303dlhc_registers_mag { + LSM303DLHC_REGISTER_MAG_CRA_REG_M = 0x00, + LSM303DLHC_REGISTER_MAG_CRB_REG_M = 0x01, + LSM303DLHC_REGISTER_MAG_MR_REG_M = 0x02, + LSM303DLHC_REGISTER_MAG_OUT_X_H_M = 0x03, + LSM303DLHC_REGISTER_MAG_OUT_X_L_M = 0x04, + LSM303DLHC_REGISTER_MAG_OUT_Z_H_M = 0x05, + LSM303DLHC_REGISTER_MAG_OUT_Z_L_M = 0x06, + LSM303DLHC_REGISTER_MAG_OUT_Y_H_M = 0x07, + LSM303DLHC_REGISTER_MAG_OUT_Y_L_M = 0x08, + LSM303DLHC_REGISTER_MAG_SR_REG_Mg = 0x09, + LSM303DLHC_REGISTER_MAG_IRA_REG_M = 0x0A, + LSM303DLHC_REGISTER_MAG_IRB_REG_M = 0x0B, + LSM303DLHC_REGISTER_MAG_IRC_REG_M = 0x0C, + LSM303DLHC_REGISTER_MAG_TEMP_OUT_H_M = 0x31, + LSM303DLHC_REGISTER_MAG_TEMP_OUT_L_M = 0x32 +}; + +int lsm303dlhc_write8(uint8_t addr, uint8_t reg, uint32_t value); +int lsm303dlhc_read8(uint8_t addr, uint8_t reg, uint8_t *value); + +#ifdef __cplusplus +} +#endif + +#endif /* __LSM303DLHC_PRIV_H__ */ http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f720b6e4/hw/drivers/sensors/lsm303dlhc/syscfg.yml ---------------------------------------------------------------------- diff --git a/hw/drivers/sensors/lsm303dlhc/syscfg.yml b/hw/drivers/sensors/lsm303dlhc/syscfg.yml new file mode 100644 index 0000000..dcd8f3f --- /dev/null +++ b/hw/drivers/sensors/lsm303dlhc/syscfg.yml @@ -0,0 +1,32 @@ +# The BSD License (BSD) +# +# Copyright (c) 2016 Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +syscfg.defs: + LSM303DLHC_I2CBUS: + description: 'I2C bus number for the LSM303DLHC' + value: -1 + LSM303DLHC_LOG: + description: 'Enable LSM303DLHC logging' + value: 0 + LSM303DLHC_STATS: + description: 'Enable LSM303DLHC statistics' + value: 0
