⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w99200.cpp

📁 Vxworks 下的视频采集程序
💻 CPP
字号:
#include <stdio.h>
#include <time.h>
#include"syslib.h"
#include "pci.h"
#include "xdefine.h" 
#include "w99200f.h"
#include "w99200.h"
//#include "data.h"
extern unsigned long _IOBase;     // I/O base for video 
   
#define I2C_READY 0x0040 // 6-bit=1 I2C ready  
#define SA7114_W  0x0042 // SAA7114 Write Mode
#define SA7114_R  0x0043 // SAA7114 Read Mode 

#define SA7113_W  0x004A
#define SA7113_R  0x004B

//extern int _dMem_Data[64];
//extern int _dSDRAM_Data[2052];
//extern int _dAUDIO_Data[32]; 


 
extern int  _ulAIR;     // Address Index Register
extern int  _ulDPR;    // Data Port Register 
extern int  _ulODPR;   // the Output port of the Output-FIFO
extern int _dMem_Data[64];// 4*64=256 Bytes
extern int _dSDRAM_Data[2052]; // 2048*4=8192 Bytes
extern int _dAUDIO_Data[32]; // 32*4=128 Bytes
extern int _dDef_Regs[135];  // Default Value of Registers
extern int iSA;
extern  unsigned char       _cBus;
extern  unsigned char       _cDeviceNO;

  

void W99200Outpdw(int port, int data)
{
 // _outpdw((WORD) port,data);// direct outport a double word
 sysOutLong((int)port,(int)data);
 //pciConfigOutByt(_cBus,_cDeviceNO,/*_funID*/PCI_FUNCTION_ID,port,data);
}
void W99200OutIndexdw(int Port, int IndexData, int DataAddress, int Data)
{
   W99200Outpdw(Port,IndexData); // outport register index
   W99200Outpdw(DataAddress,Data); // outport data                                                                    
} 
int  W99200WriteReg(int index, int value)
{  
  
//  printf("WriteReg: Index=%x, value=%x\n", index, value);
  W99200OutIndexdw(_IOBase+_ulAIR,index,_IOBase+_ulDPR,value);
  //printf("wewewew\n");
  return TRUE;  
} 

int W99200Inpdw(int Port)
{
  int data=0;
//  data=_inpdw((WORD) Port); // direct inport a double word
  data=sysInWord((int)Port);
  return data;                                                                  
}
int W99200InIndexdw (int Port, int IndexData, int DataAddress)
{
   int data=0; 
   W99200Outpdw(Port,IndexData); // outport register index
   data=W99200Inpdw(DataAddress);
   return data;
}
int W99200ReadReg(int index)
{  
  int ulRet;
  ulRet=W99200InIndexdw(_IOBase+_ulAIR,index,_IOBase+_ulDPR);
  return ulRet;  
} 
void W99200ReSet()
{  
   int value;
   value=0xFF;
   W99200WriteReg(Video_reset, value);   
} 
int W99200IMEM_Write(int Mem)
{     
    int dMem_Select;
    int dSize; 
    int i; 
  
    dSize=64;  
    dMem_Select=Mem;
    // Set the internal memories size by index 
    if ( dMem_Select==0x09 || dMem_Select==0x0b )
       dSize=48;
    if ( dMem_Select==0x11 || dMem_Select==0x15 || dMem_Select==0x1d || dMem_Select==0x2b|| dMem_Select==0x0c)
       dSize=32;
    if ( dMem_Select==0x1a)
       dSize=16;          
    // Soft reset  
    W99200ReSet();
    // Configuration 
    W99200WriteReg(Vwork_mode, 0x0008);
    W99200WriteReg(Vmem_select,dMem_Select);
    // Start Command  
    W99200WriteReg(Vstart, 0x00FF);
    // Forward Data transfer
    for ( i=0 ; i < dSize ; i++)
      W99200WriteReg(Vdata_in, _dMem_Data[i]); 
    // Stop Command
    W99200WriteReg(Vstop, 0x00FF);
    return TRUE;
} 

int W99200FIFO_Thr(void)
{
   int ulRet;
     
    ulRet=0x00; 
    
    ulRet=W99200ReadReg(0x0f); // otis 4/20 adding 
    //if( ulRet & 0x3c )
    //if ( (ulRet & 0x0020) == 0x0020 ) 
    //   printf( " \n int_source ->%lx",ulRet);
    if ( (ulRet & 0x0002) == 0x0002 )
    {
         //W99200WriteReg(Vint_clear,0x02);
         return TRUE;
    }
	
    
    return FALSE;
}
int W99200FIFO_End(void)
{
    int ulRet;
    clock_t start, end;

    // Polling FIFO passes the threshold
  start=clock();
//  do
  {
       ulRet=W99200ReadReg(Vint_source); // 1-bit=1: FIFO passed the threshold
       if ( (ulRet & 0x0001) == 0x0001 )
         return TRUE;
     end=clock();
  } //while( (end-start) < 500 );
    return FALSE;
}   
int W99200I2CStatus(void)
{   
    int dValue;
    int ulRet; 
    clock_t start, end; 
    
    //W99200WriteReg(Vint_enable,I2C_READY);// enable interrupt I2C ready  
    // Polling I2C Status  
    start=clock(); 
    ulRet=0;
    do
    {  
       //ulRet=W99200ReadReg(I2c_status); // 0-bit=0 false;1 success 
       ulRet=W99200ReadReg(Vint_source); // 0-bit=0 false;1 success 
       if ( (ulRet & 0x0040) == 0x0040 ) 
       {
         W99200WriteReg(Vint_clear,I2C_READY);//4/21..................
         /*
         if ( W99200ReadReg(I2c_status)== 0x01 )
           return TRUE;
         else */
           return TRUE;   
       }   
       end=clock();    
    }while( (end-start) < 500);   
    dValue=0x00FF; // I2c_stop = any data
    //W99200WriteReg(I2c_stop, dValue);// I2C Stop
    return FALSE;
}
int W99200I2CWrite(int Subadrs, int *Value,UINT Count)
{       
  
  int dValue[256];
  int iResult=0;
  UINT uCount,i;

//  printf("Subadrs=%x Value=%x\n", Subadrs, *Value);
  
  uCount=Count; 
  // Read the written data
  for ( i=0 ; i < uCount ; i++ )
  {
      dValue[i]=*Value;
      Value++;
  } 
  // enable interrupt I2C ready   
  //W99200WriteReg(Vint_enable, I2C_READY); 
 
  // *** I2C Start 
  W99200WriteReg(I2c_start, 0x00FF); // I2c_start: any data
  // *** Write Device ID, SAA7114 Write Mode=42, Read Mode=43 
  if ( iSA==2 )
     W99200WriteReg(I2c_data, SA7114_W); 
  else
     W99200WriteReg(I2c_data, SA7113_W); 
   printf("**%d\n",iSA);  
  //W99200F_DELAY(); // otis adding 4/1
  // Check I2C Acknowledge
  if ( W99200I2CStatus()== TRUE ) 
  {
    // Write Subaddress
    W99200WriteReg(I2c_data, Subadrs);
    //W99200F_DELAY(); // otis adding 4/1
    if ( W99200I2CStatus()!= TRUE ) // Check I2C Acknowledge
         return FALSE; 
    // Write data     
    for ( i=0 ; i < uCount ; i++ )
    {
       W99200WriteReg(I2c_data, dValue[i]);
      // W99200F_DELAY(); // otis adding 4/1
       if ( W99200I2CStatus()!= TRUE ) // Check I2C Acknowledge
         return FALSE;
    }
    // I2C Stop
    W99200WriteReg(I2c_stop, 0x00FF); // I2c_stop = any data
    //W99200F_DELAY(); // otis adding 4/1
    if ( W99200I2CStatus() == TRUE )
         return TRUE;
    else
         return FALSE;   
  }
  else
    return FALSE;  
    } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -