static void TEMPer_release(void *priv) { struct temper *temper = priv; ch341_close(temper->ch); free(temper); }
/* 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; }
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; }