mirror of https://gitee.com/openkylin/linux.git
V4L/DVB (5063): ZC0301 driver updates.
- Implement audio ioctl's and VIDIOC_ENUM_FRAMESIZES - Documentation updates - Generic improvements Signed-off-by: Luca Risolia <luca.risolia@studio.unibo.it> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
f327ebbd00
commit
7e3a066070
|
@ -23,7 +23,7 @@ Index
|
||||||
|
|
||||||
1. Copyright
|
1. Copyright
|
||||||
============
|
============
|
||||||
Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it>
|
Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||||
|
|
||||||
|
|
||||||
2. Disclaimer
|
2. Disclaimer
|
||||||
|
@ -125,8 +125,9 @@ And finally:
|
||||||
6. Module loading
|
6. Module loading
|
||||||
=================
|
=================
|
||||||
To use the driver, it is necessary to load the "zc0301" module into memory
|
To use the driver, it is necessary to load the "zc0301" module into memory
|
||||||
after every other module required: "videodev", "usbcore" and, depending on
|
after every other module required: "videodev", "v4l2_common", "compat_ioctl32",
|
||||||
the USB host controller you have, "ehci-hcd", "uhci-hcd" or "ohci-hcd".
|
"usbcore" and, depending on the USB host controller you have, "ehci-hcd",
|
||||||
|
"uhci-hcd" or "ohci-hcd".
|
||||||
|
|
||||||
Loading can be done as shown below:
|
Loading can be done as shown below:
|
||||||
|
|
||||||
|
@ -211,12 +212,11 @@ Vendor ID Product ID
|
||||||
0x041e 0x4036
|
0x041e 0x4036
|
||||||
0x041e 0x403a
|
0x041e 0x403a
|
||||||
0x0458 0x7007
|
0x0458 0x7007
|
||||||
0x0458 0x700C
|
0x0458 0x700c
|
||||||
0x0458 0x700f
|
0x0458 0x700f
|
||||||
0x046d 0x08ae
|
0x046d 0x08ae
|
||||||
0x055f 0xd003
|
0x055f 0xd003
|
||||||
0x055f 0xd004
|
0x055f 0xd004
|
||||||
0x046d 0x08ae
|
|
||||||
0x0ac8 0x0301
|
0x0ac8 0x0301
|
||||||
0x0ac8 0x301b
|
0x0ac8 0x301b
|
||||||
0x0ac8 0x303b
|
0x0ac8 0x303b
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* V4L2 driver for ZC0301 Image Processor and Control Chip *
|
* V4L2 driver for ZC0301[P] Image Processor and Control Chip *
|
||||||
* *
|
* *
|
||||||
* Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
* Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
* it under the terms of the GNU General Public License as published by *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Video4Linux2 driver for ZC0301[P] Image Processor and Control Chip *
|
* Video4Linux2 driver for ZC0301[P] Image Processor and Control Chip *
|
||||||
* *
|
* *
|
||||||
* Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
* Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
||||||
* *
|
* *
|
||||||
* Informations about the chip internals needed to enable the I2C protocol *
|
* Informations about the chip internals needed to enable the I2C protocol *
|
||||||
* have been taken from the documentation of the ZC030x Video4Linux1 *
|
* have been taken from the documentation of the ZC030x Video4Linux1 *
|
||||||
|
@ -52,8 +52,8 @@
|
||||||
#define ZC0301_MODULE_AUTHOR "(C) 2006 Luca Risolia"
|
#define ZC0301_MODULE_AUTHOR "(C) 2006 Luca Risolia"
|
||||||
#define ZC0301_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>"
|
#define ZC0301_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>"
|
||||||
#define ZC0301_MODULE_LICENSE "GPL"
|
#define ZC0301_MODULE_LICENSE "GPL"
|
||||||
#define ZC0301_MODULE_VERSION "1:1.05"
|
#define ZC0301_MODULE_VERSION "1:1.07"
|
||||||
#define ZC0301_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 5)
|
#define ZC0301_MODULE_VERSION_CODE KERNEL_VERSION(1, 1, 7)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ MODULE_PARM_DESC(force_munmap,
|
||||||
"\ndetected camera."
|
"\ndetected camera."
|
||||||
"\n 0 = do not force memory unmapping"
|
"\n 0 = do not force memory unmapping"
|
||||||
"\n 1 = force memory unmapping (save memory)"
|
"\n 1 = force memory unmapping (save memory)"
|
||||||
"\nDefault value is "__MODULE_STRING(SN9C102_FORCE_MUNMAP)"."
|
"\nDefault value is "__MODULE_STRING(ZC0301_FORCE_MUNMAP)"."
|
||||||
"\n");
|
"\n");
|
||||||
|
|
||||||
static unsigned int frame_timeout[] = {[0 ... ZC0301_MAX_DEVICES-1] =
|
static unsigned int frame_timeout[] = {[0 ... ZC0301_MAX_DEVICES-1] =
|
||||||
|
@ -136,7 +136,8 @@ zc0301_request_buffers(struct zc0301_device* cam, u32 count,
|
||||||
|
|
||||||
cam->nbuffers = count;
|
cam->nbuffers = count;
|
||||||
while (cam->nbuffers > 0) {
|
while (cam->nbuffers > 0) {
|
||||||
if ((buff = vmalloc_32(cam->nbuffers * PAGE_ALIGN(imagesize))))
|
if ((buff = vmalloc_32_user(cam->nbuffers *
|
||||||
|
PAGE_ALIGN(imagesize))))
|
||||||
break;
|
break;
|
||||||
cam->nbuffers--;
|
cam->nbuffers--;
|
||||||
}
|
}
|
||||||
|
@ -430,7 +431,8 @@ static int zc0301_start_transfer(struct zc0301_device* cam)
|
||||||
struct usb_host_interface* altsetting = usb_altnum_to_altsetting(
|
struct usb_host_interface* altsetting = usb_altnum_to_altsetting(
|
||||||
usb_ifnum_to_if(udev, 0),
|
usb_ifnum_to_if(udev, 0),
|
||||||
ZC0301_ALTERNATE_SETTING);
|
ZC0301_ALTERNATE_SETTING);
|
||||||
const unsigned int psz = altsetting->endpoint[0].desc.wMaxPacketSize;
|
const unsigned int psz = le16_to_cpu(altsetting->
|
||||||
|
endpoint[0].desc.wMaxPacketSize);
|
||||||
struct urb* urb;
|
struct urb* urb;
|
||||||
s8 i, j;
|
s8 i, j;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
@ -489,7 +491,7 @@ static int zc0301_start_transfer(struct zc0301_device* cam)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
free_urbs:
|
free_urbs:
|
||||||
for (i = 0; i < ZC0301_URBS; i++)
|
for (i = 0; (i < ZC0301_URBS) && cam->urb[i]; i++)
|
||||||
usb_free_urb(cam->urb[i]);
|
usb_free_urb(cam->urb[i]);
|
||||||
|
|
||||||
free_buffers:
|
free_buffers:
|
||||||
|
@ -1287,6 +1289,35 @@ zc0301_vidioc_s_crop(struct zc0301_device* cam, void __user * arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
zc0301_vidioc_enum_framesizes(struct zc0301_device* cam, void __user * arg)
|
||||||
|
{
|
||||||
|
struct v4l2_frmsizeenum frmsize;
|
||||||
|
|
||||||
|
if (copy_from_user(&frmsize, arg, sizeof(frmsize)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
if (frmsize.index != 0 && frmsize.index != 1)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (frmsize.pixel_format != V4L2_PIX_FMT_JPEG)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
frmsize.type = V4L2_FRMSIZE_TYPE_DISCRETE;
|
||||||
|
|
||||||
|
if (frmsize.index == 1) {
|
||||||
|
frmsize.discrete.width = cam->sensor.cropcap.defrect.width;
|
||||||
|
frmsize.discrete.height = cam->sensor.cropcap.defrect.height;
|
||||||
|
}
|
||||||
|
memset(&frmsize.reserved, 0, sizeof(frmsize.reserved));
|
||||||
|
|
||||||
|
if (copy_to_user(arg, &frmsize, sizeof(frmsize)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
zc0301_vidioc_enum_fmt(struct zc0301_device* cam, void __user * arg)
|
zc0301_vidioc_enum_fmt(struct zc0301_device* cam, void __user * arg)
|
||||||
{
|
{
|
||||||
|
@ -1295,6 +1326,9 @@ zc0301_vidioc_enum_fmt(struct zc0301_device* cam, void __user * arg)
|
||||||
if (copy_from_user(&fmtd, arg, sizeof(fmtd)))
|
if (copy_from_user(&fmtd, arg, sizeof(fmtd)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
if (fmtd.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (fmtd.index == 0) {
|
if (fmtd.index == 0) {
|
||||||
strcpy(fmtd.description, "JPEG");
|
strcpy(fmtd.description, "JPEG");
|
||||||
fmtd.pixelformat = V4L2_PIX_FMT_JPEG;
|
fmtd.pixelformat = V4L2_PIX_FMT_JPEG;
|
||||||
|
@ -1795,6 +1829,9 @@ static int zc0301_ioctl_v4l2(struct inode* inode, struct file* filp,
|
||||||
case VIDIOC_S_FMT:
|
case VIDIOC_S_FMT:
|
||||||
return zc0301_vidioc_try_s_fmt(cam, cmd, arg);
|
return zc0301_vidioc_try_s_fmt(cam, cmd, arg);
|
||||||
|
|
||||||
|
case VIDIOC_ENUM_FRAMESIZES:
|
||||||
|
return zc0301_vidioc_enum_framesizes(cam, arg);
|
||||||
|
|
||||||
case VIDIOC_G_JPEGCOMP:
|
case VIDIOC_G_JPEGCOMP:
|
||||||
return zc0301_vidioc_g_jpegcomp(cam, arg);
|
return zc0301_vidioc_g_jpegcomp(cam, arg);
|
||||||
|
|
||||||
|
@ -1830,6 +1867,7 @@ static int zc0301_ioctl_v4l2(struct inode* inode, struct file* filp,
|
||||||
case VIDIOC_QUERYSTD:
|
case VIDIOC_QUERYSTD:
|
||||||
case VIDIOC_ENUMSTD:
|
case VIDIOC_ENUMSTD:
|
||||||
case VIDIOC_QUERYMENU:
|
case VIDIOC_QUERYMENU:
|
||||||
|
case VIDIOC_ENUM_FRAMEINTERVALS:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1876,6 +1914,7 @@ static const struct file_operations zc0301_fops = {
|
||||||
.open = zc0301_open,
|
.open = zc0301_open,
|
||||||
.release = zc0301_release,
|
.release = zc0301_release,
|
||||||
.ioctl = zc0301_ioctl,
|
.ioctl = zc0301_ioctl,
|
||||||
|
.compat_ioctl = v4l_compat_ioctl32,
|
||||||
.read = zc0301_read,
|
.read = zc0301_read,
|
||||||
.poll = zc0301_poll,
|
.poll = zc0301_poll,
|
||||||
.mmap = zc0301_mmap,
|
.mmap = zc0301_mmap,
|
||||||
|
@ -1913,7 +1952,7 @@ zc0301_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
||||||
mutex_init(&cam->dev_mutex);
|
mutex_init(&cam->dev_mutex);
|
||||||
|
|
||||||
DBG(2, "ZC0301[P] Image Processor and Control Chip detected "
|
DBG(2, "ZC0301[P] Image Processor and Control Chip detected "
|
||||||
"(vid/pid 0x%04X/0x%04X)",id->idVendor, id->idProduct);
|
"(vid/pid 0x%04X:0x%04X)",id->idVendor, id->idProduct);
|
||||||
|
|
||||||
for (i = 0; zc0301_sensor_table[i]; i++) {
|
for (i = 0; zc0301_sensor_table[i]; i++) {
|
||||||
err = zc0301_sensor_table[i](cam);
|
err = zc0301_sensor_table[i](cam);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Plug-in for PAS202BCB image sensor connected to the ZC0301[P] Image *
|
* Plug-in for PAS202BCB image sensor connected to the ZC0301 Image *
|
||||||
* Processor and Control Chip *
|
* Processor and Control Chip *
|
||||||
* *
|
* *
|
||||||
* Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
* Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
||||||
* *
|
* *
|
||||||
* Initialization values of the ZC0301[P] have been taken from the SPCA5XX *
|
* Initialization values of the ZC0301[P] have been taken from the SPCA5XX *
|
||||||
* driver maintained by Michel Xhaard <mxhaard@magic.fr> *
|
* driver maintained by Michel Xhaard <mxhaard@magic.fr> *
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Plug-in for PB-0330 image sensor connected to the ZC0301[P] Image *
|
* Plug-in for PB-0330 image sensor connected to the ZC0301P Image *
|
||||||
* Processor and Control Chip *
|
* Processor and Control Chip *
|
||||||
* *
|
* *
|
||||||
* Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
* Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
||||||
* *
|
* *
|
||||||
* Initialization values of the ZC0301[P] have been taken from the SPCA5XX *
|
* Initialization values of the ZC0301[P] have been taken from the SPCA5XX *
|
||||||
* driver maintained by Michel Xhaard <mxhaard@magic.fr> *
|
* driver maintained by Michel Xhaard <mxhaard@magic.fr> *
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* API for image sensors connected to the ZC0301 Image Processor and *
|
* API for image sensors connected to the ZC0301[P] Image Processor and *
|
||||||
* Control Chip *
|
* Control Chip *
|
||||||
* *
|
* *
|
||||||
* Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
* Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
* it under the terms of the GNU General Public License as published by *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
@ -70,7 +70,7 @@ static const struct usb_device_id zc0301_id_table[] = { \
|
||||||
{ ZC0301_USB_DEVICE(0x041e, 0x4036, 0xff), }, /* HV7131 */ \
|
{ ZC0301_USB_DEVICE(0x041e, 0x4036, 0xff), }, /* HV7131 */ \
|
||||||
{ ZC0301_USB_DEVICE(0x041e, 0x403a, 0xff), }, /* HV7131 */ \
|
{ ZC0301_USB_DEVICE(0x041e, 0x403a, 0xff), }, /* HV7131 */ \
|
||||||
{ ZC0301_USB_DEVICE(0x0458, 0x7007, 0xff), }, /* TAS5130 */ \
|
{ ZC0301_USB_DEVICE(0x0458, 0x7007, 0xff), }, /* TAS5130 */ \
|
||||||
{ ZC0301_USB_DEVICE(0x0458, 0x700C, 0xff), }, /* TAS5130 */ \
|
{ ZC0301_USB_DEVICE(0x0458, 0x700c, 0xff), }, /* TAS5130 */ \
|
||||||
{ ZC0301_USB_DEVICE(0x0458, 0x700f, 0xff), }, /* TAS5130 */ \
|
{ ZC0301_USB_DEVICE(0x0458, 0x700f, 0xff), }, /* TAS5130 */ \
|
||||||
{ ZC0301_USB_DEVICE(0x046d, 0x08ae, 0xff), }, /* PAS202 */ \
|
{ ZC0301_USB_DEVICE(0x046d, 0x08ae, 0xff), }, /* PAS202 */ \
|
||||||
{ ZC0301_USB_DEVICE(0x055f, 0xd003, 0xff), }, /* TAS5130 */ \
|
{ ZC0301_USB_DEVICE(0x055f, 0xd003, 0xff), }, /* TAS5130 */ \
|
||||||
|
@ -93,9 +93,9 @@ extern int zc0301_i2c_read(struct zc0301_device*, u16 address, u8 length);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define ZC0301_MAX_CTRLS V4L2_CID_LASTP1-V4L2_CID_BASE+10
|
#define ZC0301_MAX_CTRLS (V4L2_CID_LASTP1 - V4L2_CID_BASE + 10)
|
||||||
#define ZC0301_V4L2_CID_DAC_MAGNITUDE V4L2_CID_PRIVATE_BASE
|
#define ZC0301_V4L2_CID_DAC_MAGNITUDE (V4L2_CID_PRIVATE_BASE + 0)
|
||||||
#define ZC0301_V4L2_CID_GREEN_BALANCE V4L2_CID_PRIVATE_BASE + 1
|
#define ZC0301_V4L2_CID_GREEN_BALANCE (V4L2_CID_PRIVATE_BASE + 1)
|
||||||
|
|
||||||
struct zc0301_sensor {
|
struct zc0301_sensor {
|
||||||
char name[32];
|
char name[32];
|
||||||
|
|
Loading…
Reference in New Issue