* [PATCH 0 of 4] ov534 patches
@ 2008-12-03 20:46 Jim Paris
2008-12-03 20:47 ` [PATCH 1 of 4] ov534: don't check status twice Jim Paris
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Jim Paris @ 2008-12-03 20:46 UTC (permalink / raw)
To: video4linux-list
Hi,
Here are some ov534 patches I've been working on.
ov534: don't check status twice
ov534: initialization cleanup
ov534: Fix frame size so we don't miss the last pixel
ov534: frame transfer improvements
-jim
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
^ permalink raw reply [flat|nested] 12+ messages in thread* [PATCH 1 of 4] ov534: don't check status twice 2008-12-03 20:46 [PATCH 0 of 4] ov534 patches Jim Paris @ 2008-12-03 20:47 ` Jim Paris 2008-12-03 20:47 ` [PATCH 2 of 4] ov534: initialization cleanup Jim Paris ` (3 subsequent siblings) 4 siblings, 0 replies; 12+ messages in thread From: Jim Paris @ 2008-12-03 20:47 UTC (permalink / raw) To: video4linux-list # HG changeset patch # User jim@jtan.com # Date 1228334704 18000 # Node ID fa4fcbdb237a065c4033bd51be28fa9da9016cef # Parent ee27d949bfa5e050f858b5bae4cc9a050ff5b119 ov534: don't check status twice sccb_reg_write already calls sccb_check_status, no need to do it again. Signed-off-by: Jim Paris <jim@jtan.com> diff -r ee27d949bfa5 -r fa4fcbdb237a linux/drivers/media/video/gspca/ov534.c --- a/linux/drivers/media/video/gspca/ov534.c Tue Dec 02 19:00:57 2008 +0100 +++ b/linux/drivers/media/video/gspca/ov534.c Wed Dec 03 15:05:04 2008 -0500 @@ -369,31 +369,23 @@ switch (sd->frame_rate) { case 50: sccb_reg_write(gspca_dev->dev, 0x11, 0x01); - sccb_check_status(gspca_dev->dev); sccb_reg_write(gspca_dev->dev, 0x0d, 0x41); - sccb_check_status(gspca_dev->dev); ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x02); break; case 40: sccb_reg_write(gspca_dev->dev, 0x11, 0x02); - sccb_check_status(gspca_dev->dev); sccb_reg_write(gspca_dev->dev, 0x0d, 0xc1); - sccb_check_status(gspca_dev->dev); ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x04); break; case 30: default: sccb_reg_write(gspca_dev->dev, 0x11, 0x04); - sccb_check_status(gspca_dev->dev); sccb_reg_write(gspca_dev->dev, 0x0d, 0x81); - sccb_check_status(gspca_dev->dev); ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x02); break; case 15: sccb_reg_write(gspca_dev->dev, 0x11, 0x03); - sccb_check_status(gspca_dev->dev); sccb_reg_write(gspca_dev->dev, 0x0d, 0x41); - sccb_check_status(gspca_dev->dev); ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x04); break; }; -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2 of 4] ov534: initialization cleanup 2008-12-03 20:46 [PATCH 0 of 4] ov534 patches Jim Paris 2008-12-03 20:47 ` [PATCH 1 of 4] ov534: don't check status twice Jim Paris @ 2008-12-03 20:47 ` Jim Paris 2008-12-03 20:47 ` [PATCH 3 of 4] ov534: Fix frame size so we don't miss the last pixel Jim Paris ` (2 subsequent siblings) 4 siblings, 0 replies; 12+ messages in thread From: Jim Paris @ 2008-12-03 20:47 UTC (permalink / raw) To: video4linux-list # HG changeset patch # User jim@jtan.com # Date 1228334814 18000 # Node ID 893107a5df87228bb6766f26226fcef8069e3fc8 # Parent fa4fcbdb237a065c4033bd51be28fa9da9016cef ov534: initialization cleanup Clean up bridge and sensor chip initialization by putting initial register values in arrays rather than open-coding calls to *_reg_write. Also remove ov534_reg_verify_write, as the verify step doesn't appear necessary. The order of some writes was rearranged and some duplicate writes were removed, but the camera behavior is unchanged. Signed-off-by: Jim Paris <jim@jtan.com> diff -r fa4fcbdb237a -r 893107a5df87 linux/drivers/media/video/gspca/ov534.c --- a/linux/drivers/media/video/gspca/ov534.c Wed Dec 03 15:05:04 2008 -0500 +++ b/linux/drivers/media/video/gspca/ov534.c Wed Dec 03 15:06:54 2008 -0500 @@ -94,19 +94,6 @@ return data; } -static void ov534_reg_verify_write(struct usb_device *udev, u16 reg, u16 val) -{ - u16 data; - - ov534_reg_write(udev, reg, val); - data = ov534_reg_read(udev, reg); - if (data != val) { - PDEBUG(D_ERR | D_USBO, - "unexpected result from read: 0x%04x != 0x%04x", val, - data); - } -} - /* Two bits control LED: 0x21 bit 7 and 0x23 bit 7. * (direction and output)? */ static void ov534_set_led(struct usb_device *udev, int status) @@ -162,174 +149,168 @@ PDEBUG(D_ERR, "sccb_reg_write failed"); } +static const __u8 ov534_reg_initdata[][2] = { + { 0xe7, 0x3a }, + + { OV534_REG_ADDRESS, 0x42 }, /* select OV772x sensor */ + + { 0xc2, 0x0c }, + { 0x88, 0xf8 }, + { 0xc3, 0x69 }, + { 0x89, 0xff }, + { 0x76, 0x03 }, + { 0x92, 0x01 }, + { 0x93, 0x18 }, + { 0x94, 0x10 }, + { 0x95, 0x10 }, + { 0xe2, 0x00 }, + { 0xe7, 0x3e }, + + { 0x1c, 0x0a }, + { 0x1d, 0x22 }, + { 0x1d, 0x06 }, + + { 0x96, 0x00 }, + + { 0x97, 0x20 }, + { 0x97, 0x20 }, + { 0x97, 0x20 }, + { 0x97, 0x0a }, + { 0x97, 0x3f }, + { 0x97, 0x4a }, + { 0x97, 0x20 }, + { 0x97, 0x15 }, + { 0x97, 0x0b }, + + { 0x8e, 0x40 }, + { 0x1f, 0x81 }, + { 0x34, 0x05 }, + { 0xe3, 0x04 }, + { 0x88, 0x00 }, + { 0x89, 0x00 }, + { 0x76, 0x00 }, + { 0xe7, 0x2e }, + { 0x31, 0xf9 }, + { 0x25, 0x42 }, + { 0x21, 0xf0 }, + + { 0x1c, 0x00 }, + { 0x1d, 0x40 }, + { 0x1d, 0x02 }, + { 0x1d, 0x00 }, + { 0x1d, 0x02 }, + { 0x1d, 0x57 }, + { 0x1d, 0xff }, + + { 0x8d, 0x1c }, + { 0x8e, 0x80 }, + { 0xe5, 0x04 }, + + { 0xc0, 0x50 }, + { 0xc1, 0x3c }, + { 0xc2, 0x0c }, +}; + +static const __u8 ov772x_reg_initdata[][2] = { + { 0x12, 0x80 }, + { 0x11, 0x01 }, + + { 0x3d, 0x03 }, + { 0x17, 0x26 }, + { 0x18, 0xa0 }, + { 0x19, 0x07 }, + { 0x1a, 0xf0 }, + { 0x32, 0x00 }, + { 0x29, 0xa0 }, + { 0x2c, 0xf0 }, + { 0x65, 0x20 }, + { 0x11, 0x01 }, + { 0x42, 0x7f }, + { 0x63, 0xe0 }, + { 0x64, 0xff }, + { 0x66, 0x00 }, + { 0x13, 0xf0 }, + { 0x0d, 0x41 }, + { 0x0f, 0xc5 }, + { 0x14, 0x11 }, + + { 0x22, 0x7f }, + { 0x23, 0x03 }, + { 0x24, 0x40 }, + { 0x25, 0x30 }, + { 0x26, 0xa1 }, + { 0x2a, 0x00 }, + { 0x2b, 0x00 }, + { 0x6b, 0xaa }, + { 0x13, 0xff }, + + { 0x90, 0x05 }, + { 0x91, 0x01 }, + { 0x92, 0x03 }, + { 0x93, 0x00 }, + { 0x94, 0x60 }, + { 0x95, 0x3c }, + { 0x96, 0x24 }, + { 0x97, 0x1e }, + { 0x98, 0x62 }, + { 0x99, 0x80 }, + { 0x9a, 0x1e }, + { 0x9b, 0x08 }, + { 0x9c, 0x20 }, + { 0x9e, 0x81 }, + + { 0xa6, 0x04 }, + { 0x7e, 0x0c }, + { 0x7f, 0x16 }, + { 0x80, 0x2a }, + { 0x81, 0x4e }, + { 0x82, 0x61 }, + { 0x83, 0x6f }, + { 0x84, 0x7b }, + { 0x85, 0x86 }, + { 0x86, 0x8e }, + { 0x87, 0x97 }, + { 0x88, 0xa4 }, + { 0x89, 0xaf }, + { 0x8a, 0xc5 }, + { 0x8b, 0xd7 }, + { 0x8c, 0xe8 }, + { 0x8d, 0x20 }, + + { 0x0c, 0x90 }, + + { 0x2b, 0x00 }, + { 0x22, 0x7f }, + { 0x23, 0x03 }, + { 0x11, 0x01 }, + { 0x0c, 0xd0 }, + { 0x64, 0xff }, + { 0x0d, 0x41 }, + + { 0x14, 0x41 }, + { 0x0e, 0xcd }, + { 0xac, 0xbf }, + { 0x8e, 0x00 }, + { 0x0c, 0xd0 } +}; + + /* setup method */ static void ov534_setup(struct usb_device *udev) { - ov534_reg_verify_write(udev, 0xe7, 0x3a); + int i; - ov534_reg_write(udev, OV534_REG_ADDRESS, 0x60); - ov534_reg_write(udev, OV534_REG_ADDRESS, 0x60); - ov534_reg_write(udev, OV534_REG_ADDRESS, 0x60); - ov534_reg_write(udev, OV534_REG_ADDRESS, 0x42); - - ov534_reg_verify_write(udev, 0xc2, 0x0c); - ov534_reg_verify_write(udev, 0x88, 0xf8); - ov534_reg_verify_write(udev, 0xc3, 0x69); - ov534_reg_verify_write(udev, 0x89, 0xff); - ov534_reg_verify_write(udev, 0x76, 0x03); - ov534_reg_verify_write(udev, 0x92, 0x01); - ov534_reg_verify_write(udev, 0x93, 0x18); - ov534_reg_verify_write(udev, 0x94, 0x10); - ov534_reg_verify_write(udev, 0x95, 0x10); - ov534_reg_verify_write(udev, 0xe2, 0x00); - ov534_reg_verify_write(udev, 0xe7, 0x3e); - - ov534_reg_write(udev, 0x1c, 0x0a); - ov534_reg_write(udev, 0x1d, 0x22); - ov534_reg_write(udev, 0x1d, 0x06); - - ov534_reg_verify_write(udev, 0x96, 0x00); - - ov534_reg_write(udev, 0x97, 0x20); - ov534_reg_write(udev, 0x97, 0x20); - ov534_reg_write(udev, 0x97, 0x20); - ov534_reg_write(udev, 0x97, 0x0a); - ov534_reg_write(udev, 0x97, 0x3f); - ov534_reg_write(udev, 0x97, 0x4a); - ov534_reg_write(udev, 0x97, 0x20); - ov534_reg_write(udev, 0x97, 0x15); - ov534_reg_write(udev, 0x97, 0x0b); - - ov534_reg_verify_write(udev, 0x8e, 0x40); - ov534_reg_verify_write(udev, 0x1f, 0x81); - ov534_reg_verify_write(udev, 0x34, 0x05); - ov534_reg_verify_write(udev, 0xe3, 0x04); - ov534_reg_verify_write(udev, 0x88, 0x00); - ov534_reg_verify_write(udev, 0x89, 0x00); - ov534_reg_verify_write(udev, 0x76, 0x00); - ov534_reg_verify_write(udev, 0xe7, 0x2e); - ov534_reg_verify_write(udev, 0x31, 0xf9); - ov534_reg_verify_write(udev, 0x25, 0x42); - ov534_reg_verify_write(udev, 0x21, 0xf0); - - ov534_reg_write(udev, 0x1c, 0x00); - ov534_reg_write(udev, 0x1d, 0x40); - ov534_reg_write(udev, 0x1d, 0x02); - ov534_reg_write(udev, 0x1d, 0x00); - ov534_reg_write(udev, 0x1d, 0x02); - ov534_reg_write(udev, 0x1d, 0x57); - ov534_reg_write(udev, 0x1d, 0xff); - - ov534_reg_verify_write(udev, 0x8d, 0x1c); - ov534_reg_verify_write(udev, 0x8e, 0x80); - ov534_reg_verify_write(udev, 0xe5, 0x04); + /* Initialize bridge chip */ + for (i = 0; i < ARRAY_SIZE(ov534_reg_initdata); i++) + ov534_reg_write(udev, ov534_reg_initdata[i][0], + ov534_reg_initdata[i][1]); ov534_set_led(udev, 1); - sccb_reg_write(udev, 0x12, 0x80); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x11, 0x01); - - ov534_set_led(udev, 0); - - sccb_reg_write(udev, 0x3d, 0x03); - sccb_reg_write(udev, 0x17, 0x26); - sccb_reg_write(udev, 0x18, 0xa0); - sccb_reg_write(udev, 0x19, 0x07); - sccb_reg_write(udev, 0x1a, 0xf0); - sccb_reg_write(udev, 0x32, 0x00); - sccb_reg_write(udev, 0x29, 0xa0); - sccb_reg_write(udev, 0x2c, 0xf0); - sccb_reg_write(udev, 0x65, 0x20); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x42, 0x7f); - sccb_reg_write(udev, 0x63, 0xe0); - sccb_reg_write(udev, 0x64, 0xff); - sccb_reg_write(udev, 0x66, 0x00); - sccb_reg_write(udev, 0x13, 0xf0); - sccb_reg_write(udev, 0x0d, 0x41); - sccb_reg_write(udev, 0x0f, 0xc5); - sccb_reg_write(udev, 0x14, 0x11); - - ov534_set_led(udev, 1); - - sccb_reg_write(udev, 0x22, 0x7f); - sccb_reg_write(udev, 0x23, 0x03); - sccb_reg_write(udev, 0x24, 0x40); - sccb_reg_write(udev, 0x25, 0x30); - sccb_reg_write(udev, 0x26, 0xa1); - sccb_reg_write(udev, 0x2a, 0x00); - sccb_reg_write(udev, 0x2b, 0x00); - sccb_reg_write(udev, 0x6b, 0xaa); - sccb_reg_write(udev, 0x13, 0xff); - - ov534_set_led(udev, 0); - - sccb_reg_write(udev, 0x90, 0x05); - sccb_reg_write(udev, 0x91, 0x01); - sccb_reg_write(udev, 0x92, 0x03); - sccb_reg_write(udev, 0x93, 0x00); - sccb_reg_write(udev, 0x94, 0x60); - sccb_reg_write(udev, 0x95, 0x3c); - sccb_reg_write(udev, 0x96, 0x24); - sccb_reg_write(udev, 0x97, 0x1e); - sccb_reg_write(udev, 0x98, 0x62); - sccb_reg_write(udev, 0x99, 0x80); - sccb_reg_write(udev, 0x9a, 0x1e); - sccb_reg_write(udev, 0x9b, 0x08); - sccb_reg_write(udev, 0x9c, 0x20); - sccb_reg_write(udev, 0x9e, 0x81); - - ov534_set_led(udev, 1); - - sccb_reg_write(udev, 0xa6, 0x04); - sccb_reg_write(udev, 0x7e, 0x0c); - sccb_reg_write(udev, 0x7f, 0x16); - sccb_reg_write(udev, 0x80, 0x2a); - sccb_reg_write(udev, 0x81, 0x4e); - sccb_reg_write(udev, 0x82, 0x61); - sccb_reg_write(udev, 0x83, 0x6f); - sccb_reg_write(udev, 0x84, 0x7b); - sccb_reg_write(udev, 0x85, 0x86); - sccb_reg_write(udev, 0x86, 0x8e); - sccb_reg_write(udev, 0x87, 0x97); - sccb_reg_write(udev, 0x88, 0xa4); - sccb_reg_write(udev, 0x89, 0xaf); - sccb_reg_write(udev, 0x8a, 0xc5); - sccb_reg_write(udev, 0x8b, 0xd7); - sccb_reg_write(udev, 0x8c, 0xe8); - sccb_reg_write(udev, 0x8d, 0x20); - - sccb_reg_write(udev, 0x0c, 0x90); - - ov534_reg_verify_write(udev, 0xc0, 0x50); - ov534_reg_verify_write(udev, 0xc1, 0x3c); - ov534_reg_verify_write(udev, 0xc2, 0x0c); - - ov534_set_led(udev, 1); - - sccb_reg_write(udev, 0x2b, 0x00); - sccb_reg_write(udev, 0x22, 0x7f); - sccb_reg_write(udev, 0x23, 0x03); - sccb_reg_write(udev, 0x11, 0x01); - sccb_reg_write(udev, 0x0c, 0xd0); - sccb_reg_write(udev, 0x64, 0xff); - sccb_reg_write(udev, 0x0d, 0x41); - - sccb_reg_write(udev, 0x14, 0x41); - sccb_reg_write(udev, 0x0e, 0xcd); - sccb_reg_write(udev, 0xac, 0xbf); - sccb_reg_write(udev, 0x8e, 0x00); - sccb_reg_write(udev, 0x0c, 0xd0); + /* Initialize sensor */ + for (i = 0; i < ARRAY_SIZE(ov772x_reg_initdata); i++) + sccb_reg_write(udev, ov772x_reg_initdata[i][0], + ov772x_reg_initdata[i][1]); ov534_reg_write(udev, 0xe0, 0x09); ov534_set_led(udev, 0); @@ -370,23 +351,23 @@ case 50: sccb_reg_write(gspca_dev->dev, 0x11, 0x01); sccb_reg_write(gspca_dev->dev, 0x0d, 0x41); - ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x02); + ov534_reg_write(gspca_dev->dev, 0xe5, 0x02); break; case 40: sccb_reg_write(gspca_dev->dev, 0x11, 0x02); sccb_reg_write(gspca_dev->dev, 0x0d, 0xc1); - ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x04); + ov534_reg_write(gspca_dev->dev, 0xe5, 0x04); break; case 30: default: sccb_reg_write(gspca_dev->dev, 0x11, 0x04); sccb_reg_write(gspca_dev->dev, 0x0d, 0x81); - ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x02); + ov534_reg_write(gspca_dev->dev, 0xe5, 0x02); break; case 15: sccb_reg_write(gspca_dev->dev, 0x11, 0x03); sccb_reg_write(gspca_dev->dev, 0x0d, 0x41); - ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x04); + ov534_reg_write(gspca_dev->dev, 0xe5, 0x04); break; }; -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3 of 4] ov534: Fix frame size so we don't miss the last pixel 2008-12-03 20:46 [PATCH 0 of 4] ov534 patches Jim Paris 2008-12-03 20:47 ` [PATCH 1 of 4] ov534: don't check status twice Jim Paris 2008-12-03 20:47 ` [PATCH 2 of 4] ov534: initialization cleanup Jim Paris @ 2008-12-03 20:47 ` Jim Paris 2008-12-03 20:47 ` [PATCH 4 of 4] ov534: frame transfer improvements Jim Paris 2008-12-04 8:14 ` [PATCH 0 of 4] ov534 patches Jean-Francois Moine 4 siblings, 0 replies; 12+ messages in thread From: Jim Paris @ 2008-12-03 20:47 UTC (permalink / raw) To: video4linux-list # HG changeset patch # User jim@jtan.com # Date 1228334850 18000 # Node ID 61c8d2959dd6ad1b45e0d8bf12b3d5748fc6a568 # Parent 893107a5df87228bb6766f26226fcef8069e3fc8 ov534: Fix frame size so we don't miss the last pixel The frame size is too small, so we lose the last YUYV pixel. Fix the setup and remove the last_pixel hack. Signed-off-by: Jim Paris <jim@jtan.com> diff -r 893107a5df87 -r 61c8d2959dd6 linux/drivers/media/video/gspca/ov534.c --- a/linux/drivers/media/video/gspca/ov534.c Wed Dec 03 15:06:54 2008 -0500 +++ b/linux/drivers/media/video/gspca/ov534.c Wed Dec 03 15:07:30 2008 -0500 @@ -198,9 +198,9 @@ { 0x1d, 0x40 }, { 0x1d, 0x02 }, { 0x1d, 0x00 }, - { 0x1d, 0x02 }, - { 0x1d, 0x57 }, - { 0x1d, 0xff }, + { 0x1d, 0x02 }, /* frame size 0x025800 * 4 = 614400 */ + { 0x1d, 0x58 }, /* frame size */ + { 0x1d, 0x00 }, /* frame size */ { 0x8d, 0x1c }, { 0x8e, 0x80 }, @@ -398,19 +398,12 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame, __u8 *data, int len) { - /* - * The current camera setup doesn't stream the last pixel, so we set it - * to a dummy value - */ - __u8 last_pixel[4] = { 0, 0, 0, 0 }; int framesize = gspca_dev->cam.bulk_size; - if (len == framesize - 4) { - frame = - gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); - frame = - gspca_frame_add(gspca_dev, LAST_PACKET, frame, last_pixel, - 4); + if (len == framesize) { + frame = gspca_frame_add(gspca_dev, FIRST_PACKET, frame, + data, len); + frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0); } else PDEBUG(D_PACK, "packet len = %d, framesize = %d", len, framesize); -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4 of 4] ov534: frame transfer improvements 2008-12-03 20:46 [PATCH 0 of 4] ov534 patches Jim Paris ` (2 preceding siblings ...) 2008-12-03 20:47 ` [PATCH 3 of 4] ov534: Fix frame size so we don't miss the last pixel Jim Paris @ 2008-12-03 20:47 ` Jim Paris 2008-12-04 8:14 ` [PATCH 0 of 4] ov534 patches Jean-Francois Moine 4 siblings, 0 replies; 12+ messages in thread From: Jim Paris @ 2008-12-03 20:47 UTC (permalink / raw) To: video4linux-list # HG changeset patch # User jim@jtan.com # Date 1228335450 18000 # Node ID ede2dd835a2086131584558f5ccb1e2170135b07 # Parent 61c8d2959dd6ad1b45e0d8bf12b3d5748fc6a568 ov534: frame transfer improvements The indirect registers at 0x1c/0x1d control frame settings. If we leave the values at 0x0a and 0x0b at their reset-time defaults, frame data from the camera matches the UVC payload format. This lets us better reassemble the data into frames and know when data was lost. This also lets us relax the bulk_size requirement from 600K to 2K, which should help systems on with limited RAM (like the PS3). Signed-off-by: Jim Paris <jim@jtan.com> diff -r 61c8d2959dd6 -r ede2dd835a20 linux/drivers/media/video/gspca/ov534.c --- a/linux/drivers/media/video/gspca/ov534.c Wed Dec 03 15:07:30 2008 -0500 +++ b/linux/drivers/media/video/gspca/ov534.c Wed Dec 03 15:17:30 2008 -0500 @@ -166,10 +166,6 @@ { 0xe2, 0x00 }, { 0xe7, 0x3e }, - { 0x1c, 0x0a }, - { 0x1d, 0x22 }, - { 0x1d, 0x06 }, - { 0x96, 0x00 }, { 0x97, 0x20 }, @@ -328,10 +324,8 @@ cam->cam_mode = vga_mode; cam->nmodes = ARRAY_SIZE(vga_mode); - cam->bulk_size = vga_mode[0].sizeimage; + cam->bulk_size = 2048; cam->bulk_nurbs = 2; - - PDEBUG(D_PROBE, "bulk_size = %d", cam->bulk_size); return 0; } @@ -379,8 +373,6 @@ PDEBUG(D_PROBE, "width = %d, height = %d", gspca_dev->width, gspca_dev->height); - gspca_dev->cam.bulk_size = gspca_dev->width * gspca_dev->height * 2; - /* start streaming data */ ov534_set_led(gspca_dev->dev, 1); ov534_reg_write(gspca_dev->dev, 0xe0, 0x00); @@ -395,18 +387,80 @@ ov534_set_led(gspca_dev->dev, 0); } +/* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */ +#define UVC_STREAM_EOH (1 << 7) +#define UVC_STREAM_ERR (1 << 6) +#define UVC_STREAM_STI (1 << 5) +#define UVC_STREAM_RES (1 << 4) +#define UVC_STREAM_SCR (1 << 3) +#define UVC_STREAM_PTS (1 << 2) +#define UVC_STREAM_EOF (1 << 1) +#define UVC_STREAM_FID (1 << 0) + static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame, __u8 *data, int len) { - int framesize = gspca_dev->cam.bulk_size; + static __u32 last_pts; + __u32 this_pts; + static int last_fid; + int this_fid; - if (len == framesize) { - frame = gspca_frame_add(gspca_dev, FIRST_PACKET, frame, - data, len); - frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0); - } else - PDEBUG(D_PACK, "packet len = %d, framesize = %d", len, - framesize); + /* Payloads are prefixed with a the UVC-style header. We + consider a frame to start when the FID toggles, or the PTS + changes. A frame ends when EOF is set, and we've received + the correct number of bytes. */ + + /* Verify UVC header. Header length is always 12 */ + if (data[0] != 12 || len < 12) { + PDEBUG(D_PACK, "bad header"); + goto discard; + } + + /* Check errors */ + if (data[1] & UVC_STREAM_ERR) { + PDEBUG(D_PACK, "payload error"); + goto discard; + } + + /* Extract PTS and FID */ + if (!(data[1] & UVC_STREAM_PTS)) { + PDEBUG(D_PACK, "PTS not present"); + goto discard; + } + this_pts = (data[5] << 24) | (data[4] << 16) | (data[3] << 8) | data[2]; + this_fid = (data[1] & UVC_STREAM_FID) ? 1 : 0; + + /* If PTS or FID has changed, start a new frame. */ + if (this_pts != last_pts || this_fid != last_fid) { + frame = gspca_frame_add(gspca_dev, FIRST_PACKET, frame, NULL, 0); + last_pts = this_pts; + last_fid = this_fid; + } + + /* Add the data from this payload */ + frame = gspca_frame_add(gspca_dev, INTER_PACKET, frame, + data + 12, len - 12); + + /* If this packet is marked as EOF, end the frame */ + if (data[1] & UVC_STREAM_EOF) { + last_pts = 0; + + if ((frame->data_end - frame->data) != + (gspca_dev->width * gspca_dev->height * 2)) { + PDEBUG(D_PACK, "short frame"); + goto discard; + } + + gspca_frame_add(gspca_dev, LAST_PACKET, frame, NULL, 0); + } + + /* Done */ + return; + +discard: + /* Discard data until a new frame starts. */ + gspca_frame_add(gspca_dev, DISCARD_PACKET, frame, NULL, 0); + return; } /* sub-driver description */ -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0 of 4] ov534 patches 2008-12-03 20:46 [PATCH 0 of 4] ov534 patches Jim Paris ` (3 preceding siblings ...) 2008-12-03 20:47 ` [PATCH 4 of 4] ov534: frame transfer improvements Jim Paris @ 2008-12-04 8:14 ` Jean-Francois Moine 2008-12-04 12:05 ` Antonio Ospite 2008-12-04 17:15 ` Jim Paris 4 siblings, 2 replies; 12+ messages in thread From: Jean-Francois Moine @ 2008-12-04 8:14 UTC (permalink / raw) To: Jim Paris; +Cc: video4linux-list On Wed, 2008-12-03 at 15:46 -0500, Jim Paris wrote: > Hi, Hi Jim, > Here are some ov534 patches I've been working on. > > ov534: don't check status twice > ov534: initialization cleanup > ov534: Fix frame size so we don't miss the last pixel > ov534: frame transfer improvements Thank you for these patchs. Some changes were already done in my repository. I merged them and pushed. May you check if everything is correct? Also, I moved the last fid and pts to the sd structure. This allows many webcams to work simultaneously. I was wondering about the reset of these variables: last_fid is never reset and last_pts is reset on UVC_STREAM_EOF. Shouldn't they also be reset on streaming start? Cheers. -- Ken ar c'hentañ | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0 of 4] ov534 patches 2008-12-04 8:14 ` [PATCH 0 of 4] ov534 patches Jean-Francois Moine @ 2008-12-04 12:05 ` Antonio Ospite 2008-12-09 21:12 ` Jim Paris 2008-12-04 17:15 ` Jim Paris 1 sibling, 1 reply; 12+ messages in thread From: Antonio Ospite @ 2008-12-04 12:05 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: video4linux-list [-- Attachment #1.1: Type: text/plain, Size: 1115 bytes --] On Thu, 04 Dec 2008 09:14:02 +0100 Jean-Francois Moine <moinejf@free.fr> wrote: > On Wed, 2008-12-03 at 15:46 -0500, Jim Paris wrote: > > Hi, > Thanks Jim. > Hi Jim, > > > Here are some ov534 patches I've been working on. > > > > ov534: don't check status twice > > ov534: initialization cleanup > > ov534: Fix frame size so we don't miss the last pixel > > ov534: frame transfer improvements > > Thank you for these patchs. Some changes were already done in my > repository. I merged them and pushed. May you check if everything is > correct? > Tested the latest version, I am getting "payload error"s setting frame_rate=50, loosing about 50% of frames. I tried raising bulk_size but then I get "frame overflow" errors from gspca, I'll investigate further. Regards, Antonio -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? Web site: http://www.studenti.unina.it/~ospite Public key: http://www.studenti.unina.it/~ospite/aopubkey.asc [-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0 of 4] ov534 patches 2008-12-04 12:05 ` Antonio Ospite @ 2008-12-09 21:12 ` Jim Paris 0 siblings, 0 replies; 12+ messages in thread From: Jim Paris @ 2008-12-09 21:12 UTC (permalink / raw) To: Antonio Ospite; +Cc: video4linux-list Antonio Ospite wrote: > Tested the latest version, I am getting "payload error"s setting > frame_rate=50, loosing about 50% of frames. I tried raising bulk_size > but then I get "frame overflow" errors from gspca, I'll investigate > further. If bulk_size is bigger, the headers appear every 2048 bytes, not at the beginning of each bulk packet. Try the attached patch? (The layout of sd_pkt_scan gets a bit strange, but the differences are more clear this way; I can rewrite it a little more clearly) -jim -- ov534: improve payload handling Frame data in bulk transfers is separated into 2048-byte payloads. Each payload has its own header. Signed-off-by: Jim Paris <jim@jtan.com> diff -r ffeb9d2be572 linux/drivers/media/video/gspca/ov534.c --- a/linux/drivers/media/video/gspca/ov534.c Mon Dec 08 10:41:04 2008 +0100 +++ b/linux/drivers/media/video/gspca/ov534.c Tue Dec 09 16:06:07 2008 -0500 @@ -1,6 +1,7 @@ /* * ov534/ov772x gspca driver * Copyright (C) 2008 Antonio Ospite <ospite@studenti.unina.it> + * Copyright (C) 2008 Jim Paris <jim@jtan.com> * * Based on a prototype written by Mark Ferrell <majortrips@gmail.com> * USB protocol reverse engineered by Jim Paris <jim@jtan.com> @@ -193,8 +194,8 @@ { 0x1c, 0x00 }, { 0x1d, 0x40 }, - { 0x1d, 0x02 }, - { 0x1d, 0x00 }, + { 0x1d, 0x02 }, /* payload size 0x0200 * 4 = 2048 bytes */ + { 0x1d, 0x00 }, /* payload size */ { 0x1d, 0x02 }, /* frame size 0x025800 * 4 = 614400 */ { 0x1d, 0x58 }, /* frame size */ { 0x1d, 0x00 }, /* frame size */ @@ -325,7 +326,7 @@ cam->cam_mode = vga_mode; cam->nmodes = ARRAY_SIZE(vga_mode); - cam->bulk_size = 2048; + cam->bulk_size = 16384; cam->bulk_nurbs = 2; return 0; @@ -402,6 +403,17 @@ struct sd *sd = (struct sd *) gspca_dev; __u32 this_pts; int this_fid; + int remaining_len = len; + __u8 *next_data = data; + +scan_next: + if (remaining_len <= 0) + return; + + data = next_data; + len = min(remaining_len, 2048); + remaining_len -= len; + next_data += len; /* Payloads are prefixed with a the UVC-style header. We consider a frame to start when the FID toggles, or the PTS @@ -452,12 +464,13 @@ gspca_frame_add(gspca_dev, LAST_PACKET, frame, NULL, 0); } - /* Done */ - return; + /* Done this payload */ + goto scan_next; discard: /* Discard data until a new frame starts. */ gspca_frame_add(gspca_dev, DISCARD_PACKET, frame, NULL, 0); + goto scan_next; } /* sub-driver description */ -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0 of 4] ov534 patches 2008-12-04 8:14 ` [PATCH 0 of 4] ov534 patches Jean-Francois Moine 2008-12-04 12:05 ` Antonio Ospite @ 2008-12-04 17:15 ` Jim Paris 2008-12-06 17:42 ` Antonio Ospite 1 sibling, 1 reply; 12+ messages in thread From: Jim Paris @ 2008-12-04 17:15 UTC (permalink / raw) To: Jean-Francois Moine, Antonio Ospite; +Cc: video4linux-list Hi Jean, Antonio, Jean-Francois Moine wrote: > Thank you for these patchs. Some changes were already done in my > repository. I merged them and pushed. May you check if everything is > correct? I took a brief look and the merge looks OK, thanks. > Also, I moved the last fid and pts to the sd structure. This allows many > webcams to work simultaneously. I was wondering about the reset of these > variables: last_fid is never reset and last_pts is reset on > UVC_STREAM_EOF. Shouldn't they also be reset on streaming start? I didn't consider multiple cameras. Moving them of course makes sense for that. I did think of the reset case and thought it was OK, but given Antonio's report below there might need to be some fixes in here anyway. Antonio Ospite wrote: > Tested the latest version, I am getting "payload error"s setting > frame_rate=50, loosing about 50% of frames. I tried raising > bulk_size but then I get "frame overflow" errors from gspca, I'll > investigate further. I don't think I see any payload errors even at 50fps. For the bulk size, I'm not sure exactly how the payloads work into that. I suppose that when bulk_size is larger than the camera's payload size (2048), we get another payload header at data[2048] but don't pay attention to it. If this header had the EOF then we can send gspca too much data, causing frame overflow. (there's no overflow check in ov534 since gspca handles it already). With the current setup, we're essentially getting a UVC stream. This makes sense since the marketing for ov534 says it supports UVC. So some documentation for this would be http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip This header and payload format is handled by a couple drivers that I found: linux/drivers/media/video/uvc/uvc_video.c uvc_video_decode_start uvc_video_decode_data uvc_video_decode_end (I thought there was another Linux driver that also handled this payloads itself, but now I can't find it again) http://www.openbsd.org/cgi-bin/cvsweb/src/sys/dev/usb/uvideo.c?rev=1.99 uvideo_vs_decode_stream_header Some discussion I found on payload headers in bulk transfers is here http://osdir.com/ml/linux.drivers.uvc.devel/2007-05/msg00036.html Maybe finding a way to switch to isoc would make things easier? -jim -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0 of 4] ov534 patches 2008-12-04 17:15 ` Jim Paris @ 2008-12-06 17:42 ` Antonio Ospite 2008-12-09 21:21 ` Jim Paris 0 siblings, 1 reply; 12+ messages in thread From: Antonio Ospite @ 2008-12-06 17:42 UTC (permalink / raw) To: Jim Paris; +Cc: video4linux-list [-- Attachment #1.1: Type: text/plain, Size: 1600 bytes --] On Thu, 4 Dec 2008 12:15:46 -0500 Jim Paris <jim@jtan.com> wrote: > > Antonio Ospite wrote: > > Tested the latest version, I am getting "payload error"s setting > > frame_rate=50, loosing about 50% of frames. I tried raising > > bulk_size but then I get "frame overflow" errors from gspca, I'll > > investigate further. > > I don't think I see any payload errors even at 50fps. For the bulk > size, I'm not sure exactly how the payloads work into that. I suppose > that when bulk_size is larger than the camera's payload size (2048), > we get another payload header at data[2048] but don't pay attention to > it. If this header had the EOF then we can send gspca too much data, > causing frame overflow. (there's no overflow check in ov534 since > gspca handles it already). > > With the current setup, we're essentially getting a UVC stream. This > makes sense since the marketing for ov534 says it supports UVC. So > some documentation for this would be > http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip > I need to read something more about UVC. Ah, and from a quick test on PS3 it looks like the header is not added here, but I haven't had the chance to see what exactly happened. Hope to post some news soon. Regards, Antonio -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? Web site: http://www.studenti.unina.it/~ospite Public key: http://www.studenti.unina.it/~ospite/aopubkey.asc [-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0 of 4] ov534 patches 2008-12-06 17:42 ` Antonio Ospite @ 2008-12-09 21:21 ` Jim Paris 2008-12-10 16:07 ` Antonio Ospite 0 siblings, 1 reply; 12+ messages in thread From: Jim Paris @ 2008-12-09 21:21 UTC (permalink / raw) To: Antonio Ospite; +Cc: video4linux-list Antonio Ospite wrote: > I need to read something more about UVC. Me too. This bridge chip supports it -- maybe we just need to tweak the USB descriptors so that the existing UVC driver knows what to do? > Ah, and from a quick test on PS3 it looks like the header is not added > here, but I haven't had the chance to see what exactly happened. I'm relying on power on defaults, but we can also enable the header explicitly if that's more reliable. -jim -- ov534: explicitly initialize frame format Set frame format registers 0x0a and 0x0b to explicit values rather than relying on reset-time defaults Signed-off-by: Jim Paris <jim@jtan.com> diff -r bc3e6d69f66b linux/drivers/media/video/gspca/ov534.c --- a/linux/drivers/media/video/gspca/ov534.c Tue Dec 09 16:06:08 2008 -0500 +++ b/linux/drivers/media/video/gspca/ov534.c Tue Dec 09 16:20:30 2008 -0500 @@ -199,6 +199,10 @@ { 0x1d, 0x02 }, /* frame size 0x025800 * 4 = 614400 */ { 0x1d, 0x58 }, /* frame size */ { 0x1d, 0x00 }, /* frame size */ + + { 0x1c, 0x0a }, + { 0x1d, 0x08 }, /* turn on UVC header */ + { 0x1d, 0x0e }, /* .. */ { 0x8d, 0x1c }, { 0x8e, 0x80 }, -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0 of 4] ov534 patches 2008-12-09 21:21 ` Jim Paris @ 2008-12-10 16:07 ` Antonio Ospite 0 siblings, 0 replies; 12+ messages in thread From: Antonio Ospite @ 2008-12-10 16:07 UTC (permalink / raw) To: Jim Paris; +Cc: video4linux-list [-- Attachment #1.1: Type: text/plain, Size: 1485 bytes --] On Tue, 9 Dec 2008 16:21:27 -0500 Jim Paris <jim@jtan.com> wrote: > Antonio Ospite wrote: > > I need to read something more about UVC. > > Me too. This bridge chip supports it -- maybe we just need to tweak > the USB descriptors so that the existing UVC driver knows what to do? > > > Ah, and from a quick test on PS3 it looks like the header is not added > > here, but I haven't had the chance to see what exactly happened. > > I'm relying on power on defaults, but we can also enable the header > explicitly if that's more reliable. > > -jim > > -- > > ov534: explicitly initialize frame format > With this one, plus: ov534: improve payload handling the PlayStation eye works again on PS3 at 30fps. I haven't tested on PC at high frame rate yet, my main PC is broken right now. I'll also add QVGA resolution as soon as it is fixed, 320x240 is handy for skype and co. Jim, do you think a _per_resolution_ frame rate table is acceptable for now? We can switch to a formula in a second time if we figure out how to do that. I guess that registers values controlling frame rate are a function of the frame size, right? Thanks, Antonio -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? Web site: http://www.studenti.unina.it/~ospite Public key: http://www.studenti.unina.it/~ospite/aopubkey.asc [-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2008-12-10 16:08 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-03 20:46 [PATCH 0 of 4] ov534 patches Jim Paris 2008-12-03 20:47 ` [PATCH 1 of 4] ov534: don't check status twice Jim Paris 2008-12-03 20:47 ` [PATCH 2 of 4] ov534: initialization cleanup Jim Paris 2008-12-03 20:47 ` [PATCH 3 of 4] ov534: Fix frame size so we don't miss the last pixel Jim Paris 2008-12-03 20:47 ` [PATCH 4 of 4] ov534: frame transfer improvements Jim Paris 2008-12-04 8:14 ` [PATCH 0 of 4] ov534 patches Jean-Francois Moine 2008-12-04 12:05 ` Antonio Ospite 2008-12-09 21:12 ` Jim Paris 2008-12-04 17:15 ` Jim Paris 2008-12-06 17:42 ` Antonio Ospite 2008-12-09 21:21 ` Jim Paris 2008-12-10 16:07 ` Antonio Ospite
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox