1PVR350 Video decoder registers 0x02002800 -> 0x02002B00
2=======================================================
3
4This list has been worked out through trial and error. There will be mistakes
5and omissions. Some registers have no obvious effect so it's hard to say what
6they do, while others interact with each other, or require a certain load
7sequence. Horizontal filter setup is one example, with six registers working
8in unison and requiring a certain load sequence to correctly configure. The
9indexed colour palette is much easier to set at just two registers, but again
10it requires a certain load sequence.
11
12Some registers are fussy about what they are set to. Load in a bad value & the
13decoder will fail. A firmware reload will often recover, but sometimes a reset
14is required. For registers containing size information, setting them to 0 is
15generally a bad idea. For other control registers i.e. 2878, you'll only find
16out what values are bad when it hangs.
17
18--------------------------------------------------------------------------------
192800
20      bit 0
21	Decoder enable
22	  0 = disable
23	  1 = enable
24--------------------------------------------------------------------------------
252804
26      bits 0:31
27	Decoder horizontal Y alias register 1
28---------------
292808
30      bits 0:31
31	Decoder horizontal Y alias register 2
32---------------
33280C
34      bits 0:31
35	Decoder horizontal Y alias register 3
36---------------
372810
38      bits 0:31
39	Decoder horizontal Y alias register 4
40---------------
412814
42      bits 0:31
43	Decoder horizontal Y alias register 5
44---------------
452818
46      bits 0:31
47	Decoder horizontal Y alias trigger
48
49     These six registers control the horizontal aliasing filter for the Y plane.
50     The first five registers must all be loaded before accessing the trigger
51     (2818), as this register actually clocks the data through for the first
52     five.
53
54     To correctly program set the filter, this whole procedure must be done 16
55     times. The actual register contents are copied from a lookup-table in the
56     firmware which contains 4 different filter settings.
57
58--------------------------------------------------------------------------------
59281C
60      bits 0:31
61	Decoder horizontal UV alias register 1
62---------------
632820
64      bits 0:31
65	Decoder horizontal UV alias register 2
66---------------
672824
68      bits 0:31
69	Decoder horizontal UV alias register 3
70---------------
712828
72      bits 0:31
73	Decoder horizontal UV alias register 4
74---------------
75282C
76      bits 0:31
77	Decoder horizontal UV alias register 5
78---------------
792830
80      bits 0:31
81	Decoder horizontal UV alias trigger
82
83     These six registers control the horizontal aliasing for the UV plane.
84     Operation is the same as the Y filter, with 2830 being the trigger
85     register.
86
87--------------------------------------------------------------------------------
882834
89      bits 0:15
90	Decoder Y source width in pixels
91
92      bits 16:31
93	Decoder Y destination width in pixels
94---------------
952838
96      bits 0:15
97	Decoder UV source width in pixels
98
99      bits 16:31
100	Decoder UV destination width in pixels
101
102     NOTE: For both registers, the resulting image must be fully visible on
103     screen. If the image exceeds the right edge both the source and destination
104     size must be adjusted to reflect the visible portion. For the source width,
105     you must take into account the scaling when calculating the new value.
106--------------------------------------------------------------------------------
107
108283C
109      bits 0:31
110	Decoder Y horizontal scaling
111		    Normally = Reg 2854 >> 2
112---------------
1132840
114      bits 0:31
115	Decoder ?? unknown - horizontal scaling
116	  Usually 0x00080514
117---------------
1182844
119      bits 0:31
120	Decoder UV horizontal scaling
121	  Normally = Reg 2854 >> 2
122---------------
1232848
124      bits 0:31
125	Decoder ?? unknown - horizontal scaling
126	  Usually 0x00100514
127---------------
128284C
129      bits 0:31
130	Decoder ?? unknown - Y plane
131	  Usually 0x00200020
132---------------
1332850
134      bits 0:31
135	Decoder ?? unknown - UV plane
136	  Usually 0x00200020
137---------------
1382854
139      bits 0:31
140	Decoder 'master' value for horizontal scaling
141---------------
1422858
143      bits 0:31
144	Decoder ?? unknown
145	  Usually 0
146---------------
147285C
148      bits 0:31
149	Decoder ?? unknown
150	  Normally = Reg 2854 >> 1
151---------------
1522860
153      bits 0:31
154	Decoder ?? unknown
155	  Usually 0
156---------------
1572864
158      bits 0:31
159	Decoder ?? unknown
160	  Normally = Reg 2854 >> 1
161---------------
1622868
163      bits 0:31
164	Decoder ?? unknown
165	  Usually 0
166
167     Most of these registers either control horizontal scaling, or appear linked
168     to it in some way. Register 2854 contains the 'master' value & the other
169     registers can be calculated from that one. You must also remember to
170     correctly set the divider in Reg 2874.
171
172     To enlarge:
173	     Reg 2854 = (source_width * 0x00200000) / destination_width
174	     Reg 2874 = No divide
175
176     To reduce from full size down to half size:
177	     Reg 2854 = (source_width/2 * 0x00200000) / destination width
178	     Reg 2874 = Divide by 2
179
180     To reduce from half size down to quarter size:
181	     Reg 2854 = (source_width/4 * 0x00200000) / destination width
182	     Reg 2874 = Divide by 4
183
184     The result is always rounded up.
185
186--------------------------------------------------------------------------------
187286C
188      bits 0:15
189	Decoder horizontal Y buffer offset
190
191      bits 15:31
192	Decoder horizontal UV buffer offset
193
194     Offset into the video image buffer. If the offset is gradually incremented,
195     the on screen image will move left & wrap around higher up on the right.
196
197--------------------------------------------------------------------------------
1982870
199      bits 0:15
200	Decoder horizontal Y output offset
201
202      bits 16:31
203	Decoder horizontal UV output offset
204
205     Offsets the actual video output. Controls output alignment of the Y & UV
206     planes. The higher the value, the greater the shift to the left. Use
207     reg 2890 to move the image right.
208
209--------------------------------------------------------------------------------
2102874
211      bits 0:1
212	Decoder horizontal Y output size divider
213	  00 = No divide
214	  01 = Divide by 2
215	  10 = Divide by 3
216
217      bits 4:5
218	Decoder horizontal UV output size divider
219	  00 = No divide
220	  01 = Divide by 2
221	  10 = Divide by 3
222
223      bit 8
224	Decoder ?? unknown
225	  0 = Normal
226	  1 = Affects video output levels
227
228      bit 16
229	Decoder ?? unknown
230	  0 = Normal
231	  1 = Disable horizontal filter
232
233--------------------------------------------------------------------------------
2342878
235      bit 0
236	?? unknown
237
238      bit 1
239	osd on/off
240	  0 = osd off
241	  1 = osd on
242
243      bit 2
244	Decoder + osd video timing
245	  0 = NTSC
246	  1 = PAL
247
248      bits 3:4
249	?? unknown
250
251      bit 5
252	Decoder + osd
253	  Swaps upper & lower fields
254
255--------------------------------------------------------------------------------
256287C
257      bits 0:10
258	Decoder & osd ?? unknown
259	  Moves entire screen horizontally. Starts at 0x005 with the screen
260	  shifted heavily to the right. Incrementing in steps of 0x004 will
261	  gradually shift the screen to the left.
262
263      bits 11:31
264	?? unknown
265
266     Normally contents are 0x00101111 (NTSC) or 0x1010111d (PAL)
267
268--------------------------------------------------------------------------------
2692880  --------    ?? unknown
2702884  --------    ?? unknown
271--------------------------------------------------------------------------------
2722888
273      bit 0
274	Decoder + osd ?? unknown
275	  0 = Normal
276	  1 = Misaligned fields (Correctable through 289C & 28A4)
277
278      bit 4
279	?? unknown
280
281      bit 8
282	?? unknown
283
284     Warning: Bad values will require a firmware reload to recover.
285		 Known to be bad are 0x000,0x011,0x100,0x111
286--------------------------------------------------------------------------------
287288C
288      bits 0:15
289	osd ?? unknown
290	  Appears to affect the osd position stability. The higher the value the
291	  more unstable it becomes. Decoder output remains stable.
292
293      bits 16:31
294	osd ?? unknown
295	  Same as bits 0:15
296
297--------------------------------------------------------------------------------
2982890
299      bits 0:11
300	Decoder output horizontal offset.
301
302     Horizontal offset moves the video image right. A small left shift is
303     possible, but it's better to use reg 2870 for that due to its greater
304     range.
305
306     NOTE: Video corruption will occur if video window is shifted off the right
307     edge. To avoid this read the notes for 2834 & 2838.
308--------------------------------------------------------------------------------
3092894
310      bits 0:23
311	Decoder output video surround colour.
312
313     Contains the colour (in yuv) used to fill the screen when the video is
314     running in a window.
315--------------------------------------------------------------------------------
3162898
317      bits 0:23
318	Decoder video window colour
319	  Contains the colour (in yuv) used to fill the video window when the
320	  video is turned off.
321
322      bit 24
323	Decoder video output
324	  0 = Video on
325	  1 = Video off
326
327      bit 28
328	Decoder plane order
329	  0 = Y,UV
330	  1 = UV,Y
331
332      bit 29
333	Decoder second plane byte order
334	  0 = Normal (UV)
335	  1 = Swapped (VU)
336
337     In normal usage, the first plane is Y & the second plane is UV. Though the
338     order of the planes can be swapped, only the byte order of the second plane
339     can be swapped. This isn't much use for the Y plane, but can be useful for
340     the UV plane.
341
342--------------------------------------------------------------------------------
343289C
344      bits 0:15
345	Decoder vertical field offset 1
346
347      bits 16:31
348	Decoder vertical field offset 2
349
350     Controls field output vertical alignment. The higher the number, the lower
351     the image on screen. Known starting values are 0x011E0017 (NTSC) &
352     0x01500017 (PAL)
353--------------------------------------------------------------------------------
35428A0
355      bits 0:15
356	Decoder & osd width in pixels
357
358      bits 16:31
359	Decoder & osd height in pixels
360
361     All output from the decoder & osd are disabled beyond this area. Decoder
362     output will simply go black outside of this region. If the osd tries to
363     exceed this area it will become corrupt.
364--------------------------------------------------------------------------------
36528A4
366      bits 0:11
367	osd left shift.
368
369     Has a range of 0x770->0x7FF. With the exception of 0, any value outside of
370     this range corrupts the osd.
371--------------------------------------------------------------------------------
37228A8
373      bits 0:15
374	osd vertical field offset 1
375
376      bits 16:31
377	osd vertical field offset 2
378
379     Controls field output vertical alignment. The higher the number, the lower
380     the image on screen. Known starting values are 0x011E0017 (NTSC) &
381     0x01500017 (PAL)
382--------------------------------------------------------------------------------
38328AC  --------    ?? unknown
384 |
385 V
38628BC  --------    ?? unknown
387--------------------------------------------------------------------------------
38828C0
389      bit 0
390	Current output field
391	  0 = first field
392	  1 = second field
393
394      bits 16:31
395	Current scanline
396	  The scanline counts from the top line of the first field
397	  through to the last line of the second field.
398--------------------------------------------------------------------------------
39928C4  --------    ?? unknown
400 |
401 V
40228F8  --------    ?? unknown
403--------------------------------------------------------------------------------
40428FC
405      bit 0
406	?? unknown
407	  0 = Normal
408	  1 = Breaks decoder & osd output
409--------------------------------------------------------------------------------
4102900
411      bits 0:31
412	Decoder vertical Y alias register 1
413---------------
4142904
415      bits 0:31
416	Decoder vertical Y alias register 2
417---------------
4182908
419      bits 0:31
420	Decoder vertical Y alias trigger
421
422     These three registers control the vertical aliasing filter for the Y plane.
423     Operation is similar to the horizontal Y filter (2804). The only real
424     difference is that there are only two registers to set before accessing
425     the trigger register (2908). As for the horizontal filter, the values are
426     taken from a lookup table in the firmware, and the procedure must be
427     repeated 16 times to fully program the filter.
428--------------------------------------------------------------------------------
429290C
430      bits 0:31
431	Decoder vertical UV alias register 1
432---------------
4332910
434      bits 0:31
435	Decoder vertical UV alias register 2
436---------------
4372914
438      bits 0:31
439	Decoder vertical UV alias trigger
440
441     These three registers control the vertical aliasing filter for the UV
442     plane. Operation is the same as the Y filter, with 2914 being the trigger.
443--------------------------------------------------------------------------------
4442918
445      bits 0:15
446	Decoder Y source height in pixels
447
448      bits 16:31
449	Decoder Y destination height in pixels
450---------------
451291C
452      bits 0:15
453	Decoder UV source height in pixels divided by 2
454
455      bits 16:31
456	Decoder UV destination height in pixels
457
458     NOTE: For both registers, the resulting image must be fully visible on
459     screen. If the image exceeds the bottom edge both the source and
460     destination size must be adjusted to reflect the visible portion. For the
461     source height, you must take into account the scaling when calculating the
462     new value.
463--------------------------------------------------------------------------------
4642920
465      bits 0:31
466	Decoder Y vertical scaling
467	  Normally = Reg 2930 >> 2
468---------------
4692924
470      bits 0:31
471	Decoder Y vertical scaling
472	  Normally = Reg 2920 + 0x514
473---------------
4742928
475      bits 0:31
476	Decoder UV vertical scaling
477	  When enlarging = Reg 2930 >> 2
478	  When reducing = Reg 2930 >> 3
479---------------
480292C
481      bits 0:31
482	Decoder UV vertical scaling
483	  Normally = Reg 2928 + 0x514
484---------------
4852930
486      bits 0:31
487	Decoder 'master' value for vertical scaling
488---------------
4892934
490      bits 0:31
491	Decoder ?? unknown - Y vertical scaling
492---------------
4932938
494      bits 0:31
495	Decoder Y vertical scaling
496	  Normally = Reg 2930
497---------------
498293C
499      bits 0:31
500	Decoder ?? unknown - Y vertical scaling
501---------------
5022940
503      bits 0:31
504	Decoder UV vertical scaling
505	  When enlarging = Reg 2930 >> 1
506	  When reducing = Reg 2930
507---------------
5082944
509      bits 0:31
510	Decoder ?? unknown - UV vertical scaling
511---------------
5122948
513      bits 0:31
514	Decoder UV vertical scaling
515	  Normally = Reg 2940
516---------------
517294C
518      bits 0:31
519	Decoder ?? unknown - UV vertical scaling
520
521     Most of these registers either control vertical scaling, or appear linked
522     to it in some way. Register 2930 contains the 'master' value & all other
523     registers can be calculated from that one. You must also remember to
524     correctly set the divider in Reg 296C
525
526     To enlarge:
527	     Reg 2930 = (source_height * 0x00200000) / destination_height
528	     Reg 296C = No divide
529
530     To reduce from full size down to half size:
531	     Reg 2930 = (source_height/2 * 0x00200000) / destination height
532	     Reg 296C = Divide by 2
533
534      To reduce from half down to quarter.
535	     Reg 2930 = (source_height/4 * 0x00200000) / destination height
536	     Reg 296C = Divide by 4
537
538--------------------------------------------------------------------------------
5392950
540      bits 0:15
541	Decoder Y line index into display buffer, first field
542
543      bits 16:31
544	Decoder Y vertical line skip, first field
545--------------------------------------------------------------------------------
5462954
547      bits 0:15
548	Decoder Y line index into display buffer, second field
549
550      bits 16:31
551	Decoder Y vertical line skip, second field
552--------------------------------------------------------------------------------
5532958
554      bits 0:15
555	Decoder UV line index into display buffer, first field
556
557      bits 16:31
558	Decoder UV vertical line skip, first field
559--------------------------------------------------------------------------------
560295C
561      bits 0:15
562	Decoder UV line index into display buffer, second field
563
564      bits 16:31
565	Decoder UV vertical line skip, second field
566--------------------------------------------------------------------------------
5672960
568      bits 0:15
569	Decoder destination height minus 1
570
571      bits 16:31
572	Decoder destination height divided by 2
573--------------------------------------------------------------------------------
5742964
575      bits 0:15
576	Decoder Y vertical offset, second field
577
578      bits 16:31
579	Decoder Y vertical offset, first field
580
581     These two registers shift the Y plane up. The higher the number, the
582     greater the shift.
583--------------------------------------------------------------------------------
5842968
585      bits 0:15
586	Decoder UV vertical offset, second field
587
588      bits 16:31
589	Decoder UV vertical offset, first field
590
591     These two registers shift the UV plane up. The higher the number, the
592     greater the shift.
593--------------------------------------------------------------------------------
594296C
595      bits 0:1
596	Decoder vertical Y output size divider
597	  00 = No divide
598	  01 = Divide by 2
599	  10 = Divide by 4
600
601      bits 8:9
602	Decoder vertical UV output size divider
603	  00 = No divide
604	  01 = Divide by 2
605	  10 = Divide by 4
606--------------------------------------------------------------------------------
6072970
608      bit 0
609	Decoder ?? unknown
610	  0 = Normal
611	  1 = Affect video output levels
612
613      bit 16
614	Decoder ?? unknown
615	  0 = Normal
616	  1 = Disable vertical filter
617
618--------------------------------------------------------------------------------
6192974  --------   ?? unknown
620 |
621 V
62229EF  --------   ?? unknown
623--------------------------------------------------------------------------------
6242A00
625      bits 0:2
626	osd colour mode
627	  000 = 8 bit indexed
628	  001 = 16 bit (565)
629	  010 = 15 bit (555)
630	  011 = 12 bit (444)
631	  100 = 32 bit (8888)
632
633      bits 4:5
634	osd display bpp
635	  01 = 8 bit
636	  10 = 16 bit
637	  11 = 32 bit
638
639      bit 8
640	osd global alpha
641	  0 = Off
642	  1 = On
643
644      bit 9
645	osd local alpha
646	  0 = Off
647	  1 = On
648
649      bit 10
650	osd colour key
651	  0 = Off
652	  1 = On
653
654      bit 11
655	osd ?? unknown
656	  Must be 1
657
658      bit 13
659	osd colour space
660	  0 = ARGB
661	  1 = AYVU
662
663      bits 16:31
664	osd ?? unknown
665	  Must be 0x001B (some kind of buffer pointer ?)
666
667     When the bits-per-pixel is set to 8, the colour mode is ignored and
668     assumed to be 8 bit indexed. For 16 & 32 bits-per-pixel the colour depth
669     is honoured, and when using a colour depth that requires fewer bytes than
670     allocated the extra bytes are used as padding. So for a 32 bpp with 8 bit
671     index colour, there are 3 padding bytes per pixel. It's also possible to
672     select 16bpp with a 32 bit colour mode. This results in the pixel width
673     being doubled, but the color key will not work as expected in this mode.
674
675     Colour key is as it suggests. You designate a colour which will become
676     completely transparent. When using 565, 555 or 444 colour modes, the
677     colour key is always 16 bits wide. The colour to key on is set in Reg 2A18.
678
679     Local alpha works differently depending on the colour mode. For 32bpp & 8
680     bit indexed, local alpha is a per-pixel 256 step transparency, with 0 being
681     transparent and 255 being solid. For the 16bpp modes 555 & 444, the unused
682     bit(s) act as a simple transparency switch, with 0 being solid & 1 being
683     fully transparent. There is no local alpha support for 16bit 565.
684
685     Global alpha is a 256 step transparency that applies to the entire osd,
686     with 0 being transparent & 255 being solid.
687
688     It's possible to combine colour key, local alpha & global alpha.
689--------------------------------------------------------------------------------
6902A04
691      bits 0:15
692	osd x coord for left edge
693
694      bits 16:31
695	osd y coord for top edge
696---------------
6972A08
698      bits 0:15
699	osd x coord for right edge
700
701      bits 16:31
702	osd y coord for bottom edge
703
704     For both registers, (0,0) = top left corner of the display area. These
705     registers do not control the osd size, only where it's positioned & how
706     much is visible. The visible osd area cannot exceed the right edge of the
707     display, otherwise the osd will become corrupt. See reg 2A10 for
708     setting osd width.
709--------------------------------------------------------------------------------
7102A0C
711      bits 0:31
712	osd buffer index
713
714     An index into the osd buffer. Slowly incrementing this moves the osd left,
715     wrapping around onto the right edge
716--------------------------------------------------------------------------------
7172A10
718      bits 0:11
719	osd buffer 32 bit word width
720
721     Contains the width of the osd measured in 32 bit words. This means that all
722     colour modes are restricted to a byte width which is divisible by 4.
723--------------------------------------------------------------------------------
7242A14
725      bits 0:15
726	osd height in pixels
727
728      bits 16:32
729	osd line index into buffer
730	  osd will start displaying from this line.
731--------------------------------------------------------------------------------
7322A18
733      bits 0:31
734	osd colour key
735
736     Contains the colour value which will be transparent.
737--------------------------------------------------------------------------------
7382A1C
739      bits 0:7
740	osd global alpha
741
742     Contains the global alpha value (equiv ivtvfbctl --alpha XX)
743--------------------------------------------------------------------------------
7442A20  --------    ?? unknown
745 |
746 V
7472A2C  --------    ?? unknown
748--------------------------------------------------------------------------------
7492A30
750      bits 0:7
751	osd colour to change in indexed palette
752---------------
7532A34
754      bits 0:31
755	osd colour for indexed palette
756
757     To set the new palette, first load the index of the colour to change into
758     2A30, then load the new colour into 2A34. The full palette is 256 colours,
759     so the index range is 0x00-0xFF
760--------------------------------------------------------------------------------
7612A38  --------    ?? unknown
7622A3C  --------    ?? unknown
763--------------------------------------------------------------------------------
7642A40
765      bits 0:31
766	osd ?? unknown
767
768     Affects overall brightness, wrapping around to black
769--------------------------------------------------------------------------------
7702A44
771      bits 0:31
772	osd ?? unknown
773
774     Green tint
775--------------------------------------------------------------------------------
7762A48
777      bits 0:31
778	osd ?? unknown
779
780     Red tint
781--------------------------------------------------------------------------------
7822A4C
783      bits 0:31
784	osd ?? unknown
785
786     Affects overall brightness, wrapping around to black
787--------------------------------------------------------------------------------
7882A50
789      bits 0:31
790	osd ?? unknown
791
792     Colour shift
793--------------------------------------------------------------------------------
7942A54
795      bits 0:31
796	osd ?? unknown
797
798     Colour shift
799--------------------------------------------------------------------------------
8002A58  --------    ?? unknown
801 |
802 V
8032AFC  --------    ?? unknown
804--------------------------------------------------------------------------------
8052B00
806      bit 0
807	osd filter control
808	  0 = filter off
809	  1 = filter on
810
811      bits 1:4
812	osd ?? unknown
813
814--------------------------------------------------------------------------------
815
816v0.4 - 12 March 2007 - Ian Armstrong (ian@iarmst.demon.co.uk)
817
818