vip_1400.c revision 71d7fec4
1/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nsc/gfx/vip_1400.c,v 1.1 2002/12/10 15:12:28 alanh Exp $ */
2/*-----------------------------------------------------------------------------
3 * VIP_1400.C
4 *
5 * Version 2.0 - February 21, 2000.
6 *
7 * This file routines to control the SC1400 video input port (VIP) hardware.
8 *
9 * History:
10 *    Versions 0.1 through 2.0 by Brian Falardeau.
11 *
12 * Copyright (c) 1999-2000 National Semiconductor.
13 *-----------------------------------------------------------------------------
14 */
15
16/*-----------------------------------------------------------------------------
17 * gfx_set_vip_enable
18 *
19 * This routine enables or disables the writes to memory from the video port.
20 *-----------------------------------------------------------------------------
21 */
22#if GFX_VIDEO_DYNAMIC
23int
24sc1400_set_vip_enable(int enable)
25#else
26int
27gfx_set_vip_enable(int enable)
28#endif
29{
30   unsigned long mcr, value;
31
32   value = READ_VIP32(SC1400_VIP_CONTROL);
33
34   if (enable) {
35      /* CONFIGURE MCR FOR VIDEO INPUT MODE */
36
37      mcr = IND(SC1400_CB_BASE_ADDR + SC1400_CB_MISC_CONFIG);
38      mcr |= (SC1400_MCR_VPOUT_CK_SELECT | SC1400_MCR_VPOUT_CK_SOURCE);
39      mcr &= ~SC1400_MCR_VPOUT_MODE;
40      mcr |= SC1400_MCR_VPIN_CCIR656;
41      mcr &= ~SC1400_MCR_GENLOCK_CONTINUE;
42      OUTD(SC1400_CB_BASE_ADDR + SC1400_CB_MISC_CONFIG, mcr);
43
44      /* ENABLE CAPTURE */
45      /* Hardcode config values for now. */
46
47      WRITE_VIP32(SC1400_VIP_CONFIG, 0x30012);
48      value |= 0x103;
49   } else {
50      value &= ~(0x102);
51   }
52
53   WRITE_VIP32(SC1400_VIP_CONTROL, value);
54   return (0);
55}
56
57/*-----------------------------------------------------------------------------
58 * gfx_set_vip_base
59 *
60 * This routine sets the odd and even base address values for the VIP memory
61 * buffer.
62 *-----------------------------------------------------------------------------
63 */
64#if GFX_VIDEO_DYNAMIC
65int
66sc1400_set_vip_base(unsigned long even, unsigned long odd)
67#else
68int
69gfx_set_vip_base(unsigned long even, unsigned long odd)
70#endif
71{
72   // TRUE OFFSET IS SPECIFIED, NEED TO SET BIT 23 FOR HARDWARE
73
74   WRITE_VIP32(SC1400_VIP_EVEN_BASE, even | 0x00800000);
75   WRITE_VIP32(SC1400_VIP_ODD_BASE, odd | 0x00800000);
76   return (0);
77}
78
79/*-----------------------------------------------------------------------------
80 * gfx_set_vip_pitch
81 *
82 * This routine sets the number of bytes between scanlines for the VIP data.
83 *-----------------------------------------------------------------------------
84 */
85#if GFX_VIDEO_DYNAMIC
86int
87sc1400_set_vip_pitch(unsigned long pitch)
88#else
89int
90gfx_set_vip_pitch(unsigned long pitch)
91#endif
92{
93   WRITE_VIP32(SC1400_VIP_PITCH, pitch & 0x0000FFFC);
94   return (0);
95}
96
97/*-----------------------------------------------------------------------------
98 * gfx_set_vbi_enable
99 *
100 * This routine enables or disables the VBI data capture.
101 *-----------------------------------------------------------------------------
102 */
103#if GFX_VIDEO_DYNAMIC
104int
105sc1400_set_vbi_enable(int enable)
106#else
107int
108gfx_set_vbi_enable(int enable)
109#endif
110{
111   unsigned long value;
112
113   value = READ_VIP32(SC1400_VIP_CONTROL);
114   if (enable)
115      value |= SC1400_VIP_VBI_CAPTURE_EN;
116   else
117      value &= ~SC1400_VIP_VBI_CAPTURE_EN;
118   WRITE_VIP32(SC1400_VIP_CONTROL, value);
119   return (0);
120}
121
122/*-----------------------------------------------------------------------------
123 * gfx_set_vbi_base
124 *
125 * This routine sets the odd and even base address values for VBI capture.
126 *-----------------------------------------------------------------------------
127 */
128#if GFX_VIDEO_DYNAMIC
129int
130sc1400_set_vbi_base(unsigned long even, unsigned long odd)
131#else
132int
133gfx_set_vbi_base(unsigned long even, unsigned long odd)
134#endif
135{
136   // TRUE OFFSET IS SPECIFIED, NEED TO SET BIT 23 FOR HARDWARE
137
138   WRITE_VIP32(SC1400_VBI_EVEN_BASE, even | 0x00800000);
139   WRITE_VIP32(SC1400_VBI_ODD_BASE, odd | 0x00800000);
140   return (0);
141}
142
143/*-----------------------------------------------------------------------------
144 * gfx_set_vbi_pitch
145 *
146 * This routine sets the number of bytes between scanlines for VBI capture.
147 *-----------------------------------------------------------------------------
148 */
149#if GFX_VIDEO_DYNAMIC
150int
151sc1400_set_vbi_pitch(unsigned long pitch)
152#else
153int
154gfx_set_vbi_pitch(unsigned long pitch)
155#endif
156{
157   WRITE_VIP32(SC1400_VBI_PITCH, pitch & 0x0000FFFC);
158   return (0);
159}
160
161/*************************************************************/
162/*  READ ROUTINES  |  INCLUDED FOR DIAGNOSTIC PURPOSES ONLY  */
163/*************************************************************/
164
165#if GFX_READ_ROUTINES
166
167/*-----------------------------------------------------------------------------
168 * gfx_get_vip_enable
169 *-----------------------------------------------------------------------------
170 */
171#if GFX_VIDEO_DYNAMIC
172int
173sc1400_get_vip_enable(void)
174#else
175int
176gfx_get_vip_enable(void)
177#endif
178{
179   if (READ_VIP32(SC1400_VIP_CONTROL) & 0x00000100)
180      return (1);
181   return (0);
182}
183
184/*-----------------------------------------------------------------------------
185 * gfx_get_vip_base
186 *-----------------------------------------------------------------------------
187 */
188#if GFX_VIDEO_DYNAMIC
189unsigned long
190sc1400_get_vip_base(int odd)
191#else
192unsigned long
193gfx_get_vip_base(int odd)
194#endif
195{
196   // MASK BIT 23 AND ABOVE TO MAKE IT A TRUE OFFSET
197
198   if (odd)
199      return (READ_VIP32(SC1400_VIP_ODD_BASE) & 0x007FFFFF);
200   return (READ_VIP32(SC1400_VIP_EVEN_BASE) & 0x007FFFFF);
201}
202
203/*-----------------------------------------------------------------------------
204 * gfx_get_vip_pitch
205 *-----------------------------------------------------------------------------
206 */
207#if GFX_VIDEO_DYNAMIC
208unsigned long
209sc1400_get_vip_pitch(void)
210#else
211unsigned long
212gfx_get_vip_pitch(void)
213#endif
214{
215   return (READ_VIP32(SC1400_VIP_PITCH) & 0x0000FFFF);
216}
217
218/*-----------------------------------------------------------------------------
219 * gfx_get_vbi_enable
220 *-----------------------------------------------------------------------------
221 */
222#if GFX_VIDEO_DYNAMIC
223int
224sc1400_get_vbi_enable(void)
225#else
226int
227gfx_get_vbi_enable(void)
228#endif
229{
230   if (READ_VIP32(SC1400_VIP_CONTROL) & 0x00000200)
231      return (1);
232   return (0);
233}
234
235/*-----------------------------------------------------------------------------
236 * gfx_get_vbi_base
237 *-----------------------------------------------------------------------------
238 */
239#if GFX_VIDEO_DYNAMIC
240unsigned long
241sc1400_get_vbi_base(int odd)
242#else
243unsigned long
244gfx_get_vbi_base(int odd)
245#endif
246{
247   // MASK BIT 23 AND ABOVE TO MAKE IT A TRUE OFFSET
248
249   if (odd)
250      return (READ_VIP32(SC1400_VBI_ODD_BASE) & 0x007FFFFF);
251   return (READ_VIP32(SC1400_VBI_EVEN_BASE) & 0x007FFFFF);
252}
253
254/*-----------------------------------------------------------------------------
255 * gfx_get_vbi_pitch
256 *-----------------------------------------------------------------------------
257 */
258#if GFX_VIDEO_DYNAMIC
259unsigned long
260sc1400_get_vbi_pitch(void)
261#else
262unsigned long
263gfx_get_vbi_pitch(void)
264#endif
265{
266   return (READ_VIP32(SC1400_VBI_PITCH) & 0x0000FFFF);
267}
268
269#endif /* GFX_READ_ROUTINES */
270
271/* END OF FILE */
272