Advertisement
Guest User

Untitled

a guest
Jul 31st, 2014
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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 "no such interface\n");
  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 "no such interface\n");
  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.  
  123.     /* Modules initialization */
  124.     error = pkk_bl_init_backlight(data);
  125.     if (error) {
  126.         pkk_bl_exit_backlight(data);
  127.         printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't initializate backlight device.\n");
  128.         goto err_cleanup_data;
  129.     }
  130.     urb = usb_alloc_urb(0, GFP_KERNEL);
  131.     if (urb == NULL) {
  132.         printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't initializate urb.\n");
  133.         goto err_exit_backlight;
  134.     }
  135.     data->urb = urb;
  136.     transfer_buffer_out = kzalloc(sizeof(unsigned char) * PKK_BL_TRANSFER_BUFFER_OUT_SIZE, GFP_KERNEL);
  137.     if (transfer_buffer_out == NULL) {
  138.         printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't allocate space for transfer buffer (out).\n");
  139.         error = -ENOMEM;
  140.         goto err_urb_cleanup;
  141.     }
  142.     data->transfer_buffer_out = transfer_buffer_out;
  143.  
  144.     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);
  145.     printk(KERN_INFO PKK_BL_DRIVER_NAME "Device activated and initialized.\n");
  146.     return 0;
  147.  err_urb_cleanup:usb_free_urb(urb);
  148.  err_exit_backlight:pkk_bl_exit_backlight(data);
  149.  err_cleanup_data:kfree(data);
  150.  err_no_cleanup:
  151.     //dev_set_drvdata(&intf->dev, NULL); - intf->dev->data Wasn't assigned in this step(dev_setdrvdata wasn't called
  152.  err_nodev:
  153.     return error;
  154. }
  155.  
  156. static void pkk_bl_disconnect(struct usb_interface *intf)
  157. {
  158.     struct pkk_bl_data *data = dev_get_drvdata(&intf->dev);
  159.     printk(KERN_INFO PKK_BL_DRIVER_NAME "Hardware remove...\n");
  160.  
  161.     /* PicoLCD - There was synchronization elements (removing & using) */
  162.     pkk_bl_exit_backlight(data);
  163.     dev_set_drvdata(&intf->dev, NULL);
  164.     usb_free_urb(data->urb);
  165.     kfree(data->transfer_buffer_out);
  166.     kfree(data);
  167.     printk(KERN_INFO PKK_BL_DRIVER_NAME "Device disconnected successfully.\n");
  168. } static struct usb_device_id pkk_bl_devices[] = { {USB_DEVICE(USB_VENDOR_ID_PKK_BL, USB_DEVICE_ID_PKK_BL)}, {}
  169. };
  170.  
  171. MODULE_DEVICE_TABLE(usb, pkk_bl_devices);
  172. static struct usb_driver pkk_bl_driver = {.name = "usb_pkk_backlight",.id_table = pkk_bl_devices,.probe =
  173.         pkk_bl_probe,.disconnect = pkk_bl_disconnect,
  174. };
  175.  
  176. module_usb_driver(pkk_bl_driver);
  177. MODULE_DESCRIPTION("PKK USB backlight driver");
  178. MODULE_LICENSE("GPL v2");
  179. MODULE_AUTHOR("Dmitry Chepurovskiy <dm3chip@gmail.com>");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement