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

📄 io.cpp

📁 Vxworks 下的视频采集程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <time.h>
//#include <dos.h>
#include"syslib.h"
#include "pci.h"
#include "xdefine.h" 
#include "w99200f.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]; 


 
int  _ulAIR=0L;     // Address Index Register
int  _ulDPR=4L ;    // Data Port Register 
int  _ulODPR=8L ;   // the Output port of the Output-FIFO

  
BOOL W99200WriteReg(int index, int value);
int W99200ReadReg (int index);
void  W99200ReSet(); 

BOOL  W99200I2CWrite(int Subadrs,int *Value,UINT Count);
BOOL  W99200I2CRead(int Subadrs,int *Value); 

BOOL W99200SDRAM_Write(int Mem); 
BOOL W99200SDRAM_Read(int Mem);
BOOL W99200SDRAM_MARead(int Mem);

BOOL W99200IMEM_Write(int Mem); 
BOOL W99200IMEM_Read(int Mem); 
BOOL W99200IMEM_MARead(int Mem);

BOOL W99200AUDIO_End(void);
BOOL W99200AUDIO_Thr(void); 
BOOL W99200AUDIO_Read(void); 

BOOL W9920026QF_Write(int index, int data);  
int W9920026QF_Read(int index);

// AUDIO CODEC Test
int AK4516ReadReg(int index);  
BOOL AK4516WriteReg(int index,int dvalue);




void W99200OutIndexdw(int Port, int IndexData,int DataAddress, int Data); 
int W99200InIndexdw(int Port, int IndexData, int DataAddress);
void W99200Outpdw(int port, int data);
int W99200Inpdw(int port);

BOOL W99200I2CStatus(void);

BOOL W99200FIFO_Thr(void); 
BOOL W99200FIFO_End(void);
void W99200F_DELAY(void) ; 

extern int iSA;
//***********************************************************************
//    Function    :W99200F_DELAY
//    Description :
//    Return      :None
//***********************************************************************
void W99200F_DELAY(void)
{     
      
    clock_t start,end;
    return;
    start=clock();
    do
    {
       end=clock(); 
       //printf(" start->%ld, end->%ld\n", start,end );
    }while( (end-start) < 100 );  

}
//***********************************************************************
//    Function    :W99200WriteReg
//    Description :
//    Return      :BOOL
//***********************************************************************
BOOL W99200WriteReg(int index, int value)
{  
  
//  printf("WriteReg: Index=%x, value=%x\n", index, value);
  W99200OutIndexdw(_IOBase+_ulAIR,index,_IOBase+_ulDPR,value);
  return TRUE;  
} 

//***********************************************************************
//    Function    :W99200ReadReg
//    Description :
//    Return      :BOOL
//***********************************************************************
int W99200ReadReg(int index)
{  
  int ulRet;
  ulRet=W99200InIndexdw(_IOBase+_ulAIR,index,_IOBase+_ulDPR);
  return ulRet;  
} 

//***********************************************************************
//    Function    :W99200ReSet
//    Description :
//    Return      :NONE
//***********************************************************************
void W99200ReSet()
{  
   int value;
   value=0xFF;
   W99200WriteReg(Video_reset, value);   
} 
//***********************************************************************
//    Function    :W99200Outpdw
//    Description :
//    Return      :NONE
//***********************************************************************
void W99200Outpdw(int port, int data)
{
 // _outpdw((WORD) port,data);// direct outport a double word
 sysOutWord((int)port,(short)data);
}

//***********************************************************************
//    Function    :W99200OutIndexdw
//    Description :
//    Return      :NONE
//***********************************************************************
void W99200OutIndexdw(int Port, int IndexData, int DataAddress, int Data)
{
   W99200Outpdw(Port,IndexData); // outport register index
   W99200Outpdw(DataAddress,Data); // outport data                                                                    
} 


//***********************************************************************
//    Function    :W99200InIndexdw
//    Description :
//    Return      :int
//***********************************************************************
int W99200InIndexdw (int Port, int IndexData, int DataAddress)
{
   int data=0; 
   W99200Outpdw(Port,IndexData); // outport register index
   data=W99200Inpdw(DataAddress);
   return data;
}

//***********************************************************************
//    Function    :W99200Inpdw
//    Description :
//    Return      :
//***********************************************************************
int W99200Inpdw(int Port)
{
  int data=0;
//  data=_inpdw((WORD) Port); // direct inport a double word
  data=sysInWord((int)Port);
  return data;                                                                  
}

//***********************************************************************
//    Function    :W99200I2CWrite
//    Description :Write data to IC2
//    Parameters  :Subaddress, Data, Count  
//    Return      :TRUE or FALSE
//***********************************************************************
BOOL 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); 
     
  //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;  
    } 


//***********************************************************************
//    Function    :W99200I2CRead
//    Description :Read data from I2C
//    Parameters  :Subaddress  
//    Return      :Data
//***********************************************************************
BOOL W99200I2CRead(int Subadrs,int *Value)
{  
  // === Write SAA7114 Subadress ===
  //W99200WriteReg(Vint_enable, I2C_READY);// enable interrupt I2C ready
  // I2C Start 
  W99200WriteReg(I2c_start, 0x00FF); // I2c_start: any data
  // Write Device ID, SAA7114 Write Mode=40, Read Mode=41 
  if ( iSA==2 )
     W99200WriteReg(I2c_data, SA7114_W);   
  else
     W99200WriteReg(I2c_data, SA7113_W);      
  // Check I2C Acknowledge
  //W99200F_DELAY(); // otis adding 4/1
  if ( W99200I2CStatus()!= TRUE )
     return FALSE;
  // Write Subaddress   
  W99200WriteReg(I2c_data, Subadrs);
  // Check I2C Acknowledge
  //W99200F_DELAY(); // otis adding 4/1
  if ( W99200I2CStatus()!= TRUE )
     return FALSE;
     
  // === Read Date === 
  // 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=40, Read Mode=41 
  if ( iSA==2)
     W99200WriteReg(I2c_data, SA7114_R);
  else
     W99200WriteReg(I2c_data, SA7113_R);
  //W99200F_DELAY(); // otis adding 4/1
  if ( W99200I2CStatus()!= TRUE ) // Check I2C Acknowledge
     return FALSE;
  *Value=W99200ReadReg(I2c_data);
  // I2C Stop
  W99200WriteReg(I2c_stop, 0x00FF); // I2c_stop = any data
  if ( W99200I2CStatus()!= TRUE )
     return FALSE; 
  else
     return TRUE;   
  
}

//***********************************************************************
//    Function    :W99200I2CStatus
//    Description :Get the Acknowledge
//    Parameters  :None  
//    Return      :TRUE or FALSE
//***********************************************************************
BOOL 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;
}

//***********************************************************************
//    Function    :W99200CKFIFO_THR
//    Description :Polling the  FIFO passes the threshold level
//    Parameters  :None  
//    Return      :TRUE or FALSE
//***********************************************************************
BOOL 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;
}

//***********************************************************************
//    Function    :W99200I2CFIFO
//    Description :Polling the  FIFO End of data
//    Parameters  :None
//    Return      :TRUE or FALSE
//***********************************************************************
BOOL 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;
}   

//***********************************************************************
//    Function    :W99200SDRAM_Write
//    Description :Get the Acknowledge
//    Parameters  :None  
//    Return      :TRUE or FALSE
//***********************************************************************
BOOL W99200SDRAM_Write(int Mem)
{     
    int dMem_Select;
    int i;
    
    dMem_Select=Mem; 
    // Soft reset
    W99200ReSet();
    // Configuration 
    W99200WriteReg(Vwork_mode, 0x0006);
    W99200WriteReg(Vmem_select,dMem_Select);
    // Start Command  
    W99200WriteReg(Vstart, 0x00FF);
    // Forward Data transfer
    for ( i=0 ; i < 2048 ; i++)
      W99200WriteReg(Vdata_in,_dSDRAM_Data[i]); 
    // Stop Command
    W99200WriteReg(Vstop, 0x00FF);
    return TRUE;
}

//***********************************************************************
//    Function    :W99200SDRA_Read
//    Description :Read One Blok Data
//    Parameters  :None  
//    Return      :TRUE or FALSE
//***********************************************************************
BOOL W99200SDRAM_Read(int Mem)
{     
    int dMem_Select;
    int i;
    
    dMem_Select=Mem;     
    // Soft reset  
    W99200ReSet();
    // Configuration  
    //W99200WriteReg(Vint_enable,0x0003);// enable interrupt FIFO ready and end of data
    W99200WriteReg(Vthreshold, 0x0002);// 8 double-word(32 bytes) 
    W99200WriteReg(Vwork_mode, 0x0007);
    W99200WriteReg(Vmem_select, dMem_Select);
    // Start Command  
    W99200WriteReg(Vstart, 0x00FF);
    // Reverse Data transfer
    i=0;
    printf( "\n" );
    do // Pooling the End of Data
    {
      if ( W99200FIFO_Thr()== TRUE )
      {
        _dSDRAM_Data[i]=W99200Inpdw(_IOBase+_ulODPR);
        _dSDRAM_Data[i+1]=W99200Inpdw(_IOBase+_ulODPR);
        _dSDRAM_Data[i+2]=W99200Inpdw(_IOBase+_ulODPR);
        _dSDRAM_Data[i+3]=W99200Inpdw(_IOBase+_ulODPR);
        _dSDRAM_Data[i+4]=W99200Inpdw(_IOBase+_ulODPR);
        _dSDRAM_Data[i+5]=W99200Inpdw(_IOBase+_ulODPR);
        _dSDRAM_Data[i+6]=W99200Inpdw(_IOBase+_ulODPR);
        _dSDRAM_Data[i+7]=W99200Inpdw(_IOBase+_ulODPR);
        i=i+8;
        if ( (i%50)==0 )
          printf( "." );
      }
    } while ( W99200FIFO_End()!=TRUE  );
    printf( "\n" );
    return TRUE;
} 
// 3/17 adding    
//***********************************************************************
//    Function    :W99200SDRA_MARead
//    Description :Read One Blok Data use Master Mode
//    Parameters  :None  
//    Return      :TRUE or FALSE
//***********************************************************************
/*BOOL W99200SDRAM_MARead(int Mem)
{     
    int dMem_Select;
    int i;
    int daddress; 
    BYTE  *bOffset;
    int *pd;
    int seg_val=0,off_val=0;
    void  *pp = _dSDRAM_Data;
    
//    bOffset=(BYTE *)pp;
//    seg_val=_FP_SEG(pp);
//    off_val=_FP_OFF(pp);
//    daddress=(int)seg_val;
//    daddress <<= 4;
//    daddress += off_val;
      daddress=pp;
    for( i = 0; i < 4; i ++ )    // Find the 4 address
    {
        if((daddress & 0x0003) == 0)
            break;
        daddress ++;
    }
    bOffset=bOffset+i; 
    pd=(int *)bOffset;
    dMem_Select=Mem;     
    // Soft reset  
    W99200ReSet();
    // Configuration  
    //W99200WriteReg(Vint_enable,0x0003);// enable interrupt FIFO ready and end of data 3/16
    W99200WriteReg(Vthreshold, 0x0002);// 8 double-word(32 bytes) 

⌨️ 快捷键说明

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