📄 main.c
字号:
/******************************************************************************
$File: main.c $
$Revision: 1.3 $
$Date: 2007/11/19 04:23:40 $
Project: SensorStream
Title: Sensor Stream to Video/LCD Output application
Author(s): BJ
Description:
This application stream video images from either an Omnivision OV7X48 VGA
sensor or Micron Black and White VGA sensor and output to either the
ADV7179 video encoder in NTSC or PAL mode, or to a NEC VGA LCD panel.
Configuration:
See readme file
*******************************************************************************
Modification History:
====================
Revision 1.0 - BJ 2006/07/02
Created application
Revision 1.1 - BJ 2006/07/17
Fixed major screen flicker when running on BF561 under Debug mode
******************************************************************************/
/******************************************************************************
Include files
******************************************************************************/
#include <services/services.h> // system service includes
#include <SDK-ezkitutilities.h> // EZ-Kit utilities
#include <adi_ssl_Init.h> // adi_ssl_Init utilities
#include <SensorCommon/common.h>
#include <SensorCommon/device.h>
/******************************************************************************
Configuration
******************************************************************************/
// select default video output mode
//#define VIDEO_MODE_VGA
#define VIDEO_MODE_PAL
//#define VIDEO_MODE_NTSC
// uncommen next line to use deferred callbacks
//#define USE_DEFERRED_CALLBACKS
/******************************************************************************
Global definitions
******************************************************************************/
// a macro to halt execution and return control to the ICE
#define WAIL() asm("EMUEXCPT;"); asm("NOP;")
#define VIDEO_REFRESH_VGA 60
#define VIDEO_REFRESH_NTSC 25
#define VIDEO_REFRESH_PAL 30
#if defined(__ADSP_TETON__)
#define INPUT_PPI 0
#define OUTPUT_PPI 1
#else
#error This application is only tested to work on Blackfin Teton
#endif
/******************************************************************************
Static data
******************************************************************************/
#if defined (__ADSP_TETON__)
section("sdram_bank1") static u32 InputData[720*480/2];
section("sdram_bank3") static u32 OutputData[GFX_PAL_FRAME_SIZE/2];
section("sdram_bank0") static u16 OverlayData[GFX_PAL_FRAME_SIZE];
#endif
/******************************************************************************
Global variables
******************************************************************************/
static ADI_DCB_HANDLE DCBManagerHandle=NULL; // handle to Callback service
static ADI_DEV_BUFFER *InputBuffer=NULL;
volatile u32 InputFrame=0;
static ADI_DEV_BUFFER *OutputBuffer=NULL;
volatile u32 OutputFrame=0;
#if !defined(VIDEO_MODE_NTSC) & !defined(VIDEO_MODE_PAL) & defined(VIDEO_MODE_VGA)
GFX_MODE ModeDefault=GFX_MODE_VGA;
DEVICE_TYPE TypeDefault=DEVICE_NL6448BC33;
#elif !defined(VIDEO_MODE_NTSC) & defined(VIDEO_MODE_PAL) & !defined(VIDEO_MODE_VGA)
GFX_MODE ModeDefault=GFX_MODE_PALI;
DEVICE_TYPE TypeDefault=DEVICE_ADV7179;
#elif defined(VIDEO_MODE_NTSC) & !defined(VIDEO_MODE_PAL) & !defined(VIDEO_MODE_VGA)
GFX_MODE ModeDefault=GFX_MODE_NTSCI;
DEVICE_TYPE TypeDefault=DEVICE_ADV7179;
#elif defined(VIDEO_MODE_NTSC) | defined(VIDEO_MODE_PAL) | defined(VIDEO_MODE_VGA)
#error Error: One or more default video modes is selected, please define either VIDEO_MODE_NTSC, VIDEO_MODE_PAL or VIDEO_MODE_VGA
#else
#error Error: No default video mode is selected, please define either VIDEO_MODE_NTSC, VIDEO_MODE_PAL or VIDEO_MODE_VGA
#endif
/******************************************************************************
Function definitions
******************************************************************************/
// exception handlers
static ADI_INT_HANDLER(ExceptionHandler);
static ADI_INT_HANDLER(HWErrorHandler);
// callback functions
static void CallbackOutput(void *,u32,void *);
static void CallbackInput(void *,u32,void *);
/******************************************************************************
Function: main
******************************************************************************/
int main(void)
{
u32 i,Code,Count,Flag,Update,Transparent,FrameCount,Frame,Mask;
bool Blank;
short Retry;
ADI_DEV_DEVICE_HANDLE Input,Output;
GFX_CANVAS Overlay,Header,Info;
DEVICE_TYPE Type,TypeOld,InputType;
GFX_MODE Mode,ModeOld;
enum
{
STATE_INPUT,
STATE_INPUT_OPEN,
STATE_INPUT_FRAME,
STATE_INPUT_CLOSE,
STATE_OUTPUT,
STATE_OUTPUT_OPEN,
STATE_OUTPUT_FRAME,
STATE_OUTPUT_CLOSE,
} State=STATE_OUTPUT;
/* Initialize blackfin device ************************************************/
// Initialise processor
ezInit(1);
adi_ssl_Init();
ezErrorCheck(adi_int_CECHook(3,ExceptionHandler,NULL,FALSE));
ezErrorCheck(adi_int_CECHook(5,HWErrorHandler,NULL,FALSE));
/* speed up clock frequency */
#if defined(__ADSP_EDINBURGH__)
/* only configure 533 as 561 cannot operate a max speed */
adi_pwr_SetFreq( 0, 0, ADI_PWR_DF_NONE );
#endif
/* Initialize ez-kit *********************************************************/
for (i=EZ_FIRST_LED;i<EZ_NUM_LEDS;i++) ezInitLED(i);
ezTurnOffAllLEDs();
ezDisableVideoEncoder();
ezDisableVideoDecoder();
#if defined(__ADSP_TETON__)
// setup the DMA channel priorities so that the output PPI has higher
// priority than the input PPI
ezErrorCheck(adi_dma_SetMapping(ADI_DMA_PMAP_PPI1,ADI_DMA_DMA1_1));
ezErrorCheck(adi_dma_SetMapping(ADI_DMA_PMAP_PPI2,ADI_DMA_DMA1_0));
#else
#error This application is only tested to work on Blackfin Teton
#endif
/* Initialize application variables ******************************************/
Code=ADI_DEV_RESULT_SUCCESS;
Transparent=0xFFFFFFFF;
ModeOld=GFX_MODE_UNKNOWN;
Mode=ModeDefault;
TypeOld=DEVICE_UNKNOWN;
Type=TypeDefault;
InputType=DEVICE_UNKNOWN;
Flag=1;
Update=0;
Blank=true;
Input=Output=NULL;
Frame=0;
device_init(adi_dev_ManagerHandle,adi_dma_ManagerHandle,DCBManagerHandle);
/* Main application loop *****************************************************/
while (Code==ADI_DEV_RESULT_SUCCESS)
{
switch (State)
{
case STATE_INPUT:
Retry=0;
State=STATE_INPUT_OPEN;
case STATE_INPUT_OPEN:
{
ADI_DEV_CMD_VALUE_PAIR Micron[]={
{MICRON_CMD_SET_MODE,(void *)Mode},
{ADI_DEV_CMD_END,NULL}
}, Omnivision[]={
{OMNIVISION_CMD_SET_MODE,(void *)Mode},
{ADI_DEV_CMD_END,NULL}
};
FrameCount=InputFrame+1;
if (Input==NULL)
{
if ((Input=device_open(DEVICE_OV7648,INPUT_PPI,(u16 *)InputData,sizeof(InputData[0]),CallbackInput,Omnivision))) InputType=DEVICE_OV7648;
else if ((Input=device_open(DEVICE_MT9V022M,INPUT_PPI,(u16 *)InputData,sizeof(InputData[0]),CallbackInput,Micron))) InputType=DEVICE_MT9V022M;
}
if (Input) State=STATE_INPUT_FRAME;
else if (Retry--<=0) State=STATE_OUTPUT;
break;
}
case STATE_INPUT_FRAME:
if ((InputFrame-FrameCount)&0x80000000) break;
State=STATE_OUTPUT;
break;
case STATE_INPUT_CLOSE:
State=STATE_INPUT;
device_close(Input);
Input=NULL;
break;
case STATE_OUTPUT:
{
if (Type!=TypeOld||Mode!=ModeOld)
{
GFX_CANVAS Canvas;
u32 OverlayColour;
device_close(Input);
Input=NULL;
InputType==DEVICE_UNKNOWN;
gfx_init(&Canvas,Mode,(u16 *)OutputData,0,0,0,0);
gfx_frame(&Canvas,gfx_getcolour(&Canvas,128,128,255));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -