static void setup_dmp(char *dev_path){ char sysfs_path[200]; int ret; FILE *fd; sprintf(sysfs_path, "%s", dev_path); printf("sysfs: %s\n", sysfs_path); ret = write_sysfs_int_and_verify("power_state", sysfs_path, 1); if (ret < 0) return; ret = write_sysfs_int("in_accel_scale", dev_path, 0); if (ret < 0) return; ret = write_sysfs_int("in_anglvel_scale", dev_path, 3); if (ret < 0) return; ret = write_sysfs_int("sampling_frequency", sysfs_path, 200); if (ret < 0) return; ret = write_sysfs_int_and_verify("firmware_loaded", sysfs_path, 0); if (ret < 0) return; sprintf(dmp_path, "%s/dmp_firmware", dev_path); if ((fd = fopen(dmp_path, "wb")) < 0 ) { perror("dmp fail"); } inv_load_dmp(fd); fclose(fd); printf("firmware_loaded=%d\n", read_sysfs_posint("firmware_loaded", sysfs_path)); ret = write_sysfs_int_and_verify("dmp_on", sysfs_path, 1); if (ret < 0) return; ret = write_sysfs_int_and_verify("dmp_int_on", sysfs_path, 1); if (ret < 0) return; /* selelct which event to enable and interrupt on/off here */ //enable_glu(sysfs_path, 0); ret = write_sysfs_int_and_verify("tap_on", sysfs_path, 0); if (ret < 0) return; ret = write_sysfs_int_and_verify("pedometer_int_on", sysfs_path, 1); ret = write_sysfs_int_and_verify("pedometer_on", sysfs_path, 1); ret = write_sysfs_int_and_verify("dmp_event_int_on", sysfs_path, 1); write_sysfs_int64("pedometer_steps", sysfs_path, 0x3ffffffff); write_sysfs_int64("pedometer_time", sysfs_path, 0xffffffff); if (ret < 0) return; ret = setup_offset_and_bias(); return; }
/** * @brief * @return INV_SUCCESS or a non-zero error code. */ inv_error_t inv_setup_dmp(void) { inv_error_t result; struct mldl_cfg * mldl_cfg = inv_get_dl_config(); inv_set_get_address( inv_setup_dmpGetAddress ); result = inv_clock_source(MPU_CLK_SEL_PLLGYROZ); if (result) { LOG_RESULT_LOCATION(result); return result; } result = inv_dl_cfg_sampling(MPU_FILTER_42HZ, 4); if (result) { LOG_RESULT_LOCATION(result); return result; } result = inv_set_full_scale(2000.f); if (result) { LOG_RESULT_LOCATION(result); return result; } result = inv_load_dmp(dmpMemory, DMP_CODE_SIZE, sConfig); if (result) { LOG_RESULT_LOCATION(result); return result; } result = inv_set_ignore_system_suspend(false); if (result) { LOG_RESULT_LOCATION(result); return result; } if (mldl_cfg->slave[EXT_SLAVE_TYPE_ACCEL] && mldl_cfg->slave[EXT_SLAVE_TYPE_ACCEL]->config) { struct ext_slave_config config; long odr; config.key = MPU_SLAVE_CONFIG_ODR_SUSPEND; config.len = sizeof(long); config.apply = false; config.data = &odr; odr = 0; result = inv_mpu_config_accel(mldl_cfg, inv_get_serial_handle(), inv_get_serial_handle(), &config); if (result) { LOG_RESULT_LOCATION(result); return result; } config.key = MPU_SLAVE_CONFIG_ODR_RESUME; odr = 200000; result = inv_mpu_config_accel(mldl_cfg, inv_get_serial_handle(), inv_get_serial_handle(), &config); if (result) { LOG_RESULT_LOCATION(result); return result; } config.key = MPU_SLAVE_CONFIG_IRQ_SUSPEND; odr = MPU_SLAVE_IRQ_TYPE_NONE; result = inv_mpu_config_accel(mldl_cfg, inv_get_serial_handle(), inv_get_serial_handle(), &config); if (result) { LOG_RESULT_LOCATION(result); return result; } config.key = MPU_SLAVE_CONFIG_IRQ_RESUME; odr = MPU_SLAVE_IRQ_TYPE_NONE; result = inv_mpu_config_accel(mldl_cfg, inv_get_serial_handle(), inv_get_serial_handle(), &config); if (result) { LOG_RESULT_LOCATION(result); return result; } } return result; }