diff options
-rw-r--r-- | linux/drivers/media/dvb/dvb-core/dvb_frontend.c | 2 | ||||
-rw-r--r-- | linux/drivers/media/dvb/ttpci/budget-av.c | 5 | ||||
-rw-r--r-- | linux/drivers/media/dvb/ttpci/budget.c | 1 | ||||
-rw-r--r-- | linux/drivers/media/video/cafe_ccic.c | 2 | ||||
-rw-r--r-- | linux/drivers/media/video/v4l2-common.c | 12 | ||||
-rw-r--r-- | v4l2-apps/lib/v4l2_driver.c | 193 | ||||
-rw-r--r-- | v4l2-apps/lib/v4l2_driver.h | 26 | ||||
-rw-r--r-- | v4l2-apps/test/driver-test.c | 3 |
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; |