Advertisement
Guest User

Untitled

a guest
Jul 31st, 2014
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.54 KB | None | 0 0
  1. #include <linux/init.h>
  2.  
  3. #include <linux/module.h>
  4. #include <linux/backlight.h>
  5. #include <linux/usb.h>
  6.  
  7. #include <linux/kernel.h>
  8. #include <linux/slab.h>
  9.  
  10. #include "usb-pkk-backlight.h"
  11. static void urb_out_complete(struct urb *urb)
  12. {
  13. return;
  14. }
  15.  
  16. static int pkk_bl_get_brightness(struct backlight_device *bdev)
  17. {
  18. struct pkk_bl_data *data = bl_get_data(bdev);
  19.  
  20. //uint8_t *brightness = &bdev->props.brightness; //Not sure, that this is right
  21. uint8_t *brightness = &data->brightness;
  22. printk(KERN_INFO PKK_BL_DRIVER_NAME "Brightness get function called. Current brightness: %d.\n", *brightness);
  23. return *brightness;
  24. }
  25.  
  26. static int pkk_bl_set_brightness(struct backlight_device *bdev)
  27. {
  28. struct pkk_bl_data *data = bl_get_data(bdev);
  29.  
  30. //uint8_t *brightness = &bdev->props.brightness; //Not sure, that this is right
  31. uint8_t *brightness = &data->brightness;
  32. unsigned char *transfer_buffer_out = data->transfer_buffer_out;
  33. int error;
  34. *brightness = bdev->props.brightness;
  35. printk(KERN_INFO PKK_BL_DRIVER_NAME "Brightness set function called. New brightness: %d.\n", *brightness);
  36. *transfer_buffer_out = PKK_BL_CMD_SET_BRIGHTNESS;
  37. transfer_buffer_out++;
  38. *transfer_buffer_out = *brightness;
  39. error = usb_submit_urb(data->urb, GFP_KERNEL);
  40. if (data->urb->status != 0 || error != 0) {
  41. printk(KERN_ERR PKK_BL_DRIVER_NAME "Urb submit failled. Urb status: %d. Usb_submit_urb returned:%d.\n",
  42. data->urb->status, error);
  43. }
  44. return 0;
  45. }
  46.  
  47. static const struct backlight_ops pkk_bl_blops = {
  48. .update_status = pkk_bl_set_brightness,
  49. .get_brightness = pkk_bl_get_brightness,
  50. };
  51.  
  52. static int pkk_bl_init_backlight(struct pkk_bl_data *data) // I'm not sure that it should be static
  53. {
  54. struct device *dev = &data->intf->dev;
  55. struct backlight_device *bdev;
  56. struct backlight_properties props;
  57. printk(KERN_INFO PKK_BL_DRIVER_NAME "Backlight device initialization...\n");
  58. if (data->intf == 0) {
  59. printk(KERN_ERR PKK_BL_DRIVER_NAME "%s(): no such interface\n", __FUNCTION__);
  60. return -ENODEV;
  61. }
  62. /* PicoLCD - There was sommething for hid_report */
  63. memset(&props, 0, sizeof(props));
  64. props.type = BACKLIGHT_RAW; //I don't know what is it
  65. props.max_brightness = PKK_BL_MAX_BRIGHTNESS;
  66. printk("%s(): data->intf = %p\ndev = %p\ndata = %p\n", __FUNCTION__, data->intf, (void *)dev, data);
  67. printk("%s(): dev_name(dev) = %s\ndev = %p\ndata = %p\n", __FUNCTION__, dev_name(dev), (void *)dev, data);
  68. bdev = backlight_device_register(dev_name(dev), dev, data, &pkk_bl_blops, &props);
  69. if (IS_ERR(bdev)) {
  70. printk(KERN_ERR PKK_BL_DRIVER_NAME "Failed to register backlight.\n");
  71. return PTR_ERR(bdev);
  72. }
  73. printk(KERN_INFO PKK_BL_DRIVER_NAME "%s():%d", __FUNCTION__, __LINE__);
  74. bdev->props.brightness = PKK_BL_DEFAULT_BRIGHTNESS;
  75. data->bdev = bdev;
  76. pkk_bl_set_brightness(bdev);
  77. printk(KERN_INFO PKK_BL_DRIVER_NAME "Backlight device initialized.\n");
  78. return 0;
  79. }
  80.  
  81. static void pkk_bl_exit_backlight(struct pkk_bl_data *data) // I'm not sure that it should be static
  82. {
  83. struct backlight_device *bdev = data->bdev;
  84. printk(KERN_INFO PKK_BL_DRIVER_NAME "Backlight device unregistering...\n");
  85. data->bdev = NULL;
  86. if (bdev)
  87. backlight_device_unregister(bdev);
  88. printk(KERN_INFO PKK_BL_DRIVER_NAME "Backlight device unregistered successfully.\n");
  89. }
  90.  
  91. static int pkk_bl_probe(struct usb_interface *intf, const struct usb_device_id *id)
  92. {
  93. struct pkk_bl_data *data;
  94. int error = 0;
  95. struct urb *urb;
  96. unsigned char *transfer_buffer_out;
  97. struct usb_device *udev = interface_to_usbdev(intf);
  98.  
  99. if (intf == NULL) {
  100. printk(KERN_ERR "%s(): no such interface\n", __FUNCTION__);
  101. error = -ENODEV;
  102. goto err_nodev;
  103. }
  104. printk(KERN_INFO PKK_BL_DRIVER_NAME "Hardware probe...\n");
  105.  
  106. /* Varibles initialization and assigments */
  107. data = kzalloc(sizeof(struct pkk_bl_data), GFP_KERNEL);
  108. if (data == NULL) {
  109. printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't allocate space for device data.\n");
  110. error = -ENOMEM;
  111. goto err_no_cleanup;
  112. }
  113.  
  114. /* PicoLCD - There was synchronization elements (initialization & using) */
  115. dev_set_drvdata(&intf->dev, data);
  116. printk("pkk_bl_probe: intf = %p\n", (void *)intf);
  117. printk("pkk_bl_probe: &intf->dev = %p\n", (void *)&intf->dev);
  118.  
  119. /* Filling data structure */
  120. data->udev_id = (struct usb_device_id *)id;
  121. data->udev = udev;
  122. data->intf = intf;
  123.  
  124. /* Modules initialization */
  125. error = pkk_bl_init_backlight(data);
  126. if (error) {
  127. pkk_bl_exit_backlight(data);
  128. printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't initializate backlight device.\n");
  129. goto err_cleanup_data;
  130. }
  131. urb = usb_alloc_urb(0, GFP_KERNEL);
  132. if (urb == NULL) {
  133. printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't initializate urb.\n");
  134. goto err_exit_backlight;
  135. }
  136. data->urb = urb;
  137. transfer_buffer_out = kzalloc(sizeof(unsigned char) * PKK_BL_TRANSFER_BUFFER_OUT_SIZE, GFP_KERNEL);
  138. if (transfer_buffer_out == NULL) {
  139. printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't allocate space for transfer buffer (out).\n");
  140. error = -ENOMEM;
  141. goto err_urb_cleanup;
  142. }
  143. data->transfer_buffer_out = transfer_buffer_out;
  144.  
  145. usb_fill_int_urb(urb, udev, usb_rcvintpipe(to_usb_device(&intf->dev), PKK_BL_OUT_ENDPOINT), transfer_buffer_out, PKK_BL_TRANSFER_BUFFER_OUT_SIZE, urb_out_complete, data, PKK_BL_OUT_INTERVAL);
  146. printk(KERN_INFO PKK_BL_DRIVER_NAME "Device activated and initialized.\n");
  147. return 0;
  148. err_urb_cleanup:usb_free_urb(urb);
  149. err_exit_backlight:pkk_bl_exit_backlight(data);
  150. err_cleanup_data:kfree(data);
  151. err_no_cleanup:
  152. //dev_set_drvdata(&intf->dev, NULL); - intf->dev->data Wasn't assigned in this step(dev_setdrvdata wasn't called
  153. err_nodev:
  154. return error;
  155. }
  156.  
  157. static void pkk_bl_disconnect(struct usb_interface *intf)
  158. {
  159. struct pkk_bl_data *data = dev_get_drvdata(&intf->dev);
  160. printk(KERN_INFO PKK_BL_DRIVER_NAME "Hardware remove...\n");
  161.  
  162. /* PicoLCD - There was synchronization elements (removing & using) */
  163. pkk_bl_exit_backlight(data);
  164. dev_set_drvdata(&intf->dev, NULL);
  165. usb_free_urb(data->urb);
  166. kfree(data->transfer_buffer_out);
  167. kfree(data);
  168. printk(KERN_INFO PKK_BL_DRIVER_NAME "Device disconnected successfully.\n");
  169. }
  170.  
  171. static struct usb_device_id pkk_bl_devices[] = {
  172. { USB_DEVICE(USB_VENDOR_ID_PKK_BL, USB_DEVICE_ID_PKK_BL) },
  173. {}
  174. };
  175.  
  176. MODULE_DEVICE_TABLE(usb, pkk_bl_devices);
  177. static struct usb_driver pkk_bl_driver = {
  178. .name = "usb_pkk_backlight",
  179. .id_table = pkk_bl_devices,
  180. .probe = pkk_bl_probe,
  181. .disconnect = pkk_bl_disconnect,
  182. };
  183.  
  184. module_usb_driver(pkk_bl_driver);
  185. MODULE_DESCRIPTION("PKK USB backlight driver");
  186. MODULE_LICENSE("GPL v2");
  187. MODULE_AUTHOR("Dmitry Chepurovskiy <dm3chip@gmail.com>");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement