Advertisement
Dm3Ch

usb-pkk-backlight.c v4

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