Advertisement
Guest User

Untitled

a guest
Jul 31st, 2014
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.57 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 = 0;
  34. printk("%s(): data->transfer_buffer_out = %p\n", __FUNCTION__, data->transfer_buffer_out);
  35. *brightness = bdev->props.brightness;
  36. printk(KERN_INFO PKK_BL_DRIVER_NAME "Brightness set function called. New brightness: %d.\n", *brightness);
  37. *transfer_buffer_out = PKK_BL_CMD_SET_BRIGHTNESS;
  38. transfer_buffer_out++;
  39. *transfer_buffer_out = *brightness;
  40. error = usb_submit_urb(data->urb, GFP_KERNEL);
  41. if (data->urb->status != 0 || error != 0) {
  42. printk(KERN_ERR PKK_BL_DRIVER_NAME "Urb submit failled. Urb status: %d. Usb_submit_urb returned:%d.\n",
  43. data->urb->status, error);
  44. }
  45. return error;
  46. }
  47.  
  48. static const struct backlight_ops pkk_bl_blops = {
  49. .update_status = pkk_bl_set_brightness,
  50. .get_brightness = pkk_bl_get_brightness,
  51. };
  52.  
  53. static int pkk_bl_init_backlight(struct pkk_bl_data *data) // I'm not sure that it should be static
  54. {
  55. struct device *dev = &data->intf->dev;
  56. struct backlight_device *bdev;
  57. struct backlight_properties props;
  58. printk(KERN_INFO PKK_BL_DRIVER_NAME "Backlight device initialization...\n");
  59. if (data->intf == 0) {
  60. printk(KERN_ERR PKK_BL_DRIVER_NAME "%s(): no such interface\n", __FUNCTION__);
  61. return -ENODEV;
  62. }
  63. /* PicoLCD - There was sommething for hid_report */
  64. memset(&props, 0, sizeof(props));
  65. props.type = BACKLIGHT_RAW; //I don't know what is it
  66. props.max_brightness = PKK_BL_MAX_BRIGHTNESS;
  67. printk("%s(): data->intf = %p\ndev = %p\ndata = %p\n", __FUNCTION__, data->intf, (void *)dev, data);
  68. printk("%s(): dev_name(dev) = %s\ndev = %p\ndata = %p\n", __FUNCTION__, dev_name(dev), (void *)dev, data);
  69. bdev = backlight_device_register(dev_name(dev), dev, data, &pkk_bl_blops, &props);
  70. if (IS_ERR(bdev)) {
  71. printk(KERN_ERR PKK_BL_DRIVER_NAME "Failed to register backlight.\n");
  72. return PTR_ERR(bdev);
  73. }
  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. urb = usb_alloc_urb(0, GFP_KERNEL);
  126. if (urb == NULL) {
  127. printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't initializate urb.\n");
  128. goto err_exit_backlight;
  129. }
  130. data->urb = urb;
  131. transfer_buffer_out = kzalloc(sizeof(unsigned char) * PKK_BL_TRANSFER_BUFFER_OUT_SIZE, GFP_KERNEL);
  132. if (transfer_buffer_out == NULL) {
  133. printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't allocate space for transfer buffer (out).\n");
  134. error = -ENOMEM;
  135. goto err_urb_cleanup;
  136. }
  137.  
  138. data->transfer_buffer_out = transfer_buffer_out;
  139. error = pkk_bl_init_backlight(data);
  140. if (error) {
  141. pkk_bl_exit_backlight(data);
  142. printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't initializate backlight device.\n");
  143. goto err_cleanup_data;
  144. }
  145.  
  146. 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);
  147. printk(KERN_INFO PKK_BL_DRIVER_NAME "Device activated and initialized.\n");
  148. return 0;
  149. err_cleanup_data:kfree(data);
  150. err_urb_cleanup:usb_free_urb(urb);
  151. err_exit_backlight:pkk_bl_exit_backlight(data);
  152. err_no_cleanup:
  153. //dev_set_drvdata(&intf->dev, NULL); - intf->dev->data Wasn't assigned in this step(dev_setdrvdata wasn't called
  154. err_nodev:
  155. return error;
  156. }
  157.  
  158. static void pkk_bl_disconnect(struct usb_interface *intf)
  159. {
  160. struct pkk_bl_data *data = dev_get_drvdata(&intf->dev);
  161. printk(KERN_INFO PKK_BL_DRIVER_NAME "Hardware remove...\n");
  162.  
  163. /* PicoLCD - There was synchronization elements (removing & using) */
  164. pkk_bl_exit_backlight(data);
  165. dev_set_drvdata(&intf->dev, NULL);
  166. usb_free_urb(data->urb);
  167. kfree(data->transfer_buffer_out);
  168. kfree(data);
  169. printk(KERN_INFO PKK_BL_DRIVER_NAME "Device disconnected successfully.\n");
  170. }
  171.  
  172. static struct usb_device_id pkk_bl_devices[] = {
  173. { USB_DEVICE(USB_VENDOR_ID_PKK_BL, USB_DEVICE_ID_PKK_BL) },
  174. {}
  175. };
  176.  
  177. MODULE_DEVICE_TABLE(usb, pkk_bl_devices);
  178. static struct usb_driver pkk_bl_driver = {
  179. .name = "usb_pkk_backlight",
  180. .id_table = pkk_bl_devices,
  181. .probe = pkk_bl_probe,
  182. .disconnect = pkk_bl_disconnect,
  183. };
  184.  
  185. module_usb_driver(pkk_bl_driver);
  186. MODULE_DESCRIPTION("PKK USB backlight driver");
  187. MODULE_LICENSE("GPL v2");
  188. MODULE_AUTHOR("Dmitry Chepurovskiy <dm3chip@gmail.com>");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement