summaryrefslogtreecommitdiff
path: root/graphics/vid
diff options
context:
space:
mode:
authorkent <kent@pkgsrc.org>2002-06-23 15:15:32 +0000
committerkent <kent@pkgsrc.org>2002-06-23 15:15:32 +0000
commitd7351c546345f61fe60224813d61a41db7738350 (patch)
tree6d8467fdb9a54dad9662fca746852e2d066e59cb /graphics/vid
parent70a8ccb2798aecc255337e94005e881acf3cae5a (diff)
downloadpkgsrc-d7351c546345f61fe60224813d61a41db7738350.tar.gz
Make this compile with recent usb.h. KONISHI Katsuhiro created the patch.
Add OV511+ support by a patch of FreeBSD port. Increment PKGREVISION. This change closes pkg/17356.
Diffstat (limited to 'graphics/vid')
-rw-r--r--graphics/vid/Makefile4
-rw-r--r--graphics/vid/distinfo4
-rw-r--r--graphics/vid/patches/patch-ab291
3 files changed, 284 insertions, 15 deletions
diff --git a/graphics/vid/Makefile b/graphics/vid/Makefile
index b2f1e0622bc..b86b8841209 100644
--- a/graphics/vid/Makefile
+++ b/graphics/vid/Makefile
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.2 2002/03/13 17:37:18 fredb Exp $
+# $NetBSD: Makefile,v 1.3 2002/06/23 15:15:32 kent Exp $
#
DISTNAME= vid-1.0.1
-PKGREVISION= 1
+PKGREVISION= 2
CATEGORIES= graphics
MASTER_SITES= http://members.home.com/housel/
diff --git a/graphics/vid/distinfo b/graphics/vid/distinfo
index a6f4ee933bb..bd50a04a1e8 100644
--- a/graphics/vid/distinfo
+++ b/graphics/vid/distinfo
@@ -1,6 +1,6 @@
-$NetBSD: distinfo,v 1.1.1.1 2002/02/18 03:06:16 wulf Exp $
+$NetBSD: distinfo,v 1.2 2002/06/23 15:15:33 kent Exp $
SHA1 (vid-1.0.1.tar.gz) = 4967f9d02429f9202ea879c051c736d112856063
Size (vid-1.0.1.tar.gz) = 13986 bytes
SHA1 (patch-aa) = c3704b480290f030f1c72a7686e2d8738ee24806
-SHA1 (patch-ab) = e5c414fd06ae6806b74bc534be4e0b1450effc70
+SHA1 (patch-ab) = c6f4e202ec4724ff3389f0885b186fe19c819b77
diff --git a/graphics/vid/patches/patch-ab b/graphics/vid/patches/patch-ab
index 58887a6a6a8..cea3466bb9d 100644
--- a/graphics/vid/patches/patch-ab
+++ b/graphics/vid/patches/patch-ab
@@ -1,8 +1,111 @@
-$NetBSD: patch-ab,v 1.1.1.1 2002/02/18 03:06:16 wulf Exp $
+$NetBSD: patch-ab,v 1.2 2002/06/23 15:15:33 kent Exp $
---- vid.c.orig Mon May 8 14:29:03 2000
-+++ vid.c Fri Dec 28 20:01:07 2001
-@@ -294,7 +294,11 @@
+--- vid.c.orig Mon May 8 13:59:03 2000
++++ vid.c
+@@ -48,6 +48,8 @@
+ struct usb_ctl_request ur;
+ unsigned char data[1024];
+
++#if defined(USB_STACK_VERSION) && (USB_STACK_VERSION < 2)
++
+ ur.request.bmRequestType = UT_READ_VENDOR_INTERFACE;
+ ur.request.bRequest = 2;
+
+@@ -57,6 +59,17 @@
+ ur.data = data;
+ ur.flags = 0;
+ ur.actlen = 0;
++#else
++ ur.ucr_request.bmRequestType = UT_READ_VENDOR_INTERFACE;
++ ur.ucr_request.bRequest = 2;
++
++ USETW(ur.ucr_request.wValue, 0); /* unused */
++ USETW(ur.ucr_request.wIndex, reg); /* index */
++ USETW(ur.ucr_request.wLength, 1); /* payload len in bytes */
++ ur.ucr_data = data;
++ ur.ucr_flags = 0;
++ ur.ucr_actlen = 0;
++#endif
+
+ if(ioctl(fd, USB_DO_REQUEST, &ur) < 0) {
+ return -1;
+@@ -72,6 +85,8 @@
+
+ data[0] = val;
+
++#if defined(USB_STACK_VERSION) && (USB_STACK_VERSION < 2)
++
+ ur.request.bmRequestType = UT_WRITE_VENDOR_INTERFACE;
+ ur.request.bRequest = 2;
+
+@@ -81,7 +96,17 @@
+ ur.data = data;
+ ur.flags = 0;
+ ur.actlen = 0;
++#else
++ ur.ucr_request.bmRequestType = UT_WRITE_VENDOR_INTERFACE;
++ ur.ucr_request.bRequest = 2;
+
++ USETW(ur.ucr_request.wValue, 0); /* unused */
++ USETW(ur.ucr_request.wIndex, reg); /* index */
++ USETW(ur.ucr_request.wLength, 1); /* payload len in bytes */
++ ur.ucr_data = data;
++ ur.ucr_flags = 0;
++ ur.ucr_actlen = 0;
++#endif
+ if(ioctl(fd, USB_DO_REQUEST, &ur) < 0) {
+ return -1;
+ }
+@@ -217,12 +242,15 @@
+ struct vidstate vs; /* current read state */
+ int small = 0; /* use 320x240 */
+ int frmnm = 0; /* cyclic frame number key */
++ int isplus; /* bridge is OV511+ if true, else OV511 */
++ int is20; /* sensor is OV7620 if true, else OV7610 */
++ int bufsize; /* size of packet buffer */
+
+ /* pnm_init(&argc, argv); */ /* required for PNM programs? */
+
+ while(++argv, --argc) {
+ if(strcmp(*argv, "--version") == 0) {
+- fprintf(stderr, "OV511 capture program version " VERSION
++ fprintf(stderr, "OV511/OV511+ capture program version " VERSION
+ "\nCopyright 2000 Peter S. Housel"
+ "\nThis program is free software; "
+ "you may redistribute it under the terms of"
+@@ -235,14 +263,14 @@
+ exit(0);
+ } else if(strcmp(*argv, "--help") == 0) {
+ fprintf(stderr, "usage: vid [options]\n"
+- "Capture an image frame from an OV511-based USB video camera\n"
++ "Capture an image frame from an OV511/OV511+-based USB video camera\n"
+ "and write image data to standard output in PNM format\n\n"
+ "--version print program version information\n"
+ "--usage summarize command line options\n"
+ "--help print this description\n"
+ "--small capture as 320x240 image (default is 640x480)\n"
+ "-d device, --device-name=device\n"
+- " specify OV511 ugen device\n");
++ " specify OV511/OV511+ ugen device\n");
+ exit(0);
+ } else if(strcmp(*argv, "--small") == 0) {
+ small = 1;
+@@ -287,18 +315,33 @@
+ exit(1);
+ }
+
+- if(udi.vendorNo != 0x05A9 || udi.productNo != 0x0511) {
+- fprintf(stderr, "device %s is not an OmniVision OV511\n", devname);
++#if defined(USB_STACK_VERSION) && (USB_STACK_VERSION < 2)
++
++ if(udi.vendorNo != 0x05A9 || udi.productNo != 0x0511 && udi.productNo != 0xa511) {
++#else
++ if(udi.udi_vendorNo != 0x05A9 || udi.udi_productNo != 0x0511 && udi.udi_productNo != 0xa511) {
++#endif
++
++ fprintf(stderr, "device %s is not an OmniVision OV511/OV511+\n", devname);
+ exit(1);
+ }
} else {
int i = 0;
for(i = 0; i < 15; ++i) {
@@ -13,18 +116,133 @@ $NetBSD: patch-ab,v 1.1.1.1 2002/02/18 03:06:16 wulf Exp $
+#endif
if((fd = open(dev, O_RDWR)) < 0)
continue;
++#if defined(USB_STACK_VERSION) && (USB_STACK_VERSION < 2)
if(ioctl(fd, USB_GET_DEVICEINFO, &udi) < 0
-@@ -398,7 +402,8 @@
+- || udi.vendorNo != 0x05A9 || udi.productNo != 0x0511) {
++ || udi.vendorNo != 0x05A9 || udi.productNo != 0x0511 && udi.productNo != 0xa511) {
++#else
++ if(ioctl(fd, USB_GET_DEVICEINFO, &udi) < 0
++ || udi.udi_vendorNo != 0x05A9 || udi.udi_productNo != 0x0511 && udi.udi_productNo != 0xa511) {
++#endif
+ close(fd);
+ fd = -1;
+ continue;
+@@ -308,12 +351,18 @@
+ }
+
+ if(fd < 0) {
+- fprintf(stderr, "vid: couldn't locate an OV511 device\n");
++ fprintf(stderr, "vid: couldn't locate an OV511/OV511+ device\n");
+ exit(1);
+ }
+
+ devname = dev;
+ }
++#if defined(USB_STACK_VERSION) && (USB_STACK_VERSION < 2)
++ isplus = udi.productNo == 0xa511;
++#else
++ isplus = udi.udi_productNo == 0xa511;
++#endif
++ bufsize = (isplus ? 961 : 993);
+
+ /* reset the OV511 */
+ if(ov511_reg_write(fd, OV511_REG_RST, 0x7f) < 0)
+@@ -398,23 +447,56 @@
if(ov511_reg_write(fd, OV511_REG_CE_EN, 0x0) < 0)
exit(1);
- ov511_i2c_write(fd, OV7610_REG_RWB, 0x5);
-+ ov511_i2c_write(fd, OV7610_REG_GC, 0x00);
-+ ov511_i2c_write(fd, OV7610_REG_RWB, 0x05);
- ov511_i2c_write(fd, OV7610_REG_EC, 0xFF);
- ov511_i2c_write(fd, OV7610_REG_COMB, 0x01);
- ov511_i2c_write(fd, OV7610_REG_FD, 0x06);
-@@ -468,7 +473,11 @@
+- ov511_i2c_write(fd, OV7610_REG_EC, 0xFF);
+- ov511_i2c_write(fd, OV7610_REG_COMB, 0x01);
+- ov511_i2c_write(fd, OV7610_REG_FD, 0x06);
+- ov511_i2c_write(fd, OV7610_REG_COME, 0x1c);
+- ov511_i2c_write(fd, OV7610_REG_COMF, 0x90);
+- ov511_i2c_write(fd, OV7610_REG_ECW, 0x2e);
+- ov511_i2c_write(fd, OV7610_REG_ECB, 0x7C);
+- ov511_i2c_write(fd, OV7610_REG_COMH, 0x24);
+- ov511_i2c_write(fd, OV7610_REG_EHSH, 0x04);
+- ov511_i2c_write(fd, OV7610_REG_EHSL, 0xAC);
+- ov511_i2c_write(fd, OV7610_REG_EXBK, 0xFE);
+- ov511_i2c_write(fd, OV7610_REG_COMJ, 0x93);
+- ov511_i2c_write(fd, OV7610_REG_BADJ, 0x48);
+- ov511_i2c_write(fd, OV7610_REG_COMK, 0x81);
++ /* This returns 0 if we have an OV7620 sensor */
++ if((is20 = ov511_i2c_read(fd, OV7610_REG_COMI)) < 0)
++ exit(1);
++ is20 = !is20;
++
++ /* set up the OV7610/OV7620 */
++ if(is20) {
++ ov511_i2c_write(fd, OV7610_REG_EC, 0xff);
++ ov511_i2c_write(fd, OV7610_REG_FD, 0x06);
++ ov511_i2c_write(fd, OV7610_REG_COMH, 0x24);
++ ov511_i2c_write(fd, OV7610_REG_EHSL, 0xac);
++ ov511_i2c_write(fd, OV7610_REG_COMA, 0x00);
++ ov511_i2c_write(fd, OV7610_REG_COMH, 0x24);
++ ov511_i2c_write(fd, OV7610_REG_RWB, 0x85);
++ ov511_i2c_write(fd, OV7610_REG_COMD, 0x01);
++ ov511_i2c_write(fd, 0x23, 0x00);
++ ov511_i2c_write(fd, OV7610_REG_ECW, 0x10);
++ ov511_i2c_write(fd, OV7610_REG_ECB, 0x8a);
++ ov511_i2c_write(fd, OV7610_REG_COMG, 0xe2);
++ ov511_i2c_write(fd, OV7610_REG_EHSH, 0x00);
++ ov511_i2c_write(fd, OV7610_REG_EXBK, 0xfe);
++ ov511_i2c_write(fd, 0x30, 0x71);
++ ov511_i2c_write(fd, 0x31, 0x60);
++ ov511_i2c_write(fd, 0x32, 0x26);
++ ov511_i2c_write(fd, OV7610_REG_YGAM, 0x20);
++ ov511_i2c_write(fd, OV7610_REG_BADJ, 0x48);
++ ov511_i2c_write(fd, OV7610_REG_COMA, 0x24);
++ ov511_i2c_write(fd, OV7610_REG_SYN_CLK, 0x01);
++ ov511_i2c_write(fd, OV7610_REG_BBS, 0x24);
++ ov511_i2c_write(fd, OV7610_REG_RBS, 0x24);
++ } else {
++ ov511_i2c_write(fd, OV7610_REG_GC, 0x00);
++ ov511_i2c_write(fd, OV7610_REG_RWB, 0x05);
++ ov511_i2c_write(fd, OV7610_REG_EC, 0xFF);
++ ov511_i2c_write(fd, OV7610_REG_COMB, 0x01);
++ ov511_i2c_write(fd, OV7610_REG_FD, 0x06);
++ ov511_i2c_write(fd, OV7610_REG_COME, 0x1c);
++ ov511_i2c_write(fd, OV7610_REG_COMF, 0x90);
++ ov511_i2c_write(fd, OV7610_REG_ECW, 0x2e);
++ ov511_i2c_write(fd, OV7610_REG_ECB, 0x7C);
++ ov511_i2c_write(fd, OV7610_REG_COMH, 0x24);
++ ov511_i2c_write(fd, OV7610_REG_EHSH, 0x04);
++ ov511_i2c_write(fd, OV7610_REG_EHSL, 0xAC);
++ ov511_i2c_write(fd, OV7610_REG_EXBK, 0xFE);
++ ov511_i2c_write(fd, OV7610_REG_COMJ, 0x93);
++ ov511_i2c_write(fd, OV7610_REG_BADJ, 0x48);
++ ov511_i2c_write(fd, OV7610_REG_COMK, 0x81);
+
+- ov511_i2c_write(fd, OV7610_REG_GAM, 0x04);
++ ov511_i2c_write(fd, OV7610_REG_GAM, 0x04);
++ }
+
+ if(small) {
+ vs.width = 320;
+@@ -442,14 +524,19 @@
+ ov511_reg_write(fd, OV511_REG_LNDV, 0x00);
+
+ /* set FIFO format (993-byte packets) */
+- if(ov511_reg_write(fd, OV511_REG_PKSZ, 0x1F) < 0)
++ if(ov511_reg_write(fd, OV511_REG_PKSZ, bufsize/32) < 0)
+ exit(1);
+ if(ov511_reg_write(fd, OV511_REG_PKFMT, 0x03) < 0)
+ exit(1);
+
+ /* select the 993-byte alternative */
++#if defined(USB_STACK_VERSION) && (USB_STACK_VERSION < 2)
+ alt.interface_index = 0;
+- alt.alt_no = 1;
++ alt.alt_no = (isplus ? 7 : 1);
++#else
++ alt.uai_interface_index = 0;
++ alt.uai_alt_no = (isplus ? 7 : 1);
++#endif
+ if(ioctl(fd, USB_SET_ALTINTERFACE, &alt) < 0) {
+ perror("USB_SET_ALTINTERFACE");
+ exit(1);
+@@ -468,42 +555,49 @@
vs.xels = pnm_allocarray(vs.width, vs.height);
/* open the isochronous endpoint (endpoint 1) */
@@ -37,3 +255,54 @@ $NetBSD: patch-ab,v 1.1.1.1 2002/02/18 03:06:16 wulf Exp $
if((isoc = open(isocdev, O_RDONLY)) < 0) {
perror(isocdev);
exit(1);
+ }
+
+ /* read, looking for start and end frames */
+- while(vs.state != DONE && (len = read(isoc, &buf, 993)) >= 0) {
++ while(vs.state != DONE && (len = read(isoc, &buf, bufsize)) >= 0) {
+ if(buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[3] == 0
+ && buf[4] == 0 && buf[5] == 0 && buf[6] == 0 && buf[7] == 0
+- && (buf[8] & 0x80) == 0 && buf[992] == 0 && vs.state == SKIPPING) {
+- vs.state = READING;
+- vs.iY = vs.jY = vs.iUV = vs.jUV = 0;
+- vs.residue = 0;
+- procdata(&vs, buf + 9, 993 - 10);
++ && (buf[8] & 0x80) == 0 && buf[bufsize-1] == 0 && vs.state == SKIPPING) {
++ vs.state = READING;
++ vs.iY = vs.jY = vs.iUV = vs.jUV = 0;
++ vs.residue = 0;
++ procdata(&vs, buf + 9, bufsize - 10);
+ } else if(buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[3] == 0
+- && buf[4] == 0 && buf[5] == 0 && buf[6] == 0 && buf[7] == 0
+- && (buf[8] & 0x80) == 0x80 && buf[992] == 0
++ && buf[4] == 0 && buf[5] == 0 && buf[6] == 0 && buf[7] == 0
++ && (buf[8] & 0x80) == 0x80 && buf[bufsize-1] == 0
+ && vs.state == READING) {
+ vs.state = DONE;
+ } else if(vs.state == READING) {
+- procdata(&vs, buf, 993 - 1);
++ procdata(&vs, buf, bufsize - 1);
+
+ /* abort the capture and start over if packets come in out-of-order */
+- if(buf[992] != frmnm && buf[992] != 1) {
++ if(buf[bufsize-1] != frmnm && buf[bufsize-1] != 1) {
+ vs.state = SKIPPING;
+ }
+- frmnm = buf[992] + 1;
++ frmnm = buf[bufsize-1] + 1;
+ if(frmnm == 256)
+ frmnm = 1;
+- } else if(buf[992] != 0) {
+- frmnm = buf[992] + 1;
++ } else if(buf[bufsize-1] != 0) {
++ frmnm = buf[bufsize-1] + 1;
+ if(frmnm == 256)
+ frmnm = 1;
+ }
+ }
++
++ /* reset and close the OV511 */
++ ov511_reg_write(fd, OV511_REG_RST, 0x7f);
+
+ close(isoc);
+ close(fd);