Exemple #1
0
static void TEMPer_release(void *priv)
{
	struct temper *temper = priv;

	ch341_close(temper->ch);
	free(temper);
}
Exemple #2
0
/* open this device, set default parameters */
static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port)
{
	struct usb_serial *serial = port->serial;
	struct ch341_private *priv = usb_get_serial_port_data(serial->port[0]);
	int r;

	priv->baud_rate = DEFAULT_BAUD_RATE;

	r = ch341_configure(serial->dev, priv);
	if (r)
		goto out;

	r = ch341_set_handshake(serial->dev, priv->line_control);
	if (r)
		goto out;

	r = ch341_set_baudrate(serial->dev, priv);
	if (r)
		goto out;

	dbg("%s - submitting interrupt urb", __func__);
	r = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
	if (r) {
		dev_err(&port->dev, "%s - failed submitting interrupt urb,"
			" error %d\n", __func__, r);
		ch341_close(port);
		goto out;
	}

	r = usb_serial_generic_open(tty, port);

out:	return r;
}
Exemple #3
0
static int TEMPer_attach(struct usense_device *dev, struct usb_dev_handle *usb, void **priv)
{
	/* Connect to ch341 */
	int err;
	struct temper *temper;
	struct ch341 *ch;
	uint8_t cfg;
	int16_t temp;

	ch = ch341_open(usb);
	if (ch == NULL) {
		return -ENODEV;
	}

	temper = calloc(1, sizeof(*temper));
	temper->ch = ch;

	temper->i2c_bit.data = ch;
	temper->i2c_bit.setsda = temper_setsda;
	temper->i2c_bit.setscl = temper_setscl;
	temper->i2c_bit.getsda = temper_getsda;
	temper->i2c_bit.getscl = NULL;
	temper->i2c_bit.udelay = 50;	/* in ms */
	temper->i2c_bit.timeout = 1000;	/* in ms */

	temper->adap.timeout = 1000;
	temper->adap.retries = 3;
	strncpy(&temper->adap.name[0], "ch341-i2c", sizeof(temper->adap.name));
	temper->adap.algo_data = &temper->i2c_bit;
	i2c_bit_add_bus(&temper->adap);

	/* Reset device */
	temp_reset(&temper->adap);

	/* Read config */
	cfg = 0;
	err = temp_cfg_read(&temper->adap, &cfg);
	if (err < 0) {
		fprintf(stderr, "%s: Can't get current configuration.\n", usense_device_name(dev));
		ch341_close(ch);
		return -EINVAL;
	}

	if (cfg != 0x60) {
		err = temp_cfg_write(&temper->adap, 0x60);
	}
	if (err < 0) {
		fprintf(stderr, "%s: Can't configure 12bit resolution\n", usense_device_name(dev));
		ch341_close(ch);
		return -EINVAL;
	} else {
		usense_prop_set(dev, "TEMPer.resolution","12");
	}

	/* Set the device and type */
	usense_prop_set(dev, "device", "TEMPer");
	usense_prop_set(dev, "type", "temp");

	TEMPer_update(dev, temper);

	*priv = temper;

	return 0;
}