bool MPU9250_mag::ak8963_setup(void) { int retries = 10; // enable the I2C master to slaves on the aux bus uint8_t user_ctrl = _parent->read_reg(MPUREG_USER_CTRL); _parent->write_checked_reg(MPUREG_USER_CTRL, user_ctrl | BIT_I2C_MST_EN); _parent->write_reg(MPUREG_I2C_MST_CTRL, BIT_I2C_MST_P_NSR | BIT_I2C_MST_WAIT_FOR_ES | BITS_I2C_MST_CLOCK_400HZ); if (!ak8963_check_id()) { ::printf("AK8963: bad id\n"); } while (!ak8963_read_adjustments()) { if (!retries--) { ::printf("AK8963: failed to read adjustment data\n"); break; } } passthrough_write(AK8963REG_CNTL1, AK8963_CONTINUOUS_MODE2 | AK8963_16BIT_ADC); set_passthrough(AK8963REG_ST1, sizeof(struct ak8963_regs)); return true; }
/* * 400kHz I2C bus speed = 2.5us per bit = 25us per byte */ void MPU9250_mag::passthrough_write(uint8_t reg, uint8_t val) { set_passthrough(reg, 1, &val); usleep(50); // wait for the value to be written to slave _parent->write_reg(MPUREG_I2C_SLV0_CTRL, 0); // disable new writes }
static GstFlowReturn gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf) { GstAudioFilter *filter = GST_AUDIO_FILTER (btrans); GstIirEqualizer *equ = GST_IIR_EQUALIZER (btrans); GstClockTime timestamp; if (G_UNLIKELY (filter->format.channels < 1 || equ->process == NULL)) return GST_FLOW_NOT_NEGOTIATED; if (equ->need_new_coefficients) { update_coefficients (equ); set_passthrough (equ); } if (gst_base_transform_is_passthrough (btrans)) return GST_FLOW_OK; timestamp = GST_BUFFER_TIMESTAMP (buf); timestamp = gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp); if (GST_CLOCK_TIME_IS_VALID (timestamp)) gst_object_sync_values (G_OBJECT (equ), timestamp); equ->process (equ, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), filter->format.channels); return GST_FLOW_OK; }
void MPU9250_mag::passthrough_read(uint8_t reg, uint8_t *buf, uint8_t size) { set_passthrough(reg, size); usleep(25 + 25 * size); // wait for the value to be read from slave read_block(MPUREG_EXT_SENS_DATA_00, buf, size); _parent->write_reg(MPUREG_I2C_SLV0_CTRL, 0); // disable new reads }
static GstFlowReturn gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf) { GstAudioFilter *filter = GST_AUDIO_FILTER (btrans); GstIirEqualizer *equ = GST_IIR_EQUALIZER (btrans); GstClockTime timestamp; GstMapInfo map; gint channels = GST_AUDIO_FILTER_CHANNELS (filter); gboolean need_new_coefficients; if (G_UNLIKELY (channels < 1 || equ->process == NULL)) return GST_FLOW_NOT_NEGOTIATED; BANDS_LOCK (equ); need_new_coefficients = equ->need_new_coefficients; BANDS_UNLOCK (equ); if (!need_new_coefficients && gst_base_transform_is_passthrough (btrans)) return GST_FLOW_OK; timestamp = GST_BUFFER_TIMESTAMP (buf); timestamp = gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp); if (GST_CLOCK_TIME_IS_VALID (timestamp)) { GstIirEqualizerBand **filters = equ->bands; guint f, nf = equ->freq_band_count; gst_object_sync_values (GST_OBJECT (equ), timestamp); /* sync values for bands too */ /* FIXME: iterating equ->bands is not thread-safe here */ for (f = 0; f < nf; f++) { gst_object_sync_values (GST_OBJECT (filters[f]), timestamp); } } BANDS_LOCK (equ); if (need_new_coefficients) { update_coefficients (equ); set_passthrough (equ); } BANDS_UNLOCK (equ); gst_buffer_map (buf, &map, GST_MAP_READWRITE); equ->process (equ, map.data, map.size, channels); gst_buffer_unmap (buf, &map); return GST_FLOW_OK; }
static void gst_iir_equalizer_band_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstIirEqualizerBand *band = GST_IIR_EQUALIZER_BAND (object); GstIirEqualizer *equ = GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band))); switch (prop_id) { case PROP_GAIN:{ gdouble gain; gain = g_value_get_double (value); GST_DEBUG_OBJECT (band, "gain = %lf -> %lf", band->gain, gain); if (gain != band->gain) { BANDS_LOCK (equ); equ->need_new_coefficients = TRUE; band->gain = gain; set_passthrough (equ); BANDS_UNLOCK (equ); GST_DEBUG_OBJECT (band, "changed gain = %lf ", band->gain); } break; } case PROP_FREQ:{ gdouble freq; freq = g_value_get_double (value); GST_DEBUG_OBJECT (band, "freq = %lf -> %lf", band->freq, freq); if (freq != band->freq) { BANDS_LOCK (equ); equ->need_new_coefficients = TRUE; band->freq = freq; BANDS_UNLOCK (equ); GST_DEBUG_OBJECT (band, "changed freq = %lf ", band->freq); } break; } case PROP_BANDWIDTH:{ gdouble width; width = g_value_get_double (value); GST_DEBUG_OBJECT (band, "width = %lf -> %lf", band->width, width); if (width != band->width) { BANDS_LOCK (equ); equ->need_new_coefficients = TRUE; band->width = width; BANDS_UNLOCK (equ); GST_DEBUG_OBJECT (band, "changed width = %lf ", band->width); } break; } case PROP_TYPE:{ GstIirEqualizerBandType type; type = g_value_get_enum (value); GST_DEBUG_OBJECT (band, "type = %d -> %d", band->type, type); if (type != band->type) { BANDS_LOCK (equ); equ->need_new_coefficients = TRUE; band->type = type; BANDS_UNLOCK (equ); GST_DEBUG_OBJECT (band, "changed type = %d ", band->type); } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } #ifdef GSTREAMER_LITE // We need to update coefficients and disable passthrough // if needed, otherwise after we disable passthrough equalizer will not // get re-enabled. // BANDS_LOCK (equ); // if (equ->need_new_coefficients) { // update_coefficients (equ); // set_passthrough (equ); // } // BANDS_UNLOCK (equ); #endif // GSTREAMER_LITE gst_object_unref (equ); }