1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
. [1]Home
Quickcam Web driver for Linux
This page exists to summarize the results of my reverse engineering of
the Logitech Quickcam Web. I have my own variant
[2]quickcam-web.tar.gz of Georg's quickcam driver which is working
with my cam in both compressed and uncompressed modes. The
decompression code is included. It takes some MMX optimized routines
from libmpeg2 which are also included. Note: You may need to choose
between MMXEXT or MMX by changing the value of vo_mm_accel at the end
of decode-lvc.c. Set it to 0 for no MMX.
Cristiano de Michele has added the necessary patches to the [3]qce-ga
driver, to get full video4linux support. His [4]quickcam web driver
based on qce-ga works with minimal changes to the official qce-ga
driver and will hopefully be included soon. It doesn't support
compressed mode, though. This is one reason why it is so much slower.
Quickcam Web (as seen by its twin brother)
Links to other sites
* [5]Quickcam express driver
* [6]Georg Acher's Quickcam page
Most of the remaining text is probably black magic to you. But if not,
read on :)
Components
The Logitech Quickcam Web consists of a STV0610 for USB communication
and the imaging chip VV6410. The [7]VV6410 has good public
documentation, but the STV0610 seems to be kept secret.
STV0610 ASIC
The STV0610 works similar to the STV0600, but has several more
registers. Here is a complete register dump taken just after plugging
in the cam. Spaces mark that the registers are not giving out values.
The dump was produced by qcdump which is included in the tar.gz
package I mentioned above.
Range 0x400 - 0x600
400: 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
410:
420: a2 07 06 00 00
540: 00 04 00 00 00 00 00 00 00 04 00 00 00 00 00 00
550: 00 04
560: 40 00 80 80
This seems to be some registers shadowed from 0x1xxx. They always
contain the same value; changing one changes the other, too. The
Logitech driver writes to these register set and writes a "1" to
register 0x1704 afterwards. For explanation of the contents see the
0x1xxx area.
Range 0x1400-0x1424
1400: 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1410:
1420: a2 07 06 00 00 ; I2C_ADDR, I2C_LENGTH I2C_RW, REG23, I2C_TXCOUNT
This is the I2C area. The registers 0x1400-0x140f contain the i2c
register numbers, the register 0x1410-0x141f their values.
Register 0x1420 contains the address of the I2C partner, 0x1421 the
number of valid register/value pairs minus 1. Register 0x1422 is 1 for
write, 3 for read commands. The registers 0x1400-0x1422 are normally
written in one big bunch for an I2C command.
The purpose of 0x1423 is still unknown: sometimes it is set to 4
sometimes to 5, I don't know.
The register 0x1424 gives the number of succesfully transmitted i2c
register values.
When reading two I2C register the results are written to 0x1410 and
0x1412, instead of 0x1410-0x1411. Don't know why.
Range 0x1440-0x1424
1440: 00 00 12 00 00 00 ; ISO_ENABLE, ?,?, SCAN_RATE, ?, LED
0x1440 turn ISO stream (image data stream) on(1) or off(0)
0x1443 SCAN_RATE (?)
0x1445 turn LED on(1) or off(0)
Range 0x1500-0x15ff
1500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1520: 00 00 00 00 00 00 00 00 00 00 00
1530: 00 00 00 00 00 00 00 00 00 00 00 00
1540: 00 04 00 00 00 00 00 00 00 04 00 00 00 00 00 00
1550: 00 04 00 00 00 00 00 00 00
1560: 40 00 80 80 00 ff 0a 01 00 00 00 00
1580: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1590: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
15a0: 00 00 00 00 00 00 00
15c0: 00 ff 03 00 84 00 00 00 0f 00
0x1580 - 0x15a6 Various compression quality parameters?
According to Georg Acher:
0x15c1/0x15c2 Max. ISO packet size L/H
0x15c3 Y-Control, 1: 288 lines, 2: 144 lines
0x1680?? X-Control, 0xa: 352 columns, 6: 176 columns
I don't know anything about the remaining registers. I may fill in
more later.
Range 0x1600-0x16ff
1600: 41 3f 00 00 00 00 00 00 00 3f 2a 7f 0a 00 01 02
1610: 00 00 00 c9 00 00 40 1f 00 40 1f 00 80 bb 00
1620: 00 00 00
1630: 00 01
I don't know anything about these registers.
Registers 1701, 1704, b000
1 4
1700: 00 00
0x1704 is written when a 0x400-0x5ff register is accessed.
b000: 00
????
Registers 0xe000-0xefff
e000: 12 01 00 01 ff ff ff 08 6d 04 50 08 00 01 00 01
e010: 00 01 09 02 b6 00 03 01 00 80 32 09 04 00 00 02
e020: ff ff ff 00 07 05 81 01 00 00 01 07 05 82 03 01
e030: 00 10 09 04 00 01 02 ff ff ff 00 07 05 81 01 ff
e040: 03 01 07 05 82 03 01 00 10 09 04 01 00 00 01 01
e050: 00 00 09 24 01 00 01 27 00 01 02 0c 24 02 01 01
e060: 02 00 01 00 00 00 00 09 24 06 02 01 02 43 00 00
e070: 09 24 03 03 01 01 00 02 00 09 04 02 00 01 01 02
e080: 00 00 09 05 83 01 00 00 01 00 00 09 04 02 01 01
e090: 01 02 00 00 07 24 01 03 01 01 00 1d 24 02 01 01
e0a0: 02 10 07 40 1f 00 11 28 00 80 3e 00 22 56 00 00
e0b0: 7d 00 44 ac 00 80 bb 00 09 05 83 01 64 00 01 00
e0c0: 00 07 25 01 01 00 00 00 04 03 09 04 0e 03 43 00 ......C.
e0d0: 61 00 6d 00 65 00 72 00 61 00 00 00 00 00 00 00 a.m.e.r. a.
e0e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
....
e1f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Registers 0xe000-0xe0c8 is the USB info block. This contains the same
as /proc/bus/usb/001/*. This 512 bytes repeats over and over up to
0xefff. I haven't tested whether you can write to this space.
Registers 0xf000-0xffff
f000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
....
fff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
As you can see they are completely zero. They aren't accessed by the
Logitech driver.
Compression
The Logitech Quickcam Web can deliver their images in compressed
format. The image format is a kind of JPEG, but without headers
describing the encoding. Instead the encoding is fixed. Every block
starts with a bit selecting the quantizer scale and 10 bits
representing the zeroth element of the DCT matrix. After this the
huffman codes follow. Here is the [8]huffman table. The last element
is marked by the huffman code 0110. Before every fourth block (i.e.
also before the first) there is a four bit number that has to do with
the quantizer scale, but it is always 7 in my experiments. The file
[9]decode-lvc.c contains the code interpreting the huffman blocks and
sending the result through an Inverse DCT, do a YUV transformation and
return the RGB pixels.
_________________________________________________________________
Last updated Jan 23, 2002.
|