summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linux/drivers/media/dvb/dvb-core/dvb_frontend.c2
-rw-r--r--linux/drivers/media/dvb/ttpci/budget-av.c5
-rw-r--r--linux/drivers/media/dvb/ttpci/budget.c1
-rw-r--r--linux/drivers/media/video/cafe_ccic.c2
-rw-r--r--linux/drivers/media/video/v4l2-common.c12
-rw-r--r--v4l2-apps/lib/v4l2_driver.c193
-rw-r--r--v4l2-apps/lib/v4l2_driver.h26
-rw-r--r--v4l2-apps/test/driver-test.c3
8 files changed, 228 insertions, 16 deletions
diff --git a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
index 3bc3a37e6..52008bc96 100644
--- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -348,7 +348,7 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra
static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
{
- fe_status_t s;
+ fe_status_t s = 0;
struct dvb_frontend_private *fepriv = fe->frontend_priv;
/* if we've got no parameters, just keep idling */
diff --git a/linux/drivers/media/dvb/ttpci/budget-av.c b/linux/drivers/media/dvb/ttpci/budget-av.c
index 2235ff8b8..c7312420c 100644
--- a/linux/drivers/media/dvb/ttpci/budget-av.c
+++ b/linux/drivers/media/dvb/ttpci/budget-av.c
@@ -914,6 +914,7 @@ static u8 read_pwm(struct budget_av *budget_av)
#define SUBID_DVBS_TV_STAR_CI 0x0016
#define SUBID_DVBS_EASYWATCH_1 0x001a
#define SUBID_DVBS_EASYWATCH 0x001e
+#define SUBID_DVBC_EASYWATCH 0x002a
#define SUBID_DVBC_KNC1 0x0020
#define SUBID_DVBC_KNC1_PLUS 0x0021
#define SUBID_DVBC_CINERGY1200 0x1156
@@ -952,6 +953,7 @@ static void frontend_init(struct budget_av *budget_av)
case SUBID_DVBS_KNC1_PLUS:
case SUBID_DVBC_KNC1_PLUS:
case SUBID_DVBT_KNC1_PLUS:
+ case SUBID_DVBC_EASYWATCH:
saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTHI);
break;
}
@@ -1006,6 +1008,7 @@ static void frontend_init(struct budget_av *budget_av)
case SUBID_DVBC_KNC1:
case SUBID_DVBC_KNC1_PLUS:
case SUBID_DVBC_CINERGY1200:
+ case SUBID_DVBC_EASYWATCH:
budget_av->reinitialise_demod = 1;
fe = dvb_attach(tda10021_attach, &philips_cu1216_config,
&budget_av->budget.i2c_adap,
@@ -1242,6 +1245,7 @@ MAKE_BUDGET_INFO(knc1t, "KNC1 DVB-T", BUDGET_KNC1T);
MAKE_BUDGET_INFO(kncxs, "KNC TV STAR DVB-S", BUDGET_TVSTAR);
MAKE_BUDGET_INFO(satewpls, "Satelco EasyWatch DVB-S light", BUDGET_TVSTAR);
MAKE_BUDGET_INFO(satewpls1, "Satelco EasyWatch DVB-S light", BUDGET_KNC1S);
+MAKE_BUDGET_INFO(satewplc, "Satelco EasyWatch DVB-C", BUDGET_KNC1CP);
MAKE_BUDGET_INFO(knc1sp, "KNC1 DVB-S Plus", BUDGET_KNC1SP);
MAKE_BUDGET_INFO(knc1cp, "KNC1 DVB-C Plus", BUDGET_KNC1CP);
MAKE_BUDGET_INFO(knc1tp, "KNC1 DVB-T Plus", BUDGET_KNC1TP);
@@ -1260,6 +1264,7 @@ static struct pci_device_id pci_tbl[] = {
MAKE_EXTENSION_PCI(kncxs, 0x1894, 0x0016),
MAKE_EXTENSION_PCI(satewpls, 0x1894, 0x001e),
MAKE_EXTENSION_PCI(satewpls1, 0x1894, 0x001a),
+ MAKE_EXTENSION_PCI(satewplc, 0x1894, 0x002a),
MAKE_EXTENSION_PCI(knc1c, 0x1894, 0x0020),
MAKE_EXTENSION_PCI(knc1cp, 0x1894, 0x0021),
MAKE_EXTENSION_PCI(knc1t, 0x1894, 0x0030),
diff --git a/linux/drivers/media/dvb/ttpci/budget.c b/linux/drivers/media/dvb/ttpci/budget.c
index e58f0391e..e28617bd5 100644
--- a/linux/drivers/media/dvb/ttpci/budget.c
+++ b/linux/drivers/media/dvb/ttpci/budget.c
@@ -382,6 +382,7 @@ static void frontend_init(struct budget *budget)
if (budget->dvb_frontend) {
budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
budget->dvb_frontend->tuner_priv = &budget->i2c_adap;
+ budget->dvb_frontend->ops.set_tone = budget_set_tone;
break;
}
break;
diff --git a/linux/drivers/media/video/cafe_ccic.c b/linux/drivers/media/video/cafe_ccic.c
index 3a8bbe4d2..1f53533b5 100644
--- a/linux/drivers/media/video/cafe_ccic.c
+++ b/linux/drivers/media/video/cafe_ccic.c
@@ -1695,7 +1695,7 @@ static struct v4l2_tvnorm cafe_tvnorm[] = {
};
-void cafe_v4l_dev_release(struct video_device *vd)
+static void cafe_v4l_dev_release(struct video_device *vd)
{
struct cafe_camera *cam = container_of(vd, struct cafe_camera, v4ldev);
diff --git a/linux/drivers/media/video/v4l2-common.c b/linux/drivers/media/video/v4l2-common.c
index e6c821745..cab95efa6 100644
--- a/linux/drivers/media/video/v4l2-common.c
+++ b/linux/drivers/media/video/v4l2-common.c
@@ -202,11 +202,13 @@ char *v4l2_field_names[] = {
};
char *v4l2_type_names[] = {
- [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "video-cap",
- [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "video-over",
- [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "video-out",
- [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
- [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
+ [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "video-cap",
+ [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "video-over",
+ [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "video-out",
+ [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
+ [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
+ [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
+ [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "slicec-vbi-out",
};
static char *v4l2_memory_names[] = {
diff --git a/v4l2-apps/lib/v4l2_driver.c b/v4l2-apps/lib/v4l2_driver.c
index 1b0a61109..e656a550d 100644
--- a/v4l2-apps/lib/v4l2_driver.c
+++ b/v4l2-apps/lib/v4l2_driver.c
@@ -10,9 +10,9 @@
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
*/
+#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <malloc.h>
@@ -20,6 +20,7 @@
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
+#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -51,6 +52,74 @@ static void free_list(struct drv_list **list_ptr)
}
/****************************************************************************
+ Auxiliary Arrays to aid debug messages
+ ****************************************************************************/
+char *v4l2_field_names[] = {
+ [V4L2_FIELD_ANY] = "any",
+ [V4L2_FIELD_NONE] = "none",
+ [V4L2_FIELD_TOP] = "top",
+ [V4L2_FIELD_BOTTOM] = "bottom",
+ [V4L2_FIELD_INTERLACED] = "interlaced",
+ [V4L2_FIELD_SEQ_TB] = "seq-tb",
+ [V4L2_FIELD_SEQ_BT] = "seq-bt",
+ [V4L2_FIELD_ALTERNATE] = "alternate",
+};
+
+char *v4l2_type_names[] = {
+ [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "video-cap",
+ [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "video-over",
+ [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "video-out",
+ [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
+ [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
+ [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
+ [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "slicec-vbi-out",
+};
+
+static char *v4l2_memory_names[] = {
+ [V4L2_MEMORY_MMAP] = "mmap",
+ [V4L2_MEMORY_USERPTR] = "userptr",
+ [V4L2_MEMORY_OVERLAY] = "overlay",
+};
+
+#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(*arr))
+#define prt_names(a,arr) (((a)<ARRAY_SIZE(arr))?arr[a]:"unknown")
+
+char *prt_caps(uint32_t caps)
+{
+ static char s[4096]="";
+
+ if (V4L2_CAP_VIDEO_CAPTURE & caps)
+ strcat (s,"CAPTURE ");
+ if (V4L2_CAP_VIDEO_OUTPUT & caps)
+ strcat (s,"OUTPUT ");
+ if (V4L2_CAP_VIDEO_OVERLAY & caps)
+ strcat (s,"OVERLAY ");
+ if (V4L2_CAP_VBI_CAPTURE & caps)
+ strcat (s,"VBI_CAPTURE ");
+ if (V4L2_CAP_VBI_OUTPUT & caps)
+ strcat (s,"VBI_OUTPUT ");
+ if (V4L2_CAP_SLICED_VBI_CAPTURE & caps)
+ strcat (s,"SLICED_VBI_CAPTURE ");
+ if (V4L2_CAP_SLICED_VBI_OUTPUT & caps)
+ strcat (s,"SLICED_VBI_OUTPUT ");
+ if (V4L2_CAP_RDS_CAPTURE & caps)
+ strcat (s,"RDS_CAPTURE ");
+ if (V4L2_CAP_TUNER & caps)
+ strcat (s,"TUNER ");
+ if (V4L2_CAP_AUDIO & caps)
+ strcat (s,"AUDIO ");
+ if (V4L2_CAP_RADIO & caps)
+ strcat (s,"RADIO ");
+ if (V4L2_CAP_READWRITE & caps)
+ strcat (s,"READWRITE ");
+ if (V4L2_CAP_ASYNCIO & caps)
+ strcat (s,"ASYNCIO ");
+ if (V4L2_CAP_STREAMING & caps)
+ strcat (s,"STREAMING ");
+
+ return s;
+}
+/****************************************************************************
Open/Close V4L2 devices
****************************************************************************/
int v4l2_open (char *device, int debug, struct v4l2_driver *drv)
@@ -69,12 +138,14 @@ int v4l2_open (char *device, int debug, struct v4l2_driver *drv)
ret=ioctl(drv->fd,VIDIOC_QUERYCAP,(void *) &drv->cap);
if (ret>=0 && drv->debug) {
printf ("driver=%s, card=%s, bus=%s, version=%d.%d.%d, "
- "capabilities=0x%08x\n",
+ "capabilities=%s\n",
drv->cap.driver,drv->cap.card,drv->cap.bus_info,
(drv->cap.version >> 16) & 0xff,
(drv->cap.version >> 8) & 0xff,
drv->cap.version & 0xff,
- drv->cap.capabilities);
+ prt_caps(drv->cap.capabilities));
+
+
}
return ret;
}
@@ -101,9 +172,12 @@ int v4l2_enum_stds (struct v4l2_driver *drv)
free_list(&drv->stds);
list=drv->stds=calloc(1,sizeof(drv->stds));
+ assert (list!=NULL);
for (i=0; ok==0; i++) {
p=calloc(1,sizeof(*p));
+ assert (p);
+
p->index=i;
ok=ioctl(drv->fd,VIDIOC_ENUMSTD,p);
if (ok<0) {
@@ -121,6 +195,7 @@ int v4l2_enum_stds (struct v4l2_driver *drv)
if (list->curr) {
list->next=calloc(1,sizeof(*list->next));
list=list->next;
+ assert (list!=NULL);
}
list->curr=p;
}
@@ -140,9 +215,11 @@ int v4l2_enum_input (struct v4l2_driver *drv)
free_list(&drv->inputs);
list=drv->inputs=calloc(1,sizeof(drv->inputs));
+ assert (list!=NULL);
for (i=0; ok==0; i++) {
p=calloc(1,sizeof(*p));
+ assert (p);
p->index=i;
ok=ioctl(drv->fd,VIDIOC_ENUMINPUT,p);
if (ok<0) {
@@ -159,6 +236,7 @@ int v4l2_enum_input (struct v4l2_driver *drv)
if (list->curr) {
list->next=calloc(1,sizeof(*list->next));
list=list->next;
+ assert (list!=NULL);
}
list->curr=p;
}
@@ -178,9 +256,12 @@ int v4l2_enum_fmt (struct v4l2_driver *drv, enum v4l2_buf_type type)
free_list(&drv->fmt_caps);
list=drv->fmt_caps=calloc(1,sizeof(drv->fmt_caps));
+ assert (list!=NULL);
for (i=0; ok==0; i++) {
p=calloc(1,sizeof(*p));
+ assert (p!=NULL);
+
p->index=i;
p->type =type;
@@ -199,6 +280,7 @@ int v4l2_enum_fmt (struct v4l2_driver *drv, enum v4l2_buf_type type)
if (list->curr) {
list->next=calloc(1,sizeof(*list->next));
list=list->next;
+ assert (list!=NULL);
}
list->curr=p;
}
@@ -222,7 +304,7 @@ int v4l2_setget_std (struct v4l2_driver *drv, enum v4l2_direction dir, v4l2_std_
ret=errno;
sprintf (s,"while trying to set STD to %08x",
- (unsigned int) id);
+ (unsigned int) *id);
perror(s);
}
}
@@ -324,6 +406,7 @@ int v4l2_gettryset_fmt_cap (struct v4l2_driver *drv, enum v4l2_direction dir,
if (ret < 0) {
perror("VIDIOC_S_FMT failed\n");
}
+ drv->sizeimage=pix->sizeimage;
}
if (pix->pixelformat != pixelformat) {
@@ -390,3 +473,105 @@ int v4l2_get_parm (struct v4l2_driver *drv)
return ret;
}
+
+/****************************************************************************
+ Queue Control
+ ****************************************************************************/
+
+int v4l2_mmap_bufs(struct v4l2_driver *drv, unsigned int num_buffers)
+{
+ uint32_t i;
+
+ if (drv->sizeimage==0) {
+ fprintf(stderr,"Image size is zero! Can't proceed\n");
+ return -1;
+ }
+ /* Requests the specified number of buffers */
+ drv->reqbuf.count = num_buffers;
+ drv->reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ drv->reqbuf.memory = V4L2_MEMORY_MMAP;
+
+ if (ioctl(drv->fd,VIDIOC_REQBUFS,&drv->reqbuf)<0) {
+ perror("reqbufs");
+ return errno;
+ }
+
+ if (drv->debug)
+ printf ("REQBUFS: count=%d, type=%s, memory=%s\n",
+ drv->reqbuf.count,
+ prt_names(drv->reqbuf.type,v4l2_type_names),
+ prt_names(drv->reqbuf.memory,v4l2_memory_names));
+
+ /* Frees previous allocations, if required */
+ if (drv->v4l2_bufs)
+ free(drv->v4l2_bufs);
+ if (drv->bufs)
+ free(drv->bufs);
+
+ /* Allocates the required number of buffers */
+ drv->v4l2_bufs=calloc(drv->reqbuf.count, sizeof(drv->v4l2_bufs));
+ assert(drv->v4l2_bufs!=NULL);
+ drv->bufs=calloc(drv->reqbuf.count, drv->sizeimage);
+ assert(drv->bufs);
+
+ for (i = 0; i < drv->reqbuf.count; i++) {
+ struct v4l2_buffer *p=drv->v4l2_bufs[i];
+ struct v4l2_timecode *tc;
+
+ /* Requests kernel buffers to be mmapped */
+ p=calloc(1,sizeof(*p));
+ assert (p!=NULL);
+ p->index = i;
+ p->type = drv->reqbuf.type;
+ p->memory = V4L2_MEMORY_MMAP;
+ if (ioctl(drv->fd,VIDIOC_QUERYBUF,p)<0) {
+ int ret=errno;
+ perror("querybuf");
+
+ free(drv->v4l2_bufs);
+ free(drv->bufs);
+
+ drv->v4l2_bufs=NULL;
+ drv->bufs=NULL;
+ return ret;
+ }
+
+ if (drv->debug) {
+ printf ("QUERYBUF: %02ld:%02d:%02d.%08ld index=%d, type=%s, "
+ "bytesused=%d, flags=0x%08x, "
+ "field=%s, sequence=%d, memory=%s, offset=0x%08x\n",
+ (p->timestamp.tv_sec/3600),
+ (int)(p->timestamp.tv_sec/60)%60,
+ (int)(p->timestamp.tv_sec%60),
+ p->timestamp.tv_usec,
+ p->index,
+ prt_names(p->type,v4l2_type_names),
+ p->bytesused,p->flags,
+ prt_names(p->field,v4l2_field_names),
+ p->sequence,
+ prt_names(p->memory,v4l2_memory_names),
+ p->m.offset);
+ tc=&p->timecode;
+ printf ("TIMECODE: %02d:%02d:%02d type=%d, "
+ "flags=0x%08x, frames=%d, userbits=0x%08x\n",
+ tc->hours,tc->minutes,tc->seconds,
+ tc->type, tc->flags, tc->frames, *(uint32_t *) tc->userbits);
+ }
+
+printf("offset=0x%08x\n",p->m.offset);
+ drv->bufs[i].length = drv->sizeimage;
+ drv->bufs[i].start = mmap(NULL, drv->bufs[i].length, PROT_READ | PROT_WRITE,
+ MAP_SHARED, drv->fd, p->m.offset);
+ if (MAP_FAILED == drv->bufs) {
+ perror("mmap");
+
+// free(drv->v4l2_bufs);
+// free(drv->bufs);
+
+// drv->v4l2_bufs=NULL;
+// drv->bufs=NULL;
+ return errno;
+ }
+ }
+ return 0;
+}
diff --git a/v4l2-apps/lib/v4l2_driver.h b/v4l2-apps/lib/v4l2_driver.h
index aac00834f..5e04c1e86 100644
--- a/v4l2-apps/lib/v4l2_driver.h
+++ b/v4l2-apps/lib/v4l2_driver.h
@@ -21,16 +21,31 @@ struct drv_list {
struct drv_list *next;
};
+struct v4l2_t_buf {
+ void *start;
+ size_t length;
+};
+
struct v4l2_driver {
- int fd; /* Driver descriptor */
+ int fd; /* Driver descriptor */
+
+ int debug;
- int debug;
+ /* V4L2 structs */
+ struct v4l2_capability cap;
+ struct v4l2_streamparm parm;
- struct v4l2_capability cap;
+ /* Several lists to be used to store enumbered values */
+ struct drv_list *stds,*inputs,*fmt_caps;
- struct v4l2_streamparm parm;
+ /* Stream control */
+ struct v4l2_requestbuffers reqbuf;
+ struct v4l2_buffer **v4l2_bufs;
+ struct v4l2_t_buf *bufs;
+ uint32_t sizeimage;
- struct drv_list *stds,*inputs,*fmt_caps;
+ /* Queue control */
+ uint32_t waitq, currq;
};
enum v4l2_direction {
@@ -53,4 +68,5 @@ int v4l2_setget_input (struct v4l2_driver *drv, enum v4l2_direction dir, struct
int v4l2_gettryset_fmt_cap (struct v4l2_driver *drv, enum v4l2_direction dir,
struct v4l2_format *fmt,uint32_t width, uint32_t height,
uint32_t pixelformat, enum v4l2_field field);
+int v4l2_mmap_bufs(struct v4l2_driver *drv, unsigned int num_buffers);
diff --git a/v4l2-apps/test/driver-test.c b/v4l2-apps/test/driver-test.c
index 53ce6b9d7..809ee170c 100644
--- a/v4l2-apps/test/driver-test.c
+++ b/v4l2-apps/test/driver-test.c
@@ -69,6 +69,9 @@ int main(void)
if (v4l2_get_parm (&drv)<0) {
perror("get_parm");
}
+
+ v4l2_mmap_bufs(&drv, 2);
+
if (v4l2_close (&drv)<0) {
perror("close");
return -1;