Lines Matching +full:serial +full:- +full:dir
1 // SPDX-License-Identifier: GPL-2.0+
8 * COMEDI - Linux Control and Measurement Device Interface
78 DT9812_DEVID_DT9812_10, /* 8 2 8 8 1 +/- 10V */
79 DT9812_DEVID_DT9812_2PT5, /* 8 2 8 8 1 0-2.44V */
180 ((DT9812_MAX_WRITE_CMD_PIPE_SIZE - 4 - 1) / sizeof(u8))
193 ((DT9812_MAX_WRITE_CMD_PIPE_SIZE - 4 - 1) / \
208 ((DT9812_MAX_WRITE_CMD_PIPE_SIZE - 4 - 1) / \
239 struct dt9812_private *devpriv = dev->private; in dt9812_read_info()
249 return -ENOMEM; in dt9812_read_info()
253 cmd->cmd = cpu_to_le32(DT9812_R_FLASH_DATA); in dt9812_read_info()
254 cmd->u.flash_data_info.address = in dt9812_read_info()
256 cmd->u.flash_data_info.numbytes = cpu_to_le16(buf_size); in dt9812_read_info()
259 ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr), in dt9812_read_info()
264 ret = usb_bulk_msg(usb, usb_rcvbulkpipe(usb, devpriv->cmd_rd.addr), in dt9812_read_info()
270 ret = -EREMOTEIO; in dt9812_read_info()
283 struct dt9812_private *devpriv = dev->private; in dt9812_read_multiple_registers()
293 return -ENOMEM; in dt9812_read_multiple_registers()
297 cmd->cmd = cpu_to_le32(DT9812_R_MULTI_BYTE_REG); in dt9812_read_multiple_registers()
298 cmd->u.read_multi_info.count = reg_count; in dt9812_read_multiple_registers()
300 cmd->u.read_multi_info.address[i] = address[i]; in dt9812_read_multiple_registers()
303 ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr), in dt9812_read_multiple_registers()
308 ret = usb_bulk_msg(usb, usb_rcvbulkpipe(usb, devpriv->cmd_rd.addr), in dt9812_read_multiple_registers()
314 ret = -EREMOTEIO; in dt9812_read_multiple_registers()
327 struct dt9812_private *devpriv = dev->private; in dt9812_write_multiple_registers()
334 return -ENOMEM; in dt9812_write_multiple_registers()
336 cmd->cmd = cpu_to_le32(DT9812_W_MULTI_BYTE_REG); in dt9812_write_multiple_registers()
337 cmd->u.read_multi_info.count = reg_count; in dt9812_write_multiple_registers()
339 cmd->u.write_multi_info.write[i].address = address[i]; in dt9812_write_multiple_registers()
340 cmd->u.write_multi_info.write[i].value = value[i]; in dt9812_write_multiple_registers()
344 ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr), in dt9812_write_multiple_registers()
356 struct dt9812_private *devpriv = dev->private; in dt9812_rmw_multiple_registers()
363 return -ENOMEM; in dt9812_rmw_multiple_registers()
365 cmd->cmd = cpu_to_le32(DT9812_RMW_MULTI_BYTE_REG); in dt9812_rmw_multiple_registers()
366 cmd->u.rmw_multi_info.count = reg_count; in dt9812_rmw_multiple_registers()
368 cmd->u.rmw_multi_info.rmw[i] = rmw[i]; in dt9812_rmw_multiple_registers()
371 ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr), in dt9812_rmw_multiple_registers()
380 struct dt9812_private *devpriv = dev->private; in dt9812_digital_in()
385 mutex_lock(&devpriv->mut); in dt9812_digital_in()
389 * bits 0-6 in F020_SFR_P3 are bits 0-6 in the digital in dt9812_digital_in()
395 mutex_unlock(&devpriv->mut); in dt9812_digital_in()
402 struct dt9812_private *devpriv = dev->private; in dt9812_digital_out()
407 mutex_lock(&devpriv->mut); in dt9812_digital_out()
409 mutex_unlock(&devpriv->mut); in dt9812_digital_out()
417 struct dt9812_private *devpriv = dev->private; in dt9812_configure_mux()
419 if (devpriv->device == DT9812_DEVID_DT9812_10) { in dt9812_configure_mux()
420 /* In the DT9812/10V MUX is selected by P1.5-7 */ in dt9812_configure_mux()
421 rmw->address = F020_SFR_P1; in dt9812_configure_mux()
422 rmw->and_mask = 0xe0; in dt9812_configure_mux()
423 rmw->or_value = channel << 5; in dt9812_configure_mux()
426 rmw->address = F020_SFR_AMX0SL; in dt9812_configure_mux()
427 rmw->and_mask = 0xff; in dt9812_configure_mux()
428 rmw->or_value = channel & 0x07; in dt9812_configure_mux()
436 struct dt9812_private *devpriv = dev->private; in dt9812_configure_gain()
439 if (devpriv->device == DT9812_DEVID_DT9812_10) in dt9812_configure_gain()
442 rmw->address = F020_SFR_ADC0CF; in dt9812_configure_gain()
443 rmw->and_mask = F020_MASK_ADC0CF_AMP0GN2 | in dt9812_configure_gain()
449 * 000 -> Gain = 1 in dt9812_configure_gain()
450 * 001 -> Gain = 2 in dt9812_configure_gain()
451 * 010 -> Gain = 4 in dt9812_configure_gain()
452 * 011 -> Gain = 8 in dt9812_configure_gain()
453 * 10x -> Gain = 16 in dt9812_configure_gain()
454 * 11x -> Gain = 0.5 in dt9812_configure_gain()
457 rmw->or_value = F020_MASK_ADC0CF_AMP0GN2 | in dt9812_configure_gain()
463 rmw->or_value = 0x00; in dt9812_configure_gain()
466 rmw->or_value = F020_MASK_ADC0CF_AMP0GN0; in dt9812_configure_gain()
469 rmw->or_value = F020_MASK_ADC0CF_AMP0GN1; in dt9812_configure_gain()
472 rmw->or_value = F020_MASK_ADC0CF_AMP0GN1 | in dt9812_configure_gain()
476 rmw->or_value = F020_MASK_ADC0CF_AMP0GN2; in dt9812_configure_gain()
484 struct dt9812_private *devpriv = dev->private; in dt9812_analog_in()
494 mutex_lock(&devpriv->mut); in dt9812_analog_in()
527 switch (devpriv->device) { in dt9812_analog_in()
530 * For DT9812-10V the personality module set the in dt9812_analog_in()
543 mutex_unlock(&devpriv->mut); in dt9812_analog_in()
550 struct dt9812_private *devpriv = dev->private; in dt9812_analog_out()
554 mutex_lock(&devpriv->mut); in dt9812_analog_out()
568 /* 3. load msb of DAC value next to latch the 12-bit value */ in dt9812_analog_out()
585 /* 3. load msb of DAC value next to latch the 12-bit value */ in dt9812_analog_out()
593 mutex_unlock(&devpriv->mut); in dt9812_analog_out()
612 return insn->n; in dt9812_di_insn_bits()
621 dt9812_digital_out(dev, s->state); in dt9812_do_insn_bits()
623 data[1] = s->state; in dt9812_do_insn_bits()
625 return insn->n; in dt9812_do_insn_bits()
633 unsigned int chan = CR_CHAN(insn->chanspec); in dt9812_ai_insn_read()
638 for (i = 0; i < insn->n; i++) { in dt9812_ai_insn_read()
645 return insn->n; in dt9812_ai_insn_read()
653 struct dt9812_private *devpriv = dev->private; in dt9812_ao_insn_read()
656 mutex_lock(&devpriv->mut); in dt9812_ao_insn_read()
658 mutex_unlock(&devpriv->mut); in dt9812_ao_insn_read()
668 unsigned int chan = CR_CHAN(insn->chanspec); in dt9812_ao_insn_write()
671 for (i = 0; i < insn->n; i++) { in dt9812_ao_insn_write()
679 s->readback[chan] = val; in dt9812_ao_insn_write()
682 return insn->n; in dt9812_ao_insn_write()
688 struct usb_host_interface *host = intf->cur_altsetting; in dt9812_find_endpoints()
689 struct dt9812_private *devpriv = dev->private; in dt9812_find_endpoints()
693 if (host->desc.bNumEndpoints != 5) { in dt9812_find_endpoints()
694 dev_err(dev->class_dev, "Wrong number of endpoints\n"); in dt9812_find_endpoints()
695 return -ENODEV; in dt9812_find_endpoints()
698 for (i = 0; i < host->desc.bNumEndpoints; ++i) { in dt9812_find_endpoints()
699 int dir = -1; in dt9812_find_endpoints() local
701 ep = &host->endpoint[i].desc; in dt9812_find_endpoints()
705 dir = USB_DIR_IN; in dt9812_find_endpoints()
708 dir = USB_DIR_OUT; in dt9812_find_endpoints()
709 devpriv->cmd_wr.addr = ep->bEndpointAddress; in dt9812_find_endpoints()
710 devpriv->cmd_wr.size = usb_endpoint_maxp(ep); in dt9812_find_endpoints()
713 dir = USB_DIR_IN; in dt9812_find_endpoints()
714 devpriv->cmd_rd.addr = ep->bEndpointAddress; in dt9812_find_endpoints()
715 devpriv->cmd_rd.size = usb_endpoint_maxp(ep); in dt9812_find_endpoints()
719 dir = USB_DIR_OUT; in dt9812_find_endpoints()
723 dir = USB_DIR_IN; in dt9812_find_endpoints()
726 if ((ep->bEndpointAddress & USB_DIR_IN) != dir) { in dt9812_find_endpoints()
727 dev_err(dev->class_dev, in dt9812_find_endpoints()
729 return -ENODEV; in dt9812_find_endpoints()
738 struct dt9812_private *devpriv = dev->private; in dt9812_reset_device()
739 u32 serial; in dt9812_reset_device() local
761 dev_err(dev->class_dev, in dt9812_reset_device()
769 dev_err(dev->class_dev, "failed to read vendor id\n"); in dt9812_reset_device()
776 dev_err(dev->class_dev, "failed to read product id\n"); in dt9812_reset_device()
783 dev_err(dev->class_dev, "failed to read device id\n"); in dt9812_reset_device()
786 devpriv->device = le16_to_cpu(tmp16); in dt9812_reset_device()
790 dev_err(dev->class_dev, "failed to read serial number\n"); in dt9812_reset_device()
793 serial = le32_to_cpu(tmp32); in dt9812_reset_device()
796 dev_info(dev->class_dev, "USB DT9812 (%4.4x.%4.4x.%4.4x) #0x%8.8x\n", in dt9812_reset_device()
797 vendor, product, devpriv->device, serial); in dt9812_reset_device()
799 if (devpriv->device != DT9812_DEVID_DT9812_10 && in dt9812_reset_device()
800 devpriv->device != DT9812_DEVID_DT9812_2PT5) { in dt9812_reset_device()
801 dev_err(dev->class_dev, "Unsupported device!\n"); in dt9812_reset_device()
802 return -EINVAL; in dt9812_reset_device()
820 return -ENOMEM; in dt9812_auto_attach()
822 mutex_init(&devpriv->mut); in dt9812_auto_attach()
833 is_unipolar = (devpriv->device == DT9812_DEVID_DT9812_2PT5); in dt9812_auto_attach()
840 s = &dev->subdevices[0]; in dt9812_auto_attach()
841 s->type = COMEDI_SUBD_DI; in dt9812_auto_attach()
842 s->subdev_flags = SDF_READABLE; in dt9812_auto_attach()
843 s->n_chan = 8; in dt9812_auto_attach()
844 s->maxdata = 1; in dt9812_auto_attach()
845 s->range_table = &range_digital; in dt9812_auto_attach()
846 s->insn_bits = dt9812_di_insn_bits; in dt9812_auto_attach()
849 s = &dev->subdevices[1]; in dt9812_auto_attach()
850 s->type = COMEDI_SUBD_DO; in dt9812_auto_attach()
851 s->subdev_flags = SDF_WRITABLE; in dt9812_auto_attach()
852 s->n_chan = 8; in dt9812_auto_attach()
853 s->maxdata = 1; in dt9812_auto_attach()
854 s->range_table = &range_digital; in dt9812_auto_attach()
855 s->insn_bits = dt9812_do_insn_bits; in dt9812_auto_attach()
858 s = &dev->subdevices[2]; in dt9812_auto_attach()
859 s->type = COMEDI_SUBD_AI; in dt9812_auto_attach()
860 s->subdev_flags = SDF_READABLE | SDF_GROUND; in dt9812_auto_attach()
861 s->n_chan = 8; in dt9812_auto_attach()
862 s->maxdata = 0x0fff; in dt9812_auto_attach()
863 s->range_table = is_unipolar ? &range_unipolar2_5 : &range_bipolar10; in dt9812_auto_attach()
864 s->insn_read = dt9812_ai_insn_read; in dt9812_auto_attach()
867 s = &dev->subdevices[3]; in dt9812_auto_attach()
868 s->type = COMEDI_SUBD_AO; in dt9812_auto_attach()
869 s->subdev_flags = SDF_WRITABLE; in dt9812_auto_attach()
870 s->n_chan = 2; in dt9812_auto_attach()
871 s->maxdata = 0x0fff; in dt9812_auto_attach()
872 s->range_table = is_unipolar ? &range_unipolar2_5 : &range_bipolar10; in dt9812_auto_attach()
873 s->insn_write = dt9812_ao_insn_write; in dt9812_auto_attach()
874 s->insn_read = dt9812_ao_insn_read; in dt9812_auto_attach()
880 for (i = 0; i < s->n_chan; i++) in dt9812_auto_attach()
881 s->readback[i] = is_unipolar ? 0x0000 : 0x0800; in dt9812_auto_attach()
889 struct dt9812_private *devpriv = dev->private; in dt9812_detach()
894 mutex_destroy(&devpriv->mut); in dt9812_detach()
908 return comedi_usb_auto_config(intf, &dt9812_driver, id->driver_info); in dt9812_usb_probe()