root/drivers/media/usb/hdpvr/hdpvr-core.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. hdpvr_delete
  2. challenge
  3. device_authorization
  4. hdpvr_device_init
  5. hdpvr_probe
  6. hdpvr_disconnect

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Hauppauge HD PVR USB driver
   4  *
   5  * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
   6  * Copyright (C) 2008      Janne Grunau (j@jannau.net)
   7  * Copyright (C) 2008      John Poet
   8  */
   9 
  10 #include <linux/kernel.h>
  11 #include <linux/errno.h>
  12 #include <linux/init.h>
  13 #include <linux/slab.h>
  14 #include <linux/module.h>
  15 #include <linux/uaccess.h>
  16 #include <linux/atomic.h>
  17 #include <linux/usb.h>
  18 #include <linux/mutex.h>
  19 #include <linux/i2c.h>
  20 
  21 #include <linux/videodev2.h>
  22 #include <media/v4l2-dev.h>
  23 #include <media/v4l2-common.h>
  24 
  25 #include "hdpvr.h"
  26 
  27 static int video_nr[HDPVR_MAX] = {[0 ... (HDPVR_MAX - 1)] = UNSET};
  28 module_param_array(video_nr, int, NULL, 0);
  29 MODULE_PARM_DESC(video_nr, "video device number (-1=Auto)");
  30 
  31 /* holds the number of currently registered devices */
  32 static atomic_t dev_nr = ATOMIC_INIT(-1);
  33 
  34 int hdpvr_debug;
  35 module_param(hdpvr_debug, int, S_IRUGO|S_IWUSR);
  36 MODULE_PARM_DESC(hdpvr_debug, "enable debugging output");
  37 
  38 static uint default_video_input = HDPVR_VIDEO_INPUTS;
  39 module_param(default_video_input, uint, S_IRUGO|S_IWUSR);
  40 MODULE_PARM_DESC(default_video_input, "default video input: 0=Component / 1=S-Video / 2=Composite");
  41 
  42 static uint default_audio_input = HDPVR_AUDIO_INPUTS;
  43 module_param(default_audio_input, uint, S_IRUGO|S_IWUSR);
  44 MODULE_PARM_DESC(default_audio_input, "default audio input: 0=RCA back / 1=RCA front / 2=S/PDIF");
  45 
  46 static bool boost_audio;
  47 module_param(boost_audio, bool, S_IRUGO|S_IWUSR);
  48 MODULE_PARM_DESC(boost_audio, "boost the audio signal");
  49 
  50 
  51 /* table of devices that work with this driver */
  52 static const struct usb_device_id hdpvr_table[] = {
  53         { USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID) },
  54         { USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID1) },
  55         { USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID2) },
  56         { USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID3) },
  57         { USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID4) },
  58         { }                                     /* Terminating entry */
  59 };
  60 MODULE_DEVICE_TABLE(usb, hdpvr_table);
  61 
  62 
  63 void hdpvr_delete(struct hdpvr_device *dev)
  64 {
  65         hdpvr_free_buffers(dev);
  66         usb_put_dev(dev->udev);
  67 }
  68 
  69 static void challenge(u8 *bytes)
  70 {
  71         __le64 *i64P;
  72         u64 tmp64;
  73         uint i, idx;
  74 
  75         for (idx = 0; idx < 32; ++idx) {
  76 
  77                 if (idx & 0x3)
  78                         bytes[(idx >> 3) + 3] = bytes[(idx >> 2) & 0x3];
  79 
  80                 switch (idx & 0x3) {
  81                 case 0x3:
  82                         bytes[2] += bytes[3] * 4 + bytes[4] + bytes[5];
  83                         bytes[4] += bytes[(idx & 0x1) * 2] * 9 + 9;
  84                         break;
  85                 case 0x1:
  86                         bytes[0] *= 8;
  87                         bytes[0] += 7*idx + 4;
  88                         bytes[6] += bytes[3] * 3;
  89                         break;
  90                 case 0x0:
  91                         bytes[3 - (idx >> 3)] = bytes[idx >> 2];
  92                         bytes[5] += bytes[6] * 3;
  93                         for (i = 0; i < 3; i++)
  94                                 bytes[3] *= bytes[3] + 1;
  95                         break;
  96                 case 0x2:
  97                         for (i = 0; i < 3; i++)
  98                                 bytes[1] *= bytes[6] + 1;
  99                         for (i = 0; i < 3; i++) {
 100                                 i64P = (__le64 *)bytes;
 101                                 tmp64 = le64_to_cpup(i64P);
 102                                 tmp64 = tmp64 + (tmp64 << (bytes[7] & 0x0f));
 103                                 *i64P = cpu_to_le64(tmp64);
 104                         }
 105                         break;
 106                 }
 107         }
 108 }
 109 
 110 /* try to init the device like the windows driver */
 111 static int device_authorization(struct hdpvr_device *dev)
 112 {
 113 
 114         int ret, retval = -ENOMEM;
 115         char request_type = 0x38, rcv_request = 0x81;
 116         char *response;
 117 
 118         mutex_lock(&dev->usbc_mutex);
 119         ret = usb_control_msg(dev->udev,
 120                               usb_rcvctrlpipe(dev->udev, 0),
 121                               rcv_request, 0x80 | request_type,
 122                               0x0400, 0x0003,
 123                               dev->usbc_buf, 46,
 124                               10000);
 125         if (ret != 46) {
 126                 v4l2_err(&dev->v4l2_dev,
 127                          "unexpected answer of status request, len %d\n", ret);
 128                 goto unlock;
 129         }
 130 #ifdef HDPVR_DEBUG
 131         else {
 132                 v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
 133                          "Status request returned, len %d: %46ph\n",
 134                          ret, dev->usbc_buf);
 135         }
 136 #endif
 137 
 138         dev->fw_ver = dev->usbc_buf[1];
 139 
 140         dev->usbc_buf[46] = '\0';
 141         v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n",
 142                           dev->fw_ver, &dev->usbc_buf[2]);
 143 
 144         if (dev->fw_ver > 0x15) {
 145                 dev->options.brightness = 0x80;
 146                 dev->options.contrast   = 0x40;
 147                 dev->options.hue        = 0xf;
 148                 dev->options.saturation = 0x40;
 149                 dev->options.sharpness  = 0x80;
 150         }
 151 
 152         switch (dev->fw_ver) {
 153         case HDPVR_FIRMWARE_VERSION:
 154                 dev->flags &= ~HDPVR_FLAG_AC3_CAP;
 155                 break;
 156         case HDPVR_FIRMWARE_VERSION_AC3:
 157         case HDPVR_FIRMWARE_VERSION_0X12:
 158         case HDPVR_FIRMWARE_VERSION_0X15:
 159         case HDPVR_FIRMWARE_VERSION_0X1E:
 160                 dev->flags |= HDPVR_FLAG_AC3_CAP;
 161                 break;
 162         default:
 163                 v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might not work.\n");
 164                 if (dev->fw_ver >= HDPVR_FIRMWARE_VERSION_AC3)
 165                         dev->flags |= HDPVR_FLAG_AC3_CAP;
 166                 else
 167                         dev->flags &= ~HDPVR_FLAG_AC3_CAP;
 168         }
 169 
 170         response = dev->usbc_buf+38;
 171 #ifdef HDPVR_DEBUG
 172         v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev, "challenge: %8ph\n",
 173                  response);
 174 #endif
 175         challenge(response);
 176 #ifdef HDPVR_DEBUG
 177         v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev, " response: %8ph\n",
 178                  response);
 179 #endif
 180 
 181         msleep(100);
 182         ret = usb_control_msg(dev->udev,
 183                               usb_sndctrlpipe(dev->udev, 0),
 184                               0xd1, 0x00 | request_type,
 185                               0x0000, 0x0000,
 186                               response, 8,
 187                               10000);
 188         v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
 189                  "magic request returned %d\n", ret);
 190 
 191         retval = ret != 8;
 192 unlock:
 193         mutex_unlock(&dev->usbc_mutex);
 194         return retval;
 195 }
 196 
 197 static int hdpvr_device_init(struct hdpvr_device *dev)
 198 {
 199         int ret;
 200         u8 *buf;
 201 
 202         if (device_authorization(dev))
 203                 return -EACCES;
 204 
 205         /* default options for init */
 206         hdpvr_set_options(dev);
 207 
 208         /* set filter options */
 209         mutex_lock(&dev->usbc_mutex);
 210         buf = dev->usbc_buf;
 211         buf[0] = 0x03; buf[1] = 0x03; buf[2] = 0x00; buf[3] = 0x00;
 212         ret = usb_control_msg(dev->udev,
 213                               usb_sndctrlpipe(dev->udev, 0),
 214                               0x01, 0x38,
 215                               CTRL_LOW_PASS_FILTER_VALUE, CTRL_DEFAULT_INDEX,
 216                               buf, 4,
 217                               1000);
 218         v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
 219                  "control request returned %d\n", ret);
 220         mutex_unlock(&dev->usbc_mutex);
 221 
 222         /* enable fan and bling leds */
 223         mutex_lock(&dev->usbc_mutex);
 224         buf[0] = 0x1;
 225         ret = usb_control_msg(dev->udev,
 226                               usb_sndctrlpipe(dev->udev, 0),
 227                               0xd4, 0x38, 0, 0, buf, 1,
 228                               1000);
 229         v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
 230                  "control request returned %d\n", ret);
 231 
 232         /* boost analog audio */
 233         buf[0] = boost_audio;
 234         ret = usb_control_msg(dev->udev,
 235                               usb_sndctrlpipe(dev->udev, 0),
 236                               0xd5, 0x38, 0, 0, buf, 1,
 237                               1000);
 238         v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
 239                  "control request returned %d\n", ret);
 240         mutex_unlock(&dev->usbc_mutex);
 241 
 242         dev->status = STATUS_IDLE;
 243         return 0;
 244 }
 245 
 246 static const struct hdpvr_options hdpvr_default_options = {
 247         .video_std      = HDPVR_60HZ,
 248         .video_input    = HDPVR_COMPONENT,
 249         .audio_input    = HDPVR_RCA_BACK,
 250         .bitrate        = 65, /* 6 mbps */
 251         .peak_bitrate   = 90, /* 9 mbps */
 252         .bitrate_mode   = HDPVR_CONSTANT,
 253         .gop_mode       = HDPVR_SIMPLE_IDR_GOP,
 254         .audio_codec    = V4L2_MPEG_AUDIO_ENCODING_AAC,
 255         /* original picture controls for firmware version <= 0x15 */
 256         /* updated in device_authorization() for newer firmware */
 257         .brightness     = 0x86,
 258         .contrast       = 0x80,
 259         .hue            = 0x80,
 260         .saturation     = 0x80,
 261         .sharpness      = 0x80,
 262 };
 263 
 264 static int hdpvr_probe(struct usb_interface *interface,
 265                        const struct usb_device_id *id)
 266 {
 267         struct hdpvr_device *dev;
 268         struct usb_host_interface *iface_desc;
 269         struct usb_endpoint_descriptor *endpoint;
 270 #if IS_ENABLED(CONFIG_I2C)
 271         struct i2c_client *client;
 272 #endif
 273         size_t buffer_size;
 274         int i;
 275         int dev_num;
 276         int retval = -ENOMEM;
 277 
 278         /* allocate memory for our device state and initialize it */
 279         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
 280         if (!dev) {
 281                 dev_err(&interface->dev, "Out of memory\n");
 282                 goto error;
 283         }
 284 
 285         /* init video transfer queues first of all */
 286         /* to prevent oops in hdpvr_delete() on error paths */
 287         INIT_LIST_HEAD(&dev->free_buff_list);
 288         INIT_LIST_HEAD(&dev->rec_buff_list);
 289 
 290         /* register v4l2_device early so it can be used for printks */
 291         if (v4l2_device_register(&interface->dev, &dev->v4l2_dev)) {
 292                 dev_err(&interface->dev, "v4l2_device_register failed\n");
 293                 goto error_free_dev;
 294         }
 295 
 296         mutex_init(&dev->io_mutex);
 297         mutex_init(&dev->i2c_mutex);
 298         mutex_init(&dev->usbc_mutex);
 299         dev->usbc_buf = kmalloc(64, GFP_KERNEL);
 300         if (!dev->usbc_buf) {
 301                 v4l2_err(&dev->v4l2_dev, "Out of memory\n");
 302                 goto error_v4l2_unregister;
 303         }
 304 
 305         init_waitqueue_head(&dev->wait_buffer);
 306         init_waitqueue_head(&dev->wait_data);
 307 
 308         dev->options = hdpvr_default_options;
 309 
 310         if (default_video_input < HDPVR_VIDEO_INPUTS)
 311                 dev->options.video_input = default_video_input;
 312 
 313         if (default_audio_input < HDPVR_AUDIO_INPUTS) {
 314                 dev->options.audio_input = default_audio_input;
 315                 if (default_audio_input == HDPVR_SPDIF)
 316                         dev->options.audio_codec =
 317                                 V4L2_MPEG_AUDIO_ENCODING_AC3;
 318         }
 319 
 320         dev->udev = usb_get_dev(interface_to_usbdev(interface));
 321 
 322         /* set up the endpoint information */
 323         /* use only the first bulk-in and bulk-out endpoints */
 324         iface_desc = interface->cur_altsetting;
 325         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
 326                 endpoint = &iface_desc->endpoint[i].desc;
 327 
 328                 if (!dev->bulk_in_endpointAddr &&
 329                     usb_endpoint_is_bulk_in(endpoint)) {
 330                         /* USB interface description is buggy, reported max
 331                          * packet size is 512 bytes, windows driver uses 8192 */
 332                         buffer_size = 8192;
 333                         dev->bulk_in_size = buffer_size;
 334                         dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;
 335                 }
 336 
 337         }
 338         if (!dev->bulk_in_endpointAddr) {
 339                 v4l2_err(&dev->v4l2_dev, "Could not find bulk-in endpoint\n");
 340                 goto error_put_usb;
 341         }
 342 
 343         /* init the device */
 344         if (hdpvr_device_init(dev)) {
 345                 v4l2_err(&dev->v4l2_dev, "device init failed\n");
 346                 goto error_put_usb;
 347         }
 348 
 349         mutex_lock(&dev->io_mutex);
 350         if (hdpvr_alloc_buffers(dev, NUM_BUFFERS)) {
 351                 mutex_unlock(&dev->io_mutex);
 352                 v4l2_err(&dev->v4l2_dev,
 353                          "allocating transfer buffers failed\n");
 354                 goto error_put_usb;
 355         }
 356         mutex_unlock(&dev->io_mutex);
 357 
 358 #if IS_ENABLED(CONFIG_I2C)
 359         retval = hdpvr_register_i2c_adapter(dev);
 360         if (retval < 0) {
 361                 v4l2_err(&dev->v4l2_dev, "i2c adapter register failed\n");
 362                 goto error_free_buffers;
 363         }
 364 
 365         client = hdpvr_register_ir_i2c(dev);
 366         if (!client) {
 367                 v4l2_err(&dev->v4l2_dev, "i2c IR device register failed\n");
 368                 retval = -ENODEV;
 369                 goto reg_fail;
 370         }
 371 #endif
 372 
 373         dev_num = atomic_inc_return(&dev_nr);
 374         if (dev_num >= HDPVR_MAX) {
 375                 v4l2_err(&dev->v4l2_dev,
 376                          "max device number reached, device register failed\n");
 377                 atomic_dec(&dev_nr);
 378                 retval = -ENODEV;
 379                 goto reg_fail;
 380         }
 381 
 382         retval = hdpvr_register_videodev(dev, &interface->dev,
 383                                     video_nr[dev_num]);
 384         if (retval < 0) {
 385                 v4l2_err(&dev->v4l2_dev, "registering videodev failed\n");
 386                 goto reg_fail;
 387         }
 388 
 389         /* let the user know what node this device is now attached to */
 390         v4l2_info(&dev->v4l2_dev, "device now attached to %s\n",
 391                   video_device_node_name(&dev->video_dev));
 392         return 0;
 393 
 394 reg_fail:
 395 #if IS_ENABLED(CONFIG_I2C)
 396         i2c_del_adapter(&dev->i2c_adapter);
 397 error_free_buffers:
 398 #endif
 399         hdpvr_free_buffers(dev);
 400 error_put_usb:
 401         usb_put_dev(dev->udev);
 402         kfree(dev->usbc_buf);
 403 error_v4l2_unregister:
 404         v4l2_device_unregister(&dev->v4l2_dev);
 405 error_free_dev:
 406         kfree(dev);
 407 error:
 408         return retval;
 409 }
 410 
 411 static void hdpvr_disconnect(struct usb_interface *interface)
 412 {
 413         struct hdpvr_device *dev = to_hdpvr_dev(usb_get_intfdata(interface));
 414 
 415         v4l2_info(&dev->v4l2_dev, "device %s disconnected\n",
 416                   video_device_node_name(&dev->video_dev));
 417         /* prevent more I/O from starting and stop any ongoing */
 418         mutex_lock(&dev->io_mutex);
 419         dev->status = STATUS_DISCONNECTED;
 420         wake_up_interruptible(&dev->wait_data);
 421         wake_up_interruptible(&dev->wait_buffer);
 422         mutex_unlock(&dev->io_mutex);
 423         v4l2_device_disconnect(&dev->v4l2_dev);
 424         msleep(100);
 425         flush_work(&dev->worker);
 426         mutex_lock(&dev->io_mutex);
 427         hdpvr_cancel_queue(dev);
 428         mutex_unlock(&dev->io_mutex);
 429 #if IS_ENABLED(CONFIG_I2C)
 430         i2c_del_adapter(&dev->i2c_adapter);
 431 #endif
 432         video_unregister_device(&dev->video_dev);
 433         atomic_dec(&dev_nr);
 434 }
 435 
 436 
 437 static struct usb_driver hdpvr_usb_driver = {
 438         .name =         "hdpvr",
 439         .probe =        hdpvr_probe,
 440         .disconnect =   hdpvr_disconnect,
 441         .id_table =     hdpvr_table,
 442 };
 443 
 444 module_usb_driver(hdpvr_usb_driver);
 445 
 446 MODULE_LICENSE("GPL");
 447 MODULE_VERSION("0.2.1");
 448 MODULE_AUTHOR("Janne Grunau");
 449 MODULE_DESCRIPTION("Hauppauge HD PVR driver");

/* [<][>][^][v][top][bottom][index][help] */