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