Advertisement
Guest User

Custom Hardware Driver ATTEMPT

a guest
Mar 26th, 2014
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.22 KB | None | 0 0
  1. #include <linux/kernel.h>
  2. #include <linux/errno.h>
  3. #include <linux/init.h>
  4. #include <linux/slab.h>
  5. #include <linux/module.h>
  6. #include <linux/usb.h>
  7. //#include <linux/smp_lock.h>
  8. #include <asm/uaccess.h>
  9.  
  10. #include <linux/version.h>
  11. #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
  12. #include <linux/autoconf.h>
  13. #else
  14. #include <generated/autoconf.h>
  15. #endif
  16.  
  17. MODULE_LICENSE("Dual BSD/GPL");
  18.  
  19. #define VENDOR_ID  0x0001
  20. #define PRODUCT_ID 0x1110
  21.  
  22. static struct usb_device_id id_table[] = {
  23.   { USB_DEVICE(VENDOR_ID, PRODUCT_ID) },
  24.   { },
  25. };
  26. MODULE_DEVICE_TABLE (usb, id_table);
  27.  
  28. struct usb_led {
  29.   struct usb_device *udev;
  30.   unsigned char value;
  31. };
  32.  
  33. static void set_light(struct usb_led *led){
  34.   int retval;
  35.  
  36.   const unsigned char *buffer = kmalloc(8, GFP_KERNEL);
  37.  
  38.   retval = usb_control_msg(led->udev,
  39.                usb_sndctrlpipe(led->udev, 0),
  40.                0x12,
  41.                0xc8,
  42.                (0x02 * 0x100) + 0x0a,
  43.                (0x00 * 0x100) * led->value,
  44.                (void*)buffer,
  45.                8,
  46.                2*HZ);
  47.  
  48.   kfree(buffer);
  49. }
  50.  
  51. static ssize_t show_led(struct device *dev,
  52.             struct device_attribute *attr,
  53.             char *buf) {
  54.   struct usb_interface *intf = to_usb_interface(dev);
  55.   struct usb_led *led = usb_get_intfdata(intf);
  56.  
  57.   return sprintf(buf, "%d\n", led->value); // Might need to be ->red
  58. }
  59.  
  60. static ssize_t set_led(struct device *dev,
  61.                struct device_attribute *attr,
  62.                const char *buf,
  63.                size_t count) {
  64.   struct usb_interface *intf = to_usb_interface(dev);
  65.   struct usb_led *led = usb_get_intfdata(intf);
  66.   int temp = simple_strtoul(buf, NULL, 10);
  67.  
  68.   led->value = temp;
  69.   set_light(led);
  70.   return count;
  71. }
  72.  
  73. static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_led, set_led);
  74.  
  75. // Called when the device is initial connected and probed
  76. // by the kernel
  77. static int led_probe(struct usb_interface *interface,
  78.              const struct usb_device_id *id) {
  79.  
  80.   struct usb_device *udev = interface_to_usbdev(interface);
  81.   struct usb_led *dev = NULL;
  82.  
  83.   dev = kmalloc(sizeof(struct usb_led), GFP_KERNEL);
  84.   memset(dev, 0x00, sizeof(*dev));
  85.  
  86.   dev->udev = usb_get_dev(udev);
  87.   usb_set_intfdata(interface, dev);
  88.  
  89.   device_create_file(&interface->dev, &dev_attr_value);
  90.  
  91.   dev_info(&interface->dev, "USB LED Device now attached");
  92.  
  93.   return 0;
  94. }
  95.  
  96.  
  97. // Called when the device is disconnected
  98. //
  99. static void led_disconnect(struct usb_interface *interface) {
  100.   struct usb_led *dev;
  101.  
  102.   dev = usb_get_intfdata (interface);
  103.   usb_set_intfdata (interface, NULL);
  104.  
  105.   device_remove_file(&interface->dev, &dev_attr_value);
  106.  
  107.   usb_put_dev(dev->udev);
  108.  
  109.   kfree(dev);
  110.  
  111.   dev_info(&interface->dev, "USB LED now disconnected\n");
  112. }
  113.  
  114. // Holds information used by the USB framework
  115. static struct usb_driver led_driver = {
  116.   //  .owner = THIS_MODULE,
  117.   .name = "usbled",
  118.   .probe = led_probe,
  119.   .disconnect = led_disconnect,
  120.   .id_table = id_table,
  121. };
  122.  
  123.  
  124. // insmod calls this
  125. static int __init usbled_init(void) {
  126.   int retval = 0;
  127.  
  128.   retval = usb_register(&led_driver);
  129.   if (retval)
  130.     printk("usb_register failed. Error number %d", retval);
  131.   return retval;
  132. }
  133.  
  134. // rmmod calls this
  135. static void __exit usbled_exit(void) {
  136.   usb_deregister(&led_driver);
  137. }
  138.  
  139. module_init(usbled_init);
  140. module_exit(usbled_exit);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement