📄 tw99.c
字号:
#include "Config.h"
#include "reg.h"
#include "typedefs.h"
#include "main.h"
#include "tw99.h"
#include "i2c.h"
#include "printf.h"
//#include "lcd.h"
//#include "keypad.h"
extern DATA BYTE InSel;
extern DATA BYTE VcrFFNo;
extern bit CCFlag;
extern bit Flashing;
extern bit ReturnValue;
extern CODE BYTE InputComposite[];
extern CODE BYTE InputSVideo[];
extern CODE BYTE InputYPbPr[];
extern CODE BYTE InputSCART[];
extern CODE BYTE InputCompositeC[];
extern CODE BYTE InputYPbPrC[];
extern CODE BYTE InputSCARTC[];
extern DATA BYTE ChipID;
void CaptionOn(BYTE flag)
{
BYTE buf;
if( !flag ) {
Puts("\r\nOSD/CC1/TEXT -- OFF \r\n");
buf = 0x33; WriteI2Cn_(0x28, &buf, 1);//MonWriteI2Cn_(0x28, &buf, 1);
// delay(10);
// buf = ReadTW99(0x02);
// buf &= 0xfe;
// WriteTW99(0x02, buf);
if(ChipID == TW9908CID)
WriteTW99(0x3c, 0x40); //0xc0
else
WriteTW99(0x42, 0x40); //0xc0
}
else {
Puts("\r\nOSD/CC1/TEXT -- ON \r\n");
buf = 0x17; WriteI2Cn_(0x28, &buf, 1);//MonWriteI2Cn_(0x28, &buf, 1);
// delay(10);
buf = ReadTW99(0x02);
buf |= 0x01;
WriteTW99(0x02, buf);
if(ChipID == TW9908CID){
WriteTW99(0x36, 0x01);
WriteTW99(0x3c, 0xc0); //0xc0
WriteTW99(0x3d, 0x40);
}else{
WriteTW99(0x3c, 0x01);
WriteTW99(0x42, 0xc0); //0xc0
WriteTW99(0x43, 0x40);
}
}
}
void ChangeInputSW(BYTE InSel)
{
if(ChipID == TW9908CID){
switch(InSel) {
case 0: I2CDeviceSet( InputCompositeC ); break;
case 1: I2CDeviceSet( InputSVideo ); break;
case 2: I2CDeviceSet( InputYPbPrC ); break;
case 3: I2CDeviceSet( InputSCARTC ); break;
}
}else{
switch(InSel) {
case 0: I2CDeviceSet( InputComposite ); break;
case 1: I2CDeviceSet( InputSVideo ); break;
case 2: I2CDeviceSet( InputYPbPr ); break;
case 3: I2CDeviceSet( InputSCART ); break;
}
}
// if( CCFlag ) CaptionOn(CCFlag);
}
BYTE GetColorSystem(BYTE DecRegister1)
{
// if( (ReadTW99(0x01) & 0x01) == 0x01 )
if( (DecRegister1 & 0x01) == 0x01 )
return 0; // PAL
else
return 1; // NTSC
}
BYTE IsInteraced(void)
{
if( (ReadTW99(0x39) & 0x08)==0x08 )
return 1;
else
return 0;
}
BYTE IsVideoIn(BYTE DReg1)
{
// if( (ReadTW99(0x01) & 0x80)==0x80 )
if( (DReg1 & 0xc8)==0x80 )
return 0;
else
return 1;
}
BYTE GetVDelay(void)
{
return ReadTW99(0x08);
}
void SetVDelay(BYTE dat)
{
WriteTW99( 0x08, dat );
}
BYTE IsStandard(void)
{
BYTE dat;
dat = ReadTW99(0x39);
if( dat & 0x10 ) return 1;
else return 0;
}
/*
BYTE GetFFStatus(void)
{
if( IsStandard() && !FFbyFPGA )
return 0;
else
return 1;
}
*/
BYTE GetFFS(void)
{
if(IsInteraced() == 0){
if(IsStandard()){ // standard
if(VcrFFNo > 0){
VcrFFNo--;
// Printf("\r\nVcrFFNo : %02x VDelay : %02x", VcrFFNo, ReadTW99(0x08));
}
else
ReturnValue = 0;
}
else{ // nonstandard
if(VcrFFNo < 32){
VcrFFNo++;
// Printf("\r\nVcrFFNo : %02x VDelay : %02x", VcrFFNo, ReadTW99(0x08));
}
else
ReturnValue = 1;
}
}
return ReturnValue;
}
#ifdef NEW_BOARD
void BypassMode(void)
{
BYTE buf;
Puts("\r\nBypass Mode");
buf = ReadI2C(SAA71XX, 0x3a) | 0x10;
MonWriteI2C(SAA71XX, 0x3a, buf);
MonWriteI2C(SAA71XX, 0x6c, 0xe0);
NewLine();
}
void NonBypassMode(void)
{
BYTE buf;
Puts("\r\nNon-Bypass Mode");
buf = ReadI2C(SAA71XX, 0x3a) & 0xef;
MonWriteI2C(SAA71XX, 0x3a, buf);
MonWriteI2C(SAA71XX, 0x6c, 0x03);
NewLine();
}
#endif //NEW_BOARD
void ClosedCaptionToSerial(BYTE eds, BYTE hex)
{
BYTE rd[2], control_code=0, control_code_count=0, i , ReturnKey = 0;
bit IndEnd = 0;
rd[1]='\0'; i =0;
NewLine();
MonWriteI2C(TW99I2CAddress,0x1a, eds ? 0xc0 : 0xa0); // enable CC_DATA
Puts("\r\nPress anykey to exit CC | EDS...\r\n");
while( !RS_ready() ) {
rd[0] = ReadTW99(0x1a);
if( eds && ((rd[0] & 0x06) == 0x06) || !eds && (rd[0] & 0x04)) {
rd[0] = ReadTW99(0x1b) & 0x7f;
if( hex ) {
Printf("%02x", rd[0]);
i += 1;
if(i==16) {
Puts("\r\n");
i = 0;
}
else Puts(" ");
}
else if(DetAuto){
if( rd[0] < 0x20 ) {
// Nondisplay control chars
control_code = rd[0];
/* control_code_count++; //
}
else if( control_code_count>=2 ) {
// Second control code for ensuring. Don't need to do anything
control_code_count=0;*/
}
else {
switch( control_code ) {
case 0:
PutsP(rd);
ReturnKey = 0;
break;
default:
if( rd[0] >= 0x20 && rd[0] <= 0x2f ) {
if( control_code==0x11 || control_code==0x19 ) {
}
else {
switch( rd[0] ) {
case 0x20:
case 0x2C:
case 0x2F:
break;
default:
break;
}
}
}
else if( rd[0] >= 0x30 && rd[0] <= 0x3f ) {
// Special chars.
// debug -- Puts("_");
// debug -- Printf("%02x", rd[0]);
}
else if( rd[0] >= 0x40 && rd[0] <= 0x7f ) {
if(ReturnKey == 0){
NewLine();
ReturnKey++;
}
if( rd[0] & 0x10 ) {
// Indent
rd[0] &= 0x0e;
rd[0] <<= 1;
for(i=0; i<rd[0]; i++)
Puts(" ");
}
else {
// Color
// debug -- Puts("=");
// debug -- Printf("%02x", rd[0]);
}
}
else
// Bad
;
control_code = 0;
break;
}
}
}
else if(!DetAuto){ // small caption
if( rd[0] < 0x20 ) {
control_code = rd[0];
/* control_code_count++;
}
else if( control_code_count>=2 ) {
control_code_count=0;*/
}
else {
switch( control_code ) {
case 0:
if(rd[0] == 0x2e || rd[0] == 0x3f || rd[0] == 0x3a ||
rd[0] == 0x21 || rd[0] == 0x7d ){
IndEnd = 1;
}
if(!IndEnd){
if(rd[0] >= 0x41 && rd[0] <= 0x60){
rd[0] = rd[0] + 0x20;
}
}
else if(IndEnd){
if(rd[0] >= 0x41 && rd[0] <= 0x60)
IndEnd = 0;
}
PutsP(rd);
/* SerialOutputHex(rd[0]);*/
ReturnKey = 0;
break;
default:
if( rd[0] >= 0x40 && rd[0] <= 0x7f ) {
if(ReturnKey == 0){
NewLine();
ReturnKey++;
}
}
else
/*Bad*/
;
control_code = 0;
break;
}
}
}
}
}
RS_rx();
NewLine();
MonWriteI2C(TW99I2CAddress,0x1a, 0x00); NewLine(); // disable CC_DATA
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -