Esempio n. 1
0
static void updn_converter_lo_freq_changed_cb(GtkSpinButton *button, int data)
{
	struct iio_channel *ad9361_ch, *updn_ch;
	double target_freq, ad9361_lo, updn_pll, center_freq;
	int ret;

	if (data == UPDN_RX) {
		ad9361_ch = iio_device_find_channel(dev, "altvoltage0", true);
		updn_ch = iio_device_find_channel(udc_rx, "altvoltage0", true);
		center_freq = RX_CENTER_FREQ;
	} else if (data == UPDN_TX) {
		ad9361_ch = iio_device_find_channel(dev, "altvoltage1", true);
		updn_ch = iio_device_find_channel(udc_tx, "altvoltage0", true);
		center_freq = TX_CENTER_FREQ;
	} else {
		return;
	}

	target_freq = gtk_spin_button_get_value(button);
	split_target_lo_freq(target_freq, &updn_pll, &ad9361_lo, updn_freq_span, center_freq);
	ret = iio_channel_attr_write_longlong(ad9361_ch, freq_name, (long long)MHZ_TO_HZ(ad9361_lo));
	if (ret < 0)
		fprintf(stderr,"Write to %s attribute of %s device: %s\n",
			freq_name, PHY_DEVICE, strerror(-ret));
	ret = iio_channel_attr_write_longlong(updn_ch, "frequency", (long long)MHZ_TO_HZ(updn_pll));
	if (ret < 0)
		fprintf(stderr,"Write to %s attribute of %s device: %s\n",
			"frequency", (UPDN_TX) ? UDC_TX_DEVICE : UDC_RX_DEVICE, strerror(-ret));
	rx_freq_info_update();
}
static void dds_tx_phase_rotation(struct iio_device *dev, gdouble val)
{
	long long i, q;
	int d, j;

	if (dev == dev_dds_slave)
		d = 1;
	else
		d = 0;

	i = scale_phase_0_360(val + 90.0) * 1000;
	q = scale_phase_0_360(val) * 1000;


	DBG("Val %f, I = %d, Q = %d", val, (int)i,(int) q);

	for (j = 0; j < 8; j++) {
		switch (j) {
			case 0:
			case 1:
			case 4:
			case 5:
				iio_channel_attr_write_longlong(dds_out[d][j], "phase", i);
				break;
			default:
				iio_channel_attr_write_longlong(dds_out[d][j], "phase", q);
		}
	}

}
Esempio n. 3
0
static void spin_button_save(struct iio_widget *widget, bool is_double)
{
	gdouble freq, min;
	gdouble scale = widget->priv ? *(gdouble *)widget->priv : 1.0;

	freq = gtk_spin_button_get_value(GTK_SPIN_BUTTON (widget->widget));
	min = gtk_adjustment_get_lower(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(widget->widget)));
	if (scale < 0 && min < 0)
		freq = fabs(freq * scale);
	else
		freq *= scale;

	if (widget->priv_convert_function)
		freq = ((double (*)(double, bool))widget->priv_convert_function)(freq, false);

	if (widget->chn) {
		if (is_double)
			iio_channel_attr_write_double(widget->chn,
					widget->attr_name, freq);
		else
			iio_channel_attr_write_longlong(widget->chn,
					widget->attr_name, (long long) freq);
	} else {
		if (is_double)
			iio_device_attr_write_double(widget->dev,
					widget->attr_name, freq);
		else
			iio_device_attr_write_longlong(widget->dev,
					widget->attr_name, (long long) freq);
	}
}
static void mcs_cb (GtkWidget *widget, gpointer data)
{
	unsigned step;
	struct iio_channel *tx_sample_master, *tx_sample_slave;
	long long tx_sample_master_freq, tx_sample_slave_freq;
	char temp[40], ensm_mode[40];
	unsigned tmp;
	static int fix_slave_tune = 1;

	tx_sample_master = iio_device_find_channel(dev, "voltage0", true);
	tx_sample_slave = iio_device_find_channel(dev_slave, "voltage0", true);

	iio_channel_attr_read_longlong(tx_sample_master, "sampling_frequency", &tx_sample_master_freq);
	iio_channel_attr_read_longlong(tx_sample_slave, "sampling_frequency", &tx_sample_slave_freq);

	if (tx_sample_master_freq != tx_sample_slave_freq) {
		printf("tx_sample_master_freq != tx_sample_slave_freq\nUpdating...\n");
		iio_channel_attr_write_longlong(tx_sample_slave, "sampling_frequency", tx_sample_master_freq);
	}

	if (fix_slave_tune) {
		iio_device_reg_read(dev, 0x6, &tmp);
		iio_device_reg_write(dev_slave, 0x6, tmp);
		iio_device_reg_read(dev, 0x7, &tmp);
		iio_device_reg_write(dev_slave, 0x7, tmp);
		fix_slave_tune = 0;
	}

	iio_device_attr_read(dev, "ensm_mode", ensm_mode, sizeof(ensm_mode));

	/* Move the parts int ALERT for MCS */
	iio_device_attr_write(dev, "ensm_mode", "alert");
	iio_device_attr_write(dev_slave, "ensm_mode", "alert");

	for (step = 1; step <= 5; step++) {
		sprintf(temp, "%d", step);
		/* Don't change the order here - the master controls the SYNC GPIO */
		iio_device_debug_attr_write(dev_slave, "multichip_sync", temp);
		iio_device_debug_attr_write(dev, "multichip_sync", temp);
		sleep(0.1);
	}

	iio_device_attr_write(dev, "ensm_mode", ensm_mode);
	iio_device_attr_write(dev_slave, "ensm_mode", ensm_mode);

#if 0
	iio_device_debug_attr_write(dev, "multichip_sync", "6");
	iio_device_debug_attr_write(dev_slave, "multichip_sync", "6");
#endif

}
static int default_dds(long long freq, double scale)
{
	int i, j, ret = 0;

	for (i = 0; i < 2; i++) {
		for (j = 0; j < 8; j++) {
			ret |= iio_channel_attr_write_longlong(dds_out[i][j], "frequency", freq);
			ret |= iio_channel_attr_write_double(dds_out[i][j], "scale", scale);
		}

		tx_phase_rotation(i ? dev_dds_slave : dev_dds_master, 0.0);
	}

	return ret;
}
Esempio n. 6
0
/* write attribute: long long int */
static void wr_ch_lli(struct iio_channel *chn, const char* what, long long val)
{
	errchk(iio_channel_attr_write_longlong(chn, what, val), what);
}
Esempio n. 7
0
static int write_int(struct iio_channel *chn, const char *attr, int val)
{
	return iio_channel_attr_write_longlong(chn, attr, (long long) val);
}
int ad9361_set_bb_rate(struct iio_device *dev, unsigned long rate)
{
	struct iio_channel *chan;
	long long current_rate;
	int dec, taps, ret, i, enable, len = 0;
	int16_t *fir;
	char *buf;

	if (rate <= 20000000UL) {
		dec = 4;
		taps = 128;
		fir = fir_128_4;
	} else if (rate <= 40000000UL) {
		dec = 2;
		fir = fir_128_2;
		taps = 128;
	} else if (rate <= 53333333UL) {
		dec = 2;
		fir = fir_96_2;
		taps = 96;
	} else {
		dec = 2;
		fir = fir_64_2;
		taps = 64;
	}

	chan = iio_device_find_channel(dev, "voltage0", true);
	if (chan == NULL)
		return -ENODEV;

	ret = iio_channel_attr_read_longlong(chan, "sampling_frequency", &current_rate);
	if (ret < 0)
		return ret;

	ret = ad9361_get_trx_fir_enable(dev, &enable);
	if (ret < 0)
		return ret;

	if (enable) {
		if (current_rate <= (25000000 / 12))
			iio_channel_attr_write_longlong(chan, "sampling_frequency", 3000000);

		ret = ad9361_set_trx_fir_enable(dev, false);
		if (ret < 0)
			return ret;
	}

	buf = malloc(FIR_BUF_SIZE);
	if (!buf)
		return -ENOMEM;

	len += snprintf(buf + len, FIR_BUF_SIZE - len, "RX 3 GAIN -6 DEC %d\n", dec);
	len += snprintf(buf + len, FIR_BUF_SIZE - len, "TX 3 GAIN 0 INT %d\n", dec);

	for (i = 0; i < taps; i++)
		len += snprintf(buf + len, FIR_BUF_SIZE - len, "%d,%d\n", fir[i], fir[i]);

	len += snprintf(buf + len, FIR_BUF_SIZE - len, "\n");

	ret = iio_device_attr_write_raw(dev, "filter_fir_config", buf, len);
	free (buf);

	if (ret < 0)
		return ret;

	if (rate <= (25000000 / 12))  {
		ret = ad9361_set_trx_fir_enable(dev, true);
		if (ret < 0)
			return ret;
		ret = iio_channel_attr_write_longlong(chan, "sampling_frequency", rate);
		if (ret < 0)
			return ret;
	} else {
		ret = iio_channel_attr_write_longlong(chan, "sampling_frequency", rate);
		if (ret < 0)
			return ret;
		ret = ad9361_set_trx_fir_enable(dev, true);
		if (ret < 0)
			return ret;
	}

	return 0;
}