media: zoran: remove deprecated driver
The zoran driver has been marked deprecated for a year now without any interest to update this driver to the vb2 framework. Time to remove it altogether. Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
a4dfc8a247
commit
8dce4b265a
@ -65,5 +65,4 @@ For more details see the file COPYING in the source distribution of Linux.
|
||||
soc-camera
|
||||
uvcvideo
|
||||
vivid
|
||||
zoran
|
||||
zr364xx
|
||||
|
@ -1,583 +0,0 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
The Zoran driver
|
||||
================
|
||||
|
||||
unified zoran driver (zr360x7, zoran, buz, dc10(+), dc30(+), lml33)
|
||||
|
||||
website: http://mjpeg.sourceforge.net/driver-zoran/
|
||||
|
||||
|
||||
Frequently Asked Questions
|
||||
--------------------------
|
||||
|
||||
What cards are supported
|
||||
------------------------
|
||||
|
||||
Iomega Buz, Linux Media Labs LML33/LML33R10, Pinnacle/Miro
|
||||
DC10/DC10+/DC30/DC30+ and related boards (available under various names).
|
||||
|
||||
Iomega Buz
|
||||
~~~~~~~~~~
|
||||
|
||||
* Zoran zr36067 PCI controller
|
||||
* Zoran zr36060 MJPEG codec
|
||||
* Philips saa7111 TV decoder
|
||||
* Philips saa7185 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, saa7111, saa7185, zr36060, zr36067
|
||||
|
||||
Inputs/outputs: Composite and S-video
|
||||
|
||||
Norms: PAL, SECAM (720x576 @ 25 fps), NTSC (720x480 @ 29.97 fps)
|
||||
|
||||
Card number: 7
|
||||
|
||||
AverMedia 6 Eyes AVS6EYES
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Zoran zr36067 PCI controller
|
||||
* Zoran zr36060 MJPEG codec
|
||||
* Samsung ks0127 TV decoder
|
||||
* Conexant bt866 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, ks0127, bt866, zr36060, zr36067
|
||||
|
||||
Inputs/outputs:
|
||||
Six physical inputs. 1-6 are composite,
|
||||
1-2, 3-4, 5-6 doubles as S-video,
|
||||
1-3 triples as component.
|
||||
One composite output.
|
||||
|
||||
Norms: PAL, SECAM (720x576 @ 25 fps), NTSC (720x480 @ 29.97 fps)
|
||||
|
||||
Card number: 8
|
||||
|
||||
.. note::
|
||||
|
||||
Not autodetected, card=8 is necessary.
|
||||
|
||||
Linux Media Labs LML33
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Zoran zr36067 PCI controller
|
||||
* Zoran zr36060 MJPEG codec
|
||||
* Brooktree bt819 TV decoder
|
||||
* Brooktree bt856 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, bt819, bt856, zr36060, zr36067
|
||||
|
||||
Inputs/outputs: Composite and S-video
|
||||
|
||||
Norms: PAL (720x576 @ 25 fps), NTSC (720x480 @ 29.97 fps)
|
||||
|
||||
Card number: 5
|
||||
|
||||
Linux Media Labs LML33R10
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Zoran zr36067 PCI controller
|
||||
* Zoran zr36060 MJPEG codec
|
||||
* Philips saa7114 TV decoder
|
||||
* Analog Devices adv7170 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, saa7114, adv7170, zr36060, zr36067
|
||||
|
||||
Inputs/outputs: Composite and S-video
|
||||
|
||||
Norms: PAL (720x576 @ 25 fps), NTSC (720x480 @ 29.97 fps)
|
||||
|
||||
Card number: 6
|
||||
|
||||
Pinnacle/Miro DC10(new)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Zoran zr36057 PCI controller
|
||||
* Zoran zr36060 MJPEG codec
|
||||
* Philips saa7110a TV decoder
|
||||
* Analog Devices adv7176 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, saa7110, adv7175, zr36060, zr36067
|
||||
|
||||
Inputs/outputs: Composite, S-video and Internal
|
||||
|
||||
Norms: PAL, SECAM (768x576 @ 25 fps), NTSC (640x480 @ 29.97 fps)
|
||||
|
||||
Card number: 1
|
||||
|
||||
Pinnacle/Miro DC10+
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Zoran zr36067 PCI controller
|
||||
* Zoran zr36060 MJPEG codec
|
||||
* Philips saa7110a TV decoder
|
||||
* Analog Devices adv7176 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, sa7110, adv7175, zr36060, zr36067
|
||||
|
||||
Inputs/outputs: Composite, S-video and Internal
|
||||
|
||||
Norms: PAL, SECAM (768x576 @ 25 fps), NTSC (640x480 @ 29.97 fps)
|
||||
|
||||
Card number: 2
|
||||
|
||||
Pinnacle/Miro DC10(old)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Zoran zr36057 PCI controller
|
||||
* Zoran zr36050 MJPEG codec
|
||||
* Zoran zr36016 Video Front End or Fuji md0211 Video Front End (clone?)
|
||||
* Micronas vpx3220a TV decoder
|
||||
* mse3000 TV encoder or Analog Devices adv7176 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, vpx3220, mse3000/adv7175, zr36050, zr36016, zr36067
|
||||
|
||||
Inputs/outputs: Composite, S-video and Internal
|
||||
|
||||
Norms: PAL, SECAM (768x576 @ 25 fps), NTSC (640x480 @ 29.97 fps)
|
||||
|
||||
Card number: 0
|
||||
|
||||
Pinnacle/Miro DC30
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Zoran zr36057 PCI controller
|
||||
* Zoran zr36050 MJPEG codec
|
||||
* Zoran zr36016 Video Front End
|
||||
* Micronas vpx3225d/vpx3220a/vpx3216b TV decoder
|
||||
* Analog Devices adv7176 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, vpx3220/vpx3224, adv7175, zr36050, zr36016, zr36067
|
||||
|
||||
Inputs/outputs: Composite, S-video and Internal
|
||||
|
||||
Norms: PAL, SECAM (768x576 @ 25 fps), NTSC (640x480 @ 29.97 fps)
|
||||
|
||||
Card number: 3
|
||||
|
||||
Pinnacle/Miro DC30+
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Zoran zr36067 PCI controller
|
||||
* Zoran zr36050 MJPEG codec
|
||||
* Zoran zr36016 Video Front End
|
||||
* Micronas vpx3225d/vpx3220a/vpx3216b TV decoder
|
||||
* Analog Devices adv7176 TV encoder
|
||||
|
||||
Drivers to use: videodev, i2c-core, i2c-algo-bit,
|
||||
videocodec, vpx3220/vpx3224, adv7175, zr36050, zr36015, zr36067
|
||||
|
||||
Inputs/outputs: Composite, S-video and Internal
|
||||
|
||||
Norms: PAL, SECAM (768x576 @ 25 fps), NTSC (640x480 @ 29.97 fps)
|
||||
|
||||
Card number: 4
|
||||
|
||||
.. note::
|
||||
|
||||
#) No module for the mse3000 is available yet
|
||||
#) No module for the vpx3224 is available yet
|
||||
|
||||
1.1 What the TV decoder can do an what not
|
||||
------------------------------------------
|
||||
|
||||
The best know TV standards are NTSC/PAL/SECAM. but for decoding a frame that
|
||||
information is not enough. There are several formats of the TV standards.
|
||||
And not every TV decoder is able to handle every format. Also the every
|
||||
combination is supported by the driver. There are currently 11 different
|
||||
tv broadcast formats all aver the world.
|
||||
|
||||
The CCIR defines parameters needed for broadcasting the signal.
|
||||
The CCIR has defined different standards: A,B,D,E,F,G,D,H,I,K,K1,L,M,N,...
|
||||
The CCIR says not much about the colorsystem used !!!
|
||||
And talking about a colorsystem says not to much about how it is broadcast.
|
||||
|
||||
The CCIR standards A,E,F are not used any more.
|
||||
|
||||
When you speak about NTSC, you usually mean the standard: CCIR - M using
|
||||
the NTSC colorsystem which is used in the USA, Japan, Mexico, Canada
|
||||
and a few others.
|
||||
|
||||
When you talk about PAL, you usually mean: CCIR - B/G using the PAL
|
||||
colorsystem which is used in many Countries.
|
||||
|
||||
When you talk about SECAM, you mean: CCIR - L using the SECAM Colorsystem
|
||||
which is used in France, and a few others.
|
||||
|
||||
There the other version of SECAM, CCIR - D/K is used in Bulgaria, China,
|
||||
Slovakai, Hungary, Korea (Rep.), Poland, Rumania and a others.
|
||||
|
||||
The CCIR - H uses the PAL colorsystem (sometimes SECAM) and is used in
|
||||
Egypt, Libya, Sri Lanka, Syrain Arab. Rep.
|
||||
|
||||
The CCIR - I uses the PAL colorsystem, and is used in Great Britain, Hong Kong,
|
||||
Ireland, Nigeria, South Africa.
|
||||
|
||||
The CCIR - N uses the PAL colorsystem and PAL frame size but the NTSC framerate,
|
||||
and is used in Argentinia, Uruguay, an a few others
|
||||
|
||||
We do not talk about how the audio is broadcast !
|
||||
|
||||
A rather good sites about the TV standards are:
|
||||
http://www.sony.jp/support/
|
||||
http://info.electronicwerkstatt.de/bereiche/fernsehtechnik/frequenzen_und_normen/Fernsehnormen/
|
||||
and http://www.cabl.com/restaurant/channel.html
|
||||
|
||||
Other weird things around: NTSC 4.43 is a modificated NTSC, which is mainly
|
||||
used in PAL VCR's that are able to play back NTSC. PAL 60 seems to be the same
|
||||
as NTSC 4.43 . The Datasheets also talk about NTSC 44, It seems as if it would
|
||||
be the same as NTSC 4.43.
|
||||
NTSC Combs seems to be a decoder mode where the decoder uses a comb filter
|
||||
to split coma and luma instead of a Delay line.
|
||||
|
||||
But I did not defiantly find out what NTSC Comb is.
|
||||
|
||||
Philips saa7111 TV decoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 1997, is used in the BUZ and
|
||||
- can handle: PAL B/G/H/I, PAL N, PAL M, NTSC M, NTSC N, NTSC 4.43 and SECAM
|
||||
|
||||
Philips saa7110a TV decoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 1995, is used in the Pinnacle/Miro DC10(new), DC10+ and
|
||||
- can handle: PAL B/G, NTSC M and SECAM
|
||||
|
||||
Philips saa7114 TV decoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 2000, is used in the LML33R10 and
|
||||
- can handle: PAL B/G/D/H/I/N, PAL N, PAL M, NTSC M, NTSC 4.43 and SECAM
|
||||
|
||||
Brooktree bt819 TV decoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 1996, and is used in the LML33 and
|
||||
- can handle: PAL B/D/G/H/I, NTSC M
|
||||
|
||||
Micronas vpx3220a TV decoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 1996, is used in the DC30 and DC30+ and
|
||||
- can handle: PAL B/G/H/I, PAL N, PAL M, NTSC M, NTSC 44, PAL 60, SECAM,NTSC Comb
|
||||
|
||||
Samsung ks0127 TV decoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- is used in the AVS6EYES card and
|
||||
- can handle: NTSC-M/N/44, PAL-M/N/B/G/H/I/D/K/L and SECAM
|
||||
|
||||
|
||||
What the TV encoder can do an what not
|
||||
--------------------------------------
|
||||
|
||||
The TV encoder are doing the "same" as the decoder, but in the oder direction.
|
||||
You feed them digital data and the generate a Composite or SVHS signal.
|
||||
For information about the colorsystems and TV norm take a look in the
|
||||
TV decoder section.
|
||||
|
||||
Philips saa7185 TV Encoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 1996, is used in the BUZ
|
||||
- can generate: PAL B/G, NTSC M
|
||||
|
||||
Brooktree bt856 TV Encoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 1994, is used in the LML33
|
||||
- can generate: PAL B/D/G/H/I/N, PAL M, NTSC M, PAL-N (Argentina)
|
||||
|
||||
Analog Devices adv7170 TV Encoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 2000, is used in the LML300R10
|
||||
- can generate: PAL B/D/G/H/I/N, PAL M, NTSC M, PAL 60
|
||||
|
||||
Analog Devices adv7175 TV Encoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 1996, is used in the DC10, DC10+, DC10 old, DC30, DC30+
|
||||
- can generate: PAL B/D/G/H/I/N, PAL M, NTSC M
|
||||
|
||||
ITT mse3000 TV encoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- was introduced in 1991, is used in the DC10 old
|
||||
- can generate: PAL , NTSC , SECAM
|
||||
|
||||
Conexant bt866 TV encoder
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- is used in AVS6EYES, and
|
||||
- can generate: NTSC/PAL, PALM, PALN
|
||||
|
||||
The adv717x, should be able to produce PAL N. But you find nothing PAL N
|
||||
specific in the registers. Seem that you have to reuse a other standard
|
||||
to generate PAL N, maybe it would work if you use the PAL M settings.
|
||||
|
||||
How do I get this damn thing to work
|
||||
------------------------------------
|
||||
|
||||
Load zr36067.o. If it can't autodetect your card, use the card=X insmod
|
||||
option with X being the card number as given in the previous section.
|
||||
To have more than one card, use card=X1[,X2[,X3,[X4[..]]]]
|
||||
|
||||
To automate this, add the following to your /etc/modprobe.d/zoran.conf:
|
||||
|
||||
options zr36067 card=X1[,X2[,X3[,X4[..]]]]
|
||||
alias char-major-81-0 zr36067
|
||||
|
||||
One thing to keep in mind is that this doesn't load zr36067.o itself yet. It
|
||||
just automates loading. If you start using xawtv, the device won't load on
|
||||
some systems, since you're trying to load modules as a user, which is not
|
||||
allowed ("permission denied"). A quick workaround is to add 'Load "v4l"' to
|
||||
XF86Config-4 when you use X by default, or to run 'v4l-conf -c <device>' in
|
||||
one of your startup scripts (normally rc.local) if you don't use X. Both
|
||||
make sure that the modules are loaded on startup, under the root account.
|
||||
|
||||
What mainboard should I use (or why doesn't my card work)
|
||||
---------------------------------------------------------
|
||||
|
||||
|
||||
<insert lousy disclaimer here>. In short: good=SiS/Intel, bad=VIA.
|
||||
|
||||
Experience tells us that people with a Buz, on average, have more problems
|
||||
than users with a DC10+/LML33. Also, it tells us that people owning a VIA-
|
||||
based mainboard (ktXXX, MVP3) have more problems than users with a mainboard
|
||||
based on a different chipset. Here's some notes from Andrew Stevens:
|
||||
|
||||
Here's my experience of using LML33 and Buz on various motherboards:
|
||||
|
||||
- VIA MVP3
|
||||
- Forget it. Pointless. Doesn't work.
|
||||
- Intel 430FX (Pentium 200)
|
||||
- LML33 perfect, Buz tolerable (3 or 4 frames dropped per movie)
|
||||
- Intel 440BX (early stepping)
|
||||
- LML33 tolerable. Buz starting to get annoying (6-10 frames/hour)
|
||||
- Intel 440BX (late stepping)
|
||||
- Buz tolerable, LML3 almost perfect (occasional single frame drops)
|
||||
- SiS735
|
||||
- LML33 perfect, Buz tolerable.
|
||||
- VIA KT133(*)
|
||||
- LML33 starting to get annoying, Buz poor enough that I have up.
|
||||
|
||||
- Both 440BX boards were dual CPU versions.
|
||||
|
||||
Bernhard Praschinger later added:
|
||||
|
||||
- AMD 751
|
||||
- Buz perfect-tolerable
|
||||
- AMD 760
|
||||
- Buz perfect-tolerable
|
||||
|
||||
In general, people on the user mailinglist won't give you much of a chance
|
||||
if you have a VIA-based motherboard. They may be cheap, but sometimes, you'd
|
||||
rather want to spend some more money on better boards. In general, VIA
|
||||
mainboard's IDE/PCI performance will also suck badly compared to others.
|
||||
You'll noticed the DC10+/DC30+ aren't mentioned anywhere in the overview.
|
||||
Basically, you can assume that if the Buz works, the LML33 will work too. If
|
||||
the LML33 works, the DC10+/DC30+ will work too. They're most tolerant to
|
||||
different mainboard chipsets from all of the supported cards.
|
||||
|
||||
If you experience timeouts during capture, buy a better mainboard or lower
|
||||
the quality/buffersize during capture (see 'Concerning buffer sizes, quality,
|
||||
output size etc.'). If it hangs, there's little we can do as of now. Check
|
||||
your IRQs and make sure the card has its own interrupts.
|
||||
|
||||
Programming interface
|
||||
---------------------
|
||||
|
||||
This driver conforms to video4linux2. Support for V4L1 and for the custom
|
||||
zoran ioctls has been removed in kernel 2.6.38.
|
||||
|
||||
For programming example, please, look at lavrec.c and lavplay.c code in
|
||||
the MJPEG-tools (http://mjpeg.sf.net/).
|
||||
|
||||
Additional notes for software developers:
|
||||
|
||||
The driver returns maxwidth and maxheight parameters according to
|
||||
the current TV standard (norm). Therefore, the software which
|
||||
communicates with the driver and "asks" for these parameters should
|
||||
first set the correct norm. Well, it seems logically correct: TV
|
||||
standard is "more constant" for current country than geometry
|
||||
settings of a variety of TV capture cards which may work in ITU or
|
||||
square pixel format.
|
||||
|
||||
Applications
|
||||
------------
|
||||
|
||||
Applications known to work with this driver:
|
||||
|
||||
TV viewing:
|
||||
|
||||
* xawtv
|
||||
* kwintv
|
||||
* probably any TV application that supports video4linux or video4linux2.
|
||||
|
||||
MJPEG capture/playback:
|
||||
|
||||
* mjpegtools/lavtools (or Linux Video Studio)
|
||||
* gstreamer
|
||||
* mplayer
|
||||
|
||||
General raw capture:
|
||||
|
||||
* xawtv
|
||||
* gstreamer
|
||||
* probably any application that supports video4linux or video4linux2
|
||||
|
||||
Video editing:
|
||||
|
||||
* Cinelerra
|
||||
* MainActor
|
||||
* mjpegtools (or Linux Video Studio)
|
||||
|
||||
|
||||
Concerning buffer sizes, quality, output size etc.
|
||||
--------------------------------------------------
|
||||
|
||||
|
||||
The zr36060 can do 1:2 JPEG compression. This is really the theoretical
|
||||
maximum that the chipset can reach. The driver can, however, limit compression
|
||||
to a maximum (size) of 1:4. The reason for this is that some cards (e.g. Buz)
|
||||
can't handle 1:2 compression without stopping capture after only a few minutes.
|
||||
With 1:4, it'll mostly work. If you have a Buz, use 'low_bitrate=1' to go into
|
||||
1:4 max. compression mode.
|
||||
|
||||
100% JPEG quality is thus 1:2 compression in practice. So for a full PAL frame
|
||||
(size 720x576). The JPEG fields are stored in YUY2 format, so the size of the
|
||||
fields are 720x288x16/2 bits/field (2 fields/frame) = 207360 bytes/field x 2 =
|
||||
414720 bytes/frame (add some more bytes for headers and DHT (huffman)/DQT
|
||||
(quantization) tables, and you'll get to something like 512kB per frame for
|
||||
1:2 compression. For 1:4 compression, you'd have frames of half this size.
|
||||
|
||||
Some additional explanation by Martin Samuelsson, which also explains the
|
||||
importance of buffer sizes:
|
||||
--
|
||||
> Hmm, I do not think it is really that way. With the current (downloaded
|
||||
> at 18:00 Monday) driver I get that output sizes for 10 sec:
|
||||
> -q 50 -b 128 : 24.283.332 Bytes
|
||||
> -q 50 -b 256 : 48.442.368
|
||||
> -q 25 -b 128 : 24.655.992
|
||||
> -q 25 -b 256 : 25.859.820
|
||||
|
||||
I woke up, and can't go to sleep again. I'll kill some time explaining why
|
||||
this doesn't look strange to me.
|
||||
|
||||
Let's do some math using a width of 704 pixels. I'm not sure whether the Buz
|
||||
actually use that number or not, but that's not too important right now.
|
||||
|
||||
704x288 pixels, one field, is 202752 pixels. Divided by 64 pixels per block;
|
||||
3168 blocks per field. Each pixel consist of two bytes; 128 bytes per block;
|
||||
1024 bits per block. 100% in the new driver mean 1:2 compression; the maximum
|
||||
output becomes 512 bits per block. Actually 510, but 512 is simpler to use
|
||||
for calculations.
|
||||
|
||||
Let's say that we specify d1q50. We thus want 256 bits per block; times 3168
|
||||
becomes 811008 bits; 101376 bytes per field. We're talking raw bits and bytes
|
||||
here, so we don't need to do any fancy corrections for bits-per-pixel or such
|
||||
things. 101376 bytes per field.
|
||||
|
||||
d1 video contains two fields per frame. Those sum up to 202752 bytes per
|
||||
frame, and one of those frames goes into each buffer.
|
||||
|
||||
But wait a second! -b128 gives 128kB buffers! It's not possible to cram
|
||||
202752 bytes of JPEG data into 128kB!
|
||||
|
||||
This is what the driver notice and automatically compensate for in your
|
||||
examples. Let's do some math using this information:
|
||||
|
||||
128kB is 131072 bytes. In this buffer, we want to store two fields, which
|
||||
leaves 65536 bytes for each field. Using 3168 blocks per field, we get
|
||||
20.68686868... available bytes per block; 165 bits. We can't allow the
|
||||
request for 256 bits per block when there's only 165 bits available! The -q50
|
||||
option is silently overridden, and the -b128 option takes precedence, leaving
|
||||
us with the equivalence of -q32.
|
||||
|
||||
This gives us a data rate of 165 bits per block, which, times 3168, sums up
|
||||
to 65340 bytes per field, out of the allowed 65536. The current driver has
|
||||
another level of rate limiting; it won't accept -q values that fill more than
|
||||
6/8 of the specified buffers. (I'm not sure why. "Playing it safe" seem to be
|
||||
a safe bet. Personally, I think I would have lowered requested-bits-per-block
|
||||
by one, or something like that.) We can't use 165 bits per block, but have to
|
||||
lower it again, to 6/8 of the available buffer space: We end up with 124 bits
|
||||
per block, the equivalence of -q24. With 128kB buffers, you can't use greater
|
||||
than -q24 at -d1. (And PAL, and 704 pixels width...)
|
||||
|
||||
The third example is limited to -q24 through the same process. The second
|
||||
example, using very similar calculations, is limited to -q48. The only
|
||||
example that actually grab at the specified -q value is the last one, which
|
||||
is clearly visible, looking at the file size.
|
||||
--
|
||||
|
||||
Conclusion: the quality of the resulting movie depends on buffer size, quality,
|
||||
whether or not you use 'low_bitrate=1' as insmod option for the zr36060.c
|
||||
module to do 1:4 instead of 1:2 compression, etc.
|
||||
|
||||
If you experience timeouts, lowering the quality/buffersize or using
|
||||
'low_bitrate=1 as insmod option for zr36060.o might actually help, as is
|
||||
proven by the Buz.
|
||||
|
||||
It hangs/crashes/fails/whatevers! Help!
|
||||
---------------------------------------
|
||||
|
||||
Make sure that the card has its own interrupts (see /proc/interrupts), check
|
||||
the output of dmesg at high verbosity (load zr36067.o with debug=2,
|
||||
load all other modules with debug=1). Check that your mainboard is favorable
|
||||
(see question 2) and if not, test the card in another computer. Also see the
|
||||
notes given in question 3 and try lowering quality/buffersize/capturesize
|
||||
if recording fails after a period of time.
|
||||
|
||||
If all this doesn't help, give a clear description of the problem including
|
||||
detailed hardware information (memory+brand, mainboard+chipset+brand, which
|
||||
MJPEG card, processor, other PCI cards that might be of interest), give the
|
||||
system PnP information (/proc/interrupts, /proc/dma, /proc/devices), and give
|
||||
the kernel version, driver version, glibc version, gcc version and any other
|
||||
information that might possibly be of interest. Also provide the dmesg output
|
||||
at high verbosity. See 'Contacting' on how to contact the developers.
|
||||
|
||||
Maintainers/Contacting
|
||||
----------------------
|
||||
|
||||
The driver is currently maintained by Laurent Pinchart and Ronald Bultje
|
||||
(<laurent.pinchart@skynet.be> and <rbultje@ronald.bitfreak.net>). For bug
|
||||
reports or questions, please contact the mailinglist instead of the developers
|
||||
individually. For user questions (i.e. bug reports or how-to questions), send
|
||||
an email to <mjpeg-users@lists.sf.net>, for developers (i.e. if you want to
|
||||
help programming), send an email to <mjpeg-developer@lists.sf.net>. See
|
||||
http://www.sf.net/projects/mjpeg/ for subscription information.
|
||||
|
||||
For bug reports, be sure to include all the information as described in
|
||||
the section 'It hangs/crashes/fails/whatevers! Help!'. Please make sure
|
||||
you're using the latest version (http://mjpeg.sf.net/driver-zoran/).
|
||||
|
||||
Previous maintainers/developers of this driver include Serguei Miridonov
|
||||
<mirsev@cicese.mx>, Wolfgang Scherr <scherr@net4you.net>, Dave Perks
|
||||
<dperks@ibm.net> and Rainer Johanni <Rainer@Johanni.de>.
|
||||
|
||||
Driver's License
|
||||
----------------
|
||||
|
||||
This driver is distributed under the terms of the General Public License.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
See http://www.gnu.org/ for more information.
|
@ -33,8 +33,6 @@ source "drivers/staging/media/sunxi/Kconfig"
|
||||
|
||||
source "drivers/staging/media/tegra-vde/Kconfig"
|
||||
|
||||
source "drivers/staging/media/zoran/Kconfig"
|
||||
|
||||
source "drivers/staging/media/ipu3/Kconfig"
|
||||
|
||||
source "drivers/staging/media/soc_camera/Kconfig"
|
||||
|
@ -5,7 +5,6 @@ obj-$(CONFIG_VIDEO_DM365_VPFE) += davinci_vpfe/
|
||||
obj-$(CONFIG_VIDEO_OMAP4) += omap4iss/
|
||||
obj-$(CONFIG_VIDEO_SUNXI) += sunxi/
|
||||
obj-$(CONFIG_TEGRA_VDE) += tegra-vde/
|
||||
obj-$(CONFIG_VIDEO_ZORAN) += zoran/
|
||||
obj-$(CONFIG_VIDEO_ROCKCHIP_VPU) += rockchip/vpu/
|
||||
obj-$(CONFIG_VIDEO_IPU3_IMGU) += ipu3/
|
||||
obj-$(CONFIG_SOC_CAMERA) += soc_camera/
|
||||
|
@ -1,75 +0,0 @@
|
||||
config VIDEO_ZORAN
|
||||
tristate "Zoran ZR36057/36067 Video For Linux (Deprecated)"
|
||||
depends on PCI && I2C_ALGOBIT && VIDEO_V4L2 && VIRT_TO_BUS
|
||||
depends on !ALPHA
|
||||
help
|
||||
Say Y for support for MJPEG capture cards based on the Zoran
|
||||
36057/36067 PCI controller chipset. This includes the Iomega
|
||||
Buz, Pinnacle DC10+ and the Linux Media Labs LML33. There is
|
||||
a driver homepage at <http://mjpeg.sf.net/driver-zoran/>. For
|
||||
more information, check <file:Documentation/media/v4l-drivers/zoran.rst>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called zr36067.
|
||||
|
||||
config VIDEO_ZORAN_DC30
|
||||
tristate "Pinnacle/Miro DC30(+) support"
|
||||
depends on VIDEO_ZORAN
|
||||
select VIDEO_ADV7175 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_VPX3220 if MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
Support for the Pinnacle/Miro DC30(+) MJPEG capture/playback
|
||||
card. This also supports really old DC10 cards based on the
|
||||
zr36050 MJPEG codec and zr36016 VFE.
|
||||
|
||||
config VIDEO_ZORAN_ZR36060
|
||||
tristate "Zoran ZR36060"
|
||||
depends on VIDEO_ZORAN
|
||||
help
|
||||
Say Y to support Zoran boards based on 36060 chips.
|
||||
This includes Iomega Buz, Pinnacle DC10, Linux media Labs 33
|
||||
and 33 R10 and AverMedia 6 boards.
|
||||
|
||||
config VIDEO_ZORAN_BUZ
|
||||
tristate "Iomega Buz support"
|
||||
depends on VIDEO_ZORAN_ZR36060
|
||||
select VIDEO_SAA711X if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_SAA7185 if MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
Support for the Iomega Buz MJPEG capture/playback card.
|
||||
|
||||
config VIDEO_ZORAN_DC10
|
||||
tristate "Pinnacle/Miro DC10(+) support"
|
||||
depends on VIDEO_ZORAN_ZR36060
|
||||
select VIDEO_SAA7110 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_ADV7175 if MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
Support for the Pinnacle/Miro DC10(+) MJPEG capture/playback
|
||||
card.
|
||||
|
||||
config VIDEO_ZORAN_LML33
|
||||
tristate "Linux Media Labs LML33 support"
|
||||
depends on VIDEO_ZORAN_ZR36060
|
||||
select VIDEO_BT819 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_BT856 if MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
Support for the Linux Media Labs LML33 MJPEG capture/playback
|
||||
card.
|
||||
|
||||
config VIDEO_ZORAN_LML33R10
|
||||
tristate "Linux Media Labs LML33R10 support"
|
||||
depends on VIDEO_ZORAN_ZR36060
|
||||
select VIDEO_SAA711X if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_ADV7170 if MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
support for the Linux Media Labs LML33R10 MJPEG capture/playback
|
||||
card.
|
||||
|
||||
config VIDEO_ZORAN_AVS6EYES
|
||||
tristate "AverMedia 6 Eyes support"
|
||||
depends on VIDEO_ZORAN_ZR36060
|
||||
select VIDEO_BT856 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_BT866 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_KS0127 if MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
Support for the AverMedia 6 Eyes video surveillance card.
|
@ -1,7 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
zr36067-objs := zoran_procfs.o zoran_device.o \
|
||||
zoran_driver.o zoran_card.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_ZORAN) += zr36067.o videocodec.o
|
||||
obj-$(CONFIG_VIDEO_ZORAN_DC30) += zr36050.o zr36016.o
|
||||
obj-$(CONFIG_VIDEO_ZORAN_ZR36060) += zr36060.o
|
@ -1,4 +0,0 @@
|
||||
The zoran driver is marked deprecated. It will be removed
|
||||
around May 2019 unless someone is willing to update this
|
||||
driver to the latest V4L2 frameworks (especially the vb2
|
||||
framework).
|
@ -1,391 +0,0 @@
|
||||
/*
|
||||
* VIDEO MOTION CODECs internal API for video devices
|
||||
*
|
||||
* Interface for MJPEG (and maybe later MPEG/WAVELETS) codec's
|
||||
* bound to a master device.
|
||||
*
|
||||
* (c) 2002 Wolfgang Scherr <scherr@net4you.at>
|
||||
*
|
||||
* $Id: videocodec.c,v 1.1.2.8 2003/03/29 07:16:04 rbultje Exp $
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define VIDEOCODEC_VERSION "v0.2"
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
// kernel config is here (procfs flag)
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/uaccess.h>
|
||||
#endif
|
||||
|
||||
#include "videocodec.h"
|
||||
|
||||
static int debug;
|
||||
module_param(debug, int, 0);
|
||||
MODULE_PARM_DESC(debug, "Debug level (0-4)");
|
||||
|
||||
#define dprintk(num, format, args...) \
|
||||
do { \
|
||||
if (debug >= num) \
|
||||
printk(format, ##args); \
|
||||
} while (0)
|
||||
|
||||
struct attached_list {
|
||||
struct videocodec *codec;
|
||||
struct attached_list *next;
|
||||
};
|
||||
|
||||
struct codec_list {
|
||||
const struct videocodec *codec;
|
||||
int attached;
|
||||
struct attached_list *list;
|
||||
struct codec_list *next;
|
||||
};
|
||||
|
||||
static struct codec_list *codeclist_top;
|
||||
|
||||
/* ================================================= */
|
||||
/* function prototypes of the master/slave interface */
|
||||
/* ================================================= */
|
||||
|
||||
struct videocodec *
|
||||
videocodec_attach (struct videocodec_master *master)
|
||||
{
|
||||
struct codec_list *h = codeclist_top;
|
||||
struct attached_list *a, *ptr;
|
||||
struct videocodec *codec;
|
||||
int res;
|
||||
|
||||
if (!master) {
|
||||
dprintk(1, KERN_ERR "videocodec_attach: no data\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dprintk(2,
|
||||
"videocodec_attach: '%s', flags %lx, magic %lx\n",
|
||||
master->name, master->flags, master->magic);
|
||||
|
||||
if (!h) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"videocodec_attach: no device available\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (h) {
|
||||
// attach only if the slave has at least the flags
|
||||
// expected by the master
|
||||
if ((master->flags & h->codec->flags) == master->flags) {
|
||||
dprintk(4, "videocodec_attach: try '%s'\n",
|
||||
h->codec->name);
|
||||
|
||||
if (!try_module_get(h->codec->owner))
|
||||
return NULL;
|
||||
|
||||
codec = kmemdup(h->codec, sizeof(struct videocodec),
|
||||
GFP_KERNEL);
|
||||
if (!codec) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"videocodec_attach: no mem\n");
|
||||
goto out_module_put;
|
||||
}
|
||||
|
||||
res = strlen(codec->name);
|
||||
snprintf(codec->name + res, sizeof(codec->name) - res,
|
||||
"[%d]", h->attached);
|
||||
codec->master_data = master;
|
||||
res = codec->setup(codec);
|
||||
if (res == 0) {
|
||||
dprintk(3, "videocodec_attach '%s'\n",
|
||||
codec->name);
|
||||
ptr = kzalloc(sizeof(struct attached_list), GFP_KERNEL);
|
||||
if (!ptr) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"videocodec_attach: no memory\n");
|
||||
goto out_kfree;
|
||||
}
|
||||
ptr->codec = codec;
|
||||
|
||||
a = h->list;
|
||||
if (!a) {
|
||||
h->list = ptr;
|
||||
dprintk(4,
|
||||
"videocodec: first element\n");
|
||||
} else {
|
||||
while (a->next)
|
||||
a = a->next; // find end
|
||||
a->next = ptr;
|
||||
dprintk(4,
|
||||
"videocodec: in after '%s'\n",
|
||||
h->codec->name);
|
||||
}
|
||||
|
||||
h->attached += 1;
|
||||
return codec;
|
||||
} else {
|
||||
kfree(codec);
|
||||
}
|
||||
}
|
||||
h = h->next;
|
||||
}
|
||||
|
||||
dprintk(1, KERN_ERR "videocodec_attach: no codec found!\n");
|
||||
return NULL;
|
||||
|
||||
out_module_put:
|
||||
module_put(h->codec->owner);
|
||||
out_kfree:
|
||||
kfree(codec);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
videocodec_detach (struct videocodec *codec)
|
||||
{
|
||||
struct codec_list *h = codeclist_top;
|
||||
struct attached_list *a, *prev;
|
||||
int res;
|
||||
|
||||
if (!codec) {
|
||||
dprintk(1, KERN_ERR "videocodec_detach: no data\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dprintk(2,
|
||||
"videocodec_detach: '%s', type: %x, flags %lx, magic %lx\n",
|
||||
codec->name, codec->type, codec->flags, codec->magic);
|
||||
|
||||
if (!h) {
|
||||
dprintk(1,
|
||||
KERN_ERR "videocodec_detach: no device left...\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
while (h) {
|
||||
a = h->list;
|
||||
prev = NULL;
|
||||
while (a) {
|
||||
if (codec == a->codec) {
|
||||
res = a->codec->unset(a->codec);
|
||||
if (res >= 0) {
|
||||
dprintk(3,
|
||||
"videocodec_detach: '%s'\n",
|
||||
a->codec->name);
|
||||
a->codec->master_data = NULL;
|
||||
} else {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"videocodec_detach: '%s'\n",
|
||||
a->codec->name);
|
||||
a->codec->master_data = NULL;
|
||||
}
|
||||
if (prev == NULL) {
|
||||
h->list = a->next;
|
||||
dprintk(4,
|
||||
"videocodec: delete first\n");
|
||||
} else {
|
||||
prev->next = a->next;
|
||||
dprintk(4,
|
||||
"videocodec: delete middle\n");
|
||||
}
|
||||
module_put(a->codec->owner);
|
||||
kfree(a->codec);
|
||||
kfree(a);
|
||||
h->attached -= 1;
|
||||
return 0;
|
||||
}
|
||||
prev = a;
|
||||
a = a->next;
|
||||
}
|
||||
h = h->next;
|
||||
}
|
||||
|
||||
dprintk(1, KERN_ERR "videocodec_detach: given codec not found!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int
|
||||
videocodec_register (const struct videocodec *codec)
|
||||
{
|
||||
struct codec_list *ptr, *h = codeclist_top;
|
||||
|
||||
if (!codec) {
|
||||
dprintk(1, KERN_ERR "videocodec_register: no data!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dprintk(2,
|
||||
"videocodec: register '%s', type: %x, flags %lx, magic %lx\n",
|
||||
codec->name, codec->type, codec->flags, codec->magic);
|
||||
|
||||
ptr = kzalloc(sizeof(struct codec_list), GFP_KERNEL);
|
||||
if (!ptr) {
|
||||
dprintk(1, KERN_ERR "videocodec_register: no memory\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
ptr->codec = codec;
|
||||
|
||||
if (!h) {
|
||||
codeclist_top = ptr;
|
||||
dprintk(4, "videocodec: hooked in as first element\n");
|
||||
} else {
|
||||
while (h->next)
|
||||
h = h->next; // find the end
|
||||
h->next = ptr;
|
||||
dprintk(4, "videocodec: hooked in after '%s'\n",
|
||||
h->codec->name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
videocodec_unregister (const struct videocodec *codec)
|
||||
{
|
||||
struct codec_list *prev = NULL, *h = codeclist_top;
|
||||
|
||||
if (!codec) {
|
||||
dprintk(1, KERN_ERR "videocodec_unregister: no data!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dprintk(2,
|
||||
"videocodec: unregister '%s', type: %x, flags %lx, magic %lx\n",
|
||||
codec->name, codec->type, codec->flags, codec->magic);
|
||||
|
||||
if (!h) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"videocodec_unregister: no device left...\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
while (h) {
|
||||
if (codec == h->codec) {
|
||||
if (h->attached) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"videocodec: '%s' is used\n",
|
||||
h->codec->name);
|
||||
return -EBUSY;
|
||||
}
|
||||
dprintk(3, "videocodec: unregister '%s' is ok.\n",
|
||||
h->codec->name);
|
||||
if (prev == NULL) {
|
||||
codeclist_top = h->next;
|
||||
dprintk(4,
|
||||
"videocodec: delete first element\n");
|
||||
} else {
|
||||
prev->next = h->next;
|
||||
dprintk(4,
|
||||
"videocodec: delete middle element\n");
|
||||
}
|
||||
kfree(h);
|
||||
return 0;
|
||||
}
|
||||
prev = h;
|
||||
h = h->next;
|
||||
}
|
||||
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"videocodec_unregister: given codec not found!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int proc_videocodecs_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct codec_list *h = codeclist_top;
|
||||
struct attached_list *a;
|
||||
|
||||
seq_printf(m, "<S>lave or attached <M>aster name type flags magic ");
|
||||
seq_printf(m, "(connected as)\n");
|
||||
|
||||
while (h) {
|
||||
seq_printf(m, "S %32s %04x %08lx %08lx (TEMPLATE)\n",
|
||||
h->codec->name, h->codec->type,
|
||||
h->codec->flags, h->codec->magic);
|
||||
a = h->list;
|
||||
while (a) {
|
||||
seq_printf(m, "M %32s %04x %08lx %08lx (%s)\n",
|
||||
a->codec->master_data->name,
|
||||
a->codec->master_data->type,
|
||||
a->codec->master_data->flags,
|
||||
a->codec->master_data->magic,
|
||||
a->codec->name);
|
||||
a = a->next;
|
||||
}
|
||||
h = h->next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ===================== */
|
||||
/* hook in driver module */
|
||||
/* ===================== */
|
||||
static int __init
|
||||
videocodec_init (void)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static struct proc_dir_entry *videocodec_proc_entry;
|
||||
#endif
|
||||
|
||||
printk(KERN_INFO "Linux video codec intermediate layer: %s\n",
|
||||
VIDEOCODEC_VERSION);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
videocodec_proc_entry = proc_create_single("videocodecs", 0, NULL,
|
||||
proc_videocodecs_show);
|
||||
if (!videocodec_proc_entry) {
|
||||
dprintk(1, KERN_ERR "videocodec: can't init procfs.\n");
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit
|
||||
videocodec_exit (void)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
remove_proc_entry("videocodecs", NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(videocodec_attach);
|
||||
EXPORT_SYMBOL(videocodec_detach);
|
||||
EXPORT_SYMBOL(videocodec_register);
|
||||
EXPORT_SYMBOL(videocodec_unregister);
|
||||
|
||||
module_init(videocodec_init);
|
||||
module_exit(videocodec_exit);
|
||||
|
||||
MODULE_AUTHOR("Wolfgang Scherr <scherr@net4you.at>");
|
||||
MODULE_DESCRIPTION("Intermediate API module for video codecs "
|
||||
VIDEOCODEC_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
@ -1,349 +0,0 @@
|
||||
/*
|
||||
* VIDEO MOTION CODECs internal API for video devices
|
||||
*
|
||||
* Interface for MJPEG (and maybe later MPEG/WAVELETS) codec's
|
||||
* bound to a master device.
|
||||
*
|
||||
* (c) 2002 Wolfgang Scherr <scherr@net4you.at>
|
||||
*
|
||||
* $Id: videocodec.h,v 1.1.2.4 2003/01/14 21:15:03 rbultje Exp $
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* =================== */
|
||||
/* general description */
|
||||
/* =================== */
|
||||
|
||||
/* Should ease the (re-)usage of drivers supporting cards with (different)
|
||||
video codecs. The codecs register to this module their functionality,
|
||||
and the processors (masters) can attach to them if they fit.
|
||||
|
||||
The codecs are typically have a "strong" binding to their master - so I
|
||||
don't think it makes sense to have a full blown interfacing as with e.g.
|
||||
i2c. If you have an other opinion, let's discuss & implement it :-)))
|
||||
|
||||
Usage:
|
||||
|
||||
The slave has just to setup the videocodec structure and use two functions:
|
||||
videocodec_register(codecdata);
|
||||
videocodec_unregister(codecdata);
|
||||
The best is just calling them at module (de-)initialisation.
|
||||
|
||||
The master sets up the structure videocodec_master and calls:
|
||||
codecdata=videocodec_attach(master_codecdata);
|
||||
videocodec_detach(codecdata);
|
||||
|
||||
The slave is called during attach/detach via functions setup previously
|
||||
during register. At that time, the master_data pointer is set up
|
||||
and the slave can access any io registers of the master device (in the case
|
||||
the slave is bound to it). Otherwise it doesn't need this functions and
|
||||
therfor they may not be initialized.
|
||||
|
||||
The other functions are just for convenience, as they are for sure used by
|
||||
most/all of the codecs. The last ones may be omitted, too.
|
||||
|
||||
See the structure declaration below for more information and which data has
|
||||
to be set up for the master and the slave.
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
The master should have "knowledge" of the slave and vice versa. So the data
|
||||
structures sent to/from slave via set_data/get_data set_image/get_image are
|
||||
device dependent and vary between MJPEG/MPEG/WAVELET/... devices. (!!!!)
|
||||
----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
/* ========================================== */
|
||||
/* description of the videocodec_io structure */
|
||||
/* ========================================== */
|
||||
|
||||
/*
|
||||
==== master setup ====
|
||||
name -> name of the device structure for reference and debugging
|
||||
master_data -> data ref. for the master (e.g. the zr36055,57,67)
|
||||
readreg -> ref. to read-fn from register (setup by master, used by slave)
|
||||
writereg -> ref. to write-fn to register (setup by master, used by slave)
|
||||
this two functions do the lowlevel I/O job
|
||||
|
||||
==== slave functionality setup ====
|
||||
slave_data -> data ref. for the slave (e.g. the zr36050,60)
|
||||
check -> fn-ref. checks availability of an device, returns -EIO on failure or
|
||||
the type on success
|
||||
this makes espcecially sense if a driver module supports more than
|
||||
one codec which may be quite similar to access, nevertheless it
|
||||
is good for a first functionality check
|
||||
|
||||
-- main functions you always need for compression/decompression --
|
||||
|
||||
set_mode -> this fn-ref. resets the entire codec, and sets up the mode
|
||||
with the last defined norm/size (or device default if not
|
||||
available) - it returns 0 if the mode is possible
|
||||
set_size -> this fn-ref. sets the norm and image size for
|
||||
compression/decompression (returns 0 on success)
|
||||
the norm param is defined in videodev2.h (V4L2_STD_*)
|
||||
|
||||
additional setup may be available, too - but the codec should work with
|
||||
some default values even without this
|
||||
|
||||
set_data -> sets device-specific data (tables, quality etc.)
|
||||
get_data -> query device-specific data (tables, quality etc.)
|
||||
|
||||
if the device delivers interrupts, they may be setup/handled here
|
||||
setup_interrupt -> codec irq setup (not needed for 36050/60)
|
||||
handle_interrupt -> codec irq handling (not needed for 36050/60)
|
||||
|
||||
if the device delivers pictures, they may be handled here
|
||||
put_image -> puts image data to the codec (not needed for 36050/60)
|
||||
get_image -> gets image data from the codec (not needed for 36050/60)
|
||||
the calls include frame numbers and flags (even/odd/...)
|
||||
if needed and a flag which allows blocking until its ready
|
||||
*/
|
||||
|
||||
/* ============== */
|
||||
/* user interface */
|
||||
/* ============== */
|
||||
|
||||
/*
|
||||
Currently there is only a information display planned, as the layer
|
||||
is not visible for the user space at all.
|
||||
|
||||
Information is available via procfs. The current entry is "/proc/videocodecs"
|
||||
but it makes sense to "hide" it in the /proc/video tree of v4l(2) --TODO--.
|
||||
|
||||
A example for such an output is:
|
||||
|
||||
<S>lave or attached <M>aster name type flags magic (connected as)
|
||||
S zr36050 0002 0000d001 00000000 (TEMPLATE)
|
||||
M zr36055[0] 0001 0000c001 00000000 (zr36050[0])
|
||||
M zr36055[1] 0001 0000c001 00000000 (zr36050[1])
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* =============================================== */
|
||||
/* special defines for the videocodec_io structure */
|
||||
/* =============================================== */
|
||||
|
||||
#ifndef __LINUX_VIDEOCODEC_H
|
||||
#define __LINUX_VIDEOCODEC_H
|
||||
|
||||
#include <linux/videodev2.h>
|
||||
|
||||
#define CODEC_DO_COMPRESSION 0
|
||||
#define CODEC_DO_EXPANSION 1
|
||||
|
||||
/* this are the current codec flags I think they are needed */
|
||||
/* -> type value in structure */
|
||||
#define CODEC_FLAG_JPEG 0x00000001L // JPEG codec
|
||||
#define CODEC_FLAG_MPEG 0x00000002L // MPEG1/2/4 codec
|
||||
#define CODEC_FLAG_DIVX 0x00000004L // DIVX codec
|
||||
#define CODEC_FLAG_WAVELET 0x00000008L // WAVELET codec
|
||||
// room for other types
|
||||
|
||||
#define CODEC_FLAG_MAGIC 0x00000800L // magic key must match
|
||||
#define CODEC_FLAG_HARDWARE 0x00001000L // is a hardware codec
|
||||
#define CODEC_FLAG_VFE 0x00002000L // has direct video frontend
|
||||
#define CODEC_FLAG_ENCODER 0x00004000L // compression capability
|
||||
#define CODEC_FLAG_DECODER 0x00008000L // decompression capability
|
||||
#define CODEC_FLAG_NEEDIRQ 0x00010000L // needs irq handling
|
||||
#define CODEC_FLAG_RDWRPIC 0x00020000L // handles picture I/O
|
||||
|
||||
/* a list of modes, some are just examples (is there any HW?) */
|
||||
#define CODEC_MODE_BJPG 0x0001 // Baseline JPEG
|
||||
#define CODEC_MODE_LJPG 0x0002 // Lossless JPEG
|
||||
#define CODEC_MODE_MPEG1 0x0003 // MPEG 1
|
||||
#define CODEC_MODE_MPEG2 0x0004 // MPEG 2
|
||||
#define CODEC_MODE_MPEG4 0x0005 // MPEG 4
|
||||
#define CODEC_MODE_MSDIVX 0x0006 // MS DivX
|
||||
#define CODEC_MODE_ODIVX 0x0007 // Open DivX
|
||||
#define CODEC_MODE_WAVELET 0x0008 // Wavelet
|
||||
|
||||
/* this are the current codec types I want to implement */
|
||||
/* -> type value in structure */
|
||||
#define CODEC_TYPE_NONE 0
|
||||
#define CODEC_TYPE_L64702 1
|
||||
#define CODEC_TYPE_ZR36050 2
|
||||
#define CODEC_TYPE_ZR36016 3
|
||||
#define CODEC_TYPE_ZR36060 4
|
||||
|
||||
/* the type of data may be enhanced by future implementations (data-fn.'s) */
|
||||
/* -> used in command */
|
||||
#define CODEC_G_STATUS 0x0000 /* codec status (query only) */
|
||||
#define CODEC_S_CODEC_MODE 0x0001 /* codec mode (baseline JPEG, MPEG1,... */
|
||||
#define CODEC_G_CODEC_MODE 0x8001
|
||||
#define CODEC_S_VFE 0x0002 /* additional video frontend setup */
|
||||
#define CODEC_G_VFE 0x8002
|
||||
#define CODEC_S_MMAP 0x0003 /* MMAP setup (if available) */
|
||||
|
||||
#define CODEC_S_JPEG_TDS_BYTE 0x0010 /* target data size in bytes */
|
||||
#define CODEC_G_JPEG_TDS_BYTE 0x8010
|
||||
#define CODEC_S_JPEG_SCALE 0x0011 /* scaling factor for quant. tables */
|
||||
#define CODEC_G_JPEG_SCALE 0x8011
|
||||
#define CODEC_S_JPEG_HDT_DATA 0x0018 /* huffman-tables */
|
||||
#define CODEC_G_JPEG_HDT_DATA 0x8018
|
||||
#define CODEC_S_JPEG_QDT_DATA 0x0019 /* quantizing-tables */
|
||||
#define CODEC_G_JPEG_QDT_DATA 0x8019
|
||||
#define CODEC_S_JPEG_APP_DATA 0x001A /* APP marker */
|
||||
#define CODEC_G_JPEG_APP_DATA 0x801A
|
||||
#define CODEC_S_JPEG_COM_DATA 0x001B /* COM marker */
|
||||
#define CODEC_G_JPEG_COM_DATA 0x801B
|
||||
|
||||
#define CODEC_S_PRIVATE 0x1000 /* "private" commands start here */
|
||||
#define CODEC_G_PRIVATE 0x9000
|
||||
|
||||
#define CODEC_G_FLAG 0x8000 /* this is how 'get' is detected */
|
||||
|
||||
/* types of transfer, directly user space or a kernel buffer (image-fn.'s) */
|
||||
/* -> used in get_image, put_image */
|
||||
#define CODEC_TRANSFER_KERNEL 0 /* use "memcopy" */
|
||||
#define CODEC_TRANSFER_USER 1 /* use "to/from_user" */
|
||||
|
||||
|
||||
/* ========================= */
|
||||
/* the structures itself ... */
|
||||
/* ========================= */
|
||||
|
||||
struct vfe_polarity {
|
||||
unsigned int vsync_pol:1;
|
||||
unsigned int hsync_pol:1;
|
||||
unsigned int field_pol:1;
|
||||
unsigned int blank_pol:1;
|
||||
unsigned int subimg_pol:1;
|
||||
unsigned int poe_pol:1;
|
||||
unsigned int pvalid_pol:1;
|
||||
unsigned int vclk_pol:1;
|
||||
};
|
||||
|
||||
struct vfe_settings {
|
||||
__u32 x, y; /* Offsets into image */
|
||||
__u32 width, height; /* Area to capture */
|
||||
__u16 decimation; /* Decimation divider */
|
||||
__u16 flags; /* Flags for capture */
|
||||
__u16 quality; /* quality of the video */
|
||||
};
|
||||
|
||||
struct tvnorm {
|
||||
u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
|
||||
};
|
||||
|
||||
struct jpeg_com_marker {
|
||||
int len; /* number of usable bytes in data */
|
||||
char data[60];
|
||||
};
|
||||
|
||||
struct jpeg_app_marker {
|
||||
int appn; /* number app segment */
|
||||
int len; /* number of usable bytes in data */
|
||||
char data[60];
|
||||
};
|
||||
|
||||
struct videocodec {
|
||||
struct module *owner;
|
||||
/* -- filled in by slave device during register -- */
|
||||
char name[32];
|
||||
unsigned long magic; /* may be used for client<->master attaching */
|
||||
unsigned long flags; /* functionality flags */
|
||||
unsigned int type; /* codec type */
|
||||
|
||||
/* -- these is filled in later during master device attach -- */
|
||||
|
||||
struct videocodec_master *master_data;
|
||||
|
||||
/* -- these are filled in by the slave device during register -- */
|
||||
|
||||
void *data; /* private slave data */
|
||||
|
||||
/* attach/detach client functions (indirect call) */
|
||||
int (*setup) (struct videocodec * codec);
|
||||
int (*unset) (struct videocodec * codec);
|
||||
|
||||
/* main functions, every client needs them for sure! */
|
||||
// set compression or decompression (or freeze, stop, standby, etc)
|
||||
int (*set_mode) (struct videocodec * codec,
|
||||
int mode);
|
||||
// setup picture size and norm (for the codec's video frontend)
|
||||
int (*set_video) (struct videocodec * codec,
|
||||
struct tvnorm * norm,
|
||||
struct vfe_settings * cap,
|
||||
struct vfe_polarity * pol);
|
||||
// other control commands, also mmap setup etc.
|
||||
int (*control) (struct videocodec * codec,
|
||||
int type,
|
||||
int size,
|
||||
void *data);
|
||||
|
||||
/* additional setup/query/processing (may be NULL pointer) */
|
||||
// interrupt setup / handling (for irq's delivered by master)
|
||||
int (*setup_interrupt) (struct videocodec * codec,
|
||||
long mode);
|
||||
int (*handle_interrupt) (struct videocodec * codec,
|
||||
int source,
|
||||
long flag);
|
||||
// picture interface (if any)
|
||||
long (*put_image) (struct videocodec * codec,
|
||||
int tr_type,
|
||||
int block,
|
||||
long *fr_num,
|
||||
long *flag,
|
||||
long size,
|
||||
void *buf);
|
||||
long (*get_image) (struct videocodec * codec,
|
||||
int tr_type,
|
||||
int block,
|
||||
long *fr_num,
|
||||
long *flag,
|
||||
long size,
|
||||
void *buf);
|
||||
};
|
||||
|
||||
struct videocodec_master {
|
||||
/* -- filled in by master device for registration -- */
|
||||
char name[32];
|
||||
unsigned long magic; /* may be used for client<->master attaching */
|
||||
unsigned long flags; /* functionality flags */
|
||||
unsigned int type; /* master type */
|
||||
|
||||
void *data; /* private master data */
|
||||
|
||||
__u32(*readreg) (struct videocodec * codec,
|
||||
__u16 reg);
|
||||
void (*writereg) (struct videocodec * codec,
|
||||
__u16 reg,
|
||||
__u32 value);
|
||||
};
|
||||
|
||||
|
||||
/* ================================================= */
|
||||
/* function prototypes of the master/slave interface */
|
||||
/* ================================================= */
|
||||
|
||||
/* attach and detach commands for the master */
|
||||
// * master structure needs to be kmalloc'ed before calling attach
|
||||
// and free'd after calling detach
|
||||
// * returns pointer on success, NULL on failure
|
||||
extern struct videocodec *videocodec_attach(struct videocodec_master *);
|
||||
// * 0 on success, <0 (errno) on failure
|
||||
extern int videocodec_detach(struct videocodec *);
|
||||
|
||||
/* register and unregister commands for the slaves */
|
||||
// * 0 on success, <0 (errno) on failure
|
||||
extern int videocodec_register(const struct videocodec *);
|
||||
// * 0 on success, <0 (errno) on failure
|
||||
extern int videocodec_unregister(const struct videocodec *);
|
||||
|
||||
/* the other calls are directly done via the videocodec structure! */
|
||||
|
||||
#endif /*ifndef __LINUX_VIDEOCODEC_H */
|
@ -1,402 +0,0 @@
|
||||
/*
|
||||
* zoran - Iomega Buz driver
|
||||
*
|
||||
* Copyright (C) 1999 Rainer Johanni <Rainer@Johanni.de>
|
||||
*
|
||||
* based on
|
||||
*
|
||||
* zoran.0.0.3 Copyright (C) 1998 Dave Perks <dperks@ibm.net>
|
||||
*
|
||||
* and
|
||||
*
|
||||
* bttv - Bt848 frame grabber driver
|
||||
* Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)
|
||||
* & Marcus Metzler (mocm@thp.uni-koeln.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _BUZ_H_
|
||||
#define _BUZ_H_
|
||||
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-fh.h>
|
||||
|
||||
struct zoran_sync {
|
||||
unsigned long frame; /* number of buffer that has been free'd */
|
||||
unsigned long length; /* number of code bytes in buffer (capture only) */
|
||||
unsigned long seq; /* frame sequence number */
|
||||
u64 ts; /* timestamp */
|
||||
};
|
||||
|
||||
|
||||
#define ZORAN_NAME "ZORAN" /* name of the device */
|
||||
|
||||
#define ZR_DEVNAME(zr) ((zr)->name)
|
||||
|
||||
#define BUZ_MAX_WIDTH (zr->timing->Wa)
|
||||
#define BUZ_MAX_HEIGHT (zr->timing->Ha)
|
||||
#define BUZ_MIN_WIDTH 32 /* never display less than 32 pixels */
|
||||
#define BUZ_MIN_HEIGHT 24 /* never display less than 24 rows */
|
||||
|
||||
#define BUZ_NUM_STAT_COM 4
|
||||
#define BUZ_MASK_STAT_COM 3
|
||||
|
||||
#define BUZ_MAX_FRAME 256 /* Must be a power of 2 */
|
||||
#define BUZ_MASK_FRAME 255 /* Must be BUZ_MAX_FRAME-1 */
|
||||
|
||||
#define BUZ_MAX_INPUT 16
|
||||
|
||||
#if VIDEO_MAX_FRAME <= 32
|
||||
# define V4L_MAX_FRAME 32
|
||||
#elif VIDEO_MAX_FRAME <= 64
|
||||
# define V4L_MAX_FRAME 64
|
||||
#else
|
||||
# error "Too many video frame buffers to handle"
|
||||
#endif
|
||||
#define V4L_MASK_FRAME (V4L_MAX_FRAME - 1)
|
||||
|
||||
#define MAX_FRAME (BUZ_MAX_FRAME > VIDEO_MAX_FRAME ? BUZ_MAX_FRAME : VIDEO_MAX_FRAME)
|
||||
|
||||
#include "zr36057.h"
|
||||
|
||||
enum card_type {
|
||||
UNKNOWN = -1,
|
||||
|
||||
/* Pinnacle/Miro */
|
||||
DC10_old, /* DC30 like */
|
||||
DC10_new, /* DC10plus like */
|
||||
DC10plus,
|
||||
DC30,
|
||||
DC30plus,
|
||||
|
||||
/* Linux Media Labs */
|
||||
LML33,
|
||||
LML33R10,
|
||||
|
||||
/* Iomega */
|
||||
BUZ,
|
||||
|
||||
/* AverMedia */
|
||||
AVS6EYES,
|
||||
|
||||
/* total number of cards */
|
||||
NUM_CARDS
|
||||
};
|
||||
|
||||
enum zoran_codec_mode {
|
||||
BUZ_MODE_IDLE, /* nothing going on */
|
||||
BUZ_MODE_MOTION_COMPRESS, /* grabbing frames */
|
||||
BUZ_MODE_MOTION_DECOMPRESS, /* playing frames */
|
||||
BUZ_MODE_STILL_COMPRESS, /* still frame conversion */
|
||||
BUZ_MODE_STILL_DECOMPRESS /* still frame conversion */
|
||||
};
|
||||
|
||||
enum zoran_buffer_state {
|
||||
BUZ_STATE_USER, /* buffer is owned by application */
|
||||
BUZ_STATE_PEND, /* buffer is queued in pend[] ready to feed to I/O */
|
||||
BUZ_STATE_DMA, /* buffer is queued in dma[] for I/O */
|
||||
BUZ_STATE_DONE /* buffer is ready to return to application */
|
||||
};
|
||||
|
||||
enum zoran_map_mode {
|
||||
ZORAN_MAP_MODE_RAW,
|
||||
ZORAN_MAP_MODE_JPG_REC,
|
||||
#define ZORAN_MAP_MODE_JPG ZORAN_MAP_MODE_JPG_REC
|
||||
ZORAN_MAP_MODE_JPG_PLAY,
|
||||
};
|
||||
|
||||
enum gpio_type {
|
||||
ZR_GPIO_JPEG_SLEEP = 0,
|
||||
ZR_GPIO_JPEG_RESET,
|
||||
ZR_GPIO_JPEG_FRAME,
|
||||
ZR_GPIO_VID_DIR,
|
||||
ZR_GPIO_VID_EN,
|
||||
ZR_GPIO_VID_RESET,
|
||||
ZR_GPIO_CLK_SEL1,
|
||||
ZR_GPIO_CLK_SEL2,
|
||||
ZR_GPIO_MAX,
|
||||
};
|
||||
|
||||
enum gpcs_type {
|
||||
GPCS_JPEG_RESET = 0,
|
||||
GPCS_JPEG_START,
|
||||
GPCS_MAX,
|
||||
};
|
||||
|
||||
struct zoran_format {
|
||||
char *name;
|
||||
__u32 fourcc;
|
||||
int colorspace;
|
||||
int depth;
|
||||
__u32 flags;
|
||||
__u32 vfespfr;
|
||||
};
|
||||
/* flags */
|
||||
#define ZORAN_FORMAT_COMPRESSED 1<<0
|
||||
#define ZORAN_FORMAT_OVERLAY 1<<1
|
||||
#define ZORAN_FORMAT_CAPTURE 1<<2
|
||||
#define ZORAN_FORMAT_PLAYBACK 1<<3
|
||||
|
||||
/* overlay-settings */
|
||||
struct zoran_overlay_settings {
|
||||
int is_set;
|
||||
int x, y, width, height; /* position */
|
||||
int clipcount; /* position and number of clips */
|
||||
const struct zoran_format *format; /* overlay format */
|
||||
};
|
||||
|
||||
/* v4l-capture settings */
|
||||
struct zoran_v4l_settings {
|
||||
int width, height, bytesperline; /* capture size */
|
||||
const struct zoran_format *format; /* capture format */
|
||||
};
|
||||
|
||||
/* jpg-capture/-playback settings */
|
||||
struct zoran_jpg_settings {
|
||||
int decimation; /* this bit is used to set everything to default */
|
||||
int HorDcm, VerDcm, TmpDcm; /* capture decimation settings (TmpDcm=1 means both fields) */
|
||||
int field_per_buff, odd_even; /* field-settings (odd_even=1 (+TmpDcm=1) means top-field-first) */
|
||||
int img_x, img_y, img_width, img_height; /* crop settings (subframe capture) */
|
||||
struct v4l2_jpegcompression jpg_comp; /* JPEG-specific capture settings */
|
||||
};
|
||||
|
||||
struct zoran_fh;
|
||||
|
||||
struct zoran_mapping {
|
||||
struct zoran_fh *fh;
|
||||
atomic_t count;
|
||||
};
|
||||
|
||||
struct zoran_buffer {
|
||||
struct zoran_mapping *map;
|
||||
enum zoran_buffer_state state; /* state: unused/pending/dma/done */
|
||||
struct zoran_sync bs; /* DONE: info to return to application */
|
||||
union {
|
||||
struct {
|
||||
__le32 *frag_tab; /* addresses of frag table */
|
||||
u32 frag_tab_bus; /* same value cached to save time in ISR */
|
||||
} jpg;
|
||||
struct {
|
||||
char *fbuffer; /* virtual address of frame buffer */
|
||||
unsigned long fbuffer_phys;/* physical address of frame buffer */
|
||||
unsigned long fbuffer_bus;/* bus address of frame buffer */
|
||||
} v4l;
|
||||
};
|
||||
};
|
||||
|
||||
enum zoran_lock_activity {
|
||||
ZORAN_FREE, /* free for use */
|
||||
ZORAN_ACTIVE, /* active but unlocked */
|
||||
ZORAN_LOCKED, /* locked */
|
||||
};
|
||||
|
||||
/* buffer collections */
|
||||
struct zoran_buffer_col {
|
||||
enum zoran_lock_activity active; /* feature currently in use? */
|
||||
unsigned int num_buffers, buffer_size;
|
||||
struct zoran_buffer buffer[MAX_FRAME]; /* buffers */
|
||||
u8 allocated; /* Flag if buffers are allocated */
|
||||
u8 need_contiguous; /* Flag if contiguous buffers are needed */
|
||||
/* only applies to jpg buffers, raw buffers are always contiguous */
|
||||
};
|
||||
|
||||
struct zoran;
|
||||
|
||||
/* zoran_fh contains per-open() settings */
|
||||
struct zoran_fh {
|
||||
struct v4l2_fh fh;
|
||||
struct zoran *zr;
|
||||
|
||||
enum zoran_map_mode map_mode; /* Flag which bufferset will map by next mmap() */
|
||||
|
||||
struct zoran_overlay_settings overlay_settings;
|
||||
u32 *overlay_mask; /* overlay mask */
|
||||
enum zoran_lock_activity overlay_active;/* feature currently in use? */
|
||||
|
||||
struct zoran_buffer_col buffers; /* buffers' info */
|
||||
|
||||
struct zoran_v4l_settings v4l_settings; /* structure with a lot of things to play with */
|
||||
struct zoran_jpg_settings jpg_settings; /* structure with a lot of things to play with */
|
||||
};
|
||||
|
||||
struct card_info {
|
||||
enum card_type type;
|
||||
char name[32];
|
||||
const char *i2c_decoder; /* i2c decoder device */
|
||||
const unsigned short *addrs_decoder;
|
||||
const char *i2c_encoder; /* i2c encoder device */
|
||||
const unsigned short *addrs_encoder;
|
||||
u16 video_vfe, video_codec; /* videocodec types */
|
||||
u16 audio_chip; /* audio type */
|
||||
|
||||
int inputs; /* number of video inputs */
|
||||
struct input {
|
||||
int muxsel;
|
||||
char name[32];
|
||||
} input[BUZ_MAX_INPUT];
|
||||
|
||||
v4l2_std_id norms;
|
||||
struct tvnorm *tvn[3]; /* supported TV norms */
|
||||
|
||||
u32 jpeg_int; /* JPEG interrupt */
|
||||
u32 vsync_int; /* VSYNC interrupt */
|
||||
s8 gpio[ZR_GPIO_MAX];
|
||||
u8 gpcs[GPCS_MAX];
|
||||
|
||||
struct vfe_polarity vfe_pol;
|
||||
u8 gpio_pol[ZR_GPIO_MAX];
|
||||
|
||||
/* is the /GWS line connected? */
|
||||
u8 gws_not_connected;
|
||||
|
||||
/* avs6eyes mux setting */
|
||||
u8 input_mux;
|
||||
|
||||
void (*init) (struct zoran * zr);
|
||||
};
|
||||
|
||||
struct zoran {
|
||||
struct v4l2_device v4l2_dev;
|
||||
struct v4l2_ctrl_handler hdl;
|
||||
struct video_device *video_dev;
|
||||
|
||||
struct i2c_adapter i2c_adapter; /* */
|
||||
struct i2c_algo_bit_data i2c_algo; /* */
|
||||
u32 i2cbr;
|
||||
|
||||
struct v4l2_subdev *decoder; /* video decoder sub-device */
|
||||
struct v4l2_subdev *encoder; /* video encoder sub-device */
|
||||
|
||||
struct videocodec *codec; /* video codec */
|
||||
struct videocodec *vfe; /* video front end */
|
||||
|
||||
struct mutex lock; /* file ops serialize lock */
|
||||
|
||||
u8 initialized; /* flag if zoran has been correctly initialized */
|
||||
int user; /* number of current users */
|
||||
struct card_info card;
|
||||
struct tvnorm *timing;
|
||||
|
||||
unsigned short id; /* number of this device */
|
||||
char name[32]; /* name of this device */
|
||||
struct pci_dev *pci_dev; /* PCI device */
|
||||
unsigned char revision; /* revision of zr36057 */
|
||||
unsigned char __iomem *zr36057_mem;/* pointer to mapped IO memory */
|
||||
|
||||
spinlock_t spinlock; /* Spinlock */
|
||||
|
||||
/* Video for Linux parameters */
|
||||
int input; /* card's norm and input */
|
||||
v4l2_std_id norm;
|
||||
|
||||
/* Current buffer params */
|
||||
void *vbuf_base;
|
||||
int vbuf_height, vbuf_width;
|
||||
int vbuf_depth;
|
||||
int vbuf_bytesperline;
|
||||
|
||||
struct zoran_overlay_settings overlay_settings;
|
||||
u32 *overlay_mask; /* overlay mask */
|
||||
enum zoran_lock_activity overlay_active; /* feature currently in use? */
|
||||
|
||||
wait_queue_head_t v4l_capq;
|
||||
|
||||
int v4l_overlay_active; /* Overlay grab is activated */
|
||||
int v4l_memgrab_active; /* Memory grab is activated */
|
||||
|
||||
int v4l_grab_frame; /* Frame number being currently grabbed */
|
||||
#define NO_GRAB_ACTIVE (-1)
|
||||
unsigned long v4l_grab_seq; /* Number of frames grabbed */
|
||||
struct zoran_v4l_settings v4l_settings; /* structure with a lot of things to play with */
|
||||
|
||||
/* V4L grab queue of frames pending */
|
||||
unsigned long v4l_pend_head;
|
||||
unsigned long v4l_pend_tail;
|
||||
unsigned long v4l_sync_tail;
|
||||
int v4l_pend[V4L_MAX_FRAME];
|
||||
struct zoran_buffer_col v4l_buffers; /* V4L buffers' info */
|
||||
|
||||
/* Buz MJPEG parameters */
|
||||
enum zoran_codec_mode codec_mode; /* status of codec */
|
||||
struct zoran_jpg_settings jpg_settings; /* structure with a lot of things to play with */
|
||||
|
||||
wait_queue_head_t jpg_capq; /* wait here for grab to finish */
|
||||
|
||||
/* grab queue counts/indices, mask with BUZ_MASK_STAT_COM before using as index */
|
||||
/* (dma_head - dma_tail) is number active in DMA, must be <= BUZ_NUM_STAT_COM */
|
||||
/* (value & BUZ_MASK_STAT_COM) corresponds to index in stat_com table */
|
||||
unsigned long jpg_que_head; /* Index where to put next buffer which is queued */
|
||||
unsigned long jpg_dma_head; /* Index of next buffer which goes into stat_com */
|
||||
unsigned long jpg_dma_tail; /* Index of last buffer in stat_com */
|
||||
unsigned long jpg_que_tail; /* Index of last buffer in queue */
|
||||
unsigned long jpg_seq_num; /* count of frames since grab/play started */
|
||||
unsigned long jpg_err_seq; /* last seq_num before error */
|
||||
unsigned long jpg_err_shift;
|
||||
unsigned long jpg_queued_num; /* count of frames queued since grab/play started */
|
||||
|
||||
/* zr36057's code buffer table */
|
||||
__le32 *stat_com; /* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */
|
||||
|
||||
/* (value & BUZ_MASK_FRAME) corresponds to index in pend[] queue */
|
||||
int jpg_pend[BUZ_MAX_FRAME];
|
||||
|
||||
/* array indexed by frame number */
|
||||
struct zoran_buffer_col jpg_buffers; /* MJPEG buffers' info */
|
||||
|
||||
/* Additional stuff for testing */
|
||||
#ifdef CONFIG_PROC_FS
|
||||
struct proc_dir_entry *zoran_proc;
|
||||
#else
|
||||
void *zoran_proc;
|
||||
#endif
|
||||
int testing;
|
||||
int jpeg_error;
|
||||
int intr_counter_GIRQ1;
|
||||
int intr_counter_GIRQ0;
|
||||
int intr_counter_CodRepIRQ;
|
||||
int intr_counter_JPEGRepIRQ;
|
||||
int field_counter;
|
||||
int IRQ1_in;
|
||||
int IRQ1_out;
|
||||
int JPEG_in;
|
||||
int JPEG_out;
|
||||
int JPEG_0;
|
||||
int JPEG_1;
|
||||
int END_event_missed;
|
||||
int JPEG_missed;
|
||||
int JPEG_error;
|
||||
int num_errors;
|
||||
int JPEG_max_missed;
|
||||
int JPEG_min_missed;
|
||||
|
||||
u32 last_isr;
|
||||
unsigned long frame_num;
|
||||
|
||||
wait_queue_head_t test_q;
|
||||
};
|
||||
|
||||
static inline struct zoran *to_zoran(struct v4l2_device *v4l2_dev)
|
||||
{
|
||||
return container_of(v4l2_dev, struct zoran, v4l2_dev);
|
||||
}
|
||||
|
||||
/* There was something called _ALPHA_BUZ that used the PCI address instead of
|
||||
* the kernel iomapped address for btread/btwrite. */
|
||||
#define btwrite(dat,adr) writel((dat), zr->zr36057_mem+(adr))
|
||||
#define btread(adr) readl(zr->zr36057_mem+(adr))
|
||||
|
||||
#define btand(dat,adr) btwrite((dat) & btread(adr), adr)
|
||||
#define btor(dat,adr) btwrite((dat) | btread(adr), adr)
|
||||
#define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Zoran zr36057/zr36067 PCI controller driver, for the
|
||||
* Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
|
||||
* Media Labs LML33/LML33R10.
|
||||
*
|
||||
* This part handles card-specific data and detection
|
||||
*
|
||||
* Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
|
||||
*
|
||||
* Currently maintained by:
|
||||
* Ronald Bultje <rbultje@ronald.bitfreak.net>
|
||||
* Laurent Pinchart <laurent.pinchart@skynet.be>
|
||||
* Mailinglist <mjpeg-users@lists.sf.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ZORAN_CARD_H__
|
||||
#define __ZORAN_CARD_H__
|
||||
|
||||
extern int zr36067_debug;
|
||||
|
||||
#define dprintk(num, format, args...) \
|
||||
do { \
|
||||
if (zr36067_debug >= num) \
|
||||
printk(format, ##args); \
|
||||
} while (0)
|
||||
|
||||
/* Anybody who uses more than four? */
|
||||
#define BUZ_MAX 4
|
||||
|
||||
extern const struct video_device zoran_template;
|
||||
|
||||
extern int zoran_check_jpg_settings(struct zoran *zr,
|
||||
struct zoran_jpg_settings *settings,
|
||||
int try);
|
||||
extern void zoran_open_init_params(struct zoran *zr);
|
||||
extern void zoran_vdev_release(struct video_device *vdev);
|
||||
|
||||
void zr36016_write(struct videocodec *codec, u16 reg, u32 val);
|
||||
|
||||
#endif /* __ZORAN_CARD_H__ */
|
File diff suppressed because it is too large
Load Diff
@ -1,91 +0,0 @@
|
||||
/*
|
||||
* Zoran zr36057/zr36067 PCI controller driver, for the
|
||||
* Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
|
||||
* Media Labs LML33/LML33R10.
|
||||
*
|
||||
* This part handles card-specific data and detection
|
||||
*
|
||||
* Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
|
||||
*
|
||||
* Currently maintained by:
|
||||
* Ronald Bultje <rbultje@ronald.bitfreak.net>
|
||||
* Laurent Pinchart <laurent.pinchart@skynet.be>
|
||||
* Mailinglist <mjpeg-users@lists.sf.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ZORAN_DEVICE_H__
|
||||
#define __ZORAN_DEVICE_H__
|
||||
|
||||
/* general purpose I/O */
|
||||
extern void GPIO(struct zoran *zr,
|
||||
int bit,
|
||||
unsigned int value);
|
||||
|
||||
/* codec (or actually: guest bus) access */
|
||||
extern int post_office_wait(struct zoran *zr);
|
||||
extern int post_office_write(struct zoran *zr,
|
||||
unsigned guest,
|
||||
unsigned reg,
|
||||
unsigned value);
|
||||
extern int post_office_read(struct zoran *zr,
|
||||
unsigned guest,
|
||||
unsigned reg);
|
||||
|
||||
extern void detect_guest_activity(struct zoran *zr);
|
||||
|
||||
extern void jpeg_codec_sleep(struct zoran *zr,
|
||||
int sleep);
|
||||
extern int jpeg_codec_reset(struct zoran *zr);
|
||||
|
||||
/* zr360x7 access to raw capture */
|
||||
extern void zr36057_overlay(struct zoran *zr,
|
||||
int on);
|
||||
extern void write_overlay_mask(struct zoran_fh *fh,
|
||||
struct v4l2_clip *vp,
|
||||
int count);
|
||||
extern void zr36057_set_memgrab(struct zoran *zr,
|
||||
int mode);
|
||||
extern int wait_grab_pending(struct zoran *zr);
|
||||
|
||||
/* interrupts */
|
||||
extern void print_interrupts(struct zoran *zr);
|
||||
extern void clear_interrupt_counters(struct zoran *zr);
|
||||
extern irqreturn_t zoran_irq(int irq, void *dev_id);
|
||||
|
||||
/* JPEG codec access */
|
||||
extern void jpeg_start(struct zoran *zr);
|
||||
extern void zr36057_enable_jpg(struct zoran *zr,
|
||||
enum zoran_codec_mode mode);
|
||||
extern void zoran_feed_stat_com(struct zoran *zr);
|
||||
|
||||
/* general */
|
||||
extern void zoran_set_pci_master(struct zoran *zr,
|
||||
int set_master);
|
||||
extern void zoran_init_hardware(struct zoran *zr);
|
||||
extern void zr36057_restart(struct zoran *zr);
|
||||
|
||||
extern const struct zoran_format zoran_formats[];
|
||||
|
||||
extern int v4l_nbufs;
|
||||
extern int v4l_bufsize;
|
||||
extern int jpg_nbufs;
|
||||
extern int jpg_bufsize;
|
||||
extern int pass_through;
|
||||
|
||||
/* i2c */
|
||||
#define decoder_call(zr, o, f, args...) \
|
||||
v4l2_subdev_call(zr->decoder, o, f, ##args)
|
||||
#define encoder_call(zr, o, f, args...) \
|
||||
v4l2_subdev_call(zr->encoder, o, f, ##args)
|
||||
|
||||
#endif /* __ZORAN_DEVICE_H__ */
|
File diff suppressed because it is too large
Load Diff
@ -1,221 +0,0 @@
|
||||
/*
|
||||
* Zoran zr36057/zr36067 PCI controller driver, for the
|
||||
* Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
|
||||
* Media Labs LML33/LML33R10.
|
||||
*
|
||||
* This part handles the procFS entries (/proc/ZORAN[%d])
|
||||
*
|
||||
* Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
|
||||
*
|
||||
* Currently maintained by:
|
||||
* Ronald Bultje <rbultje@ronald.bitfreak.net>
|
||||
* Laurent Pinchart <laurent.pinchart@skynet.be>
|
||||
* Mailinglist <mjpeg-users@lists.sf.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-bit.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/sem.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/poll.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "videocodec.h"
|
||||
#include "zoran.h"
|
||||
#include "zoran_procfs.h"
|
||||
#include "zoran_card.h"
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
struct procfs_params_zr36067 {
|
||||
char *name;
|
||||
short reg;
|
||||
u32 mask;
|
||||
short bit;
|
||||
};
|
||||
|
||||
static const struct procfs_params_zr36067 zr67[] = {
|
||||
{"HSPol", 0x000, 1, 30},
|
||||
{"HStart", 0x000, 0x3ff, 10},
|
||||
{"HEnd", 0x000, 0x3ff, 0},
|
||||
|
||||
{"VSPol", 0x004, 1, 30},
|
||||
{"VStart", 0x004, 0x3ff, 10},
|
||||
{"VEnd", 0x004, 0x3ff, 0},
|
||||
|
||||
{"ExtFl", 0x008, 1, 26},
|
||||
{"TopField", 0x008, 1, 25},
|
||||
{"VCLKPol", 0x008, 1, 24},
|
||||
{"DupFld", 0x008, 1, 20},
|
||||
{"LittleEndian", 0x008, 1, 0},
|
||||
|
||||
{"HsyncStart", 0x10c, 0xffff, 16},
|
||||
{"LineTot", 0x10c, 0xffff, 0},
|
||||
|
||||
{"NAX", 0x110, 0xffff, 16},
|
||||
{"PAX", 0x110, 0xffff, 0},
|
||||
|
||||
{"NAY", 0x114, 0xffff, 16},
|
||||
{"PAY", 0x114, 0xffff, 0},
|
||||
|
||||
/* {"",,,}, */
|
||||
|
||||
{NULL, 0, 0, 0},
|
||||
};
|
||||
|
||||
static void
|
||||
setparam (struct zoran *zr,
|
||||
char *name,
|
||||
char *sval)
|
||||
{
|
||||
int i = 0, reg0, reg, val;
|
||||
|
||||
while (zr67[i].name != NULL) {
|
||||
if (!strncmp(name, zr67[i].name, strlen(zr67[i].name))) {
|
||||
reg = reg0 = btread(zr67[i].reg);
|
||||
reg &= ~(zr67[i].mask << zr67[i].bit);
|
||||
if (!isdigit(sval[0]))
|
||||
break;
|
||||
val = simple_strtoul(sval, NULL, 0);
|
||||
if ((val & ~zr67[i].mask))
|
||||
break;
|
||||
reg |= (val & zr67[i].mask) << zr67[i].bit;
|
||||
dprintk(4,
|
||||
KERN_INFO
|
||||
"%s: setparam: setting ZR36067 register 0x%03x: 0x%08x=>0x%08x %s=%d\n",
|
||||
ZR_DEVNAME(zr), zr67[i].reg, reg0, reg,
|
||||
zr67[i].name, val);
|
||||
btwrite(reg, zr67[i].reg);
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static int zoran_show(struct seq_file *p, void *v)
|
||||
{
|
||||
struct zoran *zr = p->private;
|
||||
int i;
|
||||
|
||||
seq_printf(p, "ZR36067 registers:\n");
|
||||
for (i = 0; i < 0x130; i += 16)
|
||||
seq_printf(p, "%03X %08X %08X %08X %08X \n", i,
|
||||
btread(i), btread(i+4), btread(i+8), btread(i+12));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int zoran_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct zoran *data = PDE_DATA(inode);
|
||||
return single_open(file, zoran_show, data);
|
||||
}
|
||||
|
||||
static ssize_t zoran_write(struct file *file, const char __user *buffer,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct zoran *zr = PDE_DATA(file_inode(file));
|
||||
char *string, *sp;
|
||||
char *line, *ldelim, *varname, *svar, *tdelim;
|
||||
|
||||
if (count > 32768) /* Stupidity filter */
|
||||
return -EINVAL;
|
||||
|
||||
string = sp = vmalloc(count + 1);
|
||||
if (!string) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: write_proc: can not allocate memory\n",
|
||||
ZR_DEVNAME(zr));
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (copy_from_user(string, buffer, count)) {
|
||||
vfree (string);
|
||||
return -EFAULT;
|
||||
}
|
||||
string[count] = 0;
|
||||
dprintk(4, KERN_INFO "%s: write_proc: name=%pD count=%zu zr=%p\n",
|
||||
ZR_DEVNAME(zr), file, count, zr);
|
||||
ldelim = " \t\n";
|
||||
tdelim = "=";
|
||||
line = strpbrk(sp, ldelim);
|
||||
while (line) {
|
||||
*line = 0;
|
||||
svar = strpbrk(sp, tdelim);
|
||||
if (svar) {
|
||||
*svar = 0;
|
||||
varname = sp;
|
||||
svar++;
|
||||
setparam(zr, varname, svar);
|
||||
}
|
||||
sp = line + 1;
|
||||
line = strpbrk(sp, ldelim);
|
||||
}
|
||||
vfree(string);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations zoran_operations = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = zoran_open,
|
||||
.read = seq_read,
|
||||
.write = zoran_write,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
#endif
|
||||
|
||||
int
|
||||
zoran_proc_init (struct zoran *zr)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
char name[8];
|
||||
|
||||
snprintf(name, 7, "zoran%d", zr->id);
|
||||
zr->zoran_proc = proc_create_data(name, 0, NULL, &zoran_operations, zr);
|
||||
if (zr->zoran_proc != NULL) {
|
||||
dprintk(2,
|
||||
KERN_INFO
|
||||
"%s: procfs entry /proc/%s allocated. data=%p\n",
|
||||
ZR_DEVNAME(zr), name, zr);
|
||||
} else {
|
||||
dprintk(1, KERN_ERR "%s: Unable to initialise /proc/%s\n",
|
||||
ZR_DEVNAME(zr), name);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
zoran_proc_cleanup (struct zoran *zr)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
char name[8];
|
||||
|
||||
snprintf(name, 7, "zoran%d", zr->id);
|
||||
if (zr->zoran_proc)
|
||||
remove_proc_entry(name, NULL);
|
||||
zr->zoran_proc = NULL;
|
||||
#endif
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Zoran zr36057/zr36067 PCI controller driver, for the
|
||||
* Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
|
||||
* Media Labs LML33/LML33R10.
|
||||
*
|
||||
* This part handles card-specific data and detection
|
||||
*
|
||||
* Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
|
||||
*
|
||||
* Currently maintained by:
|
||||
* Ronald Bultje <rbultje@ronald.bitfreak.net>
|
||||
* Laurent Pinchart <laurent.pinchart@skynet.be>
|
||||
* Mailinglist <mjpeg-users@lists.sf.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ZORAN_PROCFS_H__
|
||||
#define __ZORAN_PROCFS_H__
|
||||
|
||||
extern int zoran_proc_init(struct zoran *zr);
|
||||
extern void zoran_proc_cleanup(struct zoran *zr);
|
||||
|
||||
#endif /* __ZORAN_PROCFS_H__ */
|
@ -1,516 +0,0 @@
|
||||
/*
|
||||
* Zoran ZR36016 basic configuration functions
|
||||
*
|
||||
* Copyright (C) 2001 Wolfgang Scherr <scherr@net4you.at>
|
||||
*
|
||||
* $Id: zr36016.c,v 1.1.2.14 2003/08/20 19:46:55 rbultje Exp $
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define ZR016_VERSION "v0.7"
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
/* I/O commands, error codes */
|
||||
#include <asm/io.h>
|
||||
|
||||
/* v4l API */
|
||||
|
||||
/* headerfile of this module */
|
||||
#include "zr36016.h"
|
||||
|
||||
/* codec io API */
|
||||
#include "videocodec.h"
|
||||
|
||||
/* it doesn't make sense to have more than 20 or so,
|
||||
just to prevent some unwanted loops */
|
||||
#define MAX_CODECS 20
|
||||
|
||||
/* amount of chips attached via this driver */
|
||||
static int zr36016_codecs;
|
||||
|
||||
/* debugging is available via module parameter */
|
||||
static int debug;
|
||||
module_param(debug, int, 0);
|
||||
MODULE_PARM_DESC(debug, "Debug level (0-4)");
|
||||
|
||||
#define dprintk(num, format, args...) \
|
||||
do { \
|
||||
if (debug >= num) \
|
||||
printk(format, ##args); \
|
||||
} while (0)
|
||||
|
||||
/* =========================================================================
|
||||
Local hardware I/O functions:
|
||||
|
||||
read/write via codec layer (registers are located in the master device)
|
||||
========================================================================= */
|
||||
|
||||
/* read and write functions */
|
||||
static u8
|
||||
zr36016_read (struct zr36016 *ptr,
|
||||
u16 reg)
|
||||
{
|
||||
u8 value = 0;
|
||||
|
||||
// just in case something is wrong...
|
||||
if (ptr->codec->master_data->readreg)
|
||||
value =
|
||||
(ptr->codec->master_data->
|
||||
readreg(ptr->codec, reg)) & 0xFF;
|
||||
else
|
||||
dprintk(1,
|
||||
KERN_ERR "%s: invalid I/O setup, nothing read!\n",
|
||||
ptr->name);
|
||||
|
||||
dprintk(4, "%s: reading from 0x%04x: %02x\n", ptr->name, reg,
|
||||
value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static void
|
||||
zr36016_write (struct zr36016 *ptr,
|
||||
u16 reg,
|
||||
u8 value)
|
||||
{
|
||||
dprintk(4, "%s: writing 0x%02x to 0x%04x\n", ptr->name, value,
|
||||
reg);
|
||||
|
||||
// just in case something is wrong...
|
||||
if (ptr->codec->master_data->writereg) {
|
||||
ptr->codec->master_data->writereg(ptr->codec, reg, value);
|
||||
} else
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: invalid I/O setup, nothing written!\n",
|
||||
ptr->name);
|
||||
}
|
||||
|
||||
/* indirect read and write functions */
|
||||
/* the 016 supports auto-addr-increment, but
|
||||
* writing it all time cost not much and is safer... */
|
||||
static u8
|
||||
zr36016_readi (struct zr36016 *ptr,
|
||||
u16 reg)
|
||||
{
|
||||
u8 value = 0;
|
||||
|
||||
// just in case something is wrong...
|
||||
if ((ptr->codec->master_data->writereg) &&
|
||||
(ptr->codec->master_data->readreg)) {
|
||||
ptr->codec->master_data->writereg(ptr->codec, ZR016_IADDR, reg & 0x0F); // ADDR
|
||||
value = (ptr->codec->master_data->readreg(ptr->codec, ZR016_IDATA)) & 0xFF; // DATA
|
||||
} else
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: invalid I/O setup, nothing read (i)!\n",
|
||||
ptr->name);
|
||||
|
||||
dprintk(4, "%s: reading indirect from 0x%04x: %02x\n", ptr->name,
|
||||
reg, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
static void
|
||||
zr36016_writei (struct zr36016 *ptr,
|
||||
u16 reg,
|
||||
u8 value)
|
||||
{
|
||||
dprintk(4, "%s: writing indirect 0x%02x to 0x%04x\n", ptr->name,
|
||||
value, reg);
|
||||
|
||||
// just in case something is wrong...
|
||||
if (ptr->codec->master_data->writereg) {
|
||||
ptr->codec->master_data->writereg(ptr->codec, ZR016_IADDR, reg & 0x0F); // ADDR
|
||||
ptr->codec->master_data->writereg(ptr->codec, ZR016_IDATA, value & 0x0FF); // DATA
|
||||
} else
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: invalid I/O setup, nothing written (i)!\n",
|
||||
ptr->name);
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Local helper function:
|
||||
|
||||
version read
|
||||
========================================================================= */
|
||||
|
||||
/* version kept in datastructure */
|
||||
static u8
|
||||
zr36016_read_version (struct zr36016 *ptr)
|
||||
{
|
||||
ptr->version = zr36016_read(ptr, 0) >> 4;
|
||||
return ptr->version;
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Local helper function:
|
||||
|
||||
basic test of "connectivity", writes/reads to/from PAX-Lo register
|
||||
========================================================================= */
|
||||
|
||||
static int
|
||||
zr36016_basic_test (struct zr36016 *ptr)
|
||||
{
|
||||
if (debug) {
|
||||
int i;
|
||||
zr36016_writei(ptr, ZR016I_PAX_LO, 0x55);
|
||||
dprintk(1, KERN_INFO "%s: registers: ", ptr->name);
|
||||
for (i = 0; i <= 0x0b; i++)
|
||||
dprintk(1, "%02x ", zr36016_readi(ptr, i));
|
||||
dprintk(1, "\n");
|
||||
}
|
||||
// for testing just write 0, then the default value to a register and read
|
||||
// it back in both cases
|
||||
zr36016_writei(ptr, ZR016I_PAX_LO, 0x00);
|
||||
if (zr36016_readi(ptr, ZR016I_PAX_LO) != 0x0) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: attach failed, can't connect to vfe processor!\n",
|
||||
ptr->name);
|
||||
return -ENXIO;
|
||||
}
|
||||
zr36016_writei(ptr, ZR016I_PAX_LO, 0x0d0);
|
||||
if (zr36016_readi(ptr, ZR016I_PAX_LO) != 0x0d0) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: attach failed, can't connect to vfe processor!\n",
|
||||
ptr->name);
|
||||
return -ENXIO;
|
||||
}
|
||||
// we allow version numbers from 0-3, should be enough, though
|
||||
zr36016_read_version(ptr);
|
||||
if (ptr->version & 0x0c) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: attach failed, suspicious version %d found...\n",
|
||||
ptr->name, ptr->version);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
return 0; /* looks good! */
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Local helper function:
|
||||
|
||||
simple loop for pushing the init datasets - NO USE --
|
||||
========================================================================= */
|
||||
|
||||
#if 0
|
||||
static int zr36016_pushit (struct zr36016 *ptr,
|
||||
u16 startreg,
|
||||
u16 len,
|
||||
const char *data)
|
||||
{
|
||||
int i=0;
|
||||
|
||||
dprintk(4, "%s: write data block to 0x%04x (len=%d)\n",
|
||||
ptr->name, startreg,len);
|
||||
while (i<len) {
|
||||
zr36016_writei(ptr, startreg++, data[i++]);
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* =========================================================================
|
||||
Basic datasets & init:
|
||||
|
||||
//TODO//
|
||||
========================================================================= */
|
||||
|
||||
static void
|
||||
zr36016_init (struct zr36016 *ptr)
|
||||
{
|
||||
// stop any processing
|
||||
zr36016_write(ptr, ZR016_GOSTOP, 0);
|
||||
|
||||
// mode setup (yuv422 in and out, compression/expansuon due to mode)
|
||||
zr36016_write(ptr, ZR016_MODE,
|
||||
ZR016_YUV422 | ZR016_YUV422_YUV422 |
|
||||
(ptr->mode == CODEC_DO_COMPRESSION ?
|
||||
ZR016_COMPRESSION : ZR016_EXPANSION));
|
||||
|
||||
// misc setup
|
||||
zr36016_writei(ptr, ZR016I_SETUP1,
|
||||
(ptr->xdec ? (ZR016_HRFL | ZR016_HORZ) : 0) |
|
||||
(ptr->ydec ? ZR016_VERT : 0) | ZR016_CNTI);
|
||||
zr36016_writei(ptr, ZR016I_SETUP2, ZR016_CCIR);
|
||||
|
||||
// Window setup
|
||||
// (no extra offset for now, norm defines offset, default width height)
|
||||
zr36016_writei(ptr, ZR016I_PAX_HI, ptr->width >> 8);
|
||||
zr36016_writei(ptr, ZR016I_PAX_LO, ptr->width & 0xFF);
|
||||
zr36016_writei(ptr, ZR016I_PAY_HI, ptr->height >> 8);
|
||||
zr36016_writei(ptr, ZR016I_PAY_LO, ptr->height & 0xFF);
|
||||
zr36016_writei(ptr, ZR016I_NAX_HI, ptr->xoff >> 8);
|
||||
zr36016_writei(ptr, ZR016I_NAX_LO, ptr->xoff & 0xFF);
|
||||
zr36016_writei(ptr, ZR016I_NAY_HI, ptr->yoff >> 8);
|
||||
zr36016_writei(ptr, ZR016I_NAY_LO, ptr->yoff & 0xFF);
|
||||
|
||||
/* shall we continue now, please? */
|
||||
zr36016_write(ptr, ZR016_GOSTOP, 1);
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
CODEC API FUNCTIONS
|
||||
|
||||
this functions are accessed by the master via the API structure
|
||||
========================================================================= */
|
||||
|
||||
/* set compression/expansion mode and launches codec -
|
||||
this should be the last call from the master before starting processing */
|
||||
static int
|
||||
zr36016_set_mode (struct videocodec *codec,
|
||||
int mode)
|
||||
{
|
||||
struct zr36016 *ptr = (struct zr36016 *) codec->data;
|
||||
|
||||
dprintk(2, "%s: set_mode %d call\n", ptr->name, mode);
|
||||
|
||||
if ((mode != CODEC_DO_EXPANSION) && (mode != CODEC_DO_COMPRESSION))
|
||||
return -EINVAL;
|
||||
|
||||
ptr->mode = mode;
|
||||
zr36016_init(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* set picture size */
|
||||
static int
|
||||
zr36016_set_video (struct videocodec *codec,
|
||||
struct tvnorm *norm,
|
||||
struct vfe_settings *cap,
|
||||
struct vfe_polarity *pol)
|
||||
{
|
||||
struct zr36016 *ptr = (struct zr36016 *) codec->data;
|
||||
|
||||
dprintk(2, "%s: set_video %d.%d, %d/%d-%dx%d (0x%x) call\n",
|
||||
ptr->name, norm->HStart, norm->VStart,
|
||||
cap->x, cap->y, cap->width, cap->height,
|
||||
cap->decimation);
|
||||
|
||||
/* if () return -EINVAL;
|
||||
* trust the master driver that it knows what it does - so
|
||||
* we allow invalid startx/y for now ... */
|
||||
ptr->width = cap->width;
|
||||
ptr->height = cap->height;
|
||||
/* (Ronald) This is ugly. zoran_device.c, line 387
|
||||
* already mentions what happens if HStart is even
|
||||
* (blue faces, etc., cr/cb inversed). There's probably
|
||||
* some good reason why HStart is 0 instead of 1, so I'm
|
||||
* leaving it to this for now, but really... This can be
|
||||
* done a lot simpler */
|
||||
ptr->xoff = (norm->HStart ? norm->HStart : 1) + cap->x;
|
||||
/* Something to note here (I don't understand it), setting
|
||||
* VStart too high will cause the codec to 'not work'. I
|
||||
* really don't get it. values of 16 (VStart) already break
|
||||
* it here. Just '0' seems to work. More testing needed! */
|
||||
ptr->yoff = norm->VStart + cap->y;
|
||||
/* (Ronald) dzjeeh, can't this thing do hor_decimation = 4? */
|
||||
ptr->xdec = ((cap->decimation & 0xff) == 1) ? 0 : 1;
|
||||
ptr->ydec = (((cap->decimation >> 8) & 0xff) == 1) ? 0 : 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* additional control functions */
|
||||
static int
|
||||
zr36016_control (struct videocodec *codec,
|
||||
int type,
|
||||
int size,
|
||||
void *data)
|
||||
{
|
||||
struct zr36016 *ptr = (struct zr36016 *) codec->data;
|
||||
int *ival = (int *) data;
|
||||
|
||||
dprintk(2, "%s: control %d call with %d byte\n", ptr->name, type,
|
||||
size);
|
||||
|
||||
switch (type) {
|
||||
case CODEC_G_STATUS: /* get last status - we don't know it ... */
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
*ival = 0;
|
||||
break;
|
||||
|
||||
case CODEC_G_CODEC_MODE:
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
*ival = 0;
|
||||
break;
|
||||
|
||||
case CODEC_S_CODEC_MODE:
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
if (*ival != 0)
|
||||
return -EINVAL;
|
||||
/* not needed, do nothing */
|
||||
return 0;
|
||||
|
||||
case CODEC_G_VFE:
|
||||
case CODEC_S_VFE:
|
||||
return 0;
|
||||
|
||||
case CODEC_S_MMAP:
|
||||
/* not available, give an error */
|
||||
return -ENXIO;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Exit and unregister function:
|
||||
|
||||
Deinitializes Zoran's JPEG processor
|
||||
========================================================================= */
|
||||
|
||||
static int
|
||||
zr36016_unset (struct videocodec *codec)
|
||||
{
|
||||
struct zr36016 *ptr = codec->data;
|
||||
|
||||
if (ptr) {
|
||||
/* do wee need some codec deinit here, too ???? */
|
||||
|
||||
dprintk(1, "%s: finished codec #%d\n", ptr->name,
|
||||
ptr->num);
|
||||
kfree(ptr);
|
||||
codec->data = NULL;
|
||||
|
||||
zr36016_codecs--;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Setup and registry function:
|
||||
|
||||
Initializes Zoran's JPEG processor
|
||||
|
||||
Also sets pixel size, average code size, mode (compr./decompr.)
|
||||
(the given size is determined by the processor with the video interface)
|
||||
========================================================================= */
|
||||
|
||||
static int
|
||||
zr36016_setup (struct videocodec *codec)
|
||||
{
|
||||
struct zr36016 *ptr;
|
||||
int res;
|
||||
|
||||
dprintk(2, "zr36016: initializing VFE subsystem #%d.\n",
|
||||
zr36016_codecs);
|
||||
|
||||
if (zr36016_codecs == MAX_CODECS) {
|
||||
dprintk(1,
|
||||
KERN_ERR "zr36016: Can't attach more codecs!\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
//mem structure init
|
||||
codec->data = ptr = kzalloc(sizeof(struct zr36016), GFP_KERNEL);
|
||||
if (NULL == ptr) {
|
||||
dprintk(1, KERN_ERR "zr36016: Can't get enough memory!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
snprintf(ptr->name, sizeof(ptr->name), "zr36016[%d]",
|
||||
zr36016_codecs);
|
||||
ptr->num = zr36016_codecs++;
|
||||
ptr->codec = codec;
|
||||
|
||||
//testing
|
||||
res = zr36016_basic_test(ptr);
|
||||
if (res < 0) {
|
||||
zr36016_unset(codec);
|
||||
return res;
|
||||
}
|
||||
//final setup
|
||||
ptr->mode = CODEC_DO_COMPRESSION;
|
||||
ptr->width = 768;
|
||||
ptr->height = 288;
|
||||
ptr->xdec = 1;
|
||||
ptr->ydec = 0;
|
||||
zr36016_init(ptr);
|
||||
|
||||
dprintk(1, KERN_INFO "%s: codec v%d attached and running\n",
|
||||
ptr->name, ptr->version);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct videocodec zr36016_codec = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "zr36016",
|
||||
.magic = 0L, // magic not used
|
||||
.flags =
|
||||
CODEC_FLAG_HARDWARE | CODEC_FLAG_VFE | CODEC_FLAG_ENCODER |
|
||||
CODEC_FLAG_DECODER,
|
||||
.type = CODEC_TYPE_ZR36016,
|
||||
.setup = zr36016_setup, // functionality
|
||||
.unset = zr36016_unset,
|
||||
.set_mode = zr36016_set_mode,
|
||||
.set_video = zr36016_set_video,
|
||||
.control = zr36016_control,
|
||||
// others are not used
|
||||
};
|
||||
|
||||
/* =========================================================================
|
||||
HOOK IN DRIVER AS KERNEL MODULE
|
||||
========================================================================= */
|
||||
|
||||
static int __init
|
||||
zr36016_init_module (void)
|
||||
{
|
||||
//dprintk(1, "ZR36016 driver %s\n",ZR016_VERSION);
|
||||
zr36016_codecs = 0;
|
||||
return videocodec_register(&zr36016_codec);
|
||||
}
|
||||
|
||||
static void __exit
|
||||
zr36016_cleanup_module (void)
|
||||
{
|
||||
if (zr36016_codecs) {
|
||||
dprintk(1,
|
||||
"zr36016: something's wrong - %d codecs left somehow.\n",
|
||||
zr36016_codecs);
|
||||
}
|
||||
videocodec_unregister(&zr36016_codec);
|
||||
}
|
||||
|
||||
module_init(zr36016_init_module);
|
||||
module_exit(zr36016_cleanup_module);
|
||||
|
||||
MODULE_AUTHOR("Wolfgang Scherr <scherr@net4you.at>");
|
||||
MODULE_DESCRIPTION("Driver module for ZR36016 video frontends "
|
||||
ZR016_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
@ -1,107 +0,0 @@
|
||||
/*
|
||||
* Zoran ZR36016 basic configuration functions - header file
|
||||
*
|
||||
* Copyright (C) 2001 Wolfgang Scherr <scherr@net4you.at>
|
||||
*
|
||||
* $Id: zr36016.h,v 1.1.2.3 2003/01/14 21:18:07 rbultje Exp $
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef ZR36016_H
|
||||
#define ZR36016_H
|
||||
|
||||
/* data stored for each zoran jpeg codec chip */
|
||||
struct zr36016 {
|
||||
char name[32];
|
||||
int num;
|
||||
/* io datastructure */
|
||||
struct videocodec *codec;
|
||||
// coder status
|
||||
__u8 version;
|
||||
// actual coder setup
|
||||
int mode;
|
||||
|
||||
__u16 xoff;
|
||||
__u16 yoff;
|
||||
__u16 width;
|
||||
__u16 height;
|
||||
__u16 xdec;
|
||||
__u16 ydec;
|
||||
};
|
||||
|
||||
/* direct register addresses */
|
||||
#define ZR016_GOSTOP 0x00
|
||||
#define ZR016_MODE 0x01
|
||||
#define ZR016_IADDR 0x02
|
||||
#define ZR016_IDATA 0x03
|
||||
|
||||
/* indirect register addresses */
|
||||
#define ZR016I_SETUP1 0x00
|
||||
#define ZR016I_SETUP2 0x01
|
||||
#define ZR016I_NAX_LO 0x02
|
||||
#define ZR016I_NAX_HI 0x03
|
||||
#define ZR016I_PAX_LO 0x04
|
||||
#define ZR016I_PAX_HI 0x05
|
||||
#define ZR016I_NAY_LO 0x06
|
||||
#define ZR016I_NAY_HI 0x07
|
||||
#define ZR016I_PAY_LO 0x08
|
||||
#define ZR016I_PAY_HI 0x09
|
||||
#define ZR016I_NOL_LO 0x0a
|
||||
#define ZR016I_NOL_HI 0x0b
|
||||
|
||||
/* possible values for mode register */
|
||||
#define ZR016_RGB444_YUV444 0x00
|
||||
#define ZR016_RGB444_YUV422 0x01
|
||||
#define ZR016_RGB444_YUV411 0x02
|
||||
#define ZR016_RGB444_Y400 0x03
|
||||
#define ZR016_RGB444_RGB444 0x04
|
||||
#define ZR016_YUV444_YUV444 0x08
|
||||
#define ZR016_YUV444_YUV422 0x09
|
||||
#define ZR016_YUV444_YUV411 0x0a
|
||||
#define ZR016_YUV444_Y400 0x0b
|
||||
#define ZR016_YUV444_RGB444 0x0c
|
||||
#define ZR016_YUV422_YUV422 0x11
|
||||
#define ZR016_YUV422_YUV411 0x12
|
||||
#define ZR016_YUV422_Y400 0x13
|
||||
#define ZR016_YUV411_YUV411 0x16
|
||||
#define ZR016_YUV411_Y400 0x17
|
||||
#define ZR016_4444_4444 0x19
|
||||
#define ZR016_100_100 0x1b
|
||||
|
||||
#define ZR016_RGB444 0x00
|
||||
#define ZR016_YUV444 0x20
|
||||
#define ZR016_YUV422 0x40
|
||||
|
||||
#define ZR016_COMPRESSION 0x80
|
||||
#define ZR016_EXPANSION 0x80
|
||||
|
||||
/* possible values for setup 1 register */
|
||||
#define ZR016_CKRT 0x80
|
||||
#define ZR016_VERT 0x40
|
||||
#define ZR016_HORZ 0x20
|
||||
#define ZR016_HRFL 0x10
|
||||
#define ZR016_DSFL 0x08
|
||||
#define ZR016_SBFL 0x04
|
||||
#define ZR016_RSTR 0x02
|
||||
#define ZR016_CNTI 0x01
|
||||
|
||||
/* possible values for setup 2 register */
|
||||
#define ZR016_SYEN 0x40
|
||||
#define ZR016_CCIR 0x04
|
||||
#define ZR016_SIGN 0x02
|
||||
#define ZR016_YMCS 0x01
|
||||
|
||||
#endif /*fndef ZR36016_H */
|
@ -1,896 +0,0 @@
|
||||
/*
|
||||
* Zoran ZR36050 basic configuration functions
|
||||
*
|
||||
* Copyright (C) 2001 Wolfgang Scherr <scherr@net4you.at>
|
||||
*
|
||||
* $Id: zr36050.c,v 1.1.2.11 2003/08/03 14:54:53 rbultje Exp $
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define ZR050_VERSION "v0.7.1"
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
/* I/O commands, error codes */
|
||||
#include <asm/io.h>
|
||||
|
||||
/* headerfile of this module */
|
||||
#include "zr36050.h"
|
||||
|
||||
/* codec io API */
|
||||
#include "videocodec.h"
|
||||
|
||||
/* it doesn't make sense to have more than 20 or so,
|
||||
just to prevent some unwanted loops */
|
||||
#define MAX_CODECS 20
|
||||
|
||||
/* amount of chips attached via this driver */
|
||||
static int zr36050_codecs;
|
||||
|
||||
/* debugging is available via module parameter */
|
||||
static int debug;
|
||||
module_param(debug, int, 0);
|
||||
MODULE_PARM_DESC(debug, "Debug level (0-4)");
|
||||
|
||||
#define dprintk(num, format, args...) \
|
||||
do { \
|
||||
if (debug >= num) \
|
||||
printk(format, ##args); \
|
||||
} while (0)
|
||||
|
||||
/* =========================================================================
|
||||
Local hardware I/O functions:
|
||||
|
||||
read/write via codec layer (registers are located in the master device)
|
||||
========================================================================= */
|
||||
|
||||
/* read and write functions */
|
||||
static u8
|
||||
zr36050_read (struct zr36050 *ptr,
|
||||
u16 reg)
|
||||
{
|
||||
u8 value = 0;
|
||||
|
||||
// just in case something is wrong...
|
||||
if (ptr->codec->master_data->readreg)
|
||||
value = (ptr->codec->master_data->readreg(ptr->codec,
|
||||
reg)) & 0xFF;
|
||||
else
|
||||
dprintk(1,
|
||||
KERN_ERR "%s: invalid I/O setup, nothing read!\n",
|
||||
ptr->name);
|
||||
|
||||
dprintk(4, "%s: reading from 0x%04x: %02x\n", ptr->name, reg,
|
||||
value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static void
|
||||
zr36050_write (struct zr36050 *ptr,
|
||||
u16 reg,
|
||||
u8 value)
|
||||
{
|
||||
dprintk(4, "%s: writing 0x%02x to 0x%04x\n", ptr->name, value,
|
||||
reg);
|
||||
|
||||
// just in case something is wrong...
|
||||
if (ptr->codec->master_data->writereg)
|
||||
ptr->codec->master_data->writereg(ptr->codec, reg, value);
|
||||
else
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: invalid I/O setup, nothing written!\n",
|
||||
ptr->name);
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Local helper function:
|
||||
|
||||
status read
|
||||
========================================================================= */
|
||||
|
||||
/* status is kept in datastructure */
|
||||
static u8
|
||||
zr36050_read_status1 (struct zr36050 *ptr)
|
||||
{
|
||||
ptr->status1 = zr36050_read(ptr, ZR050_STATUS_1);
|
||||
|
||||
zr36050_read(ptr, 0);
|
||||
return ptr->status1;
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Local helper function:
|
||||
|
||||
scale factor read
|
||||
========================================================================= */
|
||||
|
||||
/* scale factor is kept in datastructure */
|
||||
static u16
|
||||
zr36050_read_scalefactor (struct zr36050 *ptr)
|
||||
{
|
||||
ptr->scalefact = (zr36050_read(ptr, ZR050_SF_HI) << 8) |
|
||||
(zr36050_read(ptr, ZR050_SF_LO) & 0xFF);
|
||||
|
||||
/* leave 0 selected for an eventually GO from master */
|
||||
zr36050_read(ptr, 0);
|
||||
return ptr->scalefact;
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Local helper function:
|
||||
|
||||
wait if codec is ready to proceed (end of processing) or time is over
|
||||
========================================================================= */
|
||||
|
||||
static void
|
||||
zr36050_wait_end (struct zr36050 *ptr)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (!(zr36050_read_status1(ptr) & 0x4)) {
|
||||
udelay(1);
|
||||
if (i++ > 200000) { // 200ms, there is for sure something wrong!!!
|
||||
dprintk(1,
|
||||
"%s: timeout at wait_end (last status: 0x%02x)\n",
|
||||
ptr->name, ptr->status1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Local helper function:
|
||||
|
||||
basic test of "connectivity", writes/reads to/from memory the SOF marker
|
||||
========================================================================= */
|
||||
|
||||
static int
|
||||
zr36050_basic_test (struct zr36050 *ptr)
|
||||
{
|
||||
zr36050_write(ptr, ZR050_SOF_IDX, 0x00);
|
||||
zr36050_write(ptr, ZR050_SOF_IDX + 1, 0x00);
|
||||
if ((zr36050_read(ptr, ZR050_SOF_IDX) |
|
||||
zr36050_read(ptr, ZR050_SOF_IDX + 1)) != 0x0000) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: attach failed, can't connect to jpeg processor!\n",
|
||||
ptr->name);
|
||||
return -ENXIO;
|
||||
}
|
||||
zr36050_write(ptr, ZR050_SOF_IDX, 0xff);
|
||||
zr36050_write(ptr, ZR050_SOF_IDX + 1, 0xc0);
|
||||
if (((zr36050_read(ptr, ZR050_SOF_IDX) << 8) |
|
||||
zr36050_read(ptr, ZR050_SOF_IDX + 1)) != 0xffc0) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: attach failed, can't connect to jpeg processor!\n",
|
||||
ptr->name);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
zr36050_wait_end(ptr);
|
||||
if ((ptr->status1 & 0x4) == 0) {
|
||||
dprintk(1,
|
||||
KERN_ERR
|
||||
"%s: attach failed, jpeg processor failed (end flag)!\n",
|
||||
ptr->name);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
return 0; /* looks good! */
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Local helper function:
|
||||
|
||||
simple loop for pushing the init datasets
|
||||
========================================================================= */
|
||||
|
||||
static int
|
||||
zr36050_pushit (struct zr36050 *ptr,
|
||||
u16 startreg,
|
||||
u16 len,
|
||||
const char *data)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
dprintk(4, "%s: write data block to 0x%04x (len=%d)\n", ptr->name,
|
||||
startreg, len);
|
||||
while (i < len) {
|
||||
zr36050_write(ptr, startreg++, data[i++]);
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Basic datasets:
|
||||
|
||||
jpeg baseline setup data (you find it on lots places in internet, or just
|
||||
extract it from any regular .jpg image...)
|
||||
|
||||
Could be variable, but until it's not needed it they are just fixed to save
|
||||
memory. Otherwise expand zr36050 structure with arrays, push the values to
|
||||
it and initialize from there, as e.g. the linux zr36057/60 driver does it.
|
||||
========================================================================= */
|
||||
|
||||
static const char zr36050_dqt[0x86] = {
|
||||
0xff, 0xdb, //Marker: DQT
|
||||
0x00, 0x84, //Length: 2*65+2
|
||||
0x00, //Pq,Tq first table
|
||||
0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
|
||||
0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
|
||||
0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
|
||||
0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
|
||||
0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
|
||||
0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
|
||||
0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
|
||||
0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
|
||||
0x01, //Pq,Tq second table
|
||||
0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
|
||||
0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
|
||||
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
|
||||
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
|
||||
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
|
||||
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
|
||||
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
|
||||
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63
|
||||
};
|
||||
|
||||
static const char zr36050_dht[0x1a4] = {
|
||||
0xff, 0xc4, //Marker: DHT
|
||||
0x01, 0xa2, //Length: 2*AC, 2*DC
|
||||
0x00, //DC first table
|
||||
0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
|
||||
0x01, //DC second table
|
||||
0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
|
||||
0x10, //AC first table
|
||||
0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
|
||||
0x05, 0x05, 0x04, 0x04, 0x00, 0x00,
|
||||
0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11,
|
||||
0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
|
||||
0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
|
||||
0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24,
|
||||
0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17,
|
||||
0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34,
|
||||
0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
|
||||
0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
|
||||
0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
|
||||
0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
|
||||
0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
|
||||
0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
|
||||
0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
|
||||
0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9,
|
||||
0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8,
|
||||
0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
|
||||
0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
|
||||
0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
|
||||
0xF8, 0xF9, 0xFA,
|
||||
0x11, //AC second table
|
||||
0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
|
||||
0x07, 0x05, 0x04, 0x04, 0x00, 0x01,
|
||||
0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
|
||||
0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
|
||||
0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
|
||||
0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62,
|
||||
0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25,
|
||||
0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A,
|
||||
0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
|
||||
0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
|
||||
0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
|
||||
0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
|
||||
0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
|
||||
0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
|
||||
0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
|
||||
0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
|
||||
0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
|
||||
0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,
|
||||
0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
|
||||
0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
|
||||
0xF9, 0xFA
|
||||
};
|
||||
|
||||
/* jpeg baseline setup, this is just fixed in this driver (YUV pictures) */
|
||||
#define NO_OF_COMPONENTS 0x3 //Y,U,V
|
||||
#define BASELINE_PRECISION 0x8 //MCU size (?)
|
||||
static const char zr36050_tq[8] = { 0, 1, 1, 0, 0, 0, 0, 0 }; //table idx's QT
|
||||
static const char zr36050_td[8] = { 0, 1, 1, 0, 0, 0, 0, 0 }; //table idx's DC
|
||||
static const char zr36050_ta[8] = { 0, 1, 1, 0, 0, 0, 0, 0 }; //table idx's AC
|
||||
|
||||
/* horizontal 422 decimation setup (maybe we support 411 or so later, too) */
|
||||
static const char zr36050_decimation_h[8] = { 2, 1, 1, 0, 0, 0, 0, 0 };
|
||||
static const char zr36050_decimation_v[8] = { 1, 1, 1, 0, 0, 0, 0, 0 };
|
||||
|
||||
/* =========================================================================
|
||||
Local helper functions:
|
||||
|
||||
calculation and setup of parameter-dependent JPEG baseline segments
|
||||
(needed for compression only)
|
||||
========================================================================= */
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* SOF (start of frame) segment depends on width, height and sampling ratio
|
||||
of each color component */
|
||||
|
||||
static int
|
||||
zr36050_set_sof (struct zr36050 *ptr)
|
||||
{
|
||||
char sof_data[34]; // max. size of register set
|
||||
int i;
|
||||
|
||||
dprintk(3, "%s: write SOF (%dx%d, %d components)\n", ptr->name,
|
||||
ptr->width, ptr->height, NO_OF_COMPONENTS);
|
||||
sof_data[0] = 0xff;
|
||||
sof_data[1] = 0xc0;
|
||||
sof_data[2] = 0x00;
|
||||
sof_data[3] = (3 * NO_OF_COMPONENTS) + 8;
|
||||
sof_data[4] = BASELINE_PRECISION; // only '8' possible with zr36050
|
||||
sof_data[5] = (ptr->height) >> 8;
|
||||
sof_data[6] = (ptr->height) & 0xff;
|
||||
sof_data[7] = (ptr->width) >> 8;
|
||||
sof_data[8] = (ptr->width) & 0xff;
|
||||
sof_data[9] = NO_OF_COMPONENTS;
|
||||
for (i = 0; i < NO_OF_COMPONENTS; i++) {
|
||||
sof_data[10 + (i * 3)] = i; // index identifier
|
||||
sof_data[11 + (i * 3)] = (ptr->h_samp_ratio[i] << 4) | (ptr->v_samp_ratio[i]); // sampling ratios
|
||||
sof_data[12 + (i * 3)] = zr36050_tq[i]; // Q table selection
|
||||
}
|
||||
return zr36050_pushit(ptr, ZR050_SOF_IDX,
|
||||
(3 * NO_OF_COMPONENTS) + 10, sof_data);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* SOS (start of scan) segment depends on the used scan components
|
||||
of each color component */
|
||||
|
||||
static int
|
||||
zr36050_set_sos (struct zr36050 *ptr)
|
||||
{
|
||||
char sos_data[16]; // max. size of register set
|
||||
int i;
|
||||
|
||||
dprintk(3, "%s: write SOS\n", ptr->name);
|
||||
sos_data[0] = 0xff;
|
||||
sos_data[1] = 0xda;
|
||||
sos_data[2] = 0x00;
|
||||
sos_data[3] = 2 + 1 + (2 * NO_OF_COMPONENTS) + 3;
|
||||
sos_data[4] = NO_OF_COMPONENTS;
|
||||
for (i = 0; i < NO_OF_COMPONENTS; i++) {
|
||||
sos_data[5 + (i * 2)] = i; // index
|
||||
sos_data[6 + (i * 2)] = (zr36050_td[i] << 4) | zr36050_ta[i]; // AC/DC tbl.sel.
|
||||
}
|
||||
sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 2] = 00; // scan start
|
||||
sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 3] = 0x3F;
|
||||
sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 4] = 00;
|
||||
return zr36050_pushit(ptr, ZR050_SOS1_IDX,
|
||||
4 + 1 + (2 * NO_OF_COMPONENTS) + 3,
|
||||
sos_data);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* DRI (define restart interval) */
|
||||
|
||||
static int
|
||||
zr36050_set_dri (struct zr36050 *ptr)
|
||||
{
|
||||
char dri_data[6]; // max. size of register set
|
||||
|
||||
dprintk(3, "%s: write DRI\n", ptr->name);
|
||||
dri_data[0] = 0xff;
|
||||
dri_data[1] = 0xdd;
|
||||
dri_data[2] = 0x00;
|
||||
dri_data[3] = 0x04;
|
||||
dri_data[4] = ptr->dri >> 8;
|
||||
dri_data[5] = ptr->dri & 0xff;
|
||||
return zr36050_pushit(ptr, ZR050_DRI_IDX, 6, dri_data);
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Setup function:
|
||||
|
||||
Setup compression/decompression of Zoran's JPEG processor
|
||||
( see also zoran 36050 manual )
|
||||
|
||||
... sorry for the spaghetti code ...
|
||||
========================================================================= */
|
||||
static void
|
||||
zr36050_init (struct zr36050 *ptr)
|
||||
{
|
||||
int sum = 0;
|
||||
long bitcnt, tmp;
|
||||
|
||||
if (ptr->mode == CODEC_DO_COMPRESSION) {
|
||||
dprintk(2, "%s: COMPRESSION SETUP\n", ptr->name);
|
||||
|
||||
/* 050 communicates with 057 in master mode */
|
||||
zr36050_write(ptr, ZR050_HARDWARE, ZR050_HW_MSTR);
|
||||
|
||||
/* encoding table preload for compression */
|
||||
zr36050_write(ptr, ZR050_MODE,
|
||||
ZR050_MO_COMP | ZR050_MO_TLM);
|
||||
zr36050_write(ptr, ZR050_OPTIONS, 0);
|
||||
|
||||
/* disable all IRQs */
|
||||
zr36050_write(ptr, ZR050_INT_REQ_0, 0);
|
||||
zr36050_write(ptr, ZR050_INT_REQ_1, 3); // low 2 bits always 1
|
||||
|
||||
/* volume control settings */
|
||||
/*zr36050_write(ptr, ZR050_MBCV, ptr->max_block_vol);*/
|
||||
zr36050_write(ptr, ZR050_SF_HI, ptr->scalefact >> 8);
|
||||
zr36050_write(ptr, ZR050_SF_LO, ptr->scalefact & 0xff);
|
||||
|
||||
zr36050_write(ptr, ZR050_AF_HI, 0xff);
|
||||
zr36050_write(ptr, ZR050_AF_M, 0xff);
|
||||
zr36050_write(ptr, ZR050_AF_LO, 0xff);
|
||||
|
||||
/* setup the variable jpeg tables */
|
||||
sum += zr36050_set_sof(ptr);
|
||||
sum += zr36050_set_sos(ptr);
|
||||
sum += zr36050_set_dri(ptr);
|
||||
|
||||
/* setup the fixed jpeg tables - maybe variable, though -
|
||||
* (see table init section above) */
|
||||
dprintk(3, "%s: write DQT, DHT, APP\n", ptr->name);
|
||||
sum += zr36050_pushit(ptr, ZR050_DQT_IDX,
|
||||
sizeof(zr36050_dqt), zr36050_dqt);
|
||||
sum += zr36050_pushit(ptr, ZR050_DHT_IDX,
|
||||
sizeof(zr36050_dht), zr36050_dht);
|
||||
zr36050_write(ptr, ZR050_APP_IDX, 0xff);
|
||||
zr36050_write(ptr, ZR050_APP_IDX + 1, 0xe0 + ptr->app.appn);
|
||||
zr36050_write(ptr, ZR050_APP_IDX + 2, 0x00);
|
||||
zr36050_write(ptr, ZR050_APP_IDX + 3, ptr->app.len + 2);
|
||||
sum += zr36050_pushit(ptr, ZR050_APP_IDX + 4, 60,
|
||||
ptr->app.data) + 4;
|
||||
zr36050_write(ptr, ZR050_COM_IDX, 0xff);
|
||||
zr36050_write(ptr, ZR050_COM_IDX + 1, 0xfe);
|
||||
zr36050_write(ptr, ZR050_COM_IDX + 2, 0x00);
|
||||
zr36050_write(ptr, ZR050_COM_IDX + 3, ptr->com.len + 2);
|
||||
sum += zr36050_pushit(ptr, ZR050_COM_IDX + 4, 60,
|
||||
ptr->com.data) + 4;
|
||||
|
||||
/* do the internal huffman table preload */
|
||||
zr36050_write(ptr, ZR050_MARKERS_EN, ZR050_ME_DHTI);
|
||||
|
||||
zr36050_write(ptr, ZR050_GO, 1); // launch codec
|
||||
zr36050_wait_end(ptr);
|
||||
dprintk(2, "%s: Status after table preload: 0x%02x\n",
|
||||
ptr->name, ptr->status1);
|
||||
|
||||
if ((ptr->status1 & 0x4) == 0) {
|
||||
dprintk(1, KERN_ERR "%s: init aborted!\n",
|
||||
ptr->name);
|
||||
return; // something is wrong, its timed out!!!!
|
||||
}
|
||||
|
||||
/* setup misc. data for compression (target code sizes) */
|
||||
|
||||
/* size of compressed code to reach without header data */
|
||||
sum = ptr->real_code_vol - sum;
|
||||
bitcnt = sum << 3; /* need the size in bits */
|
||||
|
||||
tmp = bitcnt >> 16;
|
||||
dprintk(3,
|
||||
"%s: code: csize=%d, tot=%d, bit=%ld, highbits=%ld\n",
|
||||
ptr->name, sum, ptr->real_code_vol, bitcnt, tmp);
|
||||
zr36050_write(ptr, ZR050_TCV_NET_HI, tmp >> 8);
|
||||
zr36050_write(ptr, ZR050_TCV_NET_MH, tmp & 0xff);
|
||||
tmp = bitcnt & 0xffff;
|
||||
zr36050_write(ptr, ZR050_TCV_NET_ML, tmp >> 8);
|
||||
zr36050_write(ptr, ZR050_TCV_NET_LO, tmp & 0xff);
|
||||
|
||||
bitcnt -= bitcnt >> 7; // bits without stuffing
|
||||
bitcnt -= ((bitcnt * 5) >> 6); // bits without eob
|
||||
|
||||
tmp = bitcnt >> 16;
|
||||
dprintk(3, "%s: code: nettobit=%ld, highnettobits=%ld\n",
|
||||
ptr->name, bitcnt, tmp);
|
||||
zr36050_write(ptr, ZR050_TCV_DATA_HI, tmp >> 8);
|
||||
zr36050_write(ptr, ZR050_TCV_DATA_MH, tmp & 0xff);
|
||||
tmp = bitcnt & 0xffff;
|
||||
zr36050_write(ptr, ZR050_TCV_DATA_ML, tmp >> 8);
|
||||
zr36050_write(ptr, ZR050_TCV_DATA_LO, tmp & 0xff);
|
||||
|
||||
/* compression setup with or without bitrate control */
|
||||
zr36050_write(ptr, ZR050_MODE,
|
||||
ZR050_MO_COMP | ZR050_MO_PASS2 |
|
||||
(ptr->bitrate_ctrl ? ZR050_MO_BRC : 0));
|
||||
|
||||
/* this headers seem to deliver "valid AVI" jpeg frames */
|
||||
zr36050_write(ptr, ZR050_MARKERS_EN,
|
||||
ZR050_ME_DQT | ZR050_ME_DHT |
|
||||
((ptr->app.len > 0) ? ZR050_ME_APP : 0) |
|
||||
((ptr->com.len > 0) ? ZR050_ME_COM : 0));
|
||||
} else {
|
||||
dprintk(2, "%s: EXPANSION SETUP\n", ptr->name);
|
||||
|
||||
/* 050 communicates with 055 in master mode */
|
||||
zr36050_write(ptr, ZR050_HARDWARE,
|
||||
ZR050_HW_MSTR | ZR050_HW_CFIS_2_CLK);
|
||||
|
||||
/* encoding table preload */
|
||||
zr36050_write(ptr, ZR050_MODE, ZR050_MO_TLM);
|
||||
|
||||
/* disable all IRQs */
|
||||
zr36050_write(ptr, ZR050_INT_REQ_0, 0);
|
||||
zr36050_write(ptr, ZR050_INT_REQ_1, 3); // low 2 bits always 1
|
||||
|
||||
dprintk(3, "%s: write DHT\n", ptr->name);
|
||||
zr36050_pushit(ptr, ZR050_DHT_IDX, sizeof(zr36050_dht),
|
||||
zr36050_dht);
|
||||
|
||||
/* do the internal huffman table preload */
|
||||
zr36050_write(ptr, ZR050_MARKERS_EN, ZR050_ME_DHTI);
|
||||
|
||||
zr36050_write(ptr, ZR050_GO, 1); // launch codec
|
||||
zr36050_wait_end(ptr);
|
||||
dprintk(2, "%s: Status after table preload: 0x%02x\n",
|
||||
ptr->name, ptr->status1);
|
||||
|
||||
if ((ptr->status1 & 0x4) == 0) {
|
||||
dprintk(1, KERN_ERR "%s: init aborted!\n",
|
||||
ptr->name);
|
||||
return; // something is wrong, its timed out!!!!
|
||||
}
|
||||
|
||||
/* setup misc. data for expansion */
|
||||
zr36050_write(ptr, ZR050_MODE, 0);
|
||||
zr36050_write(ptr, ZR050_MARKERS_EN, 0);
|
||||
}
|
||||
|
||||
/* adr on selected, to allow GO from master */
|
||||
zr36050_read(ptr, 0);
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
CODEC API FUNCTIONS
|
||||
|
||||
this functions are accessed by the master via the API structure
|
||||
========================================================================= */
|
||||
|
||||
/* set compression/expansion mode and launches codec -
|
||||
this should be the last call from the master before starting processing */
|
||||
static int
|
||||
zr36050_set_mode (struct videocodec *codec,
|
||||
int mode)
|
||||
{
|
||||
struct zr36050 *ptr = (struct zr36050 *) codec->data;
|
||||
|
||||
dprintk(2, "%s: set_mode %d call\n", ptr->name, mode);
|
||||
|
||||
if ((mode != CODEC_DO_EXPANSION) && (mode != CODEC_DO_COMPRESSION))
|
||||
return -EINVAL;
|
||||
|
||||
ptr->mode = mode;
|
||||
zr36050_init(ptr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* set picture size (norm is ignored as the codec doesn't know about it) */
|
||||
static int
|
||||
zr36050_set_video (struct videocodec *codec,
|
||||
struct tvnorm *norm,
|
||||
struct vfe_settings *cap,
|
||||
struct vfe_polarity *pol)
|
||||
{
|
||||
struct zr36050 *ptr = (struct zr36050 *) codec->data;
|
||||
int size;
|
||||
|
||||
dprintk(2, "%s: set_video %d.%d, %d/%d-%dx%d (0x%x) q%d call\n",
|
||||
ptr->name, norm->HStart, norm->VStart,
|
||||
cap->x, cap->y, cap->width, cap->height,
|
||||
cap->decimation, cap->quality);
|
||||
/* if () return -EINVAL;
|
||||
* trust the master driver that it knows what it does - so
|
||||
* we allow invalid startx/y and norm for now ... */
|
||||
ptr->width = cap->width / (cap->decimation & 0xff);
|
||||
ptr->height = cap->height / ((cap->decimation >> 8) & 0xff);
|
||||
|
||||
/* (KM) JPEG quality */
|
||||
size = ptr->width * ptr->height;
|
||||
size *= 16; /* size in bits */
|
||||
/* apply quality setting */
|
||||
size = size * cap->quality / 200;
|
||||
|
||||
/* Minimum: 1kb */
|
||||
if (size < 8192)
|
||||
size = 8192;
|
||||
/* Maximum: 7/8 of code buffer */
|
||||
if (size > ptr->total_code_vol * 7)
|
||||
size = ptr->total_code_vol * 7;
|
||||
|
||||
ptr->real_code_vol = size >> 3; /* in bytes */
|
||||
|
||||
/* Set max_block_vol here (previously in zr36050_init, moved
|
||||
* here for consistency with zr36060 code */
|
||||
zr36050_write(ptr, ZR050_MBCV, ptr->max_block_vol);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* additional control functions */
|
||||
static int
|
||||
zr36050_control (struct videocodec *codec,
|
||||
int type,
|
||||
int size,
|
||||
void *data)
|
||||
{
|
||||
struct zr36050 *ptr = (struct zr36050 *) codec->data;
|
||||
int *ival = (int *) data;
|
||||
|
||||
dprintk(2, "%s: control %d call with %d byte\n", ptr->name, type,
|
||||
size);
|
||||
|
||||
switch (type) {
|
||||
case CODEC_G_STATUS: /* get last status */
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
zr36050_read_status1(ptr);
|
||||
*ival = ptr->status1;
|
||||
break;
|
||||
|
||||
case CODEC_G_CODEC_MODE:
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
*ival = CODEC_MODE_BJPG;
|
||||
break;
|
||||
|
||||
case CODEC_S_CODEC_MODE:
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
if (*ival != CODEC_MODE_BJPG)
|
||||
return -EINVAL;
|
||||
/* not needed, do nothing */
|
||||
return 0;
|
||||
|
||||
case CODEC_G_VFE:
|
||||
case CODEC_S_VFE:
|
||||
/* not needed, do nothing */
|
||||
return 0;
|
||||
|
||||
case CODEC_S_MMAP:
|
||||
/* not available, give an error */
|
||||
return -ENXIO;
|
||||
|
||||
case CODEC_G_JPEG_TDS_BYTE: /* get target volume in byte */
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
*ival = ptr->total_code_vol;
|
||||
break;
|
||||
|
||||
case CODEC_S_JPEG_TDS_BYTE: /* get target volume in byte */
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
ptr->total_code_vol = *ival;
|
||||
/* (Kieran Morrissey)
|
||||
* code copied from zr36060.c to ensure proper bitrate */
|
||||
ptr->real_code_vol = (ptr->total_code_vol * 6) >> 3;
|
||||
break;
|
||||
|
||||
case CODEC_G_JPEG_SCALE: /* get scaling factor */
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
*ival = zr36050_read_scalefactor(ptr);
|
||||
break;
|
||||
|
||||
case CODEC_S_JPEG_SCALE: /* set scaling factor */
|
||||
if (size != sizeof(int))
|
||||
return -EFAULT;
|
||||
ptr->scalefact = *ival;
|
||||
break;
|
||||
|
||||
case CODEC_G_JPEG_APP_DATA: { /* get appn marker data */
|
||||
struct jpeg_app_marker *app = data;
|
||||
|
||||
if (size != sizeof(struct jpeg_app_marker))
|
||||
return -EFAULT;
|
||||
|
||||
*app = ptr->app;
|
||||
break;
|
||||
}
|
||||
|
||||
case CODEC_S_JPEG_APP_DATA: { /* set appn marker data */
|
||||
struct jpeg_app_marker *app = data;
|
||||
|
||||
if (size != sizeof(struct jpeg_app_marker))
|
||||
return -EFAULT;
|
||||
|
||||
ptr->app = *app;
|
||||
break;
|
||||
}
|
||||
|
||||
case CODEC_G_JPEG_COM_DATA: { /* get comment marker data */
|
||||
struct jpeg_com_marker *com = data;
|
||||
|
||||
if (size != sizeof(struct jpeg_com_marker))
|
||||
return -EFAULT;
|
||||
|
||||
*com = ptr->com;
|
||||
break;
|
||||
}
|
||||
|
||||
case CODEC_S_JPEG_COM_DATA: { /* set comment marker data */
|
||||
struct jpeg_com_marker *com = data;
|
||||
|
||||
if (size != sizeof(struct jpeg_com_marker))
|
||||
return -EFAULT;
|
||||
|
||||
ptr->com = *com;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Exit and unregister function:
|
||||
|
||||
Deinitializes Zoran's JPEG processor
|
||||
========================================================================= */
|
||||
|
||||
static int
|
||||
zr36050_unset (struct videocodec *codec)
|
||||
{
|
||||
struct zr36050 *ptr = codec->data;
|
||||
|
||||
if (ptr) {
|
||||
/* do wee need some codec deinit here, too ???? */
|
||||
|
||||
dprintk(1, "%s: finished codec #%d\n", ptr->name,
|
||||
ptr->num);
|
||||
kfree(ptr);
|
||||
codec->data = NULL;
|
||||
|
||||
zr36050_codecs--;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
Setup and registry function:
|
||||
|
||||
Initializes Zoran's JPEG processor
|
||||
|
||||
Also sets pixel size, average code size, mode (compr./decompr.)
|
||||
(the given size is determined by the processor with the video interface)
|
||||
========================================================================= */
|
||||
|
||||
static int
|
||||
zr36050_setup (struct videocodec *codec)
|
||||
{
|
||||
struct zr36050 *ptr;
|
||||
int res;
|
||||
|
||||
dprintk(2, "zr36050: initializing MJPEG subsystem #%d.\n",
|
||||
zr36050_codecs);
|
||||
|
||||
if (zr36050_codecs == MAX_CODECS) {
|
||||
dprintk(1,
|
||||
KERN_ERR "zr36050: Can't attach more codecs!\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
//mem structure init
|
||||
codec->data = ptr = kzalloc(sizeof(struct zr36050), GFP_KERNEL);
|
||||
if (NULL == ptr) {
|
||||
dprintk(1, KERN_ERR "zr36050: Can't get enough memory!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
snprintf(ptr->name, sizeof(ptr->name), "zr36050[%d]",
|
||||
zr36050_codecs);
|
||||
ptr->num = zr36050_codecs++;
|
||||
ptr->codec = codec;
|
||||
|
||||
//testing
|
||||
res = zr36050_basic_test(ptr);
|
||||
if (res < 0) {
|
||||
zr36050_unset(codec);
|
||||
return res;
|
||||
}
|
||||
//final setup
|
||||
memcpy(ptr->h_samp_ratio, zr36050_decimation_h, 8);
|
||||
memcpy(ptr->v_samp_ratio, zr36050_decimation_v, 8);
|
||||
|
||||
ptr->bitrate_ctrl = 0; /* 0 or 1 - fixed file size flag
|
||||
* (what is the difference?) */
|
||||
ptr->mode = CODEC_DO_COMPRESSION;
|
||||
ptr->width = 384;
|
||||
ptr->height = 288;
|
||||
ptr->total_code_vol = 16000;
|
||||
ptr->max_block_vol = 240;
|
||||
ptr->scalefact = 0x100;
|
||||
ptr->dri = 1;
|
||||
|
||||
/* no app/com marker by default */
|
||||
ptr->app.appn = 0;
|
||||
ptr->app.len = 0;
|
||||
ptr->com.len = 0;
|
||||
|
||||
zr36050_init(ptr);
|
||||
|
||||
dprintk(1, KERN_INFO "%s: codec attached and running\n",
|
||||
ptr->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct videocodec zr36050_codec = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "zr36050",
|
||||
.magic = 0L, // magic not used
|
||||
.flags =
|
||||
CODEC_FLAG_JPEG | CODEC_FLAG_HARDWARE | CODEC_FLAG_ENCODER |
|
||||
CODEC_FLAG_DECODER,
|
||||
.type = CODEC_TYPE_ZR36050,
|
||||
.setup = zr36050_setup, // functionality
|
||||
.unset = zr36050_unset,
|
||||
.set_mode = zr36050_set_mode,
|
||||
.set_video = zr36050_set_video,
|
||||
.control = zr36050_control,
|
||||
// others are not used
|
||||
};
|
||||
|
||||
/* =========================================================================
|
||||
HOOK IN DRIVER AS KERNEL MODULE
|
||||
========================================================================= */
|
||||
|
||||
static int __init
|
||||
zr36050_init_module (void)
|
||||
{
|
||||
//dprintk(1, "ZR36050 driver %s\n",ZR050_VERSION);
|
||||
zr36050_codecs = 0;
|
||||
return videocodec_register(&zr36050_codec);
|
||||
}
|
||||
|
||||
static void __exit
|
||||
zr36050_cleanup_module (void)
|
||||
{
|
||||
if (zr36050_codecs) {
|
||||
dprintk(1,
|
||||
"zr36050: something's wrong - %d codecs left somehow.\n",
|
||||
zr36050_codecs);
|
||||
}
|
||||
videocodec_unregister(&zr36050_codec);
|
||||
}
|
||||
|
||||
module_init(zr36050_init_module);
|
||||
module_exit(zr36050_cleanup_module);
|
||||
|
||||
MODULE_AUTHOR("Wolfgang Scherr <scherr@net4you.at>");
|
||||
MODULE_DESCRIPTION("Driver module for ZR36050 jpeg processors "
|
||||
ZR050_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
@ -1,179 +0,0 @@
|
||||
/*
|
||||
* Zoran ZR36050 basic configuration functions - header file
|
||||
*
|
||||
* Copyright (C) 2001 Wolfgang Scherr <scherr@net4you.at>
|
||||
*
|
||||
* $Id: zr36050.h,v 1.1.2.2 2003/01/14 21:18:22 rbultje Exp $
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef ZR36050_H
|
||||
#define ZR36050_H
|
||||
|
||||
#include "videocodec.h"
|
||||
|
||||
/* data stored for each zoran jpeg codec chip */
|
||||
struct zr36050 {
|
||||
char name[32];
|
||||
int num;
|
||||
/* io datastructure */
|
||||
struct videocodec *codec;
|
||||
// last coder status
|
||||
__u8 status1;
|
||||
// actual coder setup
|
||||
int mode;
|
||||
|
||||
__u16 width;
|
||||
__u16 height;
|
||||
|
||||
__u16 bitrate_ctrl;
|
||||
|
||||
__u32 total_code_vol;
|
||||
__u32 real_code_vol;
|
||||
__u16 max_block_vol;
|
||||
|
||||
__u8 h_samp_ratio[8];
|
||||
__u8 v_samp_ratio[8];
|
||||
__u16 scalefact;
|
||||
__u16 dri;
|
||||
|
||||
/* com/app marker */
|
||||
struct jpeg_com_marker com;
|
||||
struct jpeg_app_marker app;
|
||||
};
|
||||
|
||||
/* zr36050 register addresses */
|
||||
#define ZR050_GO 0x000
|
||||
#define ZR050_HARDWARE 0x002
|
||||
#define ZR050_MODE 0x003
|
||||
#define ZR050_OPTIONS 0x004
|
||||
#define ZR050_MBCV 0x005
|
||||
#define ZR050_MARKERS_EN 0x006
|
||||
#define ZR050_INT_REQ_0 0x007
|
||||
#define ZR050_INT_REQ_1 0x008
|
||||
#define ZR050_TCV_NET_HI 0x009
|
||||
#define ZR050_TCV_NET_MH 0x00a
|
||||
#define ZR050_TCV_NET_ML 0x00b
|
||||
#define ZR050_TCV_NET_LO 0x00c
|
||||
#define ZR050_TCV_DATA_HI 0x00d
|
||||
#define ZR050_TCV_DATA_MH 0x00e
|
||||
#define ZR050_TCV_DATA_ML 0x00f
|
||||
#define ZR050_TCV_DATA_LO 0x010
|
||||
#define ZR050_SF_HI 0x011
|
||||
#define ZR050_SF_LO 0x012
|
||||
#define ZR050_AF_HI 0x013
|
||||
#define ZR050_AF_M 0x014
|
||||
#define ZR050_AF_LO 0x015
|
||||
#define ZR050_ACV_HI 0x016
|
||||
#define ZR050_ACV_MH 0x017
|
||||
#define ZR050_ACV_ML 0x018
|
||||
#define ZR050_ACV_LO 0x019
|
||||
#define ZR050_ACT_HI 0x01a
|
||||
#define ZR050_ACT_MH 0x01b
|
||||
#define ZR050_ACT_ML 0x01c
|
||||
#define ZR050_ACT_LO 0x01d
|
||||
#define ZR050_ACV_TRUN_HI 0x01e
|
||||
#define ZR050_ACV_TRUN_MH 0x01f
|
||||
#define ZR050_ACV_TRUN_ML 0x020
|
||||
#define ZR050_ACV_TRUN_LO 0x021
|
||||
#define ZR050_STATUS_0 0x02e
|
||||
#define ZR050_STATUS_1 0x02f
|
||||
|
||||
#define ZR050_SOF_IDX 0x040
|
||||
#define ZR050_SOS1_IDX 0x07a
|
||||
#define ZR050_SOS2_IDX 0x08a
|
||||
#define ZR050_SOS3_IDX 0x09a
|
||||
#define ZR050_SOS4_IDX 0x0aa
|
||||
#define ZR050_DRI_IDX 0x0c0
|
||||
#define ZR050_DNL_IDX 0x0c6
|
||||
#define ZR050_DQT_IDX 0x0cc
|
||||
#define ZR050_DHT_IDX 0x1d4
|
||||
#define ZR050_APP_IDX 0x380
|
||||
#define ZR050_COM_IDX 0x3c0
|
||||
|
||||
/* zr36050 hardware register bits */
|
||||
|
||||
#define ZR050_HW_BSWD 0x80
|
||||
#define ZR050_HW_MSTR 0x40
|
||||
#define ZR050_HW_DMA 0x20
|
||||
#define ZR050_HW_CFIS_1_CLK 0x00
|
||||
#define ZR050_HW_CFIS_2_CLK 0x04
|
||||
#define ZR050_HW_CFIS_3_CLK 0x08
|
||||
#define ZR050_HW_CFIS_4_CLK 0x0C
|
||||
#define ZR050_HW_CFIS_5_CLK 0x10
|
||||
#define ZR050_HW_CFIS_6_CLK 0x14
|
||||
#define ZR050_HW_CFIS_7_CLK 0x18
|
||||
#define ZR050_HW_CFIS_8_CLK 0x1C
|
||||
#define ZR050_HW_BELE 0x01
|
||||
|
||||
/* zr36050 mode register bits */
|
||||
|
||||
#define ZR050_MO_COMP 0x80
|
||||
#define ZR050_MO_ATP 0x40
|
||||
#define ZR050_MO_PASS2 0x20
|
||||
#define ZR050_MO_TLM 0x10
|
||||
#define ZR050_MO_DCONLY 0x08
|
||||
#define ZR050_MO_BRC 0x04
|
||||
|
||||
#define ZR050_MO_ATP 0x40
|
||||
#define ZR050_MO_PASS2 0x20
|
||||
#define ZR050_MO_TLM 0x10
|
||||
#define ZR050_MO_DCONLY 0x08
|
||||
|
||||
/* zr36050 option register bits */
|
||||
|
||||
#define ZR050_OP_NSCN_1 0x00
|
||||
#define ZR050_OP_NSCN_2 0x20
|
||||
#define ZR050_OP_NSCN_3 0x40
|
||||
#define ZR050_OP_NSCN_4 0x60
|
||||
#define ZR050_OP_NSCN_5 0x80
|
||||
#define ZR050_OP_NSCN_6 0xA0
|
||||
#define ZR050_OP_NSCN_7 0xC0
|
||||
#define ZR050_OP_NSCN_8 0xE0
|
||||
#define ZR050_OP_OVF 0x10
|
||||
|
||||
|
||||
/* zr36050 markers-enable register bits */
|
||||
|
||||
#define ZR050_ME_APP 0x80
|
||||
#define ZR050_ME_COM 0x40
|
||||
#define ZR050_ME_DRI 0x20
|
||||
#define ZR050_ME_DQT 0x10
|
||||
#define ZR050_ME_DHT 0x08
|
||||
#define ZR050_ME_DNL 0x04
|
||||
#define ZR050_ME_DQTI 0x02
|
||||
#define ZR050_ME_DHTI 0x01
|
||||
|
||||
/* zr36050 status0/1 register bit masks */
|
||||
|
||||
#define ZR050_ST_RST_MASK 0x20
|
||||
#define ZR050_ST_SOF_MASK 0x02
|
||||
#define ZR050_ST_SOS_MASK 0x02
|
||||
#define ZR050_ST_DATRDY_MASK 0x80
|
||||
#define ZR050_ST_MRKDET_MASK 0x40
|
||||
#define ZR050_ST_RFM_MASK 0x10
|
||||
#define ZR050_ST_RFD_MASK 0x08
|
||||
#define ZR050_ST_END_MASK 0x04
|
||||
#define ZR050_ST_TCVOVF_MASK 0x02
|
||||
#define ZR050_ST_DATOVF_MASK 0x01
|
||||
|
||||
/* pixel component idx */
|
||||
|
||||
#define ZR050_Y_COMPONENT 0
|
||||
#define ZR050_U_COMPONENT 1
|
||||
#define ZR050_V_COMPONENT 2
|
||||
|
||||
#endif /*fndef ZR36050_H */
|
@ -1,164 +0,0 @@
|
||||
/*
|
||||
* zr36057.h - zr36057 register offsets
|
||||
*
|
||||
* Copyright (C) 1998 Dave Perks <dperks@ibm.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _ZR36057_H_
|
||||
#define _ZR36057_H_
|
||||
|
||||
|
||||
/* Zoran ZR36057 registers */
|
||||
|
||||
#define ZR36057_VFEHCR 0x000 /* Video Front End, Horizontal Configuration Register */
|
||||
#define ZR36057_VFEHCR_HSPol (1<<30)
|
||||
#define ZR36057_VFEHCR_HStart 10
|
||||
#define ZR36057_VFEHCR_HEnd 0
|
||||
#define ZR36057_VFEHCR_Hmask 0x3ff
|
||||
|
||||
#define ZR36057_VFEVCR 0x004 /* Video Front End, Vertical Configuration Register */
|
||||
#define ZR36057_VFEVCR_VSPol (1<<30)
|
||||
#define ZR36057_VFEVCR_VStart 10
|
||||
#define ZR36057_VFEVCR_VEnd 0
|
||||
#define ZR36057_VFEVCR_Vmask 0x3ff
|
||||
|
||||
#define ZR36057_VFESPFR 0x008 /* Video Front End, Scaler and Pixel Format Register */
|
||||
#define ZR36057_VFESPFR_ExtFl (1<<26)
|
||||
#define ZR36057_VFESPFR_TopField (1<<25)
|
||||
#define ZR36057_VFESPFR_VCLKPol (1<<24)
|
||||
#define ZR36057_VFESPFR_HFilter 21
|
||||
#define ZR36057_VFESPFR_HorDcm 14
|
||||
#define ZR36057_VFESPFR_VerDcm 8
|
||||
#define ZR36057_VFESPFR_DispMode 6
|
||||
#define ZR36057_VFESPFR_YUV422 (0<<3)
|
||||
#define ZR36057_VFESPFR_RGB888 (1<<3)
|
||||
#define ZR36057_VFESPFR_RGB565 (2<<3)
|
||||
#define ZR36057_VFESPFR_RGB555 (3<<3)
|
||||
#define ZR36057_VFESPFR_ErrDif (1<<2)
|
||||
#define ZR36057_VFESPFR_Pack24 (1<<1)
|
||||
#define ZR36057_VFESPFR_LittleEndian (1<<0)
|
||||
|
||||
#define ZR36057_VDTR 0x00c /* Video Display "Top" Register */
|
||||
|
||||
#define ZR36057_VDBR 0x010 /* Video Display "Bottom" Register */
|
||||
|
||||
#define ZR36057_VSSFGR 0x014 /* Video Stride, Status, and Frame Grab Register */
|
||||
#define ZR36057_VSSFGR_DispStride 16
|
||||
#define ZR36057_VSSFGR_VidOvf (1<<8)
|
||||
#define ZR36057_VSSFGR_SnapShot (1<<1)
|
||||
#define ZR36057_VSSFGR_FrameGrab (1<<0)
|
||||
|
||||
#define ZR36057_VDCR 0x018 /* Video Display Configuration Register */
|
||||
#define ZR36057_VDCR_VidEn (1<<31)
|
||||
#define ZR36057_VDCR_MinPix 24
|
||||
#define ZR36057_VDCR_Triton (1<<24)
|
||||
#define ZR36057_VDCR_VidWinHt 12
|
||||
#define ZR36057_VDCR_VidWinWid 0
|
||||
|
||||
#define ZR36057_MMTR 0x01c /* Masking Map "Top" Register */
|
||||
|
||||
#define ZR36057_MMBR 0x020 /* Masking Map "Bottom" Register */
|
||||
|
||||
#define ZR36057_OCR 0x024 /* Overlay Control Register */
|
||||
#define ZR36057_OCR_OvlEnable (1 << 15)
|
||||
#define ZR36057_OCR_MaskStride 0
|
||||
|
||||
#define ZR36057_SPGPPCR 0x028 /* System, PCI, and General Purpose Pins Control Register */
|
||||
#define ZR36057_SPGPPCR_SoftReset (1<<24)
|
||||
|
||||
#define ZR36057_GPPGCR1 0x02c /* General Purpose Pins and GuestBus Control Register (1) */
|
||||
|
||||
#define ZR36057_MCSAR 0x030 /* MPEG Code Source Address Register */
|
||||
|
||||
#define ZR36057_MCTCR 0x034 /* MPEG Code Transfer Control Register */
|
||||
#define ZR36057_MCTCR_CodTime (1 << 30)
|
||||
#define ZR36057_MCTCR_CEmpty (1 << 29)
|
||||
#define ZR36057_MCTCR_CFlush (1 << 28)
|
||||
#define ZR36057_MCTCR_CodGuestID 20
|
||||
#define ZR36057_MCTCR_CodGuestReg 16
|
||||
|
||||
#define ZR36057_MCMPR 0x038 /* MPEG Code Memory Pointer Register */
|
||||
|
||||
#define ZR36057_ISR 0x03c /* Interrupt Status Register */
|
||||
#define ZR36057_ISR_GIRQ1 (1<<30)
|
||||
#define ZR36057_ISR_GIRQ0 (1<<29)
|
||||
#define ZR36057_ISR_CodRepIRQ (1<<28)
|
||||
#define ZR36057_ISR_JPEGRepIRQ (1<<27)
|
||||
|
||||
#define ZR36057_ICR 0x040 /* Interrupt Control Register */
|
||||
#define ZR36057_ICR_GIRQ1 (1<<30)
|
||||
#define ZR36057_ICR_GIRQ0 (1<<29)
|
||||
#define ZR36057_ICR_CodRepIRQ (1<<28)
|
||||
#define ZR36057_ICR_JPEGRepIRQ (1<<27)
|
||||
#define ZR36057_ICR_IntPinEn (1<<24)
|
||||
|
||||
#define ZR36057_I2CBR 0x044 /* I2C Bus Register */
|
||||
#define ZR36057_I2CBR_SDA (1<<1)
|
||||
#define ZR36057_I2CBR_SCL (1<<0)
|
||||
|
||||
#define ZR36057_JMC 0x100 /* JPEG Mode and Control */
|
||||
#define ZR36057_JMC_JPG (1 << 31)
|
||||
#define ZR36057_JMC_JPGExpMode (0 << 29)
|
||||
#define ZR36057_JMC_JPGCmpMode (1 << 29)
|
||||
#define ZR36057_JMC_MJPGExpMode (2 << 29)
|
||||
#define ZR36057_JMC_MJPGCmpMode (3 << 29)
|
||||
#define ZR36057_JMC_RTBUSY_FB (1 << 6)
|
||||
#define ZR36057_JMC_Go_en (1 << 5)
|
||||
#define ZR36057_JMC_SyncMstr (1 << 4)
|
||||
#define ZR36057_JMC_Fld_per_buff (1 << 3)
|
||||
#define ZR36057_JMC_VFIFO_FB (1 << 2)
|
||||
#define ZR36057_JMC_CFIFO_FB (1 << 1)
|
||||
#define ZR36057_JMC_Stll_LitEndian (1 << 0)
|
||||
|
||||
#define ZR36057_JPC 0x104 /* JPEG Process Control */
|
||||
#define ZR36057_JPC_P_Reset (1 << 7)
|
||||
#define ZR36057_JPC_CodTrnsEn (1 << 5)
|
||||
#define ZR36057_JPC_Active (1 << 0)
|
||||
|
||||
#define ZR36057_VSP 0x108 /* Vertical Sync Parameters */
|
||||
#define ZR36057_VSP_VsyncSize 16
|
||||
#define ZR36057_VSP_FrmTot 0
|
||||
|
||||
#define ZR36057_HSP 0x10c /* Horizontal Sync Parameters */
|
||||
#define ZR36057_HSP_HsyncStart 16
|
||||
#define ZR36057_HSP_LineTot 0
|
||||
|
||||
#define ZR36057_FHAP 0x110 /* Field Horizontal Active Portion */
|
||||
#define ZR36057_FHAP_NAX 16
|
||||
#define ZR36057_FHAP_PAX 0
|
||||
|
||||
#define ZR36057_FVAP 0x114 /* Field Vertical Active Portion */
|
||||
#define ZR36057_FVAP_NAY 16
|
||||
#define ZR36057_FVAP_PAY 0
|
||||
|
||||
#define ZR36057_FPP 0x118 /* Field Process Parameters */
|
||||
#define ZR36057_FPP_Odd_Even (1 << 0)
|
||||
|
||||
#define ZR36057_JCBA 0x11c /* JPEG Code Base Address */
|
||||
|
||||
#define ZR36057_JCFT 0x120 /* JPEG Code FIFO Threshold */
|
||||
|
||||
#define ZR36057_JCGI 0x124 /* JPEG Codec Guest ID */
|
||||
#define ZR36057_JCGI_JPEGuestID 4
|
||||
#define ZR36057_JCGI_JPEGuestReg 0
|
||||
|
||||
#define ZR36057_GCR2 0x12c /* GuestBus Control Register (2) */
|
||||
|
||||
#define ZR36057_POR 0x200 /* Post Office Register */
|
||||
#define ZR36057_POR_POPen (1<<25)
|
||||
#define ZR36057_POR_POTime (1<<24)
|
||||
#define ZR36057_POR_PODir (1<<23)
|
||||
|
||||
#define ZR36057_STR 0x300 /* "Still" Transfer Register */
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -1,216 +0,0 @@
|
||||
/*
|
||||
* Zoran ZR36060 basic configuration functions - header file
|
||||
*
|
||||
* Copyright (C) 2002 Laurent Pinchart <laurent.pinchart@skynet.be>
|
||||
*
|
||||
* $Id: zr36060.h,v 1.1.1.1.2.3 2003/01/14 21:18:47 rbultje Exp $
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* ------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef ZR36060_H
|
||||
#define ZR36060_H
|
||||
|
||||
#include "videocodec.h"
|
||||
|
||||
/* data stored for each zoran jpeg codec chip */
|
||||
struct zr36060 {
|
||||
char name[32];
|
||||
int num;
|
||||
/* io datastructure */
|
||||
struct videocodec *codec;
|
||||
// last coder status
|
||||
__u8 status;
|
||||
// actual coder setup
|
||||
int mode;
|
||||
|
||||
__u16 width;
|
||||
__u16 height;
|
||||
|
||||
__u16 bitrate_ctrl;
|
||||
|
||||
__u32 total_code_vol;
|
||||
__u32 real_code_vol;
|
||||
__u16 max_block_vol;
|
||||
|
||||
__u8 h_samp_ratio[8];
|
||||
__u8 v_samp_ratio[8];
|
||||
__u16 scalefact;
|
||||
__u16 dri;
|
||||
|
||||
/* app/com marker data */
|
||||
struct jpeg_app_marker app;
|
||||
struct jpeg_com_marker com;
|
||||
};
|
||||
|
||||
/* ZR36060 register addresses */
|
||||
#define ZR060_LOAD 0x000
|
||||
#define ZR060_CFSR 0x001
|
||||
#define ZR060_CIR 0x002
|
||||
#define ZR060_CMR 0x003
|
||||
#define ZR060_MBZ 0x004
|
||||
#define ZR060_MBCVR 0x005
|
||||
#define ZR060_MER 0x006
|
||||
#define ZR060_IMR 0x007
|
||||
#define ZR060_ISR 0x008
|
||||
#define ZR060_TCV_NET_HI 0x009
|
||||
#define ZR060_TCV_NET_MH 0x00a
|
||||
#define ZR060_TCV_NET_ML 0x00b
|
||||
#define ZR060_TCV_NET_LO 0x00c
|
||||
#define ZR060_TCV_DATA_HI 0x00d
|
||||
#define ZR060_TCV_DATA_MH 0x00e
|
||||
#define ZR060_TCV_DATA_ML 0x00f
|
||||
#define ZR060_TCV_DATA_LO 0x010
|
||||
#define ZR060_SF_HI 0x011
|
||||
#define ZR060_SF_LO 0x012
|
||||
#define ZR060_AF_HI 0x013
|
||||
#define ZR060_AF_M 0x014
|
||||
#define ZR060_AF_LO 0x015
|
||||
#define ZR060_ACV_HI 0x016
|
||||
#define ZR060_ACV_MH 0x017
|
||||
#define ZR060_ACV_ML 0x018
|
||||
#define ZR060_ACV_LO 0x019
|
||||
#define ZR060_ACT_HI 0x01a
|
||||
#define ZR060_ACT_MH 0x01b
|
||||
#define ZR060_ACT_ML 0x01c
|
||||
#define ZR060_ACT_LO 0x01d
|
||||
#define ZR060_ACV_TRUN_HI 0x01e
|
||||
#define ZR060_ACV_TRUN_MH 0x01f
|
||||
#define ZR060_ACV_TRUN_ML 0x020
|
||||
#define ZR060_ACV_TRUN_LO 0x021
|
||||
#define ZR060_IDR_DEV 0x022
|
||||
#define ZR060_IDR_REV 0x023
|
||||
#define ZR060_TCR_HI 0x024
|
||||
#define ZR060_TCR_LO 0x025
|
||||
#define ZR060_VCR 0x030
|
||||
#define ZR060_VPR 0x031
|
||||
#define ZR060_SR 0x032
|
||||
#define ZR060_BCR_Y 0x033
|
||||
#define ZR060_BCR_U 0x034
|
||||
#define ZR060_BCR_V 0x035
|
||||
#define ZR060_SGR_VTOTAL_HI 0x036
|
||||
#define ZR060_SGR_VTOTAL_LO 0x037
|
||||
#define ZR060_SGR_HTOTAL_HI 0x038
|
||||
#define ZR060_SGR_HTOTAL_LO 0x039
|
||||
#define ZR060_SGR_VSYNC 0x03a
|
||||
#define ZR060_SGR_HSYNC 0x03b
|
||||
#define ZR060_SGR_BVSTART 0x03c
|
||||
#define ZR060_SGR_BHSTART 0x03d
|
||||
#define ZR060_SGR_BVEND_HI 0x03e
|
||||
#define ZR060_SGR_BVEND_LO 0x03f
|
||||
#define ZR060_SGR_BHEND_HI 0x040
|
||||
#define ZR060_SGR_BHEND_LO 0x041
|
||||
#define ZR060_AAR_VSTART_HI 0x042
|
||||
#define ZR060_AAR_VSTART_LO 0x043
|
||||
#define ZR060_AAR_VEND_HI 0x044
|
||||
#define ZR060_AAR_VEND_LO 0x045
|
||||
#define ZR060_AAR_HSTART_HI 0x046
|
||||
#define ZR060_AAR_HSTART_LO 0x047
|
||||
#define ZR060_AAR_HEND_HI 0x048
|
||||
#define ZR060_AAR_HEND_LO 0x049
|
||||
#define ZR060_SWR_VSTART_HI 0x04a
|
||||
#define ZR060_SWR_VSTART_LO 0x04b
|
||||
#define ZR060_SWR_VEND_HI 0x04c
|
||||
#define ZR060_SWR_VEND_LO 0x04d
|
||||
#define ZR060_SWR_HSTART_HI 0x04e
|
||||
#define ZR060_SWR_HSTART_LO 0x04f
|
||||
#define ZR060_SWR_HEND_HI 0x050
|
||||
#define ZR060_SWR_HEND_LO 0x051
|
||||
|
||||
#define ZR060_SOF_IDX 0x060
|
||||
#define ZR060_SOS_IDX 0x07a
|
||||
#define ZR060_DRI_IDX 0x0c0
|
||||
#define ZR060_DQT_IDX 0x0cc
|
||||
#define ZR060_DHT_IDX 0x1d4
|
||||
#define ZR060_APP_IDX 0x380
|
||||
#define ZR060_COM_IDX 0x3c0
|
||||
|
||||
/* ZR36060 LOAD register bits */
|
||||
|
||||
#define ZR060_LOAD_Load (1 << 7)
|
||||
#define ZR060_LOAD_SyncRst (1 << 0)
|
||||
|
||||
/* ZR36060 Code FIFO Status register bits */
|
||||
|
||||
#define ZR060_CFSR_Busy (1 << 7)
|
||||
#define ZR060_CFSR_CBusy (1 << 2)
|
||||
#define ZR060_CFSR_CFIFO (3 << 0)
|
||||
|
||||
/* ZR36060 Code Interface register */
|
||||
|
||||
#define ZR060_CIR_Code16 (1 << 7)
|
||||
#define ZR060_CIR_Endian (1 << 6)
|
||||
#define ZR060_CIR_CFIS (1 << 2)
|
||||
#define ZR060_CIR_CodeMstr (1 << 0)
|
||||
|
||||
/* ZR36060 Codec Mode register */
|
||||
|
||||
#define ZR060_CMR_Comp (1 << 7)
|
||||
#define ZR060_CMR_ATP (1 << 6)
|
||||
#define ZR060_CMR_Pass2 (1 << 5)
|
||||
#define ZR060_CMR_TLM (1 << 4)
|
||||
#define ZR060_CMR_BRB (1 << 2)
|
||||
#define ZR060_CMR_FSF (1 << 1)
|
||||
|
||||
/* ZR36060 Markers Enable register */
|
||||
|
||||
#define ZR060_MER_App (1 << 7)
|
||||
#define ZR060_MER_Com (1 << 6)
|
||||
#define ZR060_MER_DRI (1 << 5)
|
||||
#define ZR060_MER_DQT (1 << 4)
|
||||
#define ZR060_MER_DHT (1 << 3)
|
||||
|
||||
/* ZR36060 Interrupt Mask register */
|
||||
|
||||
#define ZR060_IMR_EOAV (1 << 3)
|
||||
#define ZR060_IMR_EOI (1 << 2)
|
||||
#define ZR060_IMR_End (1 << 1)
|
||||
#define ZR060_IMR_DataErr (1 << 0)
|
||||
|
||||
/* ZR36060 Interrupt Status register */
|
||||
|
||||
#define ZR060_ISR_ProCnt (3 << 6)
|
||||
#define ZR060_ISR_EOAV (1 << 3)
|
||||
#define ZR060_ISR_EOI (1 << 2)
|
||||
#define ZR060_ISR_End (1 << 1)
|
||||
#define ZR060_ISR_DataErr (1 << 0)
|
||||
|
||||
/* ZR36060 Video Control register */
|
||||
|
||||
#define ZR060_VCR_Video8 (1 << 7)
|
||||
#define ZR060_VCR_Range (1 << 6)
|
||||
#define ZR060_VCR_FIDet (1 << 3)
|
||||
#define ZR060_VCR_FIVedge (1 << 2)
|
||||
#define ZR060_VCR_FIExt (1 << 1)
|
||||
#define ZR060_VCR_SyncMstr (1 << 0)
|
||||
|
||||
/* ZR36060 Video Polarity register */
|
||||
|
||||
#define ZR060_VPR_VCLKPol (1 << 7)
|
||||
#define ZR060_VPR_PValPol (1 << 6)
|
||||
#define ZR060_VPR_PoePol (1 << 5)
|
||||
#define ZR060_VPR_SImgPol (1 << 4)
|
||||
#define ZR060_VPR_BLPol (1 << 3)
|
||||
#define ZR060_VPR_FIPol (1 << 2)
|
||||
#define ZR060_VPR_HSPol (1 << 1)
|
||||
#define ZR060_VPR_VSPol (1 << 0)
|
||||
|
||||
/* ZR36060 Scaling register */
|
||||
|
||||
#define ZR060_SR_VScale (1 << 2)
|
||||
#define ZR060_SR_HScale2 (1 << 0)
|
||||
#define ZR060_SR_HScale4 (2 << 0)
|
||||
|
||||
#endif /*fndef ZR36060_H */
|
Loading…
Reference in New Issue
Block a user