예제 #1
0
// Main FMC-IMAGEON initialization function. Add your code here.
int fmc_imageon_enable( camera_config_t *config )
{
   int ret;

   xil_printf("\n\r");
   xil_printf("------------------------------------------------\n\r");
   xil_printf("--    FMC-IMAGEON Camera Application (MP-2)   --\n\r");
   xil_printf("------------------------------------------------\n\r");
   xil_printf("\n\r");

   config->bVerbose = 1;
   config->vita_aec = 0;       // off
   config->vita_again = 0;     // 1.0
   config->vita_dgain = 128;   // 1.0
   config->vita_exposure = 90; // 90% of frame period


   xil_printf("FMC-IPMI Initialization ...\n\r");
   ret = fmc_iic_axi_init(&(config->fmc_ipmi_iic), "FMC-IPMI I2C Controller", config->uBaseAddr_IIC_FmcIpmi);
   if (!ret ) {
      xil_printf("ERROR: Failed to open FMC-IIC driver,\n\r");
      exit(1);
   }


   // FMC Module Validation
   if (fmc_ipmi_detect(&(config->fmc_ipmi_iic), "FMC-IMAGEON", FMC_ID_ALL)) {
      fmc_ipmi_enable( &(config->fmc_ipmi_iic), FMC_ID_SLOT1 );
   }
   else {
	   xil_printf("ERROR: Failed to validate FMC-IPMI I2C Controller.\n\r");
       exit(1);
   }


   xil_printf("FMC-IMAGEON I2C Initialization ...\n\r");
   ret = fmc_iic_axi_init(&(config->fmc_imageon_iic), "FMC-IMAGEON I2C Controller", config->uBaseAddr_IIC_FmcImageon);
   if (!ret) {
      xil_printf( "ERROR: Failed to open FMC-IIC driver\n\r");
      exit(1);
   }

   xil_printf("FMC-IMAGEON Video Clock Initialization ...\n\r");
   fmc_imageon_init(&(config->fmc_imageon), "FMC-IMAGEON", &(config->fmc_imageon_iic));
   fmc_imageon_vclk_init( &(config->fmc_imageon) );
   fmc_imageon_vclk_config( &(config->fmc_imageon), FMC_IMAGEON_VCLK_FREQ_148_500_000);

   xil_printf("Resetting clock generator ...\n\r");
   reset_dcms(config);

   // Initialize Video Output Timing
   xil_printf("Initializing Video Output for 1080P60 ...\n\r");

   config->hdmio_width  = 1920;
   config->hdmio_height = 1080;
   config->hdmio_timing.IsHDMI        = 0; // DVI Mode
   config->hdmio_timing.IsEncrypted   = 0;
   config->hdmio_timing.IsInterlaced  = 0;
   config->hdmio_timing.ColorDepth    = 8;
   config->hdmio_timing.HActiveVideo  = 1920;
   config->hdmio_timing.HFrontPorch   =   88;
   config->hdmio_timing.HSyncWidth    =   44;
   config->hdmio_timing.HSyncPolarity =    1;
   config->hdmio_timing.HBackPorch    =  148;
   config->hdmio_timing.VActiveVideo  = 1080;
   config->hdmio_timing.VFrontPorch   =    4;
   config->hdmio_timing.VSyncWidth    =    5;
   config->hdmio_timing.VSyncPolarity =    1;
   config->hdmio_timing.VBackPorch    =   36;

   if (config->bVerbose) {
  	   xil_printf("ADV7511 Video Output Information\n\r");
    	   xil_printf( "\tHSYNC Timing     = hav=%04d, hfp=%02d, hsw=%02d(hsp=%d), hbp=%03d\n\r",
      			   config->hdmio_timing.HActiveVideo,
      			   config->hdmio_timing.HFrontPorch,
      			   config->hdmio_timing.HSyncWidth, config->hdmio_timing.HSyncPolarity,
      			   config->hdmio_timing.HBackPorch);
    	   xil_printf( "\tVSYNC Timing     = vav=%04d, vfp=%02d, vsw=%02d(vsp=%d), vbp=%03d\n\r",
    			   config->hdmio_timing.VActiveVideo,
    			   config->hdmio_timing.VFrontPorch,
    			   config->hdmio_timing.VSyncWidth, config->hdmio_timing.VSyncPolarity,
    			   config->hdmio_timing.VBackPorch);
    	   xil_printf( "\tVideo Dimensions = %d x %d\n\r", config->hdmio_width, config->hdmio_height );

   }

   config->hdmio_resolution = vres_detect(config->hdmio_width, config->hdmio_height);
   xil_printf("\tVideo Resolution = %s\n\r", vres_get_name(config->hdmio_resolution));

   xil_printf( "Video Generator Configuration ...\n\r");
   vgen_init( &(config->vtc_tpg), config->uDeviceId_VTC_tpg);
   vgen_config( &(config->vtc_tpg ), config->hdmio_resolution, 1);


   // FMC-IMAGEON HDMI Output Initialization
   xil_printf( "FMC-IMAGEON HDMI Output Initialization ...\n\r" );
   ret = fmc_imageon_hdmio_init(&(config->fmc_imageon), 1, &(config->hdmio_timing), 0);
   if (!ret) {
      xil_printf("ERROR : Failed to init FMC-IMAGEON HDMI Output Interface\n\r");
      exit(0);
   }


   // FMC-IMAGEON VITA Receiver Initialization
   xil_printf( "FMC-IMAGEON VITA Receiver Initialization ...\n\r" );
   fmc_imageon_vita_receiver_init( &(config->vita_receiver), "VITA-2000", config->uBaseAddr_VITA_Receiver );
   config->vita_receiver.uManualTap = 25;
   fmc_imageon_vita_receiver_spi_config( &(config->vita_receiver), (50000000/10000000) );


   xil_printf("Video Detector Configuration ...\n\r");
   vdet_init(&(config->vtc_ipipe), config->uDeviceId_VTC_ipipe);
   vdet_config(&(config->vtc_ipipe), config->hdmio_resolution, 1);


   // Initialize the Video Sources
   //fmc_imageon_enable_tpg(config);
   int vita_enabled;
   int vita_enable_attempt=1;
   do {
	  xil_printf("\r\n\n\nFMC_IMAGEON_ENABLE_VITA, attempt %d\r\n\n\n", vita_enable_attempt++);
	  vita_enabled = fmc_imageon_enable_vita(config);
   } while(vita_enabled != 0);
   fmc_imageon_enable_ipipe(config);


   // Enable spread-spectrum clocking (SSC)
   enable_ssc(config);

   // Clear frame stores
   Xuint32 i;
   Xuint32 storage_size = config->uNumFrames_HdmiFrameBuffer * ((1920*1080)<<1);
   volatile Xuint32 *pStorageMem = (Xuint32 *)config->uBaseAddr_MEM_HdmiFrameBuffer;

   // Frame #1 - Red pixels
   for (i = 0; i < storage_size / config->uNumFrames_HdmiFrameBuffer; i += 4) {
	   *pStorageMem++ = 0xF0525A52;
   }
   // Frame #2 - Green pixels
   for (i = 0; i < storage_size / config->uNumFrames_HdmiFrameBuffer; i += 4) {
	   *pStorageMem++ = 0x36912291;
   }
   // Frame #3 - Blue pixels
   for (i = 0; i < storage_size / config->uNumFrames_HdmiFrameBuffer; i += 4) {
	   *pStorageMem++ = 0x6E29F029;
   }


   // Initialize Output Side of AXI VDMA
   xil_printf( "Video DMA (Output Side) Initialization ...\n\r" );
   vfb_common_init(
      config->uDeviceId_VDMA_HdmiFrameBuffer, // uDeviceId
      &(config->vdma_hdmi)                    // pAxiVdma
      );
   vfb_tx_init(
      &(config->vdma_hdmi),                   // pAxiVdma
      &(config->vdmacfg_hdmi_read),           // pReadCfg
      config->hdmio_resolution,               // uVideoResolution
      config->hdmio_resolution,               // uStorageResolution
      config->uBaseAddr_MEM_HdmiFrameBuffer,  // uMemAddr
      config->uNumFrames_HdmiFrameBuffer      // uNumFrames
      );

   // Initialize Input Side of AXI VDMA
   xil_printf( "Video DMA (Input Side) Initialization ...\n\r" );
   vfb_rx_init(
      &(config->vdma_hdmi),                   // pAxiVdma
      &(config->vdmacfg_hdmi_write),          // pWriteCfg
      config->hdmio_resolution,               // uVideoResolution
      config->hdmio_resolution,               // uStorageResolution
      config->uBaseAddr_MEM_HdmiFrameBuffer,  // uMemAddr
      config->uNumFrames_HdmiFrameBuffer      // uNumFrames
      );

   sleep(64); // Version of sleep() we are using is off by 64X.

   // Status of AXI VDMA
   vfb_dump_registers( &(config->vdma_hdmi) );
   if ( vfb_check_errors( &(config->vdma_hdmi), 1/*clear errors, if any*/ ) ) {
      vfb_dump_registers( &(config->vdma_hdmi) );
   }

   xil_printf("\n\r");
   xil_printf( "Done\n\r" );
   xil_printf("\n\r");

   return 0;
}
int fmc_imageon_vita_passthrough_init( fmc_imageon_vita_passthrough_t *pDemo )
{
   int ret;
   Xuint32 timeout = 100;
   Xuint32 iterations = 0;

   printf("\n\r");
   printf("------------------------------------------------------\n\r");
   printf("--          FMC-IMAGEON VITA Pass-Through           --\n\r");
   printf("------------------------------------------------------\n\r");
   printf("\n\r");

   printf( "FMC-IMAGEON Initialization ...\n\r" );

   ret = fmc_iic_xps_init(&(pDemo->fmc_imageon_iic),"FMC-IMAGEON I2C Controller", pDemo->uBaseAddr_IIC_FmcImageon );
   if ( !ret )
   {
      printf( "ERROR : Failed to open FMC-IIC driver\n\r" );
      exit(0);
   }

   fmc_imageon_init(&(pDemo->fmc_imageon), "FMC-IMAGEON", &(pDemo->fmc_imageon_iic));
   pDemo->fmc_imageon.bVerbose = pDemo->bVerbose;

   // Configure Video Clock Synthesizer
   printf( "Video Clock Synthesizer Configuration ...\n\r" );
   fmc_imageon_vclk_init( &(pDemo->fmc_imageon) );
   fmc_imageon_vclk_config( &(pDemo->fmc_imageon), FMC_IMAGEON_VCLK_FREQ_148_500_000);
   sleep(1);

   // Set HDMI output to 1080P60
   pDemo->hdmio_resolution = VIDEO_RESOLUTION_1080P;
   pDemo->hdmio_width  = 1920;
   pDemo->hdmio_height = 1080;

   //pDemo->hdmio_timing.IsHDMI        = 1; // HDMI Mode
   pDemo->hdmio_timing.IsHDMI        = 0; // DVI Mode
   pDemo->hdmio_timing.IsEncrypted   = 0;
   pDemo->hdmio_timing.IsInterlaced  = 0;
   pDemo->hdmio_timing.ColorDepth    = 8;

   pDemo->hdmio_timing.HActiveVideo  = 1920;
   pDemo->hdmio_timing.HFrontPorch   =   88;
   pDemo->hdmio_timing.HSyncWidth    =   44;
   pDemo->hdmio_timing.HSyncPolarity =    1;
   pDemo->hdmio_timing.HBackPorch    =  148;

   pDemo->hdmio_timing.VActiveVideo  = 1080;
   pDemo->hdmio_timing.VFrontPorch   =    4;
   pDemo->hdmio_timing.VSyncWidth    =    5;
   pDemo->hdmio_timing.VSyncPolarity =    1;
   pDemo->hdmio_timing.VBackPorch    =   36;

   printf( "ADV7511 Video Output Information\n\r" );
   printf( "\tVideo Output     = %s", pDemo->hdmio_timing.IsHDMI ? "HDMI" : "DVI" );
   printf( "%s", pDemo->hdmio_timing.IsEncrypted ? ", HDCP Encrypted" : "" );
   printf( ", %s\n\r", pDemo->hdmio_timing.IsInterlaced ? "Interlaced" : "Progressive" );
   printf( "\tColor Depth      = %d bits per channel\n\r", pDemo->hdmio_timing.ColorDepth );
   printf( "\tHSYNC Timing     = hav=%04d, hfp=%02d, hsw=%02d(hsp=%d), hbp=%03d\n\r",
      pDemo->hdmio_timing.HActiveVideo,
      pDemo->hdmio_timing.HFrontPorch,
      pDemo->hdmio_timing.HSyncWidth, pDemo->hdmio_timing.HSyncPolarity,
      pDemo->hdmio_timing.HBackPorch
      );
   printf( "\tVSYNC Timing     = vav=%04d, vfp=%02d, vsw=%02d(vsp=%d), vbp=%03d\n\r",
      pDemo->hdmio_timing.VActiveVideo,
      pDemo->hdmio_timing.VFrontPorch,
      pDemo->hdmio_timing.VSyncWidth, pDemo->hdmio_timing.VSyncPolarity,
      pDemo->hdmio_timing.VBackPorch
      );
   printf( "\tVideo Dimensions = %d x %d\n\r", pDemo->hdmio_width, pDemo->hdmio_height );

   printf( "HDMI Output Initialization ...\n\r" );
   ret = fmc_imageon_hdmio_init( &(pDemo->fmc_imageon),
 	                             1,                      // hdmioEnable = 1
 	                             &(pDemo->hdmio_timing), // pTiming
 	                             0                       // waitHPD = 0
 	                             );
   if ( !ret )
   {
      printf( "ERROR : Failed to init HDMI Output Interface\n\r" );
      exit(0);
   }

  while (1)
  {

   if ( iterations > 0 )
   {
      printf( "\n\rPress ENTER to re-start ...\n\r" );
      getchar();
   }
   iterations++;

   // FMC-IMAGEON VITA Receiver Initialization
   printf( "FMC-IMAGEON VITA Receiver Initialization ...\n\r" );
   onsemi_vita_init( &(pDemo->vita_receiver), "VITA-2000", pDemo->uBaseAddr_VITA_SPI, pDemo->uBaseAddr_VITA_CAM );
   pDemo->vita_receiver.uManualTap = 25;
   printf( "FMC-IMAGEON VITA SPI Config for 10MHz ...\n\r" );
   // axi4lite_0_clk = 50MHz
   onsemi_vita_spi_config( &(pDemo->vita_receiver), (50000000/10000000) );

   // VITA-2000 Initialization
   printf( "FMC-IMAGEON VITA Initialization ...\n\r" );
   ret = onsemi_vita_sensor_initialize( &(pDemo->vita_receiver), SENSOR_INIT_ENABLE, 1 ); // Be verbose
   if ( ret == 0 )
   {
       printf( "VITA sensor failed to initialize ...\n\r" );
      //return -1;
      return XST_SUCCESS;
   }

   sleep(1);

   printf( "FMC-IMAGEON VITA Configuration for 1080P60 timing ...\n\r" );
   ret = onsemi_vita_sensor_1080P60( &(pDemo->vita_receiver), pDemo->bVerbose );
   if ( ret == 0 )
   {
      printf( "VITA sensor failed to configure for 1080P60 timing ...\n\r" );
      //return -1;
      return XST_SUCCESS;
   }

   sleep(1);
   onsemi_vita_get_status( &(pDemo->vita_receiver), &(pDemo->vita_status_t1), 0 );
   sleep(1);
   onsemi_vita_get_status( &(pDemo->vita_receiver), &(pDemo->vita_status_t2), 0 );
   //
   printf( "VITA Status = \n\r" );
   printf("\tImage Width  = %d\n\r", pDemo->vita_status_t1.cntImagePixels * 4 );
   printf("\tImage Height = %d\n\r", pDemo->vita_status_t1.cntImageLines  );
   printf("\tFrame Rate   = %d frames/sec\n\r", pDemo->vita_status_t2.cntFrames - pDemo->vita_status_t1.cntFrames );
   printf("\tCRC Status   = %X\n\r", pDemo->vita_status_t2.crcStatus );

   if ( pDemo->bVerbose )
   {
   	onsemi_vita_get_status( &(pDemo->vita_receiver), &(pDemo->vita_status_t2), 1 );
   }

#if 0
   // accept 1920x1080 resolution
   if ( (pDemo->vita_status_t1.cntImagePixels * 4)==1920 && (pDemo->vita_status_t1.cntImageLines)==1080 )
   {
   	// accept 60-64fps range
   	if ( (pDemo->vita_status_t2.cntFrames - pDemo->vita_status_t1.cntFrames)>=60 && (pDemo->vita_status_t2.cntFrames - pDemo->vita_status_t1.cntFrames)<=64 )
   	{
           ; //break;
   	}
   }
#endif


#if defined(XPAR_XVTC_NUM_INSTANCES)
   // Configure VTC on output data path
   printf( "Video Timing Controller (generator) Initialization ...\n\r" );
   vgen_init( &(pDemo->vtc_hdmio_generator), pDemo->uDeviceId_VTC_HdmioGenerator );
   vgen_config( &(pDemo->vtc_hdmio_generator), pDemo->hdmio_resolution, 1 );
#endif

//#if defined(XPAR_CFA_NUM_INSTANCES)
#if defined(XPAR_CFA_0_BASEADDR)
   printf( "Color Filter Array Interpolation (CFA) Initialization ...\n\r" );
   pDemo->pCfa_config = XCfa_LookupConfig(pDemo->uDeviceId_CFA);
   XCfa_CfgInitialize(&(pDemo->cfa), pDemo->pCfa_config, pDemo->pCfa_config->BaseAddress);
   XCfa_Reset( &(pDemo->cfa) );
   XCfa_SetBayerPhase( &(pDemo->cfa), XCFA_RGRG_COMBINATION );
   XCfa_RegUpdateEnable( &(pDemo->cfa) );
   XCfa_Enable( &(pDemo->cfa) );
   printf("\tCFA done\r\n");
#endif

   printf("\n\r");
   printf( "Done\n\r" );
   printf("\n\r");

   sleep(1);
  }

   return 0;
}