static int lis3dh_config(void *mlsl_handle, struct ext_slave_descr *slave, struct ext_slave_platform_data *pdata, struct ext_slave_config *data) { struct lis3dh_private_data *private_data = pdata->private_data; if (!data->data) return INV_ERROR_INVALID_PARAMETER; switch (data->key) { case MPU_SLAVE_CONFIG_ODR_SUSPEND: return lis3dh_set_odr(mlsl_handle, pdata, &private_data->suspend, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_ODR_RESUME: return lis3dh_set_odr(mlsl_handle, pdata, &private_data->resume, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_FSR_SUSPEND: return lis3dh_set_fsr(mlsl_handle, pdata, &private_data->suspend, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_FSR_RESUME: return lis3dh_set_fsr(mlsl_handle, pdata, &private_data->resume, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_MOT_THS: return lis3dh_set_ths(mlsl_handle, pdata, &private_data->suspend, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_NMOT_THS: return lis3dh_set_ths(mlsl_handle, pdata, &private_data->resume, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_MOT_DUR: return lis3dh_set_dur(mlsl_handle, pdata, &private_data->suspend, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_NMOT_DUR: return lis3dh_set_dur(mlsl_handle, pdata, &private_data->resume, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_IRQ_SUSPEND: return lis3dh_set_irq(mlsl_handle, pdata, &private_data->suspend, data->apply, *((long *)data->data)); case MPU_SLAVE_CONFIG_IRQ_RESUME: return lis3dh_set_irq(mlsl_handle, pdata, &private_data->resume, data->apply, *((long *)data->data)); default: return INV_ERROR_FEATURE_NOT_IMPLEMENTED; }; return INV_SUCCESS; }
static int lis3dh_init(void *mlsl_handle, struct ext_slave_descr *slave, struct ext_slave_platform_data *pdata) { inv_error_t result; long range; struct lis3dh_private_data *private_data; private_data = (struct lis3dh_private_data *) inv_malloc(sizeof(struct lis3dh_private_data)); if (!private_data) return INV_ERROR_MEMORY_EXAUSTED; pdata->private_data = private_data; private_data->resume.ctrl_reg1 = 0x67; private_data->suspend.ctrl_reg1 = 0x18; private_data->resume.mot_int1_cfg = 0x95; private_data->suspend.mot_int1_cfg = 0x2a; lis3dh_set_odr(mlsl_handle, pdata, &private_data->suspend, FALSE, 0); lis3dh_set_odr(mlsl_handle, pdata, &private_data->resume, FALSE, 200000); range = RANGE_FIXEDPOINT_TO_LONG_MG(slave->range); lis3dh_set_fsr(mlsl_handle, pdata, &private_data->suspend, FALSE, range); lis3dh_set_fsr(mlsl_handle, pdata, &private_data->resume, FALSE, range); lis3dh_set_ths(mlsl_handle, pdata, &private_data->suspend, FALSE, 80); lis3dh_set_ths(mlsl_handle, pdata, &private_data->resume, FALSE, 40); lis3dh_set_dur(mlsl_handle, pdata, &private_data->suspend, FALSE, 1000); lis3dh_set_dur(mlsl_handle, pdata, &private_data->resume, FALSE, 2540); lis3dh_set_irq(mlsl_handle, pdata, &private_data->suspend, FALSE, MPU_SLAVE_IRQ_TYPE_NONE); lis3dh_set_irq(mlsl_handle, pdata, &private_data->resume, FALSE, MPU_SLAVE_IRQ_TYPE_NONE); result = inv_serial_single_write(mlsl_handle, pdata->address, LIS3DH_CTRL_REG1, 0x07); inv_sleep(6); return INV_SUCCESS; }
static int lis3dh_init(void *mlsl_handle, struct ext_slave_descr *slave, struct ext_slave_platform_data *pdata) { int result; long range; struct lis3dh_private_data *private_data; private_data = (struct lis3dh_private_data *) kzalloc(sizeof(struct lis3dh_private_data), GFP_KERNEL); if (!private_data) return INV_ERROR_MEMORY_EXAUSTED; pdata->private_data = private_data; private_data->resume.ctrl_reg1 = 0x67; private_data->suspend.ctrl_reg1 = 0x18; private_data->resume.mot_int1_cfg = 0x95; private_data->suspend.mot_int1_cfg = 0x2a; lis3dh_set_odr(mlsl_handle, pdata, &private_data->suspend, false, 0); lis3dh_set_odr(mlsl_handle, pdata, &private_data->resume, false, 200000L); range = range_fixedpoint_to_long_mg(slave->range); lis3dh_set_fsr(mlsl_handle, pdata, &private_data->suspend, false, range); lis3dh_set_fsr(mlsl_handle, pdata, &private_data->resume, false, range); lis3dh_set_ths(mlsl_handle, pdata, &private_data->suspend, false, 80); lis3dh_set_ths(mlsl_handle, pdata, &private_data->resume, false, 40); lis3dh_set_dur(mlsl_handle, pdata, &private_data->suspend, false, 1000); lis3dh_set_dur(mlsl_handle, pdata, &private_data->resume, false, 2540); lis3dh_set_irq(mlsl_handle, pdata, &private_data->suspend, false, MPU_SLAVE_IRQ_TYPE_NONE); lis3dh_set_irq(mlsl_handle, pdata, &private_data->resume, false, MPU_SLAVE_IRQ_TYPE_NONE); result = inv_serial_single_write(mlsl_handle, pdata->address, LIS3DH_CTRL_REG1, 0x07); msleep(6); return INV_SUCCESS; }
static int lis3dh_init(void *mlsl_handle, struct ext_slave_descr *slave, struct ext_slave_platform_data *pdata) { tMLError result; struct lis3dh_private_data *private_data; private_data = (struct lis3dh_private_data *) MLOSMalloc(sizeof(struct lis3dh_private_data)); if (!private_data) return ML_ERROR_MEMORY_EXAUSTED; pdata->private_data = private_data; private_data->resume.ctrl_reg1 = 0x67; private_data->suspend.ctrl_reg1 = 0x18; private_data->resume.mot_int1_cfg = 0x95; private_data->suspend.mot_int1_cfg = 0x2a; lis3dh_set_odr(mlsl_handle, pdata, &private_data->suspend, FALSE, 0); lis3dh_set_odr(mlsl_handle, pdata, &private_data->resume, FALSE, 200000); lis3dh_set_fsr(mlsl_handle, pdata, &private_data->suspend, FALSE, 2048); lis3dh_set_fsr(mlsl_handle, pdata, &private_data->resume, FALSE, 2048); lis3dh_set_ths(mlsl_handle, pdata, &private_data->suspend, FALSE, 80); lis3dh_set_ths(mlsl_handle, pdata, &private_data->resume, FALSE, 40); lis3dh_set_dur(mlsl_handle, pdata, &private_data->suspend, FALSE, 1000); lis3dh_set_dur(mlsl_handle, pdata, &private_data->resume, FALSE, 2540); lis3dh_set_irq(mlsl_handle, pdata, &private_data->suspend, FALSE, MPU_SLAVE_IRQ_TYPE_NONE); lis3dh_set_irq(mlsl_handle, pdata, &private_data->resume, FALSE, MPU_SLAVE_IRQ_TYPE_NONE); result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, LIS3DH_CTRL_REG1, 0x07); MLOSSleep(6); return ML_SUCCESS; }
upm_result_t lis3dh_devinit(const lis3dh_context dev, LIS3DH_ODR_T odr, LIS3DH_FS_T fs, bool high_res) { assert(dev != NULL); // Set high resolution mode, ODR and FS using passed values. // Also unconditionally enable X, Y and Z axes, temperature sensor (and ADC), // BDU mode as well as disable output high-pass filter. if (lis3dh_enable_lp_mode(dev, false) || lis3dh_enable_hr_mode(dev, high_res) || lis3dh_enable_axes(dev, true, true, true) || lis3dh_enable_bdu_mode(dev, true) || lis3dh_set_odr(dev, odr) || lis3dh_set_full_scale(dev, fs) || lis3dh_enable_hp_filtering(dev, false) || lis3dh_enable_temperature(dev, true)) { printf("%s: failed to set configuration parameters\n", __FUNCTION__); return UPM_ERROR_OPERATION_FAILED; } // Settle upm_delay_ms(50); return UPM_SUCCESS; }
void auto_init_lis3dh(void) { assert(LIS3DH_NUM == LIS3DH_INFO_NUM); for (unsigned int i = 0; i < LIS3DH_NUM; i++) { LOG_DEBUG("[auto_init_saul] initializing lis3dh #%u\n", i); if (lis3dh_init(&lis3dh_devs[i], &lis3dh_params[i]) < 0) { LOG_ERROR("[auto_init_saul] error initializing lis3dh #%u\n", i); continue; } if (lis3dh_set_odr(&lis3dh_devs[i], lis3dh_params[i].odr) < 0) { LOG_ERROR("[auto_init_saul] error setting ODR for lis3dh #%u\n", i); continue; } saul_entries[i].dev = &(lis3dh_devs[i]); saul_entries[i].name = lis3dh_saul_info[i].name; saul_entries[i].driver = &lis3dh_saul_driver; saul_reg_add(&(saul_entries[i])); } }
int main(void) { lis3dh_t dev; lis3dh_data_t acc_data; int16_t temperature; puts("LIS3DH accelerometer driver test application\n"); printf("Initializing SPI_%i... ", TEST_LIS3DH_SPI); if (spi_init_master(TEST_LIS3DH_SPI, SPI_CONF_SECOND_FALLING, SPI_SPEED_10MHZ) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Initializing LIS3DH sensor... "); if (lis3dh_init(&dev, TEST_LIS3DH_SPI, TEST_LIS3DH_CS, TEST_LIS3DH_INT1, TEST_LIS3DH_INT2, SCALE) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Set ODR... "); if (lis3dh_set_odr(&dev, ODR) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Set scale... "); if (lis3dh_set_scale(&dev, SCALE) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Set axes XYZ... "); if (lis3dh_set_axes(&dev, LIS3DH_AXES_XYZ) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Disable FIFO mode... "); if (lis3dh_set_fifo(&dev, 0) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Enable temperature reading... "); if (lis3dh_set_aux_adc(&dev, 1, 1) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("LIS3DH init done.\n"); while (1) { lis3dh_read_xyz(&dev, &acc_data); if (lis3dh_read_xyz(&dev, &acc_data) != 0) { puts("Reading acceleration data... "); puts("[Failed]\n"); return 1; } if (lis3dh_read_aux_adc3(&dev, &temperature) != 0) { puts("Reading temperature data... "); puts("[Failed]\n"); return 1; } printf("Sensor data - X: %6i Y: %6i Z: %6i Temp: %6i\n", acc_data.acc_x, acc_data.acc_y, acc_data.acc_z, temperature); vtimer_usleep(SLEEP); } return 0; }
int main(void) { lis3dh_t dev; lis3dh_data_t acc_data; puts("LIS3DH accelerometer driver test application\n"); printf("Initializing SPI_%i... ", TEST_LIS3DH_SPI); if (spi_init_master(TEST_LIS3DH_SPI, SPI_CONF, SPI_SPEED) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Initializing LIS3DH sensor... "); if (lis3dh_init(&dev, TEST_LIS3DH_SPI, TEST_LIS3DH_CS, SCALE) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Set ODR... "); if (lis3dh_set_odr(&dev, ODR) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Set scale... "); if (lis3dh_set_scale(&dev, SCALE) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Set axes XYZ... "); if (lis3dh_set_axes(&dev, LIS3DH_AXES_XYZ) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Enable streaming FIFO mode... "); if (lis3dh_set_fifo(&dev, LIS3DH_FIFO_MODE_STREAM, WATERMARK_LEVEL) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Enable temperature reading... "); if (lis3dh_set_aux_adc(&dev, 1, 1) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Set INT1 watermark function... "); if (lis3dh_set_int1(&dev, LIS3DH_CTRL_REG3_I1_WTM_MASK) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("Set INT1 callback"); if (gpio_init_int(TEST_LIS3DH_INT1, GPIO_IN, GPIO_RISING, test_int1, (void*)&int1_count) == 0) { puts("[OK]"); } else { puts("[Failed]\n"); return 1; } puts("LIS3DH init done.\n"); while (1) { int fifo_level; fifo_level = lis3dh_get_fifo_level(&dev); printf("int1_count = %d\n", int1_count); printf("Reading %d measurements\n", fifo_level); while (fifo_level > 0) { int16_t temperature; int int1; if (lis3dh_read_xyz(&dev, &acc_data) != 0) { puts("Reading acceleration data... "); puts("[Failed]\n"); } if (lis3dh_read_aux_adc3(&dev, &temperature) != 0) { puts("Reading temperature data... "); puts("[Failed]\n"); return 1; } int1 = gpio_read(TEST_LIS3DH_INT1); printf("X: %6d Y: %6d Z: %6d Temp: %6d, INT1: %08x\n", acc_data.acc_x, acc_data.acc_y, acc_data.acc_z, temperature, int1); --fifo_level; } xtimer_usleep(SLEEP); } return 0; }