usbio-adc.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include <linux/delay.h>
  2. #include <linux/iio/iio.h>
  3. #include <linux/iio/driver.h>
  4. #include <linux/iio/machine.h>
  5. #include <linux/module.h>
  6. #include <linux/mutex.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/slab.h>
  9. #include <linux/usb.h>
  10. #define USBIO_VENDOR_ID 0x04d8
  11. #define USBIO_PRODUCT_ID 0x003f
  12. struct usbio_adc {
  13. struct usb_device *udev;
  14. int value;
  15. };
  16. static const struct iio_chan_spec const usbio_adc_channels[] = {
  17. {
  18. .indexed = 1,
  19. .type = IIO_VOLTAGE,
  20. .channel = 0,
  21. .datasheet_name = "DM0",
  22. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
  23. }, {
  24. .indexed = 1,
  25. .type = IIO_VOLTAGE,
  26. .channel = 1,
  27. .datasheet_name = "DM1",
  28. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
  29. }
  30. };
  31. static int usbio_adc_read(struct usb_device *usb_dev, int channel, int *val)
  32. {
  33. u8 data[64];
  34. int ret, actual_len;
  35. actual_len = 1;
  36. data[0] = 0x37+channel;
  37. *val = 0;
  38. printk(KERN_INFO "reading from %x", data[0]);
  39. ret = usb_interrupt_msg(usb_dev,
  40. usb_sndintpipe(usb_dev, 1),
  41. data, sizeof(data), &actual_len, USB_CTRL_SET_TIMEOUT);
  42. if(ret < 0)
  43. return -EIO;
  44. actual_len = 64;
  45. memset(data, 0, 64);
  46. ret = usb_bulk_msg(usb_dev,
  47. usb_rcvbulkpipe(usb_dev, 0x81),
  48. data, sizeof(data), &actual_len, USB_CTRL_SET_TIMEOUT);
  49. if(ret < 0)
  50. return -EIO;
  51. printk(KERN_INFO "back from %x",data[0]);
  52. *val = (data[2] << 8) | data[1];
  53. return IIO_VAL_INT;
  54. }
  55. static int usbio_adc_read_raw(struct iio_dev *usbio_adc_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
  56. {
  57. int ret;
  58. struct usbio_adc *adc = iio_priv(usbio_adc_dev);
  59. mutex_lock(&usbio_adc_dev->mlock);
  60. switch(mask) {
  61. case IIO_CHAN_INFO_RAW:
  62. ret = usbio_adc_read(adc->udev, chan->channel, val);
  63. break;
  64. default:
  65. ret = -EINVAL;
  66. }
  67. mutex_unlock(&usbio_adc_dev->mlock);
  68. return ret;
  69. }
  70. static const struct iio_info usbio_adc_iio_info = {
  71. .read_raw = &usbio_adc_read_raw,
  72. .driver_module = THIS_MODULE
  73. };
  74. static struct iio_map usbio_adc_default_maps[] = {
  75. {
  76. .adc_channel_label = "DM0",
  77. .consumer_dev_name = "usbio-adc",
  78. .consumer_channel = "usbio-adc0",
  79. },
  80. {
  81. .adc_channel_label = "DM1",
  82. .consumer_dev_name = "usbio-adc",
  83. .consumer_channel = "usbio-adc1",
  84. }
  85. };
  86. static int usbio_adc_probe(struct usb_interface *interface, const struct usb_device_id *id)
  87. {
  88. struct usb_device *udev = interface_to_usbdev(interface);
  89. struct iio_dev *usbio_adc_dev;
  90. struct usbio_adc *adc = NULL;
  91. int ret;
  92. usbio_adc_dev = devm_iio_device_alloc(&udev->dev, sizeof(*adc));
  93. if(!usbio_adc_dev)
  94. return -ENOMEM;
  95. adc = iio_priv(usbio_adc_dev);
  96. adc->udev = udev;
  97. adc->value = 0;
  98. usb_set_intfdata(interface, usbio_adc_dev);
  99. usbio_adc_dev->dev.parent = &udev->dev;
  100. usbio_adc_dev->name = "usbio-adc";
  101. usbio_adc_dev->channels = usbio_adc_channels;
  102. usbio_adc_dev->num_channels = ARRAY_SIZE(usbio_adc_channels);
  103. usbio_adc_dev->info = &usbio_adc_iio_info;
  104. usbio_adc_dev->modes = INDIO_DIRECT_MODE;
  105. ret = iio_map_array_register(usbio_adc_dev, usbio_adc_default_maps);
  106. if(ret < 0) {
  107. dev_err(&udev->dev, "something went wrong");
  108. return ret;
  109. }
  110. ret = iio_device_register(usbio_adc_dev);
  111. if(ret < 0) {
  112. dev_err(&udev->dev, "unable to register iiodevice \n");
  113. goto err_array_unregister;
  114. }
  115. return 0;
  116. err_array_unregister:
  117. iio_map_array_unregister(usbio_adc_dev);
  118. return ret;
  119. }
  120. static void usbio_adc_disconnect(struct usb_interface *interface)
  121. {
  122. struct iio_dev *usbio_adc_dev = usb_get_intfdata(interface);
  123. struct usbio_adc *adc = iio_priv(usbio_adc_dev);
  124. //usb_set_intfdata(interface, NULL);
  125. usb_put_dev(adc->udev);
  126. // kfree(adc);
  127. iio_device_unregister(usbio_adc_dev);
  128. iio_map_array_unregister(usbio_adc_dev);
  129. }
  130. static struct usb_device_id usbio_id_table[] = {
  131. { USB_DEVICE(USBIO_VENDOR_ID, USBIO_PRODUCT_ID) },
  132. {}
  133. };
  134. MODULE_DEVICE_TABLE(usb, usbio_id_table);
  135. static struct usb_driver usbio_adc_driver = {
  136. .name = "usbio_adc",
  137. .probe = usbio_adc_probe,
  138. .disconnect = usbio_adc_disconnect,
  139. .id_table = usbio_id_table
  140. };
  141. module_usb_driver(usbio_adc_driver);
  142. MODULE_DESCRIPTION("USBIO ADC");
  143. MODULE_AUTHOR("encrypt <encrypt@labr.xyz>");
  144. MODULE_LICENSE("GPL");