📄 saa7182.c
字号:
/*
* Copyright (c) 1995-1999 by TriMedia Technologies.
*
* +------------------------------------------------------------------+
* | This software is furnished under a license and may only be used |
* | and copied in accordance with the terms and conditions of such |
* | a license and with the inclusion of this copyright notice. This |
* | software or any other copies of this software may not be provided|
* | or otherwise made available to any other person. The ownership |
* | and title of this software is not transferred. |
* | |
* | The information in this software is subject to change without |
* | any prior notice and should not be construed as a commitment by |
* | TriMedia Technologies. |
* | |
* | this code and information is provided "as is" without any |
* | warranty of any kind, either expressed or implied, including but |
* | not limited to the implied warranties of merchantability and/or |
* | fitness for any particular purpose. |
* +------------------------------------------------------------------+
*
* Module name : saa7182.c 1.6
*
* Last update : 18:43:46 - 00/11/09
*
* Description :
*
* Initialize and control routines for saa7182 DENC.
*
* Revision :
* Built for the TCS 2.0 release
*
*
*/
#include <stdio.h>
#include <tm1/tmIIC.h>
#include <tm1/tmVO.h>
#include <tm1/tmAvFormats.h>
#include <tm1/tmProcessor.h>
#include <tmlib/tmtypes.h>
#include "saa7182.h"
#define SAA7182_NREGS 0x7E /* number of 7182 registers */
#define SAA7182_STARADR 0x38 /* Start for sub-addresses for 7182 */
#define SAA7182_ADDR 0x8C /* SAA7182 IIC address */
#define SAA7182_BLACKLEVEL_REG 0x5D /* bits 0-5 */
/* ALL VALUES TAKEN FROM DPC71SRC */
static unsigned char saa7182_init[SAA7182_NREGS - SAA7182_STARADR] = {
/* 0x38 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x40 */ 0x00, 0x00, 0x6B, 0x00, 0x00, 0x22, 0xAC, 0x0E,
/* 0x48 */ 0x03, 0x1D, 0xAC, 0xF0, 0xC8, 0xB9, 0xD4, 0x38,
/* 0x50 */ 0x47, 0xC1, 0xE3, 0x54, 0xA3, 0x54, 0xF2, 0x90,
/* 0x58 */ 0x00, 0x00, 0x00, 0x79, 0xAD, 0x3C, 0x3A, 0x3A,
/* 0x60 */ 0x00, 0x15, 0x69, 0x1F, 0x7C, 0xF0, 0x21, 0x00,
/* 0x68 */ 0x00, 0x00, 0x00, 0x6D, 0x9B, 0xCC, 0x30, 0xD1,
/* 0x70 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x78 */ 0x00, 0x00, 0x12, 0x03, 0x40, 0x00
};
typedef struct subaddInfo_t {
UInt8 subAddr; /* subaddress of IIC register */
UInt8 value; /* data for IIC register */
} subaddInfo_t;
/* PAL mode */
static subaddInfo_t saa7182_pal[] = {
{0x5B, 0x8D}, /* Gain U-Axis */
{0x5C, 0xC9}, /* Gain V-Axis */
{0x5D, 0x2D}, /* Black Level */
{0x5E, 0x3F}, /* Blanking Level */
{0x5F, 0x3F}, /* */
{0x61, 0x06}, /* DAC and Standard Control */
{0x63, 0xCB}, /* Standard Subcarrier (4LSB's) */
{0x64, 0x8A}, /* Standard Subcarrier */
{0x65, 0x09}, /* Standard Subcarrier */
{0x66, 0x2A}, /* Standard Subcarrier (4 MSB's) */
{0x6C, 0xA6}, /* Horizontal Trigger (8 LSB's) */
{0x6E, 0x20}, /* Multi Control */
{0x6F, 0xD4}, /* Closed Caption/TTX Control */
{0x7A, 0x15}, /* First active line (8 LSB's) */
{0x7B, 0x35}, /* Last active line (8 LSB's) sf */
{0x62, 0x4E}, /* 0xCE Burst Amplitude and RTC control (bit 7)*/
{0x6C, 0xAE} /* 0xAF Horizontal Trigger (8 LSB's)*/
};
/* NTSC mode */
static subaddInfo_t saa7182_ntsc[] = {
{0x5B, 0x79}, /* Gain U-Axis */
{0x5C, 0x3C}, /* Gain V-Axis */
{0x5E, 0x3A}, /* Blanking Level */
{0x5F, 0x3A}, /* */
{0x61, 0x15}, /* DAC and Standard Control */
{0x63, 0x1F}, /* Standard Subcarrier (4LSB's) */
{0x64, 0x7C}, /* Standard Subcarrier */
{0x65, 0xF0}, /* Standard Subcarrier */
{0x66, 0x21}, /* Standard Subcarrier (4 MSB's) */
{0x6E, 0x30}, /* Multi Control */
{0x6F, 0xD1}, /* Closed Caption/TTX Control */
{0x7A, 0x12}, /* First active line (8 LSB's) */
{0x7B, 0x03}, /* Last active line (8 LSB's) sf */
{0x62, 0x69}, /* 0xE9 Burst Amplitude and RTC control (bit 7)*/
{0x6C, 0x9A} /* 0x9B Horizontal Trigger (8 LSB's)*/
};
/* SECAM mode */
static subaddInfo_t saa7182_secam[] = {
{0x5B, 0x6A}, /* Gain U-Axis */
{0x5C, 0x7F}, /* Gain V-Axis */
{0x5E, 0xBF}, /* Blanking Level */
{0x5F, 0xBF}, /* */
{0x61, 0x0E}, /* DAC and Standard Control */
{0x63, 0xB2}, /* Standard Subcarrier (4LSB's) */
{0x64, 0x3B}, /* Standard Subcarrier */
{0x65, 0xA3}, /* Standard Subcarrier */
{0x66, 0x28}, /* Standard Subcarrier (4 MSB's) */
{0x6C, 0xA6}, /* Horizontal Trigger (8 LSB's) */
{0x6E, 0x20}, /* Multi Control */
{0x6F, 0xD4}, /* Closed Caption/TTX Control */
{0x7A, 0x15}, /* First active line (8 LSB's) */
{0x7B, 0x35}, /* Last active line (8 LSB's) sf */
{0x62, 0x4E}, /* 0xCE Burst Amplitude and RTC control (bit 7)*/
{0x6C, 0xAE} /* 0xAF Horizontal Trigger (8 LSB's)*/
};
static
tmLibdevErr_t
saa7182Config(UInt32 address, subaddInfo_t * tobeupdated, UInt32 last_address)
{
int i, err;
unsigned char subaddr, data;
tmLibdevErr_t retval = TMLIBDEV_OK;
/* Update the device */
for (i = 0; i < last_address; i++) {
subaddr = tobeupdated[i].subAddr;
data = tobeupdated[i].value;
err = iicWriteReg(address, subaddr, data);
if (err)
retval |= err;
}
return (retval);
}
/**** Public Init function ****/
#define SAA7111_ADDR 0x48 /* SAA7111 IIC address */
#define VIVO_THRU_TM1 (1 << 7) /* @ iic SAA7111_ADDR sub 0x11,
0 = video goes directly from dec to enc
1 = video goes thru TM1 */
tmLibdevErr_t
saa7182Init(pboardVOParam_t param)
{
int i;
int retval = 0;
unsigned char subaddr, data;
pprocCapabilities_t procCap;
UInt val;
procGetCapabilities(&procCap);
/* make sure VO clock is running at 27MHz! */
MMIO(VO_CLOCK) = (unsigned int) (0.5 +
(1431655765.0 * 27000000 / (float) procCap->cpuClockFrequency));
MMIO(VO_CTL) = 0x02700000 | (MMIO(VO_CTL) | VO_RESET);
/* do not take it out of reset */
microsleep(20000); /* wait an extra 20ms */
if (param->videoStandard == vasNone)
return TMLIBDEV_OK;
/* Update the device */
for (i = 0; i < SAA7182_NREGS; i++)
retval |= iicWriteReg(SAA7182_ADDR, i, 0);
if (retval)
return ((tmLibdevErr_t) retval);
for (i = 0; i < (SAA7182_NREGS - SAA7182_STARADR); i++) {
subaddr = (unsigned char) (SAA7182_STARADR + i);
data = saa7182_init[i];
retval |= iicWriteReg(SAA7182_ADDR, subaddr, data);
}
if (retval)
return ((tmLibdevErr_t) retval);
switch (param->videoStandard) {
case vasNTSC: /* Update for vasNTSC standard */
retval |= saa7182Config(SAA7182_ADDR, saa7182_ntsc,
(sizeof (saa7182_ntsc) >> 1));
break;
case vasPAL: /* Update for vasPAL standard */
retval |= saa7182Config(SAA7182_ADDR, saa7182_pal,
(sizeof (saa7182_pal) >> 1));
break;
case vasSECAM: /* Update for vasSECAM standard */
retval |= saa7182Config(SAA7182_ADDR, saa7182_secam,
(sizeof (saa7182_secam) >> 1));
break;
case vasNone:
return TMLIBDEV_OK;
default:
return VO_ERR_STANDARD_NOT_SUPPORTED;
}
retval |= saa7182Stop(param->videoStandard);
retval |= saa7182Start(param->videoStandard);
if (retval)
return retval;
/* Set demux on board so 7182 gets input from TM iso 7111 */
retval |= iicReadReg(SAA7111_ADDR, 0x11, &val);
retval |= iicWriteReg(SAA7111_ADDR, 0x11, val | VIVO_THRU_TM1);
return ((tmLibdevErr_t) retval);
}
/**** Public Config function ****/
tmLibdevErr_t
saa7182Configure(UInt32 subaddr, UInt32 value)
{
int err;
tmLibdevErr_t retval = TMLIBDEV_OK;
err = iicWriteReg(SAA7182_ADDR, subaddr, value);
if (err)
retval |= err;
return (retval);
}
/************************** Turn Denc DAC on *****************************/
tmLibdevErr_t
saa7182Start(tmVideoAnalogStandard_t standard)
{
switch (standard) {
case vasNTSC:
return (iicWriteReg(SAA7182_ADDR, 0x61, 0x15));
case vasPAL:
return (iicWriteReg(SAA7182_ADDR, 0x61, 0x16));
case vasSECAM:
return (iicWriteReg(SAA7182_ADDR, 0x61, 0x1C));
default:
return BOARD_ERR_UNSUPPORTED_STANDARD;
}
}
/************************** Turn Denc DAC off *****************************/
tmLibdevErr_t
saa7182Stop(tmVideoAnalogStandard_t standard)
{
switch (standard) {
case vasNTSC:
return (iicWriteReg(SAA7182_ADDR, 0x61, 0xD5));
case vasPAL:
return (iicWriteReg(SAA7182_ADDR, 0x61, 0xD6));
case vasSECAM:
return (iicWriteReg(SAA7182_ADDR, 0x61, 0xDC));
default:
return BOARD_ERR_UNSUPPORTED_STANDARD;
}
}
/************************** Set Brightness (or Balck Level) *****************/
tmLibdevErr_t
saa7182SetBrightness(UInt val)
{
if (val > 63)
return BOARD_ERR_VAL_OUT_OF_RANGE;
return iicWriteReg(SAA7182_ADDR, SAA7182_BLACKLEVEL_REG, val);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -