|
@@ -34,6 +34,18 @@
|
|
|
int debug;
|
|
|
module_param(debug, int, S_IRUGO | S_IWUSR);
|
|
|
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+/*
|
|
|
+ * dongle_this IS INDISPENSIBLY static BECAUSE FUNCTION easycap_usb_probe()
|
|
|
+ * IS CALLED SUCCESSIVELY FOR INTERFACES 0, 1, 2 AND THE POINTER peasycap
|
|
|
+ * ALLOCATED DURING THE PROBING OF INTERFACE 0 MUST BE REMEMBERED WHEN
|
|
|
+ * PROBING INTERFACES 1 AND 2.
|
|
|
+*/
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+
|
|
|
+struct easycap *peasycap_dongle[DONGLE_MANY];
|
|
|
+static int dongle_this;
|
|
|
+
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* PARAMETERS APPLICABLE TO ENTIRE DRIVER, I.E. BOTH VIDEO AND AUDIO
|
|
@@ -91,8 +103,6 @@ const struct v4l2_file_operations v4l2_fops = {
|
|
|
.mmap = easycap_mmap,
|
|
|
};
|
|
|
#endif /*EASYCAP_NEEDS_V4L2_FOPS*/
|
|
|
-int video_device_many /*=0*/;
|
|
|
-struct video_device *pvideo_array[VIDEO_DEVICE_MANY], *pvideo_device;
|
|
|
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
|
|
|
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
|
|
@@ -115,17 +125,26 @@ struct usb_class_driver easysnd_class = {
|
|
|
.minor_base = USB_SKEL_MINOR_BASE,
|
|
|
};
|
|
|
/****************************************************************************/
|
|
|
-/*--------------------------------------------------------------------------*/
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
- * IT IS NOT APPROPRIATE FOR easycap_open() TO SUBMIT THE VIDEO URBS HERE,
|
|
|
- * BECAUSE THERE WILL ALWAYS BE SUBSEQUENT NEGOTIATION OF TV STANDARD AND
|
|
|
- * FORMAT BY IOCTL AND IT IS INADVISABLE TO HAVE THE URBS RUNNING WHILE
|
|
|
- * REGISTERS OF THE SA7113H ARE BEING MANIPULATED.
|
|
|
- *
|
|
|
- * THE SUBMISSION OF VIDEO URBS IS THEREFORE DELAYED UNTIL THE IOCTL COMMAND
|
|
|
- * STREAMON IS RECEIVED.
|
|
|
- */
|
|
|
-/*--------------------------------------------------------------------------*/
|
|
|
+ * THIS ROUTINE DOES NOT DETECT MULTIPLE OCCURRENCES OF POINTER peasycap
|
|
|
+*/
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+int
|
|
|
+isdongle(struct easycap *peasycap)
|
|
|
+{
|
|
|
+int k;
|
|
|
+if ((struct easycap *)NULL == peasycap)
|
|
|
+ return -2;
|
|
|
+for (k = 0; k < DONGLE_MANY; k++) {
|
|
|
+ if (peasycap_dongle[k] == peasycap) {
|
|
|
+ peasycap->isdongle = k;
|
|
|
+ return k;
|
|
|
+ }
|
|
|
+}
|
|
|
+return -1;
|
|
|
+}
|
|
|
+/*****************************************************************************/
|
|
|
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
|
|
|
#if defined(EASYCAP_IS_VIDEODEV_CLIENT)
|
|
|
int
|
|
@@ -140,6 +159,8 @@ easycap_open(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
#if (!defined(EASYCAP_IS_VIDEODEV_CLIENT))
|
|
|
struct usb_interface *pusb_interface;
|
|
|
+#else
|
|
|
+struct video_device *pvideo_device;
|
|
|
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
|
|
|
struct usb_device *p;
|
|
|
struct easycap *peasycap;
|
|
@@ -149,6 +170,7 @@ JOT(4, "\n");
|
|
|
SAY("==========OPEN=========\n");
|
|
|
|
|
|
peasycap = (struct easycap *)NULL;
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
#if (!defined(EASYCAP_IS_VIDEODEV_CLIENT))
|
|
|
if ((struct inode *)NULL == inode) {
|
|
|
SAY("ERROR: inode is NULL.\n");
|
|
@@ -162,17 +184,16 @@ if (!pusb_interface) {
|
|
|
peasycap = usb_get_intfdata(pusb_interface);
|
|
|
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
|
|
|
#else
|
|
|
-for (i = 0; i < video_device_many; i++) {
|
|
|
- pvideo_device = pvideo_array[i];
|
|
|
- if ((struct video_device *)NULL != pvideo_device) {
|
|
|
- peasycap = (struct easycap *)video_get_drvdata(pvideo_device);
|
|
|
- break;
|
|
|
- }
|
|
|
+pvideo_device = video_devdata(file);
|
|
|
+if ((struct video_device *)NULL == pvideo_device) {
|
|
|
+ SAY("ERROR: pvideo_device is NULL.\n");
|
|
|
+ return -EFAULT;
|
|
|
}
|
|
|
-/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
+peasycap = (struct easycap *)video_get_drvdata(pvideo_device);
|
|
|
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
|
|
|
+/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
if ((struct easycap *)NULL == peasycap) {
|
|
|
- SAY("MISTAKE: peasycap is NULL\n");
|
|
|
+ SAY("ERROR: peasycap is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
file->private_data = peasycap;
|
|
@@ -181,7 +202,7 @@ file->private_data = peasycap;
|
|
|
* INITIALIZATION
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
-JOT(4, "starting initialization\n");
|
|
|
+JOM(4, "starting initialization\n");
|
|
|
|
|
|
for (k = 0; k < FRAME_BUFFER_MANY; k++) {
|
|
|
for (m = 0; m < FRAME_BUFFER_SIZE/PAGE_SIZE; m++)
|
|
@@ -189,40 +210,40 @@ for (k = 0; k < FRAME_BUFFER_MANY; k++) {
|
|
|
}
|
|
|
p = peasycap->pusb_device;
|
|
|
if ((struct usb_device *)NULL == p) {
|
|
|
- SAY("ERROR: peasycap->pusb_device is NULL\n");
|
|
|
+ SAM("ERROR: peasycap->pusb_device is NULL\n");
|
|
|
return -EFAULT;
|
|
|
} else {
|
|
|
- JOT(16, "0x%08lX=peasycap->pusb_device\n", \
|
|
|
+ JOM(16, "0x%08lX=peasycap->pusb_device\n", \
|
|
|
(long int)peasycap->pusb_device);
|
|
|
}
|
|
|
rc = wakeup_device(peasycap->pusb_device);
|
|
|
if (0 == rc)
|
|
|
- JOT(8, "wakeup_device() OK\n");
|
|
|
+ JOM(8, "wakeup_device() OK\n");
|
|
|
else {
|
|
|
- SAY("ERROR: wakeup_device() returned %i\n", rc);
|
|
|
+ SAM("ERROR: wakeup_device() returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = setup_stk(p); peasycap->input = 0;
|
|
|
if (0 == rc)
|
|
|
- JOT(8, "setup_stk() OK\n");
|
|
|
+ JOM(8, "setup_stk() OK\n");
|
|
|
else {
|
|
|
- SAY("ERROR: setup_stk() returned %i\n", rc);
|
|
|
+ SAM("ERROR: setup_stk() returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = setup_saa(p);
|
|
|
if (0 == rc)
|
|
|
- JOT(8, "setup_saa() OK\n");
|
|
|
+ JOM(8, "setup_saa() OK\n");
|
|
|
else {
|
|
|
- SAY("ERROR: setup_saa() returned %i\n", rc);
|
|
|
+ SAM("ERROR: setup_saa() returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = check_saa(p);
|
|
|
if (0 == rc)
|
|
|
- JOT(8, "check_saa() OK\n");
|
|
|
+ JOM(8, "check_saa() OK\n");
|
|
|
else if (-8 < rc)
|
|
|
- SAY("check_saa() returned %i\n", rc);
|
|
|
+ SAM("check_saa() returned %i\n", rc);
|
|
|
else {
|
|
|
- SAY("ERROR: check_saa() returned %i\n", rc);
|
|
|
+ SAM("ERROR: check_saa() returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
peasycap->standard_offset = -1;
|
|
@@ -231,17 +252,17 @@ peasycap->standard_offset = -1;
|
|
|
|
|
|
rc = adjust_standard(peasycap, V4L2_STD_NTSC_M);
|
|
|
if (0 == rc)
|
|
|
- JOT(8, "adjust_standard(.,NTSC_M) OK\n");
|
|
|
+ JOM(8, "adjust_standard(.,NTSC_M) OK\n");
|
|
|
else {
|
|
|
- SAY("ERROR: adjust_standard(.,NTSC_M) returned %i\n", rc);
|
|
|
+ SAM("ERROR: adjust_standard(.,NTSC_M) returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = adjust_format(peasycap, 640, 480, V4L2_PIX_FMT_UYVY, V4L2_FIELD_NONE, \
|
|
|
false);
|
|
|
if (0 <= rc)
|
|
|
- JOT(8, "adjust_format(.,640,480,UYVY) OK\n");
|
|
|
+ JOM(8, "adjust_format(.,640,480,UYVY) OK\n");
|
|
|
else {
|
|
|
- SAY("ERROR: adjust_format(.,640,480,UYVY) returned %i\n", rc);
|
|
|
+ SAM("ERROR: adjust_format(.,640,480,UYVY) returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
@@ -251,17 +272,17 @@ rc = adjust_standard(peasycap, \
|
|
|
(V4L2_STD_PAL_B | V4L2_STD_PAL_G | V4L2_STD_PAL_H | \
|
|
|
V4L2_STD_PAL_I | V4L2_STD_PAL_N));
|
|
|
if (0 == rc)
|
|
|
- JOT(8, "adjust_standard(.,PAL_BGHIN) OK\n");
|
|
|
+ JOM(8, "adjust_standard(.,PAL_BGHIN) OK\n");
|
|
|
else {
|
|
|
- SAY("ERROR: adjust_standard(.,PAL_BGHIN) returned %i\n", rc);
|
|
|
+ SAM("ERROR: adjust_standard(.,PAL_BGHIN) returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = adjust_format(peasycap, 640, 480, V4L2_PIX_FMT_UYVY, V4L2_FIELD_NONE, \
|
|
|
false);
|
|
|
if (0 <= rc)
|
|
|
- JOT(8, "adjust_format(.,640,480,uyvy,false) OK\n");
|
|
|
+ JOM(8, "adjust_format(.,640,480,uyvy,false) OK\n");
|
|
|
else {
|
|
|
- SAY("ERROR: adjust_format(.,640,480,uyvy,false) returned %i\n", rc);
|
|
|
+ SAM("ERROR: adjust_format(.,640,480,uyvy,false) returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
@@ -269,39 +290,39 @@ else {
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
rc = adjust_brightness(peasycap, -8192);
|
|
|
if (0 != rc) {
|
|
|
- SAY("ERROR: adjust_brightness(default) returned %i\n", rc);
|
|
|
+ SAM("ERROR: adjust_brightness(default) returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = adjust_contrast(peasycap, -8192);
|
|
|
if (0 != rc) {
|
|
|
- SAY("ERROR: adjust_contrast(default) returned %i\n", rc);
|
|
|
+ SAM("ERROR: adjust_contrast(default) returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = adjust_saturation(peasycap, -8192);
|
|
|
if (0 != rc) {
|
|
|
- SAY("ERROR: adjust_saturation(default) returned %i\n", rc);
|
|
|
+ SAM("ERROR: adjust_saturation(default) returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = adjust_hue(peasycap, -8192);
|
|
|
if (0 != rc) {
|
|
|
- SAY("ERROR: adjust_hue(default) returned %i\n", rc);
|
|
|
+ SAM("ERROR: adjust_hue(default) returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
rc = usb_set_interface(peasycap->pusb_device, peasycap->video_interface, \
|
|
|
peasycap->video_altsetting_on);
|
|
|
if (0 == rc)
|
|
|
- JOT(8, "usb_set_interface(.,%i,%i) OK\n", peasycap->video_interface, \
|
|
|
+ JOM(8, "usb_set_interface(.,%i,%i) OK\n", peasycap->video_interface, \
|
|
|
peasycap->video_altsetting_on);
|
|
|
else {
|
|
|
- SAY("ERROR: usb_set_interface() returned %i\n", rc);
|
|
|
+ SAM("ERROR: usb_set_interface() returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
rc = start_100(p);
|
|
|
if (0 == rc)
|
|
|
- JOT(8, "start_100() OK\n");
|
|
|
+ JOM(8, "start_100() OK\n");
|
|
|
else {
|
|
|
- SAY("ERROR: start_100() returned %i\n", rc);
|
|
|
+ SAM("ERROR: start_100() returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
peasycap->video_isoc_sequence = VIDEO_ISOC_BUFFER_MANY - 1;
|
|
@@ -314,7 +335,7 @@ peasycap->audio_eof = 0;
|
|
|
|
|
|
do_gettimeofday(&peasycap->timeval7);
|
|
|
|
|
|
-JOT(4, "finished initialization\n");
|
|
|
+JOM(4, "finished initialization\n");
|
|
|
return 0;
|
|
|
}
|
|
|
/*****************************************************************************/
|
|
@@ -324,33 +345,25 @@ submit_video_urbs(struct easycap *peasycap)
|
|
|
struct data_urb *pdata_urb;
|
|
|
struct urb *purb;
|
|
|
struct list_head *plist_head;
|
|
|
-int j, isbad, m, rc;
|
|
|
+int j, isbad, nospc, m, rc;
|
|
|
int isbuf;
|
|
|
|
|
|
+if ((struct easycap *)NULL == peasycap) {
|
|
|
+ SAY("ERROR: peasycap is NULL\n");
|
|
|
+ return -EFAULT;
|
|
|
+}
|
|
|
+
|
|
|
if ((struct list_head *)NULL == peasycap->purb_video_head) {
|
|
|
SAY("ERROR: peasycap->urb_video_head uninitialized\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if ((struct usb_device *)NULL == peasycap->pusb_device) {
|
|
|
SAY("ERROR: peasycap->pusb_device is NULL\n");
|
|
|
- return -EFAULT;
|
|
|
+ return -ENODEV;
|
|
|
}
|
|
|
if (!peasycap->video_isoc_streaming) {
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- JOT(4, "submission of all video urbs\n");
|
|
|
- if (0 != ready_saa(peasycap->pusb_device)) {
|
|
|
- SAY("ERROR: not ready to capture after waiting " \
|
|
|
- "one second\n");
|
|
|
- SAY("..... continuing anyway\n");
|
|
|
- }
|
|
|
- isbad = 0; m = 0;
|
|
|
+ JOM(4, "submission of all video urbs\n");
|
|
|
+ isbad = 0; nospc = 0; m = 0;
|
|
|
list_for_each(plist_head, (peasycap->purb_video_head)) {
|
|
|
pdata_urb = list_entry(plist_head, struct data_urb, list_head);
|
|
|
if (NULL != pdata_urb) {
|
|
@@ -387,44 +400,57 @@ if (!peasycap->video_isoc_streaming) {
|
|
|
rc = usb_submit_urb(purb, GFP_KERNEL);
|
|
|
if (0 != rc) {
|
|
|
isbad++;
|
|
|
- SAY("ERROR: usb_submit_urb() failed " \
|
|
|
+ SAM("ERROR: usb_submit_urb() failed " \
|
|
|
"for urb with rc:\n");
|
|
|
switch (rc) {
|
|
|
case -ENOMEM: {
|
|
|
- SAY("ENOMEM\n");
|
|
|
+ SAM("ERROR: -ENOMEM=" \
|
|
|
+ "usb_submit_urb()\n");
|
|
|
break;
|
|
|
}
|
|
|
case -ENODEV: {
|
|
|
- SAY("ENODEV\n");
|
|
|
+ SAM("ERROR: -ENODEV=" \
|
|
|
+ "usb_submit_urb()\n");
|
|
|
break;
|
|
|
}
|
|
|
case -ENXIO: {
|
|
|
- SAY("ENXIO\n");
|
|
|
+ SAM("ERROR: -ENXIO=" \
|
|
|
+ "usb_submit_urb()\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EINVAL: {
|
|
|
- SAY("EINVAL\n");
|
|
|
+ SAM("ERROR: -EINVAL=" \
|
|
|
+ "usb_submit_urb()\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EAGAIN: {
|
|
|
- SAY("EAGAIN\n");
|
|
|
+ SAM("ERROR: -EAGAIN=" \
|
|
|
+ "usb_submit_urb()\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EFBIG: {
|
|
|
- SAY("EFBIG\n");
|
|
|
+ SAM("ERROR: -EFBIG=" \
|
|
|
+ "usb_submit_urb()\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EPIPE: {
|
|
|
- SAY("EPIPE\n");
|
|
|
+ SAM("ERROR: -EPIPE=" \
|
|
|
+ "usb_submit_urb()\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EMSGSIZE: {
|
|
|
- SAY("EMSGSIZE\n");
|
|
|
+ SAM("ERROR: -EMSGSIZE=" \
|
|
|
+ "usb_submit_urb()\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case -ENOSPC: {
|
|
|
+ nospc++;
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("unknown error code %i\n",\
|
|
|
- rc);
|
|
|
+ SAM("ERROR: %i=" \
|
|
|
+ "usb_submit_urb()\n",\
|
|
|
+ rc);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -432,14 +458,20 @@ if (!peasycap->video_isoc_streaming) {
|
|
|
m++;
|
|
|
}
|
|
|
} else {
|
|
|
- isbad++;
|
|
|
+ isbad++;
|
|
|
}
|
|
|
} else {
|
|
|
isbad++;
|
|
|
}
|
|
|
}
|
|
|
+ if (nospc) {
|
|
|
+ SAM("-ENOSPC=usb_submit_urb() for %i urbs\n", nospc);
|
|
|
+ SAM("..... possibly inadequate USB bandwidth\n");
|
|
|
+ peasycap->video_eof = 1;
|
|
|
+ }
|
|
|
+
|
|
|
if (isbad) {
|
|
|
- JOT(4, "attempting cleanup instead of submitting\n");
|
|
|
+ JOM(4, "attempting cleanup instead of submitting\n");
|
|
|
list_for_each(plist_head, (peasycap->purb_video_head)) {
|
|
|
pdata_urb = list_entry(plist_head, struct data_urb, \
|
|
|
list_head);
|
|
@@ -452,16 +484,10 @@ if (!peasycap->video_isoc_streaming) {
|
|
|
peasycap->video_isoc_streaming = 0;
|
|
|
} else {
|
|
|
peasycap->video_isoc_streaming = 1;
|
|
|
- JOT(4, "submitted %i video urbs\n", m);
|
|
|
+ JOM(4, "submitted %i video urbs\n", m);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
} else {
|
|
|
- JOT(4, "already streaming video urbs\n");
|
|
|
+ JOM(4, "already streaming video urbs\n");
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
@@ -478,12 +504,9 @@ if ((struct easycap *)NULL == peasycap) {
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (peasycap->video_isoc_streaming) {
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
if ((struct list_head *)NULL != peasycap->purb_video_head) {
|
|
|
peasycap->video_isoc_streaming = 0;
|
|
|
- JOT(4, "killing video urbs\n");
|
|
|
+ JOM(4, "killing video urbs\n");
|
|
|
m = 0;
|
|
|
list_for_each(plist_head, (peasycap->purb_video_head)) {
|
|
|
pdata_urb = list_entry(plist_head, struct data_urb, \
|
|
@@ -495,13 +518,13 @@ if (peasycap->video_isoc_streaming) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- JOT(4, "%i video urbs killed\n", m);
|
|
|
+ JOM(4, "%i video urbs killed\n", m);
|
|
|
} else {
|
|
|
- SAY("ERROR: peasycap->purb_video_head is NULL\n");
|
|
|
+ SAM("ERROR: peasycap->purb_video_head is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
} else {
|
|
|
- JOT(8, "%i=video_isoc_streaming, no video urbs killed\n", \
|
|
|
+ JOM(8, "%i=video_isoc_streaming, no video urbs killed\n", \
|
|
|
peasycap->video_isoc_streaming);
|
|
|
}
|
|
|
return 0;
|
|
@@ -532,10 +555,10 @@ if (NULL == peasycap) {
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (0 != kill_video_urbs(peasycap)) {
|
|
|
- SAY("ERROR: kill_video_urbs() failed\n");
|
|
|
+ SAM("ERROR: kill_video_urbs() failed\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
-JOT(4, "ending successfully\n");
|
|
|
+JOM(4, "ending successfully\n");
|
|
|
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
|
|
|
#else
|
|
|
#
|
|
@@ -548,52 +571,28 @@ return 0;
|
|
|
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
|
|
|
#if defined(EASYCAP_IS_VIDEODEV_CLIENT)
|
|
|
int
|
|
|
-videodev_release(struct video_device *pvd)
|
|
|
+videodev_release(struct video_device *pvideo_device)
|
|
|
{
|
|
|
struct easycap *peasycap;
|
|
|
-int i, j, k;
|
|
|
|
|
|
JOT(4, "\n");
|
|
|
|
|
|
-k = 0;
|
|
|
-for (i = 0; i < video_device_many; i++) {
|
|
|
- pvideo_device = pvideo_array[i];
|
|
|
- if ((struct video_device *)NULL != pvideo_device) {
|
|
|
- if (pvd->minor == pvideo_device->minor) {
|
|
|
- peasycap = (struct easycap *)\
|
|
|
- video_get_drvdata(pvideo_device);
|
|
|
- if ((struct easycap *)NULL == peasycap) {
|
|
|
- SAY("ERROR: peasycap is NULL\n");
|
|
|
- SAY("ending unsuccessfully\n");
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
- if (0 != kill_video_urbs(peasycap)) {
|
|
|
- SAY("ERROR: kill_video_urbs() failed\n");
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
- JOT(4, "freeing video_device structure: " \
|
|
|
- "/dev/video%i\n", i);
|
|
|
- kfree((void *)pvideo_device);
|
|
|
- for (j = i; j < (VIDEO_DEVICE_MANY - 1); j++)
|
|
|
- pvideo_array[j] = pvideo_array[j + 1];
|
|
|
- video_device_many--; k++;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-if (!k) {
|
|
|
- SAY("ERROR: lost video_device structure for %i=minor\n", pvd->minor);
|
|
|
- SAY("cannot free: may cause memory leak\n");
|
|
|
+peasycap = video_get_drvdata(pvideo_device);
|
|
|
+if (NULL == peasycap) {
|
|
|
+ SAY("ERROR: peasycap is NULL\n");
|
|
|
SAY("ending unsuccessfully\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
-
|
|
|
-JOT(4, "ending successfully\n");
|
|
|
+if (0 != kill_video_urbs(peasycap)) {
|
|
|
+ SAM("ERROR: kill_video_urbs() failed\n");
|
|
|
+ return -EFAULT;
|
|
|
+}
|
|
|
+JOM(4, "ending successfully\n");
|
|
|
return 0;
|
|
|
}
|
|
|
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
|
|
|
-/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
-/****************************************************************************/
|
|
|
+/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
+/*****************************************************************************/
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* THIS FUNCTION IS CALLED FROM WITHIN easycap_usb_disconnect().
|
|
@@ -616,7 +615,7 @@ JOT(4, "\n");
|
|
|
|
|
|
peasycap = container_of(pkref, struct easycap, kref);
|
|
|
if ((struct easycap *)NULL == peasycap) {
|
|
|
- SAY("ERROR: peasycap is NULL: cannot perform deletions\n");
|
|
|
+ SAM("ERROR: peasycap is NULL: cannot perform deletions\n");
|
|
|
return;
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
@@ -625,12 +624,12 @@ if ((struct easycap *)NULL == peasycap) {
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if ((struct list_head *)NULL != peasycap->purb_video_head) {
|
|
|
- JOT(4, "freeing video urbs\n");
|
|
|
+ JOM(4, "freeing video urbs\n");
|
|
|
m = 0;
|
|
|
list_for_each(plist_head, (peasycap->purb_video_head)) {
|
|
|
pdata_urb = list_entry(plist_head, struct data_urb, list_head);
|
|
|
if (NULL == pdata_urb)
|
|
|
- JOT(4, "ERROR: pdata_urb is NULL\n");
|
|
|
+ JOM(4, "ERROR: pdata_urb is NULL\n");
|
|
|
else {
|
|
|
if ((struct urb *)NULL != pdata_urb->purb) {
|
|
|
usb_free_urb(pdata_urb->purb);
|
|
@@ -641,9 +640,9 @@ if ((struct list_head *)NULL != peasycap->purb_video_head) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- JOT(4, "%i video urbs freed\n", m);
|
|
|
+ JOM(4, "%i video urbs freed\n", m);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- JOT(4, "freeing video data_urb structures.\n");
|
|
|
+ JOM(4, "freeing video data_urb structures.\n");
|
|
|
m = 0;
|
|
|
list_for_each_safe(plist_head, plist_next, peasycap->purb_video_head) {
|
|
|
pdata_urb = list_entry(plist_head, struct data_urb, list_head);
|
|
@@ -654,14 +653,14 @@ if ((struct list_head *)NULL != peasycap->purb_video_head) {
|
|
|
m++;
|
|
|
}
|
|
|
}
|
|
|
- JOT(4, "%i video data_urb structures freed\n", m);
|
|
|
- JOT(4, "setting peasycap->purb_video_head=NULL\n");
|
|
|
+ JOM(4, "%i video data_urb structures freed\n", m);
|
|
|
+ JOM(4, "setting peasycap->purb_video_head=NULL\n");
|
|
|
peasycap->purb_video_head = (struct list_head *)NULL;
|
|
|
} else {
|
|
|
-JOT(4, "peasycap->purb_video_head is NULL\n");
|
|
|
+JOM(4, "peasycap->purb_video_head is NULL\n");
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
-JOT(4, "freeing video isoc buffers.\n");
|
|
|
+JOM(4, "freeing video isoc buffers.\n");
|
|
|
m = 0;
|
|
|
for (k = 0; k < VIDEO_ISOC_BUFFER_MANY; k++) {
|
|
|
if ((void *)NULL != peasycap->video_isoc_buffer[k].pgo) {
|
|
@@ -674,9 +673,9 @@ for (k = 0; k < VIDEO_ISOC_BUFFER_MANY; k++) {
|
|
|
m++;
|
|
|
}
|
|
|
}
|
|
|
-JOT(4, "isoc video buffers freed: %i pages\n", m * (0x01 << VIDEO_ISOC_ORDER));
|
|
|
+JOM(4, "isoc video buffers freed: %i pages\n", m * (0x01 << VIDEO_ISOC_ORDER));
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
-JOT(4, "freeing video field buffers.\n");
|
|
|
+JOM(4, "freeing video field buffers.\n");
|
|
|
lost = 0;
|
|
|
for (k = 0; k < FIELD_BUFFER_MANY; k++) {
|
|
|
for (m = 0; m < FIELD_BUFFER_SIZE/PAGE_SIZE; m++) {
|
|
@@ -689,9 +688,9 @@ for (k = 0; k < FIELD_BUFFER_MANY; k++) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-JOT(4, "video field buffers freed: %i pages\n", lost);
|
|
|
+JOM(4, "video field buffers freed: %i pages\n", lost);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
-JOT(4, "freeing video frame buffers.\n");
|
|
|
+JOM(4, "freeing video frame buffers.\n");
|
|
|
lost = 0;
|
|
|
for (k = 0; k < FRAME_BUFFER_MANY; k++) {
|
|
|
for (m = 0; m < FRAME_BUFFER_SIZE/PAGE_SIZE; m++) {
|
|
@@ -704,19 +703,19 @@ for (k = 0; k < FRAME_BUFFER_MANY; k++) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-JOT(4, "video frame buffers freed: %i pages\n", lost);
|
|
|
+JOM(4, "video frame buffers freed: %i pages\n", lost);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* FREE AUDIO.
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if ((struct list_head *)NULL != peasycap->purb_audio_head) {
|
|
|
- JOT(4, "freeing audio urbs\n");
|
|
|
+ JOM(4, "freeing audio urbs\n");
|
|
|
m = 0;
|
|
|
list_for_each(plist_head, (peasycap->purb_audio_head)) {
|
|
|
pdata_urb = list_entry(plist_head, struct data_urb, list_head);
|
|
|
if (NULL == pdata_urb)
|
|
|
- JOT(4, "ERROR: pdata_urb is NULL\n");
|
|
|
+ JOM(4, "ERROR: pdata_urb is NULL\n");
|
|
|
else {
|
|
|
if ((struct urb *)NULL != pdata_urb->purb) {
|
|
|
usb_free_urb(pdata_urb->purb);
|
|
@@ -726,9 +725,9 @@ if ((struct list_head *)NULL != peasycap->purb_audio_head) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- JOT(4, "%i audio urbs freed\n", m);
|
|
|
+ JOM(4, "%i audio urbs freed\n", m);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- JOT(4, "freeing audio data_urb structures.\n");
|
|
|
+ JOM(4, "freeing audio data_urb structures.\n");
|
|
|
m = 0;
|
|
|
list_for_each_safe(plist_head, plist_next, peasycap->purb_audio_head) {
|
|
|
pdata_urb = list_entry(plist_head, struct data_urb, list_head);
|
|
@@ -739,14 +738,14 @@ if ((struct list_head *)NULL != peasycap->purb_audio_head) {
|
|
|
m++;
|
|
|
}
|
|
|
}
|
|
|
-JOT(4, "%i audio data_urb structures freed\n", m);
|
|
|
-JOT(4, "setting peasycap->purb_audio_head=NULL\n");
|
|
|
+JOM(4, "%i audio data_urb structures freed\n", m);
|
|
|
+JOM(4, "setting peasycap->purb_audio_head=NULL\n");
|
|
|
peasycap->purb_audio_head = (struct list_head *)NULL;
|
|
|
} else {
|
|
|
-JOT(4, "peasycap->purb_audio_head is NULL\n");
|
|
|
+JOM(4, "peasycap->purb_audio_head is NULL\n");
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
-JOT(4, "freeing audio isoc buffers.\n");
|
|
|
+JOM(4, "freeing audio isoc buffers.\n");
|
|
|
m = 0;
|
|
|
for (k = 0; k < AUDIO_ISOC_BUFFER_MANY; k++) {
|
|
|
if ((void *)NULL != peasycap->audio_isoc_buffer[k].pgo) {
|
|
@@ -759,10 +758,10 @@ for (k = 0; k < AUDIO_ISOC_BUFFER_MANY; k++) {
|
|
|
m++;
|
|
|
}
|
|
|
}
|
|
|
-JOT(4, "easysnd_delete(): isoc audio buffers freed: %i pages\n", \
|
|
|
+JOM(4, "easysnd_delete(): isoc audio buffers freed: %i pages\n", \
|
|
|
m * (0x01 << AUDIO_ISOC_ORDER));
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
-JOT(4, "freeing audio buffers.\n");
|
|
|
+JOM(4, "freeing audio buffers.\n");
|
|
|
lost = 0;
|
|
|
for (k = 0; k < peasycap->audio_buffer_page_many; k++) {
|
|
|
if ((void *)NULL != peasycap->audio_buffer[k].pgo) {
|
|
@@ -772,9 +771,9 @@ for (k = 0; k < peasycap->audio_buffer_page_many; k++) {
|
|
|
lost++;
|
|
|
}
|
|
|
}
|
|
|
-JOT(4, "easysnd_delete(): audio buffers freed: %i pages\n", lost);
|
|
|
+JOM(4, "easysnd_delete(): audio buffers freed: %i pages\n", lost);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
-JOT(4, "freeing easycap structure.\n");
|
|
|
+JOM(4, "freeing easycap structure.\n");
|
|
|
allocation_video_urb = peasycap->allocation_video_urb;
|
|
|
allocation_video_page = peasycap->allocation_video_page;
|
|
|
allocation_video_struct = peasycap->allocation_video_struct;
|
|
@@ -861,7 +860,7 @@ while ((peasycap->field_read == peasycap->field_fill) || \
|
|
|
if (mode)
|
|
|
return -EAGAIN;
|
|
|
|
|
|
- JOT(8, "first wait on wq_video, " \
|
|
|
+ JOM(8, "first wait on wq_video, " \
|
|
|
"%i=field_read %i=field_fill\n", \
|
|
|
peasycap->field_read, peasycap->field_fill);
|
|
|
|
|
@@ -873,25 +872,25 @@ while ((peasycap->field_read == peasycap->field_fill) || \
|
|
|
[peasycap->field_read][0].kount)) && \
|
|
|
(0 == (0x00FF & peasycap->field_buffer\
|
|
|
[peasycap->field_read][0].kount))))))){
|
|
|
- SAY("aborted by signal\n");
|
|
|
+ SAM("aborted by signal\n");
|
|
|
return -EIO;
|
|
|
}
|
|
|
if (peasycap->video_idle) {
|
|
|
- JOT(8, "%i=peasycap->video_idle\n", peasycap->video_idle);
|
|
|
+ JOM(8, "%i=peasycap->video_idle\n", peasycap->video_idle);
|
|
|
return -EIO;
|
|
|
}
|
|
|
if (peasycap->video_eof) {
|
|
|
- JOT(8, "%i=peasycap->video_eof\n", peasycap->video_eof);
|
|
|
+ JOM(8, "%i=peasycap->video_eof\n", peasycap->video_eof);
|
|
|
kill_video_urbs(peasycap);
|
|
|
return -EIO;
|
|
|
}
|
|
|
miss++;
|
|
|
}
|
|
|
-JOT(8, "first awakening on wq_video after %i waits\n", miss);
|
|
|
+JOM(8, "first awakening on wq_video after %i waits\n", miss);
|
|
|
|
|
|
rc = field2frame(peasycap);
|
|
|
if (0 != rc)
|
|
|
- SAY("ERROR: field2frame() returned %i\n", rc);
|
|
|
+ SAM("ERROR: field2frame() returned %i\n", rc);
|
|
|
|
|
|
if (true == peasycap->offerfields) {
|
|
|
peasycap->frame_read = peasycap->frame_fill;
|
|
@@ -906,8 +905,8 @@ if (true == peasycap->offerfields) {
|
|
|
peasycap->frame_buffer[peasycap->frame_read][0].kount = \
|
|
|
V4L2_FIELD_TOP;
|
|
|
}
|
|
|
-JOT(8, "setting: %i=peasycap->frame_read\n", peasycap->frame_read);
|
|
|
-JOT(8, "bumped to: %i=peasycap->frame_fill\n", peasycap->frame_fill);
|
|
|
+JOM(8, "setting: %i=peasycap->frame_read\n", peasycap->frame_read);
|
|
|
+JOM(8, "bumped to: %i=peasycap->frame_fill\n", peasycap->frame_fill);
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
@@ -923,7 +922,7 @@ while ((peasycap->field_read == peasycap->field_fill) || \
|
|
|
if (mode)
|
|
|
return -EAGAIN;
|
|
|
|
|
|
- JOT(8, "second wait on wq_video, " \
|
|
|
+ JOM(8, "second wait on wq_video, " \
|
|
|
"%i=field_read %i=field_fill\n", \
|
|
|
peasycap->field_read, peasycap->field_fill);
|
|
|
msleep(1);
|
|
@@ -934,25 +933,25 @@ while ((peasycap->field_read == peasycap->field_fill) || \
|
|
|
[peasycap->field_read][0].kount)) && \
|
|
|
(0 != (0x00FF & peasycap->field_buffer\
|
|
|
[peasycap->field_read][0].kount))))))){
|
|
|
- SAY("aborted by signal\n");
|
|
|
+ SAM("aborted by signal\n");
|
|
|
return -EIO;
|
|
|
}
|
|
|
if (peasycap->video_idle) {
|
|
|
- JOT(8, "%i=peasycap->video_idle\n", peasycap->video_idle);
|
|
|
+ JOM(8, "%i=peasycap->video_idle\n", peasycap->video_idle);
|
|
|
return -EIO;
|
|
|
}
|
|
|
if (peasycap->video_eof) {
|
|
|
- JOT(8, "%i=peasycap->video_eof\n", peasycap->video_eof);
|
|
|
+ JOM(8, "%i=peasycap->video_eof\n", peasycap->video_eof);
|
|
|
kill_video_urbs(peasycap);
|
|
|
return -EIO;
|
|
|
}
|
|
|
miss++;
|
|
|
}
|
|
|
-JOT(8, "second awakening on wq_video after %i waits\n", miss);
|
|
|
+JOM(8, "second awakening on wq_video after %i waits\n", miss);
|
|
|
|
|
|
rc = field2frame(peasycap);
|
|
|
if (0 != rc)
|
|
|
- SAY("ERROR: field2frame() returned %i\n", rc);
|
|
|
+ SAM("ERROR: field2frame() returned %i\n", rc);
|
|
|
|
|
|
peasycap->frame_read = peasycap->frame_fill;
|
|
|
peasycap->queued[peasycap->frame_read] = 0;
|
|
@@ -970,8 +969,8 @@ if (0x01 & easycap_standard[peasycap->standard_offset].mask) {
|
|
|
V4L2_FIELD_BOTTOM;
|
|
|
}
|
|
|
|
|
|
-JOT(8, "setting: %i=peasycap->frame_read\n", peasycap->frame_read);
|
|
|
-JOT(8, "bumped to: %i=peasycap->frame_fill\n", peasycap->frame_fill);
|
|
|
+JOM(8, "setting: %i=peasycap->frame_read\n", peasycap->frame_read);
|
|
|
+JOM(8, "bumped to: %i=peasycap->frame_fill\n", peasycap->frame_fill);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -992,7 +991,6 @@ return 0;
|
|
|
int
|
|
|
field2frame(struct easycap *peasycap)
|
|
|
{
|
|
|
-static struct timeval timeval0;
|
|
|
struct timeval timeval;
|
|
|
long long int above, below;
|
|
|
__u32 remainder;
|
|
@@ -1005,12 +1003,17 @@ int rc, bytesperpixel, multiplier, much, more, over, rump, caches;
|
|
|
__u8 mask, margin;
|
|
|
bool odd, isuy, decimatepixel, offerfields;
|
|
|
|
|
|
-JOT(8, "===== parity %i, field buffer %i --> frame buffer %i\n", \
|
|
|
+if ((struct easycap *)NULL == peasycap) {
|
|
|
+ SAY("ERROR: peasycap is NULL\n");
|
|
|
+ return -EFAULT;
|
|
|
+}
|
|
|
+
|
|
|
+JOM(8, "===== parity %i, field buffer %i --> frame buffer %i\n", \
|
|
|
peasycap->field_buffer[peasycap->field_read][0].kount,\
|
|
|
peasycap->field_read, peasycap->frame_fill);
|
|
|
-JOT(8, "===== %i=bytesperpixel\n", peasycap->bytesperpixel);
|
|
|
+JOM(8, "===== %i=bytesperpixel\n", peasycap->bytesperpixel);
|
|
|
if (true == peasycap->offerfields)
|
|
|
- JOT(8, "===== offerfields\n");
|
|
|
+ JOM(8, "===== offerfields\n");
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
@@ -1018,7 +1021,7 @@ if (true == peasycap->offerfields)
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if (peasycap->field_read == peasycap->field_fill) {
|
|
|
- SAY("ERROR: on entry, still filling field buffer %i\n", \
|
|
|
+ SAM("ERROR: on entry, still filling field buffer %i\n", \
|
|
|
peasycap->field_read);
|
|
|
return 0;
|
|
|
}
|
|
@@ -1037,7 +1040,7 @@ decimatepixel = peasycap->decimatepixel;
|
|
|
if ((2 != bytesperpixel) && \
|
|
|
(3 != bytesperpixel) && \
|
|
|
(4 != bytesperpixel)) {
|
|
|
- SAY("MISTAKE: %i=bytesperpixel\n", bytesperpixel);
|
|
|
+ SAM("MISTAKE: %i=bytesperpixel\n", bytesperpixel);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (true == decimatepixel)
|
|
@@ -1065,7 +1068,7 @@ else
|
|
|
odd = false;
|
|
|
|
|
|
if ((true == odd) && (false == offerfields) &&(false == decimatepixel)) {
|
|
|
- JOT(8, " initial skipping %4i bytes p.%4i\n", \
|
|
|
+ JOM(8, " initial skipping %4i bytes p.%4i\n", \
|
|
|
w3/multiplier, mad);
|
|
|
pad += (w3 / multiplier); rad -= (w3 / multiplier);
|
|
|
}
|
|
@@ -1090,7 +1093,7 @@ while (cz < wz) {
|
|
|
rump = 0;
|
|
|
|
|
|
if (much % 2) {
|
|
|
- SAY("MISTAKE: much is odd\n");
|
|
|
+ SAM("MISTAKE: much is odd\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
@@ -1127,7 +1130,7 @@ while (cz < wz) {
|
|
|
}
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
} else {
|
|
|
- SAY("MISTAKE: %i=bytesperpixel\n", \
|
|
|
+ SAM("MISTAKE: %i=bytesperpixel\n", \
|
|
|
bytesperpixel);
|
|
|
return -EFAULT;
|
|
|
}
|
|
@@ -1138,7 +1141,7 @@ while (cz < wz) {
|
|
|
rc = redaub(peasycap, pad, pex, much, more, \
|
|
|
mask, margin, isuy);
|
|
|
if (0 > rc) {
|
|
|
- SAY("ERROR: redaub() failed\n");
|
|
|
+ SAM("ERROR: redaub() failed\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (much % 4) {
|
|
@@ -1206,7 +1209,7 @@ while (cz < wz) {
|
|
|
rump = 0;
|
|
|
|
|
|
if (much % 2) {
|
|
|
- SAY("MISTAKE: much is odd\n");
|
|
|
+ SAM("MISTAKE: much is odd\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
@@ -1243,7 +1246,7 @@ while (cz < wz) {
|
|
|
}
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
} else {
|
|
|
- SAY("MISTAKE: %i=bytesperpixel\n", \
|
|
|
+ SAM("MISTAKE: %i=bytesperpixel\n", \
|
|
|
bytesperpixel);
|
|
|
return -EFAULT;
|
|
|
}
|
|
@@ -1254,7 +1257,7 @@ while (cz < wz) {
|
|
|
rc = redaub(peasycap, pad, pex, much, more, \
|
|
|
mask, margin, isuy);
|
|
|
if (0 > rc) {
|
|
|
- SAY("ERROR: redaub() failed\n");
|
|
|
+ SAM("ERROR: redaub() failed\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
over -= much; cz += much;
|
|
@@ -1307,39 +1310,39 @@ while (cz < wz) {
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
c2 = (mex + 1)*PAGE_SIZE - rex;
|
|
|
if (cz != c2)
|
|
|
- SAY("ERROR: discrepancy %i in bytes read\n", c2 - cz);
|
|
|
+ SAM("ERROR: discrepancy %i in bytes read\n", c2 - cz);
|
|
|
c3 = (mad + 1)*PAGE_SIZE - rad;
|
|
|
|
|
|
if (false == decimatepixel) {
|
|
|
if (bytesperpixel * \
|
|
|
cz != c3) \
|
|
|
- SAY("ERROR: discrepancy %i in bytes written\n", \
|
|
|
+ SAM("ERROR: discrepancy %i in bytes written\n", \
|
|
|
c3 - (bytesperpixel * \
|
|
|
cz));
|
|
|
} else {
|
|
|
if (false == odd) {
|
|
|
if (bytesperpixel * \
|
|
|
cz != (4 * c3))
|
|
|
- SAY("ERROR: discrepancy %i in bytes written\n", \
|
|
|
+ SAM("ERROR: discrepancy %i in bytes written\n", \
|
|
|
(2*c3)-(bytesperpixel * \
|
|
|
cz));
|
|
|
} else {
|
|
|
if (0 != c3)
|
|
|
- SAY("ERROR: discrepancy %i " \
|
|
|
+ SAM("ERROR: discrepancy %i " \
|
|
|
"in bytes written\n", c3);
|
|
|
}
|
|
|
}
|
|
|
if (rump)
|
|
|
- SAY("ERROR: undischarged cache at end of line in frame buffer\n");
|
|
|
+ SAM("WORRY: undischarged cache at end of line in frame buffer\n");
|
|
|
|
|
|
-JOT(8, "===== field2frame(): %i bytes --> %i bytes (incl skip)\n", c2, c3);
|
|
|
-JOT(8, "===== field2frame(): %i=mad %i=rad\n", mad, rad);
|
|
|
+JOM(8, "===== field2frame(): %i bytes --> %i bytes (incl skip)\n", c2, c3);
|
|
|
+JOM(8, "===== field2frame(): %i=mad %i=rad\n", mad, rad);
|
|
|
|
|
|
if (true == odd)
|
|
|
- JOT(8, "+++++ field2frame(): frame buffer %i is full\n", kad);
|
|
|
+ JOM(8, "+++++ field2frame(): frame buffer %i is full\n", kad);
|
|
|
|
|
|
if (peasycap->field_read == peasycap->field_fill)
|
|
|
- SAY("WARNING: on exit, filling field buffer %i\n", \
|
|
|
+ SAM("WARNING: on exit, filling field buffer %i\n", \
|
|
|
peasycap->field_read);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
@@ -1347,23 +1350,24 @@ if (peasycap->field_read == peasycap->field_fill)
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
do_gettimeofday(&timeval);
|
|
|
-if (timeval0.tv_sec) {
|
|
|
+if (peasycap->timeval6.tv_sec) {
|
|
|
below = ((long long int)(1000000)) * \
|
|
|
- ((long long int)(timeval.tv_sec - timeval0.tv_sec)) + \
|
|
|
- (long long int)(timeval.tv_usec - timeval0.tv_usec);
|
|
|
+ ((long long int)(timeval.tv_sec - \
|
|
|
+ peasycap->timeval6.tv_sec)) + \
|
|
|
+ (long long int)(timeval.tv_usec - peasycap->timeval6.tv_usec);
|
|
|
above = (long long int)1000000;
|
|
|
|
|
|
sdr = signed_div(above, below);
|
|
|
above = sdr.quotient;
|
|
|
remainder = (__u32)sdr.remainder;
|
|
|
|
|
|
- JOT(8, "video streaming at %3lli.%03i fields per second\n", above, \
|
|
|
+ JOM(8, "video streaming at %3lli.%03i fields per second\n", above, \
|
|
|
(remainder/1000));
|
|
|
}
|
|
|
-timeval0 = timeval;
|
|
|
+peasycap->timeval6 = timeval;
|
|
|
|
|
|
if (caches)
|
|
|
- JOT(8, "%i=caches\n", caches);
|
|
|
+ JOM(8, "%i=caches\n", caches);
|
|
|
return 0;
|
|
|
}
|
|
|
/*****************************************************************************/
|
|
@@ -1416,7 +1420,7 @@ redaub(struct easycap *peasycap, void *pad, void *pex, int much, int more, \
|
|
|
__u8 mask, __u8 margin, bool isuy)
|
|
|
{
|
|
|
static __s32 ay[256], bu[256], rv[256], gu[256], gv[256];
|
|
|
-static __u8 cache[8], *pcache;
|
|
|
+__u8 *pcache;
|
|
|
__u8 r, g, b, y, u, v, c, *p2, *p3, *pz, *pr;
|
|
|
int bytesperpixel;
|
|
|
bool byteswaporder, decimatepixel, last;
|
|
@@ -1424,7 +1428,7 @@ int j, rump;
|
|
|
__s32 s32;
|
|
|
|
|
|
if (much % 2) {
|
|
|
- SAY("MISTAKE: much is odd\n");
|
|
|
+ SAM("MISTAKE: much is odd\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
bytesperpixel = peasycap->bytesperpixel;
|
|
@@ -1457,30 +1461,31 @@ if (!bu[255]) {
|
|
|
ay[j] = ay[16];
|
|
|
for (j = 236; j < 256; j++)
|
|
|
ay[j] = ay[235];
|
|
|
- JOT(8, "lookup tables are prepared\n");
|
|
|
+ JOM(8, "lookup tables are prepared\n");
|
|
|
}
|
|
|
-if ((__u8 *)NULL == pcache)
|
|
|
- pcache = &cache[0];
|
|
|
+pcache = peasycap->pcache;
|
|
|
+if (NULL == pcache)
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* TRANSFER CONTENTS OF CACHE TO THE FRAME BUFFER
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if (!pcache) {
|
|
|
- SAY("MISTAKE: pcache is NULL\n");
|
|
|
+ SAM("MISTAKE: pcache is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
-if (pcache != &cache[0])
|
|
|
- JOT(16, "cache has %i bytes\n", (int)(pcache - &cache[0]));
|
|
|
-p2 = &cache[0];
|
|
|
-p3 = (__u8 *)pad - (int)(pcache - &cache[0]);
|
|
|
+if (pcache != &peasycap->cache[0])
|
|
|
+ JOM(16, "cache has %i bytes\n", (int)(pcache - &peasycap->cache[0]));
|
|
|
+p2 = &peasycap->cache[0];
|
|
|
+p3 = (__u8 *)pad - (int)(pcache - &peasycap->cache[0]);
|
|
|
while (p2 < pcache) {
|
|
|
*p3++ = *p2; p2++;
|
|
|
}
|
|
|
-pcache = &cache[0];
|
|
|
+pcache = &peasycap->cache[0];
|
|
|
if (p3 != pad) {
|
|
|
- SAY("MISTAKE: pointer misalignment\n");
|
|
|
+ SAM("MISTAKE: pointer misalignment\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
@@ -1495,7 +1500,7 @@ else
|
|
|
v = *(p2 - 1);
|
|
|
|
|
|
if (rump)
|
|
|
- JOT(16, "%4i=much %4i=more %i=rump\n", much, more, rump);
|
|
|
+ JOM(16, "%4i=much %4i=more %i=rump\n", much, more, rump);
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
switch (bytesperpixel) {
|
|
@@ -1601,7 +1606,7 @@ case 3:
|
|
|
0 : (__u8)s32);
|
|
|
|
|
|
if ((true == last) && rump) {
|
|
|
- pcache = &cache[0];
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
switch (bytesperpixel - rump) {
|
|
|
case 1: {
|
|
|
*p3 = r;
|
|
@@ -1616,7 +1621,7 @@ case 3:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: %i=rump\n", \
|
|
|
+ SAM("MISTAKE: %i=rump\n", \
|
|
|
bytesperpixel - rump);
|
|
|
return -EFAULT;
|
|
|
}
|
|
@@ -1674,7 +1679,7 @@ case 3:
|
|
|
0 : (__u8)s32);
|
|
|
|
|
|
if ((true == last) && rump) {
|
|
|
- pcache = &cache[0];
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
switch (bytesperpixel - rump) {
|
|
|
case 1: {
|
|
|
*p3 = b;
|
|
@@ -1689,7 +1694,7 @@ case 3:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: %i=rump\n", \
|
|
|
+ SAM("MISTAKE: %i=rump\n", \
|
|
|
bytesperpixel - rump);
|
|
|
return -EFAULT;
|
|
|
}
|
|
@@ -1750,7 +1755,7 @@ case 3:
|
|
|
0 : (__u8)s32);
|
|
|
|
|
|
if ((true == last) && rump) {
|
|
|
- pcache = &cache[0];
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
switch (bytesperpixel - rump) {
|
|
|
case 1: {
|
|
|
*p3 = r;
|
|
@@ -1765,7 +1770,7 @@ case 3:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: " \
|
|
|
+ SAM("MISTAKE: " \
|
|
|
"%i=rump\n", \
|
|
|
bytesperpixel - rump);
|
|
|
return -EFAULT;
|
|
@@ -1826,7 +1831,7 @@ case 3:
|
|
|
0 : (__u8)s32);
|
|
|
|
|
|
if ((true == last) && rump) {
|
|
|
- pcache = &cache[0];
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
switch (bytesperpixel - rump) {
|
|
|
case 1: {
|
|
|
*p3 = b;
|
|
@@ -1841,7 +1846,7 @@ case 3:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: " \
|
|
|
+ SAM("MISTAKE: " \
|
|
|
"%i=rump\n", \
|
|
|
bytesperpixel - rump);
|
|
|
return -EFAULT;
|
|
@@ -1906,7 +1911,7 @@ case 4:
|
|
|
0 : (__u8)s32);
|
|
|
|
|
|
if ((true == last) && rump) {
|
|
|
- pcache = &cache[0];
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
switch (bytesperpixel - rump) {
|
|
|
case 1: {
|
|
|
*p3 = r;
|
|
@@ -1930,7 +1935,7 @@ case 4:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: %i=rump\n", \
|
|
|
+ SAM("MISTAKE: %i=rump\n", \
|
|
|
bytesperpixel - rump);
|
|
|
return -EFAULT;
|
|
|
}
|
|
@@ -1988,7 +1993,7 @@ case 4:
|
|
|
0 : (__u8)s32);
|
|
|
|
|
|
if ((true == last) && rump) {
|
|
|
- pcache = &cache[0];
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
switch (bytesperpixel - rump) {
|
|
|
case 1: {
|
|
|
*p3 = b;
|
|
@@ -2012,7 +2017,7 @@ case 4:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: %i=rump\n", \
|
|
|
+ SAM("MISTAKE: %i=rump\n", \
|
|
|
bytesperpixel - rump);
|
|
|
return -EFAULT;
|
|
|
}
|
|
@@ -2075,7 +2080,7 @@ case 4:
|
|
|
0 : (__u8)s32);
|
|
|
|
|
|
if ((true == last) && rump) {
|
|
|
- pcache = &cache[0];
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
switch (bytesperpixel - rump) {
|
|
|
case 1: {
|
|
|
*p3 = r;
|
|
@@ -2099,7 +2104,7 @@ case 4:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: " \
|
|
|
+ SAM("MISTAKE: " \
|
|
|
"%i=rump\n", \
|
|
|
bytesperpixel - \
|
|
|
rump);
|
|
@@ -2160,7 +2165,7 @@ case 4:
|
|
|
0 : (__u8)s32);
|
|
|
|
|
|
if ((true == last) && rump) {
|
|
|
- pcache = &cache[0];
|
|
|
+ pcache = &peasycap->cache[0];
|
|
|
switch (bytesperpixel - rump) {
|
|
|
case 1: {
|
|
|
*p3 = b;
|
|
@@ -2184,7 +2189,7 @@ case 4:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: " \
|
|
|
+ SAM("MISTAKE: " \
|
|
|
"%i=rump\n", \
|
|
|
bytesperpixel - rump);
|
|
|
return -EFAULT;
|
|
@@ -2208,7 +2213,7 @@ case 4:
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("MISTAKE: %i=bytesperpixel\n", bytesperpixel);
|
|
|
+ SAM("MISTAKE: %i=bytesperpixel\n", bytesperpixel);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
}
|
|
@@ -2305,19 +2310,19 @@ if (NULL == peasycap) {
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
pbuf = peasycap->frame_buffer[k][m].pgo;
|
|
|
if (NULL == pbuf) {
|
|
|
- SAY("ERROR: pbuf is NULL\n");
|
|
|
+ SAM("ERROR: pbuf is NULL\n");
|
|
|
goto finish;
|
|
|
}
|
|
|
page = virt_to_page(pbuf);
|
|
|
if (NULL == page) {
|
|
|
- SAY("ERROR: page is NULL\n");
|
|
|
+ SAM("ERROR: page is NULL\n");
|
|
|
goto finish;
|
|
|
}
|
|
|
get_page(page);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
finish:
|
|
|
if (NULL == page) {
|
|
|
- SAY("ERROR: page is NULL after get_page(page)\n");
|
|
|
+ SAM("ERROR: page is NULL after get_page(page)\n");
|
|
|
} else {
|
|
|
pvmf->page = page;
|
|
|
retcode = VM_FAULT_MINOR;
|
|
@@ -2353,7 +2358,6 @@ return retcode;
|
|
|
void
|
|
|
easycap_complete(struct urb *purb)
|
|
|
{
|
|
|
-static int mt;
|
|
|
struct easycap *peasycap;
|
|
|
struct data_buffer *pfield_buffer;
|
|
|
char errbuf[16];
|
|
@@ -2379,64 +2383,64 @@ if (peasycap->video_eof)
|
|
|
for (i = 0; i < VIDEO_ISOC_BUFFER_MANY; i++)
|
|
|
if (purb->transfer_buffer == peasycap->video_isoc_buffer[i].pgo)
|
|
|
break;
|
|
|
-JOT(16, "%2i=urb\n", i);
|
|
|
+JOM(16, "%2i=urb\n", i);
|
|
|
last = peasycap->video_isoc_sequence;
|
|
|
if ((((VIDEO_ISOC_BUFFER_MANY - 1) == last) && \
|
|
|
(0 != i)) || \
|
|
|
(((VIDEO_ISOC_BUFFER_MANY - 1) != last) && \
|
|
|
((last + 1) != i))) {
|
|
|
- SAY("ERROR: out-of-order urbs %i,%i ... continuing\n", last, i);
|
|
|
+ SAM("ERROR: out-of-order urbs %i,%i ... continuing\n", last, i);
|
|
|
}
|
|
|
peasycap->video_isoc_sequence = i;
|
|
|
|
|
|
if (peasycap->video_idle) {
|
|
|
- JOT(16, "%i=video_idle %i=video_isoc_streaming\n", \
|
|
|
+ JOM(16, "%i=video_idle %i=video_isoc_streaming\n", \
|
|
|
peasycap->video_idle, peasycap->video_isoc_streaming);
|
|
|
if (peasycap->video_isoc_streaming) {
|
|
|
rc = usb_submit_urb(purb, GFP_ATOMIC);
|
|
|
if (0 != rc) {
|
|
|
- SAY("ERROR: while %i=video_idle, " \
|
|
|
+ SAM("ERROR: while %i=video_idle, " \
|
|
|
"usb_submit_urb() failed with rc:\n", \
|
|
|
peasycap->video_idle);
|
|
|
switch (rc) {
|
|
|
case -ENOMEM: {
|
|
|
- SAY("ENOMEM\n");
|
|
|
+ SAM("ENOMEM\n");
|
|
|
break;
|
|
|
}
|
|
|
case -ENODEV: {
|
|
|
- SAY("ENODEV\n");
|
|
|
+ SAM("ENODEV\n");
|
|
|
break;
|
|
|
}
|
|
|
case -ENXIO: {
|
|
|
- SAY("ENXIO\n");
|
|
|
+ SAM("ENXIO\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EINVAL: {
|
|
|
- SAY("EINVAL\n");
|
|
|
+ SAM("EINVAL\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EAGAIN: {
|
|
|
- SAY("EAGAIN\n");
|
|
|
+ SAM("EAGAIN\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EFBIG: {
|
|
|
- SAY("EFBIG\n");
|
|
|
+ SAM("EFBIG\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EPIPE: {
|
|
|
- SAY("EPIPE\n");
|
|
|
+ SAM("EPIPE\n");
|
|
|
break;
|
|
|
}
|
|
|
case -EMSGSIZE: {
|
|
|
- SAY("EMSGSIZE\n");
|
|
|
+ SAM("EMSGSIZE\n");
|
|
|
break;
|
|
|
}
|
|
|
case -ENOSPC: {
|
|
|
- SAY("ENOSPC\n");
|
|
|
+ SAM("ENOSPC\n");
|
|
|
break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("0x%08X\n", rc);
|
|
|
+ SAM("0x%08X\n", rc);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -2447,80 +2451,80 @@ return;
|
|
|
override = 0;
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if (FIELD_BUFFER_MANY <= peasycap->field_fill) {
|
|
|
- SAY("ERROR: bad peasycap->field_fill\n");
|
|
|
+ SAM("ERROR: bad peasycap->field_fill\n");
|
|
|
return;
|
|
|
}
|
|
|
if (purb->status) {
|
|
|
if ((-ESHUTDOWN == purb->status) || (-ENOENT == purb->status)) {
|
|
|
- JOT(8, "urb status -ESHUTDOWN or -ENOENT\n");
|
|
|
+ JOM(8, "urb status -ESHUTDOWN or -ENOENT\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
(peasycap->field_buffer[peasycap->field_fill][0].kount) |= 0x8000 ;
|
|
|
- SAY("ERROR: bad urb status:\n");
|
|
|
+ SAM("ERROR: bad urb status:\n");
|
|
|
switch (purb->status) {
|
|
|
case -EINPROGRESS: {
|
|
|
- SAY("-EINPROGRESS\n"); break;
|
|
|
+ SAM("-EINPROGRESS\n"); break;
|
|
|
}
|
|
|
case -ENOSR: {
|
|
|
- SAY("-ENOSR\n"); break;
|
|
|
+ SAM("-ENOSR\n"); break;
|
|
|
}
|
|
|
case -EPIPE: {
|
|
|
- SAY("-EPIPE\n"); break;
|
|
|
+ SAM("-EPIPE\n"); break;
|
|
|
}
|
|
|
case -EOVERFLOW: {
|
|
|
- SAY("-EOVERFLOW\n"); break;
|
|
|
+ SAM("-EOVERFLOW\n"); break;
|
|
|
}
|
|
|
case -EPROTO: {
|
|
|
- SAY("-EPROTO\n"); break;
|
|
|
+ SAM("-EPROTO\n"); break;
|
|
|
}
|
|
|
case -EILSEQ: {
|
|
|
- SAY("-EILSEQ\n"); break;
|
|
|
+ SAM("-EILSEQ\n"); break;
|
|
|
}
|
|
|
case -ETIMEDOUT: {
|
|
|
- SAY("-ETIMEDOUT\n"); break;
|
|
|
+ SAM("-ETIMEDOUT\n"); break;
|
|
|
}
|
|
|
case -EMSGSIZE: {
|
|
|
- SAY("-EMSGSIZE\n"); break;
|
|
|
+ SAM("-EMSGSIZE\n"); break;
|
|
|
}
|
|
|
case -EOPNOTSUPP: {
|
|
|
- SAY("-EOPNOTSUPP\n"); break;
|
|
|
+ SAM("-EOPNOTSUPP\n"); break;
|
|
|
}
|
|
|
case -EPFNOSUPPORT: {
|
|
|
- SAY("-EPFNOSUPPORT\n"); break;
|
|
|
+ SAM("-EPFNOSUPPORT\n"); break;
|
|
|
}
|
|
|
case -EAFNOSUPPORT: {
|
|
|
- SAY("-EAFNOSUPPORT\n"); break;
|
|
|
+ SAM("-EAFNOSUPPORT\n"); break;
|
|
|
}
|
|
|
case -EADDRINUSE: {
|
|
|
- SAY("-EADDRINUSE\n"); break;
|
|
|
+ SAM("-EADDRINUSE\n"); break;
|
|
|
}
|
|
|
case -EADDRNOTAVAIL: {
|
|
|
- SAY("-EADDRNOTAVAIL\n"); break;
|
|
|
+ SAM("-EADDRNOTAVAIL\n"); break;
|
|
|
}
|
|
|
case -ENOBUFS: {
|
|
|
- SAY("-ENOBUFS\n"); break;
|
|
|
+ SAM("-ENOBUFS\n"); break;
|
|
|
}
|
|
|
case -EISCONN: {
|
|
|
- SAY("-EISCONN\n"); break;
|
|
|
+ SAM("-EISCONN\n"); break;
|
|
|
}
|
|
|
case -ENOTCONN: {
|
|
|
- SAY("-ENOTCONN\n"); break;
|
|
|
+ SAM("-ENOTCONN\n"); break;
|
|
|
}
|
|
|
case -ESHUTDOWN: {
|
|
|
- SAY("-ESHUTDOWN\n"); break;
|
|
|
+ SAM("-ESHUTDOWN\n"); break;
|
|
|
}
|
|
|
case -ENOENT: {
|
|
|
- SAY("-ENOENT\n"); break;
|
|
|
+ SAM("-ENOENT\n"); break;
|
|
|
}
|
|
|
case -ECONNRESET: {
|
|
|
- SAY("-ECONNRESET\n"); break;
|
|
|
+ SAM("-ECONNRESET\n"); break;
|
|
|
}
|
|
|
case -ENOSPC: {
|
|
|
- SAY("ENOSPC\n"); break;
|
|
|
+ SAM("ENOSPC\n"); break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("unknown error code 0x%08X\n", purb->status); break;
|
|
|
+ SAM("unknown error code 0x%08X\n", purb->status); break;
|
|
|
}
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
@@ -2579,7 +2583,7 @@ if (purb->status) {
|
|
|
strcpy(&errbuf[0], "-ECONNRESET"); break;
|
|
|
}
|
|
|
case -ENOSPC: {
|
|
|
- SAY("ENOSPC\n"); break;
|
|
|
+ SAM("ENOSPC\n"); break;
|
|
|
}
|
|
|
case -ESHUTDOWN: {
|
|
|
strcpy(&errbuf[0], "-ESHUTDOWN"); break;
|
|
@@ -2594,7 +2598,7 @@ if (purb->status) {
|
|
|
frameactual = purb->iso_frame_desc[i].actual_length;
|
|
|
frameoffset = purb->iso_frame_desc[i].offset;
|
|
|
|
|
|
- JOT(16, "frame[%2i]:" \
|
|
|
+ JOM(16, "frame[%2i]:" \
|
|
|
"%4i=status " \
|
|
|
"%4i=actual " \
|
|
|
"%4i=length " \
|
|
@@ -2608,19 +2612,20 @@ if (purb->status) {
|
|
|
PAGE_SIZE) + \
|
|
|
(int)(pfield_buffer->pto - pfield_buffer->pgo);
|
|
|
if (4 == more)
|
|
|
- mt++;
|
|
|
+ peasycap->video_mt++;
|
|
|
if (4 < more) {
|
|
|
- if (mt) {
|
|
|
- JOT(8, "%4i empty video urb frames\n", mt);
|
|
|
- mt = 0;
|
|
|
+ if (peasycap->video_mt) {
|
|
|
+ JOM(8, "%4i empty video urb frames\n", \
|
|
|
+ peasycap->video_mt);
|
|
|
+ peasycap->video_mt = 0;
|
|
|
}
|
|
|
if (FIELD_BUFFER_MANY <= peasycap->field_fill) {
|
|
|
- SAY("ERROR: bad peasycap->field_fill\n");
|
|
|
+ SAM("ERROR: bad peasycap->field_fill\n");
|
|
|
return;
|
|
|
}
|
|
|
if (FIELD_BUFFER_SIZE/PAGE_SIZE <= \
|
|
|
peasycap->field_page) {
|
|
|
- SAY("ERROR: bad peasycap->field_page\n");
|
|
|
+ SAM("ERROR: bad peasycap->field_page\n");
|
|
|
return;
|
|
|
}
|
|
|
pfield_buffer = &peasycap->field_buffer\
|
|
@@ -2653,11 +2658,11 @@ if (purb->status) {
|
|
|
peasycap->videofieldamount) {
|
|
|
if (2 == videofieldamount - \
|
|
|
peasycap->\
|
|
|
- videofieldamount)
|
|
|
+ videofieldamount) {
|
|
|
(peasycap->field_buffer\
|
|
|
[peasycap->field_fill]\
|
|
|
[0].kount) |= 0x0100;
|
|
|
- else
|
|
|
+ } else
|
|
|
(peasycap->field_buffer\
|
|
|
[peasycap->field_fill]\
|
|
|
[0].kount) |= 0x4000;
|
|
@@ -2689,15 +2694,15 @@ if (purb->status) {
|
|
|
pfield_buffer->pto = \
|
|
|
pfield_buffer->pgo;
|
|
|
|
|
|
- JOT(8, "bumped to: %i=peasycap->" \
|
|
|
+ JOM(8, "bumped to: %i=peasycap->" \
|
|
|
"field_fill %i=parity\n", \
|
|
|
peasycap->field_fill, \
|
|
|
0x00FF & pfield_buffer->kount);
|
|
|
- JOT(8, "field buffer %i has %i " \
|
|
|
+ JOM(8, "field buffer %i has %i " \
|
|
|
"bytes fit to be read\n", \
|
|
|
peasycap->field_read, \
|
|
|
videofieldamount);
|
|
|
- JOT(8, "wakeup call to wq_video, " \
|
|
|
+ JOM(8, "wakeup call to wq_video, " \
|
|
|
"%i=field_read %i=field_fill "\
|
|
|
"%i=parity\n", \
|
|
|
peasycap->field_read, \
|
|
@@ -2710,7 +2715,7 @@ if (purb->status) {
|
|
|
do_gettimeofday(&peasycap->timeval7);
|
|
|
} else {
|
|
|
peasycap->video_junk++;
|
|
|
- JOT(8, "field buffer %i had %i " \
|
|
|
+ JOM(8, "field buffer %i had %i " \
|
|
|
"bytes, now discarded\n", \
|
|
|
peasycap->field_fill, \
|
|
|
videofieldamount);
|
|
@@ -2728,20 +2733,20 @@ if (purb->status) {
|
|
|
pfield_buffer->pto = \
|
|
|
pfield_buffer->pgo;
|
|
|
|
|
|
- JOT(8, "bumped to: %i=peasycap->" \
|
|
|
+ JOM(8, "bumped to: %i=peasycap->" \
|
|
|
"field_fill %i=parity\n", \
|
|
|
peasycap->field_fill, \
|
|
|
0x00FF & pfield_buffer->kount);
|
|
|
}
|
|
|
if (8 == more) {
|
|
|
- JOT(8, "end-of-field: received " \
|
|
|
+ JOM(8, "end-of-field: received " \
|
|
|
"parity byte 0x%02X\n", \
|
|
|
(0xFF & *pu));
|
|
|
if (0x40 & *pu)
|
|
|
pfield_buffer->kount = 0x0000;
|
|
|
else
|
|
|
pfield_buffer->kount = 0x0001;
|
|
|
- JOT(8, "end-of-field: 0x%02X=kount\n",\
|
|
|
+ JOM(8, "end-of-field: 0x%02X=kount\n",\
|
|
|
0xFF & pfield_buffer->kount);
|
|
|
}
|
|
|
}
|
|
@@ -2754,12 +2759,12 @@ if (purb->status) {
|
|
|
more -= leap;
|
|
|
|
|
|
if (FIELD_BUFFER_MANY <= peasycap->field_fill) {
|
|
|
- SAY("ERROR: bad peasycap->field_fill\n");
|
|
|
+ SAM("ERROR: bad peasycap->field_fill\n");
|
|
|
return;
|
|
|
}
|
|
|
if (FIELD_BUFFER_SIZE/PAGE_SIZE <= \
|
|
|
peasycap->field_page) {
|
|
|
- SAY("ERROR: bad peasycap->field_page\n");
|
|
|
+ SAM("ERROR: bad peasycap->field_page\n");
|
|
|
return;
|
|
|
}
|
|
|
pfield_buffer = &peasycap->field_buffer\
|
|
@@ -2770,7 +2775,7 @@ if (purb->status) {
|
|
|
[peasycap->field_page];
|
|
|
if (PAGE_SIZE < (pfield_buffer->pto - \
|
|
|
pfield_buffer->pgo)) {
|
|
|
- SAY("ERROR: bad pfield_buffer->pto\n");
|
|
|
+ SAM("ERROR: bad pfield_buffer->pto\n");
|
|
|
return;
|
|
|
}
|
|
|
if (PAGE_SIZE == (pfield_buffer->pto - \
|
|
@@ -2778,7 +2783,7 @@ if (purb->status) {
|
|
|
(peasycap->field_page)++;
|
|
|
if (FIELD_BUFFER_SIZE/PAGE_SIZE <= \
|
|
|
peasycap->field_page) {
|
|
|
- JOT(16, "wrapping peasycap->" \
|
|
|
+ JOM(16, "wrapping peasycap->" \
|
|
|
"field_page\n");
|
|
|
peasycap->field_page = 0;
|
|
|
}
|
|
@@ -2813,7 +2818,7 @@ if (purb->status) {
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if (VIDEO_ISOC_BUFFER_MANY <= peasycap->video_junk) {
|
|
|
- SAY("easycap driver shutting down on condition green\n");
|
|
|
+ SAM("easycap driver shutting down on condition green\n");
|
|
|
peasycap->video_eof = 1;
|
|
|
peasycap->audio_eof = 1;
|
|
|
peasycap->video_junk = -VIDEO_ISOC_BUFFER_MANY;
|
|
@@ -2824,38 +2829,38 @@ if (VIDEO_ISOC_BUFFER_MANY <= peasycap->video_junk) {
|
|
|
if (peasycap->video_isoc_streaming) {
|
|
|
rc = usb_submit_urb(purb, GFP_ATOMIC);
|
|
|
if (0 != rc) {
|
|
|
- SAY("ERROR: while %i=video_idle, usb_submit_urb() failed " \
|
|
|
+ SAM("ERROR: while %i=video_idle, usb_submit_urb() failed " \
|
|
|
"with rc:\n", peasycap->video_idle);
|
|
|
switch (rc) {
|
|
|
case -ENOMEM: {
|
|
|
- SAY("ENOMEM\n"); break;
|
|
|
+ SAM("ENOMEM\n"); break;
|
|
|
}
|
|
|
case -ENODEV: {
|
|
|
- SAY("ENODEV\n"); break;
|
|
|
+ SAM("ENODEV\n"); break;
|
|
|
}
|
|
|
case -ENXIO: {
|
|
|
- SAY("ENXIO\n"); break;
|
|
|
+ SAM("ENXIO\n"); break;
|
|
|
}
|
|
|
case -EINVAL: {
|
|
|
- SAY("EINVAL\n"); break;
|
|
|
+ SAM("EINVAL\n"); break;
|
|
|
}
|
|
|
case -EAGAIN: {
|
|
|
- SAY("EAGAIN\n"); break;
|
|
|
+ SAM("EAGAIN\n"); break;
|
|
|
}
|
|
|
case -EFBIG: {
|
|
|
- SAY("EFBIG\n"); break;
|
|
|
+ SAM("EFBIG\n"); break;
|
|
|
}
|
|
|
case -EPIPE: {
|
|
|
- SAY("EPIPE\n"); break;
|
|
|
+ SAM("EPIPE\n"); break;
|
|
|
}
|
|
|
case -EMSGSIZE: {
|
|
|
- SAY("EMSGSIZE\n"); break;
|
|
|
+ SAM("EMSGSIZE\n"); break;
|
|
|
}
|
|
|
case -ENOSPC: {
|
|
|
- SAY("ENOSPC\n"); break;
|
|
|
+ SAM("ENOSPC\n"); break;
|
|
|
}
|
|
|
default: {
|
|
|
- SAY("0x%08X\n", rc); break;
|
|
|
+ SAM("0x%08X\n", rc); break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -2886,7 +2891,7 @@ struct usb_endpoint_descriptor *pepd;
|
|
|
struct usb_interface_descriptor *pusb_interface_descriptor;
|
|
|
struct usb_interface_assoc_descriptor *pusb_interface_assoc_descriptor;
|
|
|
struct urb *purb;
|
|
|
-static struct easycap *peasycap /*=NULL*/;
|
|
|
+struct easycap *peasycap;
|
|
|
struct data_urb *pdata_urb;
|
|
|
size_t wMaxPacketSize;
|
|
|
int ISOCwMaxPacketSize;
|
|
@@ -2896,18 +2901,18 @@ int CTRLwMaxPacketSize;
|
|
|
__u8 bEndpointAddress;
|
|
|
__u8 ISOCbEndpointAddress;
|
|
|
__u8 INTbEndpointAddress;
|
|
|
-int isin, i, j, k, m;
|
|
|
+int isin, i, j, k, m, rc;
|
|
|
__u8 bInterfaceNumber;
|
|
|
__u8 bInterfaceClass;
|
|
|
__u8 bInterfaceSubClass;
|
|
|
void *pbuf;
|
|
|
int okalt[8], isokalt;
|
|
|
-int okepn[8], isokepn;
|
|
|
-int okmps[8], isokmps;
|
|
|
+int okepn[8];
|
|
|
+int okmps[8];
|
|
|
int maxpacketsize;
|
|
|
-int rc;
|
|
|
|
|
|
JOT(4, "\n");
|
|
|
+peasycap = (struct easycap *)NULL;
|
|
|
|
|
|
if ((struct usb_interface *)NULL == pusb_interface) {
|
|
|
SAY("ERROR: pusb_interface is NULL\n");
|
|
@@ -3009,40 +3014,74 @@ JOT(4, "intf[%i]: pusb_interface_assoc_descriptor is NULL\n", \
|
|
|
/*
|
|
|
* A NEW struct easycap IS ALWAYS ALLOCATED WHEN INTERFACE 0 IS PROBED.
|
|
|
* IT IS NOT POSSIBLE HERE TO FREE ANY EXISTING struct easycap. THIS
|
|
|
- * SHOULD HAVE BEEN DONE BY easycap_delete() WHEN THE DEVICE WAS PHYSICALLY
|
|
|
- * UNPLUGGED.
|
|
|
- */
|
|
|
+ * SHOULD HAVE BEEN DONE BY easycap_delete() WHEN THE EasyCAP WAS
|
|
|
+ * PHYSICALLY UNPLUGGED.
|
|
|
+ *
|
|
|
+ * THE POINTER peasycap TO THE struct easycap IS REMEMBERED WHEN
|
|
|
+ * INTERFACES 1 AND 2 ARE PROBED.
|
|
|
+ *
|
|
|
+ * IF TWO EasyCAPs ARE PLUGGED IN NEARLY SIMULTANEOUSLY THERE WILL
|
|
|
+ * BE TROUBLE. BEWARE.
|
|
|
+*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if (0 == bInterfaceNumber) {
|
|
|
peasycap = kzalloc(sizeof(struct easycap), GFP_KERNEL);
|
|
|
if (NULL == peasycap) {
|
|
|
SAY("ERROR: Could not allocate peasycap\n");
|
|
|
return -ENOMEM;
|
|
|
- } else {
|
|
|
- peasycap->allocation_video_struct = sizeof(struct easycap);
|
|
|
- peasycap->allocation_video_page = 0;
|
|
|
- peasycap->allocation_video_urb = 0;
|
|
|
- peasycap->allocation_audio_struct = 0;
|
|
|
- peasycap->allocation_audio_page = 0;
|
|
|
- peasycap->allocation_audio_urb = 0;
|
|
|
}
|
|
|
+ SAM("allocated 0x%08lX=peasycap\n", (unsigned long int) peasycap);
|
|
|
+/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
|
|
|
+#if defined(EASYCAP_IS_VIDEODEV_CLIENT)
|
|
|
+ SAM("where 0x%08lX=&peasycap->video_device\n", \
|
|
|
+ (unsigned long int) &peasycap->video_device);
|
|
|
+#if defined(EASYCAP_NEEDS_V4L2_DEVICE_H)
|
|
|
+ SAM("and 0x%08lX=&peasycap->v4l2_device\n", \
|
|
|
+ (unsigned long int) &peasycap->v4l2_device);
|
|
|
+#endif /*EASYCAP_NEEDS_V4L2_DEVICE_H*/
|
|
|
+#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
|
|
|
+/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
- * INITIALIZE THE NEW easycap STRUCTURE.
|
|
|
- * NO PARAMETERS ARE SPECIFIED HERE REQUIRING THE SETTING OF REGISTERS.
|
|
|
- * THAT IS DONE FIRST BY easycap_open() AND LATER BY easycap_ioctl().
|
|
|
- */
|
|
|
+ * PERFORM URGENT INTIALIZATIONS ...
|
|
|
+*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- peasycap->pusb_device = pusb_device;
|
|
|
- peasycap->pusb_interface = pusb_interface;
|
|
|
-
|
|
|
kref_init(&peasycap->kref);
|
|
|
- JOT(8, "intf[%i]: after kref_init(..._video) " \
|
|
|
+ JOM(8, "intf[%i]: after kref_init(..._video) " \
|
|
|
"%i=peasycap->kref.refcount.counter\n", \
|
|
|
bInterfaceNumber, peasycap->kref.refcount.counter);
|
|
|
|
|
|
- init_waitqueue_head(&(peasycap->wq_video));
|
|
|
- init_waitqueue_head(&(peasycap->wq_audio));
|
|
|
+ init_waitqueue_head(&peasycap->wq_video);
|
|
|
+ init_waitqueue_head(&peasycap->wq_audio);
|
|
|
+
|
|
|
+ for (dongle_this = 0; dongle_this < DONGLE_MANY; dongle_this++) {
|
|
|
+ if ((struct easycap *)NULL == peasycap_dongle[dongle_this]) {
|
|
|
+ peasycap_dongle[dongle_this] = peasycap;
|
|
|
+ JOM(8, "intf[%i]: peasycap-->easycap" \
|
|
|
+ "_dongle[%i].peasycap\n", \
|
|
|
+ bInterfaceNumber, dongle_this);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (DONGLE_MANY <= dongle_this) {
|
|
|
+ SAM("ERROR: too many dongles\n");
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ peasycap->allocation_video_struct = sizeof(struct easycap);
|
|
|
+ peasycap->allocation_video_page = 0;
|
|
|
+ peasycap->allocation_video_urb = 0;
|
|
|
+ peasycap->allocation_audio_struct = 0;
|
|
|
+ peasycap->allocation_audio_page = 0;
|
|
|
+ peasycap->allocation_audio_urb = 0;
|
|
|
+
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+/*
|
|
|
+ * ... AND FURTHER INITIALIZE THE STRUCTURE
|
|
|
+*/
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+ peasycap->pusb_device = pusb_device;
|
|
|
+ peasycap->pusb_interface = pusb_interface;
|
|
|
|
|
|
peasycap->ilk = 0;
|
|
|
peasycap->microphone = false;
|
|
@@ -3062,6 +3101,8 @@ if (0 == bInterfaceNumber) {
|
|
|
peasycap->audio_isoc_buffer_size = -1;
|
|
|
|
|
|
peasycap->frame_buffer_many = FRAME_BUFFER_MANY;
|
|
|
+
|
|
|
+ peasycap->offerfields = 0;
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* DYNAMICALLY FILL IN THE AVAILABLE FORMATS.
|
|
@@ -3069,35 +3110,46 @@ if (0 == bInterfaceNumber) {
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
rc = fillin_formats();
|
|
|
if (0 > rc) {
|
|
|
- SAY("ERROR: fillin_formats() returned %i\n", rc);
|
|
|
+ SAM("ERROR: fillin_formats() returned %i\n", rc);
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
- JOT(4, "%i formats available\n", rc);
|
|
|
- } else {
|
|
|
+ JOM(4, "%i formats available\n", rc);
|
|
|
+ JOM(4, "finished initialization\n");
|
|
|
+} else {
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- if ((struct easycap *)NULL == peasycap) {
|
|
|
- SAY("ERROR: peasycap is NULL " \
|
|
|
- "when probing interface %i\n", \
|
|
|
- bInterfaceNumber);
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * FOR INTERFACES 1 AND 2 THE POINTER peasycap IS OBTAINED BY ASSUMING
|
|
|
+ * THAT dongle_this HAS NOT CHANGED SINCE INTERFACE 0 WAS PROBED. IF
|
|
|
+ * THIS IS NOT THE CASE, FOR EXAMPLE WHEN TWO EASYCAPs ARE PLUGGED IN
|
|
|
+ * SIMULTANEOUSLY, THERE WILL BE VERY SERIOUS TROUBLE.
|
|
|
+ */
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+ if ((0 > dongle_this) || (DONGLE_MANY <= dongle_this)) {
|
|
|
+ SAY("ERROR: bad dongle count\n");
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+ peasycap = peasycap_dongle[dongle_this];
|
|
|
+ JOT(8, "intf[%i]: peasycap_dongle[%i]-->peasycap\n", \
|
|
|
+ bInterfaceNumber, dongle_this);
|
|
|
|
|
|
- JOT(8, "kref_get() with %i=peasycap->kref.refcount.counter\n", \
|
|
|
- (int)peasycap->kref.refcount.counter);
|
|
|
- kref_get(&peasycap->kref);
|
|
|
+ if ((struct easycap *)NULL == peasycap) {
|
|
|
+ SAY("ERROR: peasycap is NULL when probing interface %i\n", \
|
|
|
+ bInterfaceNumber);
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if ((USB_CLASS_VIDEO == bInterfaceClass) || \
|
|
|
- (USB_CLASS_VENDOR_SPEC == bInterfaceClass)) {
|
|
|
+ (USB_CLASS_VENDOR_SPEC == bInterfaceClass)) {
|
|
|
if (-1 == peasycap->video_interface) {
|
|
|
peasycap->video_interface = bInterfaceNumber;
|
|
|
- JOT(4, "setting peasycap->video_interface=%i\n", \
|
|
|
+ JOM(4, "setting peasycap->video_interface=%i\n", \
|
|
|
peasycap->video_interface);
|
|
|
} else {
|
|
|
if (peasycap->video_interface != bInterfaceNumber) {
|
|
|
- SAY("ERROR: attempting to reset " \
|
|
|
+ SAM("ERROR: attempting to reset " \
|
|
|
"peasycap->video_interface\n");
|
|
|
- SAY("...... continuing with " \
|
|
|
+ SAM("...... continuing with " \
|
|
|
"%i=peasycap->video_interface\n", \
|
|
|
peasycap->video_interface);
|
|
|
}
|
|
@@ -3106,13 +3158,13 @@ if ((USB_CLASS_VIDEO == bInterfaceClass) || \
|
|
|
(0x02 == bInterfaceSubClass)) {
|
|
|
if (-1 == peasycap->audio_interface) {
|
|
|
peasycap->audio_interface = bInterfaceNumber;
|
|
|
- JOT(4, "setting peasycap->audio_interface=%i\n", \
|
|
|
+ JOM(4, "setting peasycap->audio_interface=%i\n", \
|
|
|
peasycap->audio_interface);
|
|
|
} else {
|
|
|
if (peasycap->audio_interface != bInterfaceNumber) {
|
|
|
- SAY("ERROR: attempting to reset " \
|
|
|
+ SAM("ERROR: attempting to reset " \
|
|
|
"peasycap->audio_interface\n");
|
|
|
- SAY("...... continuing with " \
|
|
|
+ SAM("...... continuing with " \
|
|
|
"%i=peasycap->audio_interface\n", \
|
|
|
peasycap->audio_interface);
|
|
|
}
|
|
@@ -3125,37 +3177,34 @@ if ((USB_CLASS_VIDEO == bInterfaceClass) || \
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
isokalt = 0;
|
|
|
-isokepn = 0;
|
|
|
-isokmps = 0;
|
|
|
-
|
|
|
for (i = 0; i < pusb_interface->num_altsetting; i++) {
|
|
|
pusb_host_interface = &(pusb_interface->altsetting[i]);
|
|
|
if ((struct usb_host_interface *)NULL == pusb_host_interface) {
|
|
|
- SAY("ERROR: pusb_host_interface is NULL\n");
|
|
|
+ SAM("ERROR: pusb_host_interface is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
pusb_interface_descriptor = &(pusb_host_interface->desc);
|
|
|
if ((struct usb_interface_descriptor *)NULL == \
|
|
|
pusb_interface_descriptor) {
|
|
|
- SAY("ERROR: pusb_interface_descriptor is NULL\n");
|
|
|
+ SAM("ERROR: pusb_interface_descriptor is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
- JOT(4, "intf[%i]alt[%i]: desc.bDescriptorType=0x%02X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]: desc.bDescriptorType=0x%02X\n", \
|
|
|
bInterfaceNumber, i, pusb_interface_descriptor->bDescriptorType);
|
|
|
- JOT(4, "intf[%i]alt[%i]: desc.bInterfaceNumber=0x%02X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]: desc.bInterfaceNumber=0x%02X\n", \
|
|
|
bInterfaceNumber, i, pusb_interface_descriptor->bInterfaceNumber);
|
|
|
- JOT(4, "intf[%i]alt[%i]: desc.bAlternateSetting=0x%02X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]: desc.bAlternateSetting=0x%02X\n", \
|
|
|
bInterfaceNumber, i, pusb_interface_descriptor->bAlternateSetting);
|
|
|
- JOT(4, "intf[%i]alt[%i]: desc.bNumEndpoints=0x%02X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]: desc.bNumEndpoints=0x%02X\n", \
|
|
|
bInterfaceNumber, i, pusb_interface_descriptor->bNumEndpoints);
|
|
|
- JOT(4, "intf[%i]alt[%i]: desc.bInterfaceClass=0x%02X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]: desc.bInterfaceClass=0x%02X\n", \
|
|
|
bInterfaceNumber, i, pusb_interface_descriptor->bInterfaceClass);
|
|
|
- JOT(4, "intf[%i]alt[%i]: desc.bInterfaceSubClass=0x%02X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]: desc.bInterfaceSubClass=0x%02X\n", \
|
|
|
bInterfaceNumber, i, pusb_interface_descriptor->bInterfaceSubClass);
|
|
|
- JOT(4, "intf[%i]alt[%i]: desc.bInterfaceProtocol=0x%02X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]: desc.bInterfaceProtocol=0x%02X\n", \
|
|
|
bInterfaceNumber, i, pusb_interface_descriptor->bInterfaceProtocol);
|
|
|
- JOT(4, "intf[%i]alt[%i]: desc.iInterface=0x%02X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]: desc.iInterface=0x%02X\n", \
|
|
|
bInterfaceNumber, i, pusb_interface_descriptor->iInterface);
|
|
|
|
|
|
ISOCwMaxPacketSize = -1;
|
|
@@ -3166,86 +3215,80 @@ for (i = 0; i < pusb_interface->num_altsetting; i++) {
|
|
|
INTbEndpointAddress = 0;
|
|
|
|
|
|
if (0 == pusb_interface_descriptor->bNumEndpoints)
|
|
|
- JOT(4, "intf[%i]alt[%i] has no endpoints\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i] has no endpoints\n", \
|
|
|
bInterfaceNumber, i);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
for (j = 0; j < pusb_interface_descriptor->bNumEndpoints; j++) {
|
|
|
pepd = &(pusb_host_interface->endpoint[j].desc);
|
|
|
if ((struct usb_endpoint_descriptor *)NULL == pepd) {
|
|
|
- SAY("ERROR: pepd is NULL.\n");
|
|
|
- SAY("...... skipping\n");
|
|
|
+ SAM("ERROR: pepd is NULL.\n");
|
|
|
+ SAM("...... skipping\n");
|
|
|
continue;
|
|
|
}
|
|
|
wMaxPacketSize = le16_to_cpu(pepd->wMaxPacketSize);
|
|
|
bEndpointAddress = pepd->bEndpointAddress;
|
|
|
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i]: bEndpointAddress=0x%X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i]: bEndpointAddress=0x%X\n", \
|
|
|
bInterfaceNumber, i, j, \
|
|
|
pepd->bEndpointAddress);
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i]: bmAttributes=0x%X\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i]: bmAttributes=0x%X\n", \
|
|
|
bInterfaceNumber, i, j, \
|
|
|
pepd->bmAttributes);
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i]: wMaxPacketSize=%i\n", \
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i]: wMaxPacketSize=%i\n", \
|
|
|
bInterfaceNumber, i, j, \
|
|
|
pepd->wMaxPacketSize);
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i]: bInterval=%i\n",
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i]: bInterval=%i\n",
|
|
|
bInterfaceNumber, i, j, \
|
|
|
pepd->bInterval);
|
|
|
|
|
|
if (pepd->bEndpointAddress & USB_DIR_IN) {
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i] is an IN endpoint\n",\
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i] is an IN endpoint\n",\
|
|
|
bInterfaceNumber, i, j);
|
|
|
isin = 1;
|
|
|
} else {
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i] is an OUT endpoint\n",\
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i] is an OUT endpoint\n",\
|
|
|
bInterfaceNumber, i, j);
|
|
|
- SAY("ERROR: OUT endpoint unexpected\n");
|
|
|
- SAY("...... continuing\n");
|
|
|
+ SAM("ERROR: OUT endpoint unexpected\n");
|
|
|
+ SAM("...... continuing\n");
|
|
|
isin = 0;
|
|
|
}
|
|
|
if ((pepd->bmAttributes & \
|
|
|
USB_ENDPOINT_XFERTYPE_MASK) == \
|
|
|
USB_ENDPOINT_XFER_ISOC) {
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i] is an ISOC endpoint\n",\
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i] is an ISOC endpoint\n",\
|
|
|
bInterfaceNumber, i, j);
|
|
|
if (isin) {
|
|
|
switch (bInterfaceClass) {
|
|
|
case USB_CLASS_VIDEO:
|
|
|
case USB_CLASS_VENDOR_SPEC: {
|
|
|
if (!peasycap) {
|
|
|
- SAY("MISTAKE: " \
|
|
|
+ SAM("MISTAKE: " \
|
|
|
"peasycap is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (pepd->wMaxPacketSize) {
|
|
|
if (8 > isokalt) {
|
|
|
okalt[isokalt] = i;
|
|
|
- JOT(4,\
|
|
|
+ JOM(4,\
|
|
|
"%i=okalt[%i]\n", \
|
|
|
okalt[isokalt], \
|
|
|
isokalt);
|
|
|
- isokalt++;
|
|
|
- }
|
|
|
- if (8 > isokepn) {
|
|
|
- okepn[isokepn] = \
|
|
|
+ okepn[isokalt] = \
|
|
|
pepd->\
|
|
|
bEndpointAddress & \
|
|
|
0x0F;
|
|
|
- JOT(4,\
|
|
|
+ JOM(4,\
|
|
|
"%i=okepn[%i]\n", \
|
|
|
- okepn[isokepn], \
|
|
|
- isokepn);
|
|
|
- isokepn++;
|
|
|
- }
|
|
|
- if (8 > isokmps) {
|
|
|
- okmps[isokmps] = \
|
|
|
+ okepn[isokalt], \
|
|
|
+ isokalt);
|
|
|
+ okmps[isokalt] = \
|
|
|
le16_to_cpu(pepd->\
|
|
|
wMaxPacketSize);
|
|
|
- JOT(4,\
|
|
|
+ JOM(4,\
|
|
|
"%i=okmps[%i]\n", \
|
|
|
- okmps[isokmps], \
|
|
|
- isokmps);
|
|
|
- isokmps++;
|
|
|
+ okmps[isokalt], \
|
|
|
+ isokalt);
|
|
|
+ isokalt++;
|
|
|
}
|
|
|
} else {
|
|
|
if (-1 == peasycap->\
|
|
@@ -3253,16 +3296,16 @@ for (i = 0; i < pusb_interface->num_altsetting; i++) {
|
|
|
peasycap->\
|
|
|
video_altsetting_off =\
|
|
|
i;
|
|
|
- JOT(4, "%i=video_" \
|
|
|
+ JOM(4, "%i=video_" \
|
|
|
"altsetting_off " \
|
|
|
"<====\n", \
|
|
|
peasycap->\
|
|
|
video_altsetting_off);
|
|
|
} else {
|
|
|
- SAY("ERROR: peasycap" \
|
|
|
+ SAM("ERROR: peasycap" \
|
|
|
"->video_altsetting_" \
|
|
|
"off already set\n");
|
|
|
- SAY("...... " \
|
|
|
+ SAM("...... " \
|
|
|
"continuing with " \
|
|
|
"%i=peasycap->video_" \
|
|
|
"altsetting_off\n", \
|
|
@@ -3276,39 +3319,33 @@ for (i = 0; i < pusb_interface->num_altsetting; i++) {
|
|
|
if (0x02 != bInterfaceSubClass)
|
|
|
break;
|
|
|
if (!peasycap) {
|
|
|
- SAY("MISTAKE: " \
|
|
|
+ SAM("MISTAKE: " \
|
|
|
"peasycap is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (pepd->wMaxPacketSize) {
|
|
|
if (8 > isokalt) {
|
|
|
okalt[isokalt] = i ;
|
|
|
- JOT(4,\
|
|
|
+ JOM(4,\
|
|
|
"%i=okalt[%i]\n", \
|
|
|
okalt[isokalt], \
|
|
|
isokalt);
|
|
|
- isokalt++;
|
|
|
- }
|
|
|
- if (8 > isokepn) {
|
|
|
- okepn[isokepn] = \
|
|
|
+ okepn[isokalt] = \
|
|
|
pepd->\
|
|
|
bEndpointAddress & \
|
|
|
0x0F;
|
|
|
- JOT(4,\
|
|
|
+ JOM(4,\
|
|
|
"%i=okepn[%i]\n", \
|
|
|
- okepn[isokepn], \
|
|
|
- isokepn);
|
|
|
- isokepn++;
|
|
|
- }
|
|
|
- if (8 > isokmps) {
|
|
|
- okmps[isokmps] = \
|
|
|
+ okepn[isokalt], \
|
|
|
+ isokalt);
|
|
|
+ okmps[isokalt] = \
|
|
|
le16_to_cpu(pepd->\
|
|
|
wMaxPacketSize);
|
|
|
- JOT(4,\
|
|
|
+ JOM(4,\
|
|
|
"%i=okmps[%i]\n",\
|
|
|
- okmps[isokmps], \
|
|
|
- isokmps);
|
|
|
- isokmps++;
|
|
|
+ okmps[isokalt], \
|
|
|
+ isokalt);
|
|
|
+ isokalt++;
|
|
|
}
|
|
|
} else {
|
|
|
if (-1 == peasycap->\
|
|
@@ -3316,16 +3353,16 @@ for (i = 0; i < pusb_interface->num_altsetting; i++) {
|
|
|
peasycap->\
|
|
|
audio_altsetting_off =\
|
|
|
i;
|
|
|
- JOT(4, "%i=audio_" \
|
|
|
+ JOM(4, "%i=audio_" \
|
|
|
"altsetting_off " \
|
|
|
"<====\n", \
|
|
|
peasycap->\
|
|
|
audio_altsetting_off);
|
|
|
} else {
|
|
|
- SAY("ERROR: peasycap" \
|
|
|
+ SAM("ERROR: peasycap" \
|
|
|
"->audio_altsetting_" \
|
|
|
"off already set\n");
|
|
|
- SAY("...... " \
|
|
|
+ SAM("...... " \
|
|
|
"continuing with " \
|
|
|
"%i=peasycap->\
|
|
|
audio_altsetting_" \
|
|
@@ -3343,19 +3380,19 @@ for (i = 0; i < pusb_interface->num_altsetting; i++) {
|
|
|
} else if ((pepd->bmAttributes & \
|
|
|
USB_ENDPOINT_XFERTYPE_MASK) ==\
|
|
|
USB_ENDPOINT_XFER_BULK) {
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i] is a BULK endpoint\n",\
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i] is a BULK endpoint\n",\
|
|
|
bInterfaceNumber, i, j);
|
|
|
} else if ((pepd->bmAttributes & \
|
|
|
USB_ENDPOINT_XFERTYPE_MASK) ==\
|
|
|
USB_ENDPOINT_XFER_INT) {
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i] is an INT endpoint\n",\
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i] is an INT endpoint\n",\
|
|
|
bInterfaceNumber, i, j);
|
|
|
} else {
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i] is a CTRL endpoint\n",\
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i] is a CTRL endpoint\n",\
|
|
|
bInterfaceNumber, i, j);
|
|
|
}
|
|
|
if (0 == pepd->wMaxPacketSize) {
|
|
|
- JOT(4, "intf[%i]alt[%i]end[%i] " \
|
|
|
+ JOM(4, "intf[%i]alt[%i]end[%i] " \
|
|
|
"has zero packet size\n", \
|
|
|
bInterfaceNumber, i, j);
|
|
|
}
|
|
@@ -3366,7 +3403,7 @@ for (i = 0; i < pusb_interface->num_altsetting; i++) {
|
|
|
* PERFORM INITIALIZATION OF THE PROBED INTERFACE
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
-JOT(4, "initialization begins for interface %i\n", \
|
|
|
+JOM(4, "initialization begins for interface %i\n", \
|
|
|
pusb_interface_descriptor->bInterfaceNumber);
|
|
|
switch (bInterfaceNumber) {
|
|
|
/*---------------------------------------------------------------------------*/
|
|
@@ -3376,89 +3413,78 @@ switch (bInterfaceNumber) {
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
case 0: {
|
|
|
if (!peasycap) {
|
|
|
- SAY("MISTAKE: peasycap is NULL\n");
|
|
|
+ SAM("MISTAKE: peasycap is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (!isokalt) {
|
|
|
- SAY("ERROR: no viable video_altsetting_on\n");
|
|
|
+ SAM("ERROR: no viable video_altsetting_on\n");
|
|
|
return -ENOENT;
|
|
|
} else {
|
|
|
peasycap->video_altsetting_on = okalt[isokalt - 1];
|
|
|
- JOT(4, "%i=video_altsetting_on <====\n", \
|
|
|
+ JOM(4, "%i=video_altsetting_on <====\n", \
|
|
|
peasycap->video_altsetting_on);
|
|
|
}
|
|
|
- if (!isokepn) {
|
|
|
- SAY("ERROR: no viable video_endpointnumber\n");
|
|
|
- return -ENOENT;
|
|
|
- } else {
|
|
|
- peasycap->video_endpointnumber = okepn[isokepn - 1];
|
|
|
- JOT(4, "%i=video_endpointnumber\n", \
|
|
|
- peasycap->video_endpointnumber);
|
|
|
- }
|
|
|
- if (!isokmps) {
|
|
|
- SAY("ERROR: no viable video_maxpacketsize\n");
|
|
|
- return -ENOENT;
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* DECIDE THE VIDEO STREAMING PARAMETERS
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
+ peasycap->video_endpointnumber = okepn[isokalt - 1];
|
|
|
+ JOM(4, "%i=video_endpointnumber\n", peasycap->video_endpointnumber);
|
|
|
+ maxpacketsize = okmps[isokalt - 1];
|
|
|
+ if (USB_2_0_MAXPACKETSIZE > maxpacketsize) {
|
|
|
+ peasycap->video_isoc_maxframesize = maxpacketsize;
|
|
|
} else {
|
|
|
- maxpacketsize = okmps[isokmps - 1] - 1024;
|
|
|
- if (USB_2_0_MAXPACKETSIZE > maxpacketsize) {
|
|
|
- peasycap->video_isoc_maxframesize = maxpacketsize;
|
|
|
- } else {
|
|
|
- peasycap->video_isoc_maxframesize = \
|
|
|
- USB_2_0_MAXPACKETSIZE;
|
|
|
- }
|
|
|
- JOT(4, "%i=video_isoc_maxframesize\n", \
|
|
|
- peasycap->video_isoc_maxframesize);
|
|
|
- if (0 >= peasycap->video_isoc_maxframesize) {
|
|
|
- SAY("ERROR: bad video_isoc_maxframesize\n");
|
|
|
- return -ENOENT;
|
|
|
- }
|
|
|
- peasycap->video_isoc_framesperdesc = VIDEO_ISOC_FRAMESPERDESC;
|
|
|
- JOT(4, "%i=video_isoc_framesperdesc\n", \
|
|
|
- peasycap->video_isoc_framesperdesc);
|
|
|
- if (0 >= peasycap->video_isoc_framesperdesc) {
|
|
|
- SAY("ERROR: bad video_isoc_framesperdesc\n");
|
|
|
- return -ENOENT;
|
|
|
- }
|
|
|
- peasycap->video_isoc_buffer_size = \
|
|
|
- peasycap->video_isoc_maxframesize * \
|
|
|
- peasycap->video_isoc_framesperdesc;
|
|
|
- JOT(4, "%i=video_isoc_buffer_size\n", \
|
|
|
- peasycap->video_isoc_buffer_size);
|
|
|
- if ((PAGE_SIZE << VIDEO_ISOC_ORDER) < \
|
|
|
- peasycap->video_isoc_buffer_size) {
|
|
|
- SAY("MISTAKE: " \
|
|
|
- "peasycap->video_isoc_buffer_size too big\n");
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
+ peasycap->video_isoc_maxframesize = \
|
|
|
+ USB_2_0_MAXPACKETSIZE;
|
|
|
+ }
|
|
|
+ JOM(4, "%i=video_isoc_maxframesize\n", \
|
|
|
+ peasycap->video_isoc_maxframesize);
|
|
|
+ if (0 >= peasycap->video_isoc_maxframesize) {
|
|
|
+ SAM("ERROR: bad video_isoc_maxframesize\n");
|
|
|
+ SAM(" possibly because port is USB 1.1\n");
|
|
|
+ return -ENOENT;
|
|
|
+ }
|
|
|
+ peasycap->video_isoc_framesperdesc = VIDEO_ISOC_FRAMESPERDESC;
|
|
|
+ JOM(4, "%i=video_isoc_framesperdesc\n", \
|
|
|
+ peasycap->video_isoc_framesperdesc);
|
|
|
+ if (0 >= peasycap->video_isoc_framesperdesc) {
|
|
|
+ SAM("ERROR: bad video_isoc_framesperdesc\n");
|
|
|
+ return -ENOENT;
|
|
|
+ }
|
|
|
+ peasycap->video_isoc_buffer_size = \
|
|
|
+ peasycap->video_isoc_maxframesize * \
|
|
|
+ peasycap->video_isoc_framesperdesc;
|
|
|
+ JOM(4, "%i=video_isoc_buffer_size\n", \
|
|
|
+ peasycap->video_isoc_buffer_size);
|
|
|
+ if ((PAGE_SIZE << VIDEO_ISOC_ORDER) < \
|
|
|
+ peasycap->video_isoc_buffer_size) {
|
|
|
+ SAM("MISTAKE: peasycap->video_isoc_buffer_size too big\n");
|
|
|
+ return -EFAULT;
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if (-1 == peasycap->video_interface) {
|
|
|
- SAY("MISTAKE: video_interface is unset\n");
|
|
|
+ SAM("MISTAKE: video_interface is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->video_altsetting_on) {
|
|
|
- SAY("MISTAKE: video_altsetting_on is unset\n");
|
|
|
+ SAM("MISTAKE: video_altsetting_on is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->video_altsetting_off) {
|
|
|
- SAY("MISTAKE: video_interface_off is unset\n");
|
|
|
+ SAM("MISTAKE: video_interface_off is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->video_endpointnumber) {
|
|
|
- SAY("MISTAKE: video_endpointnumber is unset\n");
|
|
|
+ SAM("MISTAKE: video_endpointnumber is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->video_isoc_maxframesize) {
|
|
|
- SAY("MISTAKE: video_isoc_maxframesize is unset\n");
|
|
|
+ SAM("MISTAKE: video_isoc_maxframesize is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->video_isoc_buffer_size) {
|
|
|
- SAY("MISTAKE: video_isoc_buffer_size is unset\n");
|
|
|
+ SAM("MISTAKE: video_isoc_buffer_size is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
@@ -3469,20 +3495,20 @@ case 0: {
|
|
|
INIT_LIST_HEAD(&(peasycap->urb_video_head));
|
|
|
peasycap->purb_video_head = &(peasycap->urb_video_head);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- JOT(4, "allocating %i frame buffers of size %li\n", \
|
|
|
+ JOM(4, "allocating %i frame buffers of size %li\n", \
|
|
|
FRAME_BUFFER_MANY, (long int)FRAME_BUFFER_SIZE);
|
|
|
- JOT(4, ".... each scattered over %li pages\n", \
|
|
|
+ JOM(4, ".... each scattered over %li pages\n", \
|
|
|
FRAME_BUFFER_SIZE/PAGE_SIZE);
|
|
|
|
|
|
for (k = 0; k < FRAME_BUFFER_MANY; k++) {
|
|
|
for (m = 0; m < FRAME_BUFFER_SIZE/PAGE_SIZE; m++) {
|
|
|
if ((void *)NULL != peasycap->frame_buffer[k][m].pgo)
|
|
|
- SAY("attempting to reallocate frame " \
|
|
|
+ SAM("attempting to reallocate frame " \
|
|
|
" buffers\n");
|
|
|
else {
|
|
|
pbuf = (void *)__get_free_page(GFP_KERNEL);
|
|
|
if ((void *)NULL == pbuf) {
|
|
|
- SAY("ERROR: Could not allocate frame "\
|
|
|
+ SAM("ERROR: Could not allocate frame "\
|
|
|
"buffer %i page %i\n", k, m);
|
|
|
return -ENOMEM;
|
|
|
} else
|
|
@@ -3496,23 +3522,23 @@ case 0: {
|
|
|
|
|
|
peasycap->frame_fill = 0;
|
|
|
peasycap->frame_read = 0;
|
|
|
- JOT(4, "allocation of frame buffers done: %i pages\n", k * \
|
|
|
+ JOM(4, "allocation of frame buffers done: %i pages\n", k * \
|
|
|
m);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- JOT(4, "allocating %i field buffers of size %li\n", \
|
|
|
+ JOM(4, "allocating %i field buffers of size %li\n", \
|
|
|
FIELD_BUFFER_MANY, (long int)FIELD_BUFFER_SIZE);
|
|
|
- JOT(4, ".... each scattered over %li pages\n", \
|
|
|
+ JOM(4, ".... each scattered over %li pages\n", \
|
|
|
FIELD_BUFFER_SIZE/PAGE_SIZE);
|
|
|
|
|
|
for (k = 0; k < FIELD_BUFFER_MANY; k++) {
|
|
|
for (m = 0; m < FIELD_BUFFER_SIZE/PAGE_SIZE; m++) {
|
|
|
if ((void *)NULL != peasycap->field_buffer[k][m].pgo) {
|
|
|
- SAY("ERROR: attempting to reallocate " \
|
|
|
+ SAM("ERROR: attempting to reallocate " \
|
|
|
"field buffers\n");
|
|
|
} else {
|
|
|
pbuf = (void *) __get_free_page(GFP_KERNEL);
|
|
|
if ((void *)NULL == pbuf) {
|
|
|
- SAY("ERROR: Could not allocate field" \
|
|
|
+ SAM("ERROR: Could not allocate field" \
|
|
|
" buffer %i page %i\n", k, m);
|
|
|
return -ENOMEM;
|
|
|
}
|
|
@@ -3528,18 +3554,18 @@ case 0: {
|
|
|
peasycap->field_fill = 0;
|
|
|
peasycap->field_page = 0;
|
|
|
peasycap->field_read = 0;
|
|
|
- JOT(4, "allocation of field buffers done: %i pages\n", k * \
|
|
|
+ JOM(4, "allocation of field buffers done: %i pages\n", k * \
|
|
|
m);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- JOT(4, "allocating %i isoc video buffers of size %i\n", \
|
|
|
+ JOM(4, "allocating %i isoc video buffers of size %i\n", \
|
|
|
VIDEO_ISOC_BUFFER_MANY, \
|
|
|
peasycap->video_isoc_buffer_size);
|
|
|
- JOT(4, ".... each occupying contiguous memory pages\n");
|
|
|
+ JOM(4, ".... each occupying contiguous memory pages\n");
|
|
|
|
|
|
for (k = 0; k < VIDEO_ISOC_BUFFER_MANY; k++) {
|
|
|
pbuf = (void *)__get_free_pages(GFP_KERNEL, VIDEO_ISOC_ORDER);
|
|
|
if (NULL == pbuf) {
|
|
|
- SAY("ERROR: Could not allocate isoc video buffer " \
|
|
|
+ SAM("ERROR: Could not allocate isoc video buffer " \
|
|
|
"%i\n", k);
|
|
|
return -ENOMEM;
|
|
|
} else
|
|
@@ -3551,26 +3577,26 @@ case 0: {
|
|
|
peasycap->video_isoc_buffer_size;
|
|
|
peasycap->video_isoc_buffer[k].kount = k;
|
|
|
}
|
|
|
- JOT(4, "allocation of isoc video buffers done: %i pages\n", \
|
|
|
+ JOM(4, "allocation of isoc video buffers done: %i pages\n", \
|
|
|
k * (0x01 << VIDEO_ISOC_ORDER));
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* ALLOCATE AND INITIALIZE MULTIPLE struct urb ...
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- JOT(4, "allocating %i struct urb.\n", VIDEO_ISOC_BUFFER_MANY);
|
|
|
- JOT(4, "using %i=peasycap->video_isoc_framesperdesc\n", \
|
|
|
+ JOM(4, "allocating %i struct urb.\n", VIDEO_ISOC_BUFFER_MANY);
|
|
|
+ JOM(4, "using %i=peasycap->video_isoc_framesperdesc\n", \
|
|
|
peasycap->video_isoc_framesperdesc);
|
|
|
- JOT(4, "using %i=peasycap->video_isoc_maxframesize\n", \
|
|
|
+ JOM(4, "using %i=peasycap->video_isoc_maxframesize\n", \
|
|
|
peasycap->video_isoc_maxframesize);
|
|
|
- JOT(4, "using %i=peasycap->video_isoc_buffer_sizen", \
|
|
|
+ JOM(4, "using %i=peasycap->video_isoc_buffer_sizen", \
|
|
|
peasycap->video_isoc_buffer_size);
|
|
|
|
|
|
for (k = 0; k < VIDEO_ISOC_BUFFER_MANY; k++) {
|
|
|
purb = usb_alloc_urb(peasycap->video_isoc_framesperdesc, \
|
|
|
GFP_KERNEL);
|
|
|
if (NULL == purb) {
|
|
|
- SAY("ERROR: usb_alloc_urb returned NULL for buffer " \
|
|
|
+ SAM("ERROR: usb_alloc_urb returned NULL for buffer " \
|
|
|
"%i\n", k);
|
|
|
return -ENOMEM;
|
|
|
} else
|
|
@@ -3578,7 +3604,7 @@ case 0: {
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
pdata_urb = kzalloc(sizeof(struct data_urb), GFP_KERNEL);
|
|
|
if (NULL == pdata_urb) {
|
|
|
- SAY("ERROR: Could not allocate struct data_urb.\n");
|
|
|
+ SAM("ERROR: Could not allocate struct data_urb.\n");
|
|
|
return -ENOMEM;
|
|
|
} else
|
|
|
peasycap->allocation_video_struct += \
|
|
@@ -3595,30 +3621,30 @@ case 0: {
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if (!k) {
|
|
|
- JOT(4, "initializing video urbs thus:\n");
|
|
|
- JOT(4, " purb->interval = 1;\n");
|
|
|
- JOT(4, " purb->dev = peasycap->pusb_device;\n");
|
|
|
- JOT(4, " purb->pipe = usb_rcvisocpipe" \
|
|
|
+ JOM(4, "initializing video urbs thus:\n");
|
|
|
+ JOM(4, " purb->interval = 1;\n");
|
|
|
+ JOM(4, " purb->dev = peasycap->pusb_device;\n");
|
|
|
+ JOM(4, " purb->pipe = usb_rcvisocpipe" \
|
|
|
"(peasycap->pusb_device,%i);\n", \
|
|
|
peasycap->video_endpointnumber);
|
|
|
- JOT(4, " purb->transfer_flags = URB_ISO_ASAP;\n");
|
|
|
- JOT(4, " purb->transfer_buffer = peasycap->" \
|
|
|
+ JOM(4, " purb->transfer_flags = URB_ISO_ASAP;\n");
|
|
|
+ JOM(4, " purb->transfer_buffer = peasycap->" \
|
|
|
"video_isoc_buffer[.].pgo;\n");
|
|
|
- JOT(4, " purb->transfer_buffer_length = %i;\n", \
|
|
|
+ JOM(4, " purb->transfer_buffer_length = %i;\n", \
|
|
|
peasycap->video_isoc_buffer_size);
|
|
|
- JOT(4, " purb->complete = easycap_complete;\n");
|
|
|
- JOT(4, " purb->context = peasycap;\n");
|
|
|
- JOT(4, " purb->start_frame = 0;\n");
|
|
|
- JOT(4, " purb->number_of_packets = %i;\n", \
|
|
|
+ JOM(4, " purb->complete = easycap_complete;\n");
|
|
|
+ JOM(4, " purb->context = peasycap;\n");
|
|
|
+ JOM(4, " purb->start_frame = 0;\n");
|
|
|
+ JOM(4, " purb->number_of_packets = %i;\n", \
|
|
|
peasycap->video_isoc_framesperdesc);
|
|
|
- JOT(4, " for (j = 0; j < %i; j++)\n", \
|
|
|
+ JOM(4, " for (j = 0; j < %i; j++)\n", \
|
|
|
peasycap->video_isoc_framesperdesc);
|
|
|
- JOT(4, " {\n");
|
|
|
- JOT(4, " purb->iso_frame_desc[j].offset = j*%i;\n",\
|
|
|
+ JOM(4, " {\n");
|
|
|
+ JOM(4, " purb->iso_frame_desc[j].offset = j*%i;\n",\
|
|
|
peasycap->video_isoc_maxframesize);
|
|
|
- JOT(4, " purb->iso_frame_desc[j].length = %i;\n", \
|
|
|
+ JOM(4, " purb->iso_frame_desc[j].length = %i;\n", \
|
|
|
peasycap->video_isoc_maxframesize);
|
|
|
- JOT(4, " }\n");
|
|
|
+ JOM(4, " }\n");
|
|
|
}
|
|
|
|
|
|
purb->interval = 1;
|
|
@@ -3640,7 +3666,7 @@ case 0: {
|
|
|
peasycap->video_isoc_maxframesize;
|
|
|
}
|
|
|
}
|
|
|
- JOT(4, "allocation of %i struct urb done.\n", k);
|
|
|
+ JOM(4, "allocation of %i struct urb done.\n", k);
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* SAVE POINTER peasycap IN THIS INTERFACE.
|
|
@@ -3657,48 +3683,55 @@ case 0: {
|
|
|
err("Not able to get a minor for this device");
|
|
|
usb_set_intfdata(pusb_interface, NULL);
|
|
|
return -ENODEV;
|
|
|
- } else
|
|
|
+ } else {
|
|
|
(peasycap->registered_video)++;
|
|
|
- SAY("easycap attached to minor #%d\n", pusb_interface->minor);
|
|
|
- break;
|
|
|
-/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
|
|
|
-#else
|
|
|
- pvideo_device = (struct video_device *)\
|
|
|
- kzalloc(sizeof(struct video_device), GFP_KERNEL);
|
|
|
- if ((struct video_device *)NULL == pvideo_device) {
|
|
|
- SAY("ERROR: Could not allocate structure video_device\n");
|
|
|
- return -ENOMEM;
|
|
|
+ SAM("easycap attached to minor #%d\n", pusb_interface->minor);
|
|
|
+ break;
|
|
|
}
|
|
|
- if (VIDEO_DEVICE_MANY <= video_device_many) {
|
|
|
- SAY("ERROR: Too many /dev/videos\n");
|
|
|
- return -ENOMEM;
|
|
|
+/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
|
|
|
+#else
|
|
|
+#if defined(EASYCAP_NEEDS_V4L2_DEVICE_H)
|
|
|
+ if (0 != (v4l2_device_register(&(pusb_interface->dev), \
|
|
|
+ &(peasycap->v4l2_device)))) {
|
|
|
+ SAM("v4l2_device_register() failed\n");
|
|
|
+ return -ENODEV;
|
|
|
+ } else {
|
|
|
+ JOM(4, "registered device instance: %s\n", \
|
|
|
+ &(peasycap->v4l2_device.name[0]));
|
|
|
}
|
|
|
- pvideo_array[video_device_many] = pvideo_device; video_device_many++;
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+/*
|
|
|
+ * THIS IS BELIEVED TO BE HARMLESS, BUT MAY WELL BE UNNECESSARY OR WRONG:
|
|
|
+*/
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+ peasycap->video_device.v4l2_dev = (struct v4l2_device *)NULL;
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
- strcpy(&pvideo_device->name[0], "easycapdc60");
|
|
|
+#endif /*EASYCAP_NEEDS_V4L2_DEVICE_H*/
|
|
|
+
|
|
|
+ strcpy(&peasycap->video_device.name[0], "easycapdc60");
|
|
|
#if defined(EASYCAP_NEEDS_V4L2_FOPS)
|
|
|
- pvideo_device->fops = &v4l2_fops;
|
|
|
+ peasycap->video_device.fops = &v4l2_fops;
|
|
|
#else
|
|
|
- pvideo_device->fops = &easycap_fops;
|
|
|
+ peasycap->video_device.fops = &easycap_fops;
|
|
|
#endif /*EASYCAP_NEEDS_V4L2_FOPS*/
|
|
|
- pvideo_device->minor = -1;
|
|
|
- pvideo_device->release = (void *)(&videodev_release);
|
|
|
+ peasycap->video_device.minor = -1;
|
|
|
+ peasycap->video_device.release = (void *)(&videodev_release);
|
|
|
|
|
|
- video_set_drvdata(pvideo_device, (void *)peasycap);
|
|
|
+ video_set_drvdata(&(peasycap->video_device), (void *)peasycap);
|
|
|
|
|
|
- rc = video_register_device(pvideo_device, VFL_TYPE_GRABBER, -1);
|
|
|
- if (0 != rc) {
|
|
|
+ if (0 != (video_register_device(&(peasycap->video_device), \
|
|
|
+ VFL_TYPE_GRABBER, -1))) {
|
|
|
err("Not able to register with videodev");
|
|
|
- videodev_release(pvideo_device);
|
|
|
+ videodev_release(&(peasycap->video_device));
|
|
|
return -ENODEV;
|
|
|
} else {
|
|
|
- peasycap->pvideo_device = pvideo_device;
|
|
|
(peasycap->registered_video)++;
|
|
|
- JOT(4, "registered with videodev: %i=minor\n", \
|
|
|
- pvideo_device->minor);
|
|
|
+ SAM("registered with videodev: %i=minor\n", \
|
|
|
+ peasycap->video_device.minor);
|
|
|
}
|
|
|
-/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
|
|
|
+/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
break;
|
|
|
}
|
|
|
/*--------------------------------------------------------------------------*/
|
|
@@ -3708,125 +3741,118 @@ case 0: {
|
|
|
*/
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
case 1: {
|
|
|
+ if (!peasycap) {
|
|
|
+ SAM("ERROR: peasycap is NULL\n");
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* SAVE POINTER peasycap IN INTERFACE 1
|
|
|
*/
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
usb_set_intfdata(pusb_interface, peasycap);
|
|
|
- JOT(4, "no initialization required for interface %i\n", \
|
|
|
+ JOM(4, "no initialization required for interface %i\n", \
|
|
|
pusb_interface_descriptor->bInterfaceNumber);
|
|
|
break;
|
|
|
}
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
case 2: {
|
|
|
if (!peasycap) {
|
|
|
- SAY("MISTAKE: peasycap is NULL\n");
|
|
|
+ SAM("MISTAKE: peasycap is NULL\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (!isokalt) {
|
|
|
- SAY("ERROR: no viable audio_altsetting_on\n");
|
|
|
+ SAM("ERROR: no viable audio_altsetting_on\n");
|
|
|
return -ENOENT;
|
|
|
} else {
|
|
|
peasycap->audio_altsetting_on = okalt[isokalt - 1];
|
|
|
- JOT(4, "%i=audio_altsetting_on <====\n", \
|
|
|
+ JOM(4, "%i=audio_altsetting_on <====\n", \
|
|
|
peasycap->audio_altsetting_on);
|
|
|
}
|
|
|
- if (!isokepn) {
|
|
|
- SAY("ERROR: no viable audio_endpointnumber\n");
|
|
|
+
|
|
|
+ peasycap->audio_endpointnumber = okepn[isokalt - 1];
|
|
|
+ JOM(4, "%i=audio_endpointnumber\n", peasycap->audio_endpointnumber);
|
|
|
+
|
|
|
+ peasycap->audio_isoc_maxframesize = okmps[isokalt - 1];
|
|
|
+ JOM(4, "%i=audio_isoc_maxframesize\n", \
|
|
|
+ peasycap->audio_isoc_maxframesize);
|
|
|
+ if (0 >= peasycap->audio_isoc_maxframesize) {
|
|
|
+ SAM("ERROR: bad audio_isoc_maxframesize\n");
|
|
|
return -ENOENT;
|
|
|
- } else {
|
|
|
- peasycap->audio_endpointnumber = okepn[isokepn - 1];
|
|
|
- JOT(4, "%i=audio_endpointnumber\n", \
|
|
|
- peasycap->audio_endpointnumber);
|
|
|
}
|
|
|
- if (!isokmps) {
|
|
|
- SAY("ERROR: no viable audio_maxpacketsize\n");
|
|
|
- return -ENOENT;
|
|
|
+ if (9 == peasycap->audio_isoc_maxframesize) {
|
|
|
+ peasycap->ilk |= 0x02;
|
|
|
+ SAM("hardware is FOUR-CVBS\n");
|
|
|
+ peasycap->microphone = true;
|
|
|
+ peasycap->audio_pages_per_fragment = 4;
|
|
|
+ } else if (256 == peasycap->audio_isoc_maxframesize) {
|
|
|
+ peasycap->ilk &= ~0x02;
|
|
|
+ SAM("hardware is CVBS+S-VIDEO\n");
|
|
|
+ peasycap->microphone = false;
|
|
|
+ peasycap->audio_pages_per_fragment = 4;
|
|
|
} else {
|
|
|
- peasycap->audio_isoc_maxframesize = okmps[isokmps - 1];
|
|
|
- JOT(4, "%i=audio_isoc_maxframesize\n", \
|
|
|
- peasycap->audio_isoc_maxframesize);
|
|
|
- if (0 >= peasycap->audio_isoc_maxframesize) {
|
|
|
- SAY("ERROR: bad audio_isoc_maxframesize\n");
|
|
|
- return -ENOENT;
|
|
|
- }
|
|
|
- if (9 == peasycap->audio_isoc_maxframesize) {
|
|
|
- peasycap->ilk |= 0x02;
|
|
|
- SAY("hardware is FOUR-CVBS\n");
|
|
|
- peasycap->microphone = true;
|
|
|
- peasycap->audio_pages_per_fragment = 4;
|
|
|
- } else if (256 == peasycap->audio_isoc_maxframesize) {
|
|
|
- peasycap->ilk &= ~0x02;
|
|
|
- SAY("hardware is CVBS+S-VIDEO\n");
|
|
|
- peasycap->microphone = false;
|
|
|
- peasycap->audio_pages_per_fragment = 4;
|
|
|
- } else {
|
|
|
- SAY("hardware is unidentified:\n");
|
|
|
- SAY("%i=audio_isoc_maxframesize\n", \
|
|
|
+ SAM("hardware is unidentified:\n");
|
|
|
+ SAM("%i=audio_isoc_maxframesize\n", \
|
|
|
peasycap->audio_isoc_maxframesize);
|
|
|
- return -ENOENT;
|
|
|
- }
|
|
|
+ return -ENOENT;
|
|
|
+ }
|
|
|
|
|
|
- peasycap->audio_bytes_per_fragment = \
|
|
|
+ peasycap->audio_bytes_per_fragment = \
|
|
|
peasycap->audio_pages_per_fragment * \
|
|
|
PAGE_SIZE ;
|
|
|
- peasycap->audio_buffer_page_many = (AUDIO_FRAGMENT_MANY * \
|
|
|
+ peasycap->audio_buffer_page_many = (AUDIO_FRAGMENT_MANY * \
|
|
|
peasycap->audio_pages_per_fragment);
|
|
|
|
|
|
- JOT(4, "%6i=AUDIO_FRAGMENT_MANY\n", AUDIO_FRAGMENT_MANY);
|
|
|
- JOT(4, "%6i=audio_pages_per_fragment\n", \
|
|
|
+ JOM(4, "%6i=AUDIO_FRAGMENT_MANY\n", AUDIO_FRAGMENT_MANY);
|
|
|
+ JOM(4, "%6i=audio_pages_per_fragment\n", \
|
|
|
peasycap->audio_pages_per_fragment);
|
|
|
- JOT(4, "%6i=audio_bytes_per_fragment\n", \
|
|
|
+ JOM(4, "%6i=audio_bytes_per_fragment\n", \
|
|
|
peasycap->audio_bytes_per_fragment);
|
|
|
- JOT(4, "%6i=audio_buffer_page_many\n", \
|
|
|
+ JOM(4, "%6i=audio_buffer_page_many\n", \
|
|
|
peasycap->audio_buffer_page_many);
|
|
|
|
|
|
- peasycap->audio_isoc_framesperdesc = 128;
|
|
|
+ peasycap->audio_isoc_framesperdesc = 128;
|
|
|
|
|
|
- JOT(4, "%i=audio_isoc_framesperdesc\n", \
|
|
|
+ JOM(4, "%i=audio_isoc_framesperdesc\n", \
|
|
|
peasycap->audio_isoc_framesperdesc);
|
|
|
- if (0 >= peasycap->audio_isoc_framesperdesc) {
|
|
|
- SAY("ERROR: bad audio_isoc_framesperdesc\n");
|
|
|
- return -ENOENT;
|
|
|
- }
|
|
|
+ if (0 >= peasycap->audio_isoc_framesperdesc) {
|
|
|
+ SAM("ERROR: bad audio_isoc_framesperdesc\n");
|
|
|
+ return -ENOENT;
|
|
|
+ }
|
|
|
|
|
|
- peasycap->audio_isoc_buffer_size = \
|
|
|
+ peasycap->audio_isoc_buffer_size = \
|
|
|
peasycap->audio_isoc_maxframesize * \
|
|
|
peasycap->audio_isoc_framesperdesc;
|
|
|
- JOT(4, "%i=audio_isoc_buffer_size\n", \
|
|
|
+ JOM(4, "%i=audio_isoc_buffer_size\n", \
|
|
|
peasycap->audio_isoc_buffer_size);
|
|
|
- if (AUDIO_ISOC_BUFFER_SIZE < \
|
|
|
- peasycap->audio_isoc_buffer_size) {
|
|
|
- SAY("MISTAKE: audio_isoc_buffer_size bigger "
|
|
|
+ if (AUDIO_ISOC_BUFFER_SIZE < peasycap->audio_isoc_buffer_size) {
|
|
|
+ SAM("MISTAKE: audio_isoc_buffer_size bigger "
|
|
|
"than %li=AUDIO_ISOC_BUFFER_SIZE\n", \
|
|
|
AUDIO_ISOC_BUFFER_SIZE);
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
+ return -EFAULT;
|
|
|
}
|
|
|
-
|
|
|
if (-1 == peasycap->audio_interface) {
|
|
|
- SAY("MISTAKE: audio_interface is unset\n");
|
|
|
+ SAM("MISTAKE: audio_interface is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->audio_altsetting_on) {
|
|
|
- SAY("MISTAKE: audio_altsetting_on is unset\n");
|
|
|
+ SAM("MISTAKE: audio_altsetting_on is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->audio_altsetting_off) {
|
|
|
- SAY("MISTAKE: audio_interface_off is unset\n");
|
|
|
+ SAM("MISTAKE: audio_interface_off is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->audio_endpointnumber) {
|
|
|
- SAY("MISTAKE: audio_endpointnumber is unset\n");
|
|
|
+ SAM("MISTAKE: audio_endpointnumber is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->audio_isoc_maxframesize) {
|
|
|
- SAY("MISTAKE: audio_isoc_maxframesize is unset\n");
|
|
|
+ SAM("MISTAKE: audio_isoc_maxframesize is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
if (-1 == peasycap->audio_isoc_buffer_size) {
|
|
|
- SAY("MISTAKE: audio_isoc_buffer_size is unset\n");
|
|
|
+ SAM("MISTAKE: audio_isoc_buffer_size is unset\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
@@ -3837,17 +3863,17 @@ case 2: {
|
|
|
INIT_LIST_HEAD(&(peasycap->urb_audio_head));
|
|
|
peasycap->purb_audio_head = &(peasycap->urb_audio_head);
|
|
|
|
|
|
- JOT(4, "allocating an audio buffer\n");
|
|
|
- JOT(4, ".... scattered over %i pages\n", \
|
|
|
+ JOM(4, "allocating an audio buffer\n");
|
|
|
+ JOM(4, ".... scattered over %i pages\n", \
|
|
|
peasycap->audio_buffer_page_many);
|
|
|
|
|
|
for (k = 0; k < peasycap->audio_buffer_page_many; k++) {
|
|
|
if ((void *)NULL != peasycap->audio_buffer[k].pgo) {
|
|
|
- SAY("ERROR: attempting to reallocate audio buffers\n");
|
|
|
+ SAM("ERROR: attempting to reallocate audio buffers\n");
|
|
|
} else {
|
|
|
pbuf = (void *) __get_free_page(GFP_KERNEL);
|
|
|
if ((void *)NULL == pbuf) {
|
|
|
- SAY("ERROR: Could not allocate audio " \
|
|
|
+ SAM("ERROR: Could not allocate audio " \
|
|
|
"buffer page %i\n", k);
|
|
|
return -ENOMEM;
|
|
|
} else
|
|
@@ -3860,16 +3886,16 @@ case 2: {
|
|
|
|
|
|
peasycap->audio_fill = 0;
|
|
|
peasycap->audio_read = 0;
|
|
|
- JOT(4, "allocation of audio buffer done: %i pages\n", k);
|
|
|
+ JOM(4, "allocation of audio buffer done: %i pages\n", k);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- JOT(4, "allocating %i isoc audio buffers of size %i\n", \
|
|
|
+ JOM(4, "allocating %i isoc audio buffers of size %i\n", \
|
|
|
AUDIO_ISOC_BUFFER_MANY, peasycap->audio_isoc_buffer_size);
|
|
|
- JOT(4, ".... each occupying contiguous memory pages\n");
|
|
|
+ JOM(4, ".... each occupying contiguous memory pages\n");
|
|
|
|
|
|
for (k = 0; k < AUDIO_ISOC_BUFFER_MANY; k++) {
|
|
|
pbuf = (void *)__get_free_pages(GFP_KERNEL, AUDIO_ISOC_ORDER);
|
|
|
if (NULL == pbuf) {
|
|
|
- SAY("ERROR: Could not allocate isoc audio buffer " \
|
|
|
+ SAM("ERROR: Could not allocate isoc audio buffer " \
|
|
|
"%i\n", k);
|
|
|
return -ENOMEM;
|
|
|
} else
|
|
@@ -3881,25 +3907,25 @@ case 2: {
|
|
|
peasycap->audio_isoc_buffer_size;
|
|
|
peasycap->audio_isoc_buffer[k].kount = k;
|
|
|
}
|
|
|
- JOT(4, "allocation of isoc audio buffers done.\n");
|
|
|
+ JOM(4, "allocation of isoc audio buffers done.\n");
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* ALLOCATE AND INITIALIZE MULTIPLE struct urb ...
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- JOT(4, "allocating %i struct urb.\n", AUDIO_ISOC_BUFFER_MANY);
|
|
|
- JOT(4, "using %i=peasycap->audio_isoc_framesperdesc\n", \
|
|
|
+ JOM(4, "allocating %i struct urb.\n", AUDIO_ISOC_BUFFER_MANY);
|
|
|
+ JOM(4, "using %i=peasycap->audio_isoc_framesperdesc\n", \
|
|
|
peasycap->audio_isoc_framesperdesc);
|
|
|
- JOT(4, "using %i=peasycap->audio_isoc_maxframesize\n", \
|
|
|
+ JOM(4, "using %i=peasycap->audio_isoc_maxframesize\n", \
|
|
|
peasycap->audio_isoc_maxframesize);
|
|
|
- JOT(4, "using %i=peasycap->audio_isoc_buffer_size\n", \
|
|
|
+ JOM(4, "using %i=peasycap->audio_isoc_buffer_size\n", \
|
|
|
peasycap->audio_isoc_buffer_size);
|
|
|
|
|
|
for (k = 0; k < AUDIO_ISOC_BUFFER_MANY; k++) {
|
|
|
purb = usb_alloc_urb(peasycap->audio_isoc_framesperdesc, \
|
|
|
GFP_KERNEL);
|
|
|
if (NULL == purb) {
|
|
|
- SAY("ERROR: usb_alloc_urb returned NULL for buffer " \
|
|
|
+ SAM("ERROR: usb_alloc_urb returned NULL for buffer " \
|
|
|
"%i\n", k);
|
|
|
return -ENOMEM;
|
|
|
} else
|
|
@@ -3907,7 +3933,7 @@ case 2: {
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
pdata_urb = kzalloc(sizeof(struct data_urb), GFP_KERNEL);
|
|
|
if (NULL == pdata_urb) {
|
|
|
- SAY("ERROR: Could not allocate struct data_urb.\n");
|
|
|
+ SAM("ERROR: Could not allocate struct data_urb.\n");
|
|
|
return -ENOMEM;
|
|
|
} else
|
|
|
peasycap->allocation_audio_struct += \
|
|
@@ -3924,30 +3950,30 @@ case 2: {
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if (!k) {
|
|
|
- JOT(4, "initializing audio urbs thus:\n");
|
|
|
- JOT(4, " purb->interval = 1;\n");
|
|
|
- JOT(4, " purb->dev = peasycap->pusb_device;\n");
|
|
|
- JOT(4, " purb->pipe = usb_rcvisocpipe(peasycap->" \
|
|
|
+ JOM(4, "initializing audio urbs thus:\n");
|
|
|
+ JOM(4, " purb->interval = 1;\n");
|
|
|
+ JOM(4, " purb->dev = peasycap->pusb_device;\n");
|
|
|
+ JOM(4, " purb->pipe = usb_rcvisocpipe(peasycap->" \
|
|
|
"pusb_device,%i);\n", \
|
|
|
peasycap->audio_endpointnumber);
|
|
|
- JOT(4, " purb->transfer_flags = URB_ISO_ASAP;\n");
|
|
|
- JOT(4, " purb->transfer_buffer = " \
|
|
|
+ JOM(4, " purb->transfer_flags = URB_ISO_ASAP;\n");
|
|
|
+ JOM(4, " purb->transfer_buffer = " \
|
|
|
"peasycap->audio_isoc_buffer[.].pgo;\n");
|
|
|
- JOT(4, " purb->transfer_buffer_length = %i;\n", \
|
|
|
+ JOM(4, " purb->transfer_buffer_length = %i;\n", \
|
|
|
peasycap->audio_isoc_buffer_size);
|
|
|
- JOT(4, " purb->complete = easysnd_complete;\n");
|
|
|
- JOT(4, " purb->context = peasycap;\n");
|
|
|
- JOT(4, " purb->start_frame = 0;\n");
|
|
|
- JOT(4, " purb->number_of_packets = %i;\n", \
|
|
|
+ JOM(4, " purb->complete = easysnd_complete;\n");
|
|
|
+ JOM(4, " purb->context = peasycap;\n");
|
|
|
+ JOM(4, " purb->start_frame = 0;\n");
|
|
|
+ JOM(4, " purb->number_of_packets = %i;\n", \
|
|
|
peasycap->audio_isoc_framesperdesc);
|
|
|
- JOT(4, " for (j = 0; j < %i; j++)\n", \
|
|
|
+ JOM(4, " for (j = 0; j < %i; j++)\n", \
|
|
|
peasycap->audio_isoc_framesperdesc);
|
|
|
- JOT(4, " {\n");
|
|
|
- JOT(4, " purb->iso_frame_desc[j].offset = j*%i;\n",\
|
|
|
+ JOM(4, " {\n");
|
|
|
+ JOM(4, " purb->iso_frame_desc[j].offset = j*%i;\n",\
|
|
|
peasycap->audio_isoc_maxframesize);
|
|
|
- JOT(4, " purb->iso_frame_desc[j].length = %i;\n", \
|
|
|
+ JOM(4, " purb->iso_frame_desc[j].length = %i;\n", \
|
|
|
peasycap->audio_isoc_maxframesize);
|
|
|
- JOT(4, " }\n");
|
|
|
+ JOM(4, " }\n");
|
|
|
}
|
|
|
|
|
|
purb->interval = 1;
|
|
@@ -3969,7 +3995,7 @@ case 2: {
|
|
|
peasycap->audio_isoc_maxframesize;
|
|
|
}
|
|
|
}
|
|
|
- JOT(4, "allocation of %i struct urb done.\n", k);
|
|
|
+ JOM(4, "allocation of %i struct urb done.\n", k);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* SAVE POINTER peasycap IN THIS INTERFACE.
|
|
@@ -3986,14 +4012,18 @@ case 2: {
|
|
|
err("Not able to get a minor for this device.");
|
|
|
usb_set_intfdata(pusb_interface, NULL);
|
|
|
return -ENODEV;
|
|
|
- } else
|
|
|
+ } else {
|
|
|
+ JOM(8, "kref_get() with %i=peasycap->kref.refcount.counter\n",\
|
|
|
+ (int)peasycap->kref.refcount.counter);
|
|
|
+ kref_get(&peasycap->kref);
|
|
|
(peasycap->registered_audio)++;
|
|
|
+ }
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
/*
|
|
|
* LET THE USER KNOW WHAT NODE THE AUDIO DEVICE IS ATTACHED TO.
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- SAY("easysnd attached to minor #%d\n", pusb_interface->minor);
|
|
|
+ SAM("easysnd attached to minor #%d\n", pusb_interface->minor);
|
|
|
break;
|
|
|
}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
@@ -4002,11 +4032,11 @@ case 2: {
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
default: {
|
|
|
- JOT(4, "ERROR: unexpected interface %i\n", bInterfaceNumber);
|
|
|
+ JOM(4, "ERROR: unexpected interface %i\n", bInterfaceNumber);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
}
|
|
|
-JOT(4, "ends successfully for interface %i\n", \
|
|
|
+JOM(4, "ends successfully for interface %i\n", \
|
|
|
pusb_interface_descriptor->bInterfaceNumber);
|
|
|
return 0;
|
|
|
}
|
|
@@ -4050,60 +4080,67 @@ bInterfaceNumber = pusb_interface_descriptor->bInterfaceNumber;
|
|
|
minor = pusb_interface->minor;
|
|
|
JOT(4, "intf[%i]: minor=%i\n", bInterfaceNumber, minor);
|
|
|
|
|
|
+if (1 == bInterfaceNumber)
|
|
|
+ return;
|
|
|
+
|
|
|
peasycap = usb_get_intfdata(pusb_interface);
|
|
|
-if ((struct easycap *)NULL == peasycap)
|
|
|
+if (NULL == peasycap) {
|
|
|
SAY("ERROR: peasycap is NULL\n");
|
|
|
-else {
|
|
|
- peasycap->pusb_device = (struct usb_device *)NULL;
|
|
|
- switch (bInterfaceNumber) {
|
|
|
-/*---------------------------------------------------------------------------*/
|
|
|
- case 0: {
|
|
|
- if ((struct list_head *)NULL != peasycap->purb_video_head) {
|
|
|
- JOT(4, "killing video urbs\n");
|
|
|
- m = 0;
|
|
|
- list_for_each(plist_head, (peasycap->purb_video_head))
|
|
|
- {
|
|
|
- pdata_urb = list_entry(plist_head, \
|
|
|
- struct data_urb, list_head);
|
|
|
- if ((struct data_urb *)NULL != pdata_urb) {
|
|
|
- if ((struct urb *)NULL != \
|
|
|
- pdata_urb->purb) {
|
|
|
- usb_kill_urb(pdata_urb->purb);
|
|
|
- m++;
|
|
|
- }
|
|
|
+ return;
|
|
|
+}
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+/*
|
|
|
+ * IF THE WAIT QUEUES ARE NOT CLEARED A DEADLOCK IS POSSIBLE. BEWARE.
|
|
|
+*/
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+peasycap->video_eof = 1;
|
|
|
+peasycap->audio_eof = 1;
|
|
|
+wake_up_interruptible(&peasycap->wq_video);
|
|
|
+wake_up_interruptible(&peasycap->wq_audio);
|
|
|
+/*---------------------------------------------------------------------------*/
|
|
|
+switch (bInterfaceNumber) {
|
|
|
+case 0: {
|
|
|
+ if ((struct list_head *)NULL != peasycap->purb_video_head) {
|
|
|
+ JOM(4, "killing video urbs\n");
|
|
|
+ m = 0;
|
|
|
+ list_for_each(plist_head, (peasycap->purb_video_head)) {
|
|
|
+ pdata_urb = list_entry(plist_head, \
|
|
|
+ struct data_urb, list_head);
|
|
|
+ if ((struct data_urb *)NULL != pdata_urb) {
|
|
|
+ if ((struct urb *)NULL != \
|
|
|
+ pdata_urb->purb) {
|
|
|
+ usb_kill_urb(pdata_urb->purb);
|
|
|
+ m++;
|
|
|
}
|
|
|
}
|
|
|
- JOT(4, "%i video urbs killed\n", m);
|
|
|
- } else
|
|
|
- SAY("ERROR: peasycap->purb_video_head is NULL\n");
|
|
|
- break;
|
|
|
+ }
|
|
|
+ JOM(4, "%i video urbs killed\n", m);
|
|
|
}
|
|
|
+ break;
|
|
|
+}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- case 2: {
|
|
|
- if ((struct list_head *)NULL != peasycap->purb_audio_head) {
|
|
|
- JOT(4, "killing audio urbs\n");
|
|
|
- m = 0;
|
|
|
- list_for_each(plist_head, \
|
|
|
- (peasycap->purb_audio_head)) {
|
|
|
- pdata_urb = list_entry(plist_head, \
|
|
|
- struct data_urb, list_head);
|
|
|
- if ((struct data_urb *)NULL != pdata_urb) {
|
|
|
- if ((struct urb *)NULL != \
|
|
|
- pdata_urb->purb) {
|
|
|
- usb_kill_urb(pdata_urb->purb);
|
|
|
- m++;
|
|
|
- }
|
|
|
+case 2: {
|
|
|
+ if ((struct list_head *)NULL != peasycap->purb_audio_head) {
|
|
|
+ JOM(4, "killing audio urbs\n");
|
|
|
+ m = 0;
|
|
|
+ list_for_each(plist_head, (peasycap->purb_audio_head)) {
|
|
|
+ pdata_urb = list_entry(plist_head, \
|
|
|
+ struct data_urb, list_head);
|
|
|
+ if ((struct data_urb *)NULL != pdata_urb) {
|
|
|
+ if ((struct urb *)NULL != \
|
|
|
+ pdata_urb->purb) {
|
|
|
+ usb_kill_urb(pdata_urb->purb);
|
|
|
+ m++;
|
|
|
}
|
|
|
}
|
|
|
- JOT(4, "%i audio urbs killed\n", m);
|
|
|
- } else
|
|
|
- SAY("ERROR: peasycap->purb_audio_head is NULL\n");
|
|
|
- break;
|
|
|
+ }
|
|
|
+ JOM(4, "%i audio urbs killed\n", m);
|
|
|
}
|
|
|
+ break;
|
|
|
+}
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
+default:
|
|
|
+ break;
|
|
|
}
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
/*
|
|
@@ -4112,29 +4149,30 @@ else {
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
switch (bInterfaceNumber) {
|
|
|
case 0: {
|
|
|
+
|
|
|
#if (!defined(EASYCAP_IS_VIDEODEV_CLIENT))
|
|
|
if ((struct easycap *)NULL == peasycap) {
|
|
|
- SAY("ERROR: peasycap has become NULL\n");
|
|
|
+ SAM("ERROR: peasycap has become NULL\n");
|
|
|
} else {
|
|
|
lock_kernel();
|
|
|
usb_deregister_dev(pusb_interface, &easycap_class);
|
|
|
(peasycap->registered_video)--;
|
|
|
|
|
|
- JOT(4, "intf[%i]: usb_deregister_dev()\n", bInterfaceNumber);
|
|
|
+ JOM(4, "intf[%i]: usb_deregister_dev()\n", bInterfaceNumber);
|
|
|
unlock_kernel();
|
|
|
- SAY("easycap detached from minor #%d\n", minor);
|
|
|
+ SAM("easycap detached from minor #%d\n", minor);
|
|
|
}
|
|
|
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
|
|
|
#else
|
|
|
if ((struct easycap *)NULL == peasycap)
|
|
|
- SAY("ERROR: peasycap has become NULL\n");
|
|
|
+ SAM("ERROR: peasycap has become NULL\n");
|
|
|
else {
|
|
|
lock_kernel();
|
|
|
- video_unregister_device(peasycap->pvideo_device);
|
|
|
+ video_unregister_device(&peasycap->video_device);
|
|
|
(peasycap->registered_video)--;
|
|
|
unlock_kernel();
|
|
|
- JOT(4, "unregistered with videodev: %i=minor\n", \
|
|
|
- pvideo_device->minor);
|
|
|
+ JOM(4, "unregistered with videodev: %i=minor\n", \
|
|
|
+ peasycap->video_device.minor);
|
|
|
}
|
|
|
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
|
|
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
|
|
@@ -4147,10 +4185,10 @@ case 2: {
|
|
|
if ((struct easycap *)NULL != peasycap)
|
|
|
(peasycap->registered_audio)--;
|
|
|
|
|
|
- JOT(4, "intf[%i]: usb_deregister_dev()\n", bInterfaceNumber);
|
|
|
+ JOM(4, "intf[%i]: usb_deregister_dev()\n", bInterfaceNumber);
|
|
|
unlock_kernel();
|
|
|
|
|
|
- SAY("easysnd detached from minor #%d\n", minor);
|
|
|
+ SAM("easysnd detached from minor #%d\n", minor);
|
|
|
break;
|
|
|
}
|
|
|
default:
|
|
@@ -4162,24 +4200,24 @@ default:
|
|
|
*/
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
if ((struct easycap *)NULL == peasycap) {
|
|
|
- SAY("ERROR: peasycap has become NULL\n");
|
|
|
- SAY("cannot call kref_put()\n");
|
|
|
- SAY("ending unsuccessfully: may cause memory leak\n");
|
|
|
+ SAM("ERROR: peasycap has become NULL\n");
|
|
|
+ SAM("cannot call kref_put()\n");
|
|
|
+ SAM("ending unsuccessfully: may cause memory leak\n");
|
|
|
return;
|
|
|
}
|
|
|
if (!peasycap->kref.refcount.counter) {
|
|
|
- SAY("ERROR: peasycap->kref.refcount.counter is zero " \
|
|
|
+ SAM("ERROR: peasycap->kref.refcount.counter is zero " \
|
|
|
"so cannot call kref_put()\n");
|
|
|
- SAY("ending unsuccessfully: may cause memory leak\n");
|
|
|
+ SAM("ending unsuccessfully: may cause memory leak\n");
|
|
|
return;
|
|
|
}
|
|
|
-JOT(4, "intf[%i]: kref_put() with %i=peasycap->kref.refcount.counter\n", \
|
|
|
+JOM(4, "intf[%i]: kref_put() with %i=peasycap->kref.refcount.counter\n", \
|
|
|
bInterfaceNumber, (int)peasycap->kref.refcount.counter);
|
|
|
kref_put(&peasycap->kref, easycap_delete);
|
|
|
-JOT(4, "intf[%i]: kref_put() done.\n", bInterfaceNumber);
|
|
|
+JOM(4, "intf[%i]: kref_put() done.\n", bInterfaceNumber);
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
-JOT(4, "ends\n");
|
|
|
+JOM(4, "ends\n");
|
|
|
return;
|
|
|
}
|
|
|
/*****************************************************************************/
|