📄 videoinvideoout.c
字号:
In3_Buffer2D.YCount = NUM_LINES;
In3_Buffer2D.YModify = 4;
In3_Buffer2D.CallbackParameter = NULL;
In3_Buffer2D.pNext = &In4_Buffer2D;
In4_Buffer2D.Data = (void*)sFrame3;
In4_Buffer2D.ElementWidth = sizeof(u32);
In4_Buffer2D.XCount = (FRAME_DATA_LEN/2);
In4_Buffer2D.XModify = 4;
In4_Buffer2D.YCount = NUM_LINES;
In4_Buffer2D.YModify = 4;
#ifdef USE_LOOPBACK
In4_Buffer2D.CallbackParameter = NULL;
#else // chained buffer
In4_Buffer2D.CallbackParameter = &In3_Buffer2D;
#endif
In4_Buffer2D.pNext = NULL;
// configure the ad7183 dataflow method
#if defined(USE_LOOPBACK)
ezErrorCheck(adi_dev_Control(AD7183DriverHandle, ADI_DEV_CMD_SET_DATAFLOW_METHOD, (void *)ADI_DEV_MODE_CHAINED_LOOPBACK));
// give the PPI driver the buffer to process
ezErrorCheck(adi_dev_Read(AD7183DriverHandle, ADI_DEV_2D, (ADI_DEV_BUFFER *)&In1_Buffer2D));
#else
ezErrorCheck(adi_dev_Control(AD7183DriverHandle, ADI_DEV_CMD_SET_DATAFLOW_METHOD, (void *)ADI_DEV_MODE_CHAINED));
// give the PPI driver the buffer to process
ezErrorCheck(adi_dev_Read(AD7183DriverHandle, ADI_DEV_2D, (ADI_DEV_BUFFER *)&In1_Buffer2D));
ezErrorCheck(adi_dev_Read(AD7183DriverHandle, ADI_DEV_2D, (ADI_DEV_BUFFER *)&In3_Buffer2D));
#endif
/********* AD7183 registers access ****************************************/
// Send Pseudo TWI Configuration table to AD7183 if register configuratian is needed
ezErrorCheck(adi_dev_Control(AD7183DriverHandle,ADI_AD7183_CMD_SET_TWI_CONFIG_TABLE,(void*)PseudoTWIConfig));
// do the register configuration here if needed.
#if defined(READ_REG_VALUE)
// read AD7183 status register
Read7183StatusReg();
#endif
// start capturing video data
ezErrorCheck(adi_dev_Control(AD7183DriverHandle, ADI_DEV_CMD_SET_DATAFLOW, (void*)TRUE));
}
/*********************************************************************
Function: StartADV7170
Description: Initialise Video Encoder ADV7179, set up buffers and
configure the encoder
*********************************************************************/
static void StartADV7179(void){
u32 Result = 0;
ezEnableVideoEncoder();// enable AD7179
//ezDisableVideoEncoder();// enable AD7179
// open the ad7179 driver
ezErrorCheck(adi_dev_Open( adi_dev_ManagerHandle, // device manager handle
&ADIADV7179EntryPoint, // entry point of device driver to open
0, // the device number (0th AD7179)
(void *)0x7179, // client handle (0x7179 will be given to the AD7179 encoder driver)
&AD7179DriverHandle, // location where AD7179 device driver handle will be stored
ADI_DEV_DIRECTION_OUTBOUND,// direction the device is to be opened
adi_dma_ManagerHandle, // DMA Manager handle
NULL, // DCB handle (NULL cause we want live callbacks)
CallbackFunction)); // address of callback function
// configure the AD7179 driver(Set PPI Device number)
ezErrorCheck(adi_dev_Control( AD7179DriverHandle, ADI_ADV717x_CMD_SET_PPI_DEVICE_NUMBER, (void*)1 ));
// configure the AD7179 driver(Open PPI Device)
ezErrorCheck(adi_dev_Control( AD7179DriverHandle, ADI_ADV717x_CMD_SET_PPI_STATUS, (void*)ADI_ADV717x_PPI_OPEN ));
// Send Pseudo TWI Configuration table to AD7179 driver
Result = adi_dev_Control(AD7179DriverHandle,ADI_ADV717x_CMD_SET_TWI_CONFIG_TABLE,(void*)PseudoTWIConfig);
if ( Result != ADI_DEV_RESULT_SUCCESS) printf("Set TWI-config table failed\n");
#if defined(READ_REG_VALUE)
// Read AD7179 registers before configuration
Read7179Regs();
#endif
#ifdef PAL_FRAME
Set7179ToPAL();// operate in PAL mode
#else
Set7179ToNTSC();// operate in NTSC mode
#endif
#if defined(READ_REG_VALUE)
// Read AD7179 register value after configuration
Read7179Regs();
#endif
// populate AD7179 outbound buffers
Out1_Buffer2D.Data = (void*)sFrame0;// address of the data storage
Out1_Buffer2D.ElementWidth = sizeof(u32);
Out1_Buffer2D.XCount = (FRAME_DATA_LEN/2);
Out1_Buffer2D.XModify = 4;
Out1_Buffer2D.YCount = NUM_LINES;
Out1_Buffer2D.YModify = 4;
Out1_Buffer2D.CallbackParameter = NULL;
Out1_Buffer2D.pNext = &Out2_Buffer2D;// point to the next buffer in the chain
Out2_Buffer2D.Data = (void*)sFrame1;// address of the data storage
Out2_Buffer2D.ElementWidth = sizeof(u32);
Out2_Buffer2D.XCount = (FRAME_DATA_LEN/2);
Out2_Buffer2D.XModify = 4;
Out2_Buffer2D.YCount = NUM_LINES;
Out2_Buffer2D.YModify = 4;
#ifdef USE_LOOPBACK
Out2_Buffer2D.CallbackParameter = NULL;
Out2_Buffer2D.pNext = &Out3_Buffer2D;// point to the next buffer in the chain
#else // chained buffer
Out2_Buffer2D.CallbackParameter = &Out1_Buffer2D;// generate callback, pArg = buffer address
Out2_Buffer2D.pNext = NULL;// terminate the chain of buffers
#endif
Out3_Buffer2D.Data = (void*)sFrame2;// address of the data storage
Out3_Buffer2D.ElementWidth = sizeof(u32);
Out3_Buffer2D.XCount = (FRAME_DATA_LEN/2);
Out3_Buffer2D.XModify = 4;
Out3_Buffer2D.YCount = NUM_LINES;
Out3_Buffer2D.YModify = 4;
Out4_Buffer2D.CallbackParameter = NULL;
Out3_Buffer2D.pNext = &Out4_Buffer2D; // point to the next buffer in the chain
Out4_Buffer2D.Data = (void*)sFrame3;// address of the data storage
Out4_Buffer2D.ElementWidth = sizeof(u32);
Out4_Buffer2D.XCount = (FRAME_DATA_LEN/2);
Out4_Buffer2D.XModify = 4;
Out4_Buffer2D.YCount = NUM_LINES;
Out4_Buffer2D.YModify = 4;
#ifdef USE_LOOPBACK
Out4_Buffer2D.CallbackParameter = NULL;
#else // chained buffer
Out4_Buffer2D.CallbackParameter = &Out3_Buffer2D;// generate callback, pArg = buffer address
#endif
Out4_Buffer2D.pNext = NULL; // terminate the chain of buffers
// configure the ad7179 dataflow method
#if defined(USE_LOOPBACK)
ezErrorCheck(adi_dev_Control(AD7179DriverHandle, ADI_DEV_CMD_SET_DATAFLOW_METHOD, (void *)ADI_DEV_MODE_CHAINED_LOOPBACK));
ezErrorCheck(adi_dev_Write(AD7179DriverHandle, ADI_DEV_2D, (ADI_DEV_BUFFER *)&Out1_Buffer2D));
#else
ezErrorCheck(adi_dev_Control(AD7179DriverHandle, ADI_DEV_CMD_SET_DATAFLOW_METHOD, (void *)ADI_DEV_MODE_CHAINED));
ezErrorCheck(adi_dev_Write(AD7179DriverHandle, ADI_DEV_2D, (ADI_DEV_BUFFER *)&Out1_Buffer2D));
ezErrorCheck(adi_dev_Write(AD7179DriverHandle, ADI_DEV_2D, (ADI_DEV_BUFFER *)&Out3_Buffer2D));
#endif
// start outputting video data
ezErrorCheck(adi_dev_Control(AD7179DriverHandle, ADI_DEV_CMD_SET_DATAFLOW, (void*)TRUE));
}
/**********************************************************************
* Configure AD7179 to NTSC mode
**********************************************************************/
static void Set7179ToNTSC(void)
{
// ADV7179 register configuration array for NTSC mode
ADI_DEV_ACCESS_REGISTER ADV7179_Cfg[]={{ADV717x_MR0, 0x00}, // register address, configuration data
{ADV717x_MR1, 0x58},
{ADV717x_MR2, 0x00},
{ADV717x_MR3, 0x00},
{ADV717x_MR4, 0x10},
{ADV717x_TMR0, 0x00},
{ADV717x_TMR1, 0x00},
{ADI_DEV_REGEND,0 }}; // End of register access
ezErrorCheck(adi_dev_Control(AD7179DriverHandle, ADI_ADV717x_CMD_SET_SCF_REG, (void *) ADV717x_SCF_VALUE_NTSC));
// configure ADV7179 in selected mode
ezErrorCheck(adi_dev_Control(AD7179DriverHandle, ADI_DEV_CMD_REGISTER_TABLE_WRITE, (void *)ADV7179_Cfg));
}
/**********************************************************************
* Configure AD7179 to PAL mode
**********************************************************************/
static void Set7179ToPAL(void)
{
// ADV7179 register configuration array for PAL mode
ADI_DEV_ACCESS_REGISTER ADV7179_Cfg[]={{ADV717x_MR0, 0x05}, // register address, configuration data
{ADV717x_MR1, 0x10},
{ADV717x_MR2, 0x00},
{ADV717x_MR3, 0x00},
{ADV717x_MR4, 0x00},
{ADV717x_TMR0, 0x08},
{ADV717x_TMR1, 0x00},
{ADI_DEV_REGEND,0 }}; // End of register access
ezErrorCheck(adi_dev_Control(AD7179DriverHandle, ADI_ADV717x_CMD_SET_SCF_REG, (void *) ADV717x_SCF_VALUE_PAL_BI));
// configure ADV7179 in selected mode
ezErrorCheck(adi_dev_Control(AD7179DriverHandle, ADI_DEV_CMD_REGISTER_TABLE_WRITE, (void *)ADV7179_Cfg));
}
/**********************************************************************
* read ADV7183 status registers
**********************************************************************/
static void Read7183StatusReg(void)
{
u32 Result = 0, i;
// array to hold the read AD7183 subaddress register value
u16 Read_data[4] ={0};
ADI_DEV_ACCESS_REGISTER Regs[] =
{{ ADV7183_STATUS1_RO, 0 }, // Register address to access, corresponding register data
{ ADV7183_IDENT_RO, 0 },
{ ADV7183_STATUS2_RO, 0 },
{ ADV7183_STATUS3_RO, 0 },
{ ADI_DEV_REGEND, 0 }}; // Register access delimiter (indicates end of register access)
//To read list of registers in DevRegs
Result = adi_dev_Control(AD7183DriverHandle, ADI_DEV_CMD_REGISTER_TABLE_READ, (void *)&Regs);
if (Result != 0) printf("CMD_SELECTIVE_REGISTER_READ failed(error:%x)\n",Result);
else {
// print the values
printf("AD7183: STATUS1 IDENT STATUS2 STATUS3\n ");
for (i=0; i<4; i++){
printf("0x%02X ",Regs[i].Data);
}
printf("\n");
}
}
/**********************************************************************
* Read AD7179 mode(PAL or NTSC)
**********************************************************************/
static void Read7179Regs(void)
{
u32 i,AD7179SCFValue,Result;
// ADV7179 register configuration array for NTSC mode
ADI_DEV_ACCESS_REGISTER ADV7179_read[]={{ADV717x_MR0, 0}, // register address, configuration data
{ADV717x_MR1, 0},
{ADV717x_MR2, 0},
{ADV717x_MR3, 0},
{ADV717x_MR4, 0},
{ADV717x_TMR0, 0},
{ADV717x_TMR1, 0},
{ADI_DEV_REGEND,0 } }; // End of register access
Result = adi_dev_Control(AD7179DriverHandle, ADI_ADV717x_CMD_GET_SCF_REG, (void *)&AD7179SCFValue);
if ( Result != ADI_DEV_RESULT_SUCCESS) printf("Get SCF-Reg failed\n");
else
printf("\nAD7179 SCF=0x%x\n",AD7179SCFValue);
// Read ADV7179 in selected mode
Result = adi_dev_Control(AD7179DriverHandle, ADI_DEV_CMD_REGISTER_TABLE_READ, (void *)ADV7179_read);
if ( Result != ADI_DEV_RESULT_SUCCESS) printf("Selective Read failed\n");
else {
printf("AD7179 Regs: ");
for(i=0;i<7;i++){
printf("0x%x ",ADV7179_read[i].Data);
}
printf("\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -