This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest
Dependencies: GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem
Fork of mbed-os-example-mbed5-blinky by
Diff: camera.h
- Revision:
- 12:9a20164dcc47
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camera.h Wed Jan 11 11:41:30 2017 +0000 @@ -0,0 +1,245 @@ + + +#define VIDEO_CVBS (0) /* Analog Video Signal */ +#define VIDEO_CMOS_CAMERA (1) /* Digital Video Signal */ +#define VIDEO_YCBCR422 (0) +#define VIDEO_RGB888 (1) +#define VIDEO_RGB565 (2) + +/**** User Selection *********/ +#define VIDEO_INPUT_METHOD (VIDEO_CVBS) /* Select VIDEO_CVBS or VIDEO_CMOS_CAMERA */ +#define VIDEO_INPUT_FORMAT (VIDEO_YCBCR422) /* Select VIDEO_YCBCR422 or VIDEO_RGB888 or VIDEO_RGB565 */ +#define USE_VIDEO_CH (0) /* Select 0 or 1 If selecting VIDEO_CMOS_CAMERA, should be 0.) */ +#define VIDEO_PAL (1) /* Select 0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */ +/*****************************/ + +#if USE_VIDEO_CH == (0) +#define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0) +#define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD) +#else +#define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_1) +#define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S1_VFIELD) +#endif + +#if ( VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 || VIDEO_INPUT_FORMAT == VIDEO_RGB565 ) +#define DATA_SIZE_PER_PIC (2u) +#else +#define DATA_SIZE_PER_PIC (4u) +#endif + +/*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128 + in accordance with the frame buffer burst transfer mode. */ +#define PIXEL_HW (320u) /* QVGA */ +#define PIXEL_VW (480u) /* QVGA */ +#define VIDEO_BUFFER_STRIDE (((PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u) +#define VIDEO_BUFFER_HEIGHT (PIXEL_VW) + + +DigitalOut led1(LED1); +DigitalOut led2(LED2); + + +#if defined(__ICCARM__) +#pragma data_alignment=16 +static uint8_t FrameBuffer_Video_A[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]@ ".mirrorram"; //16 bytes aligned!; +static uint8_t FrameBuffer_Video_B[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]@ ".mirrorram"; //16 bytes aligned!; +#pragma data_alignment=4 +#else +static uint8_t FrameBuffer_Video_A[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!; +static uint8_t FrameBuffer_Video_B[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!; +#endif +static volatile int32_t vsync_count; +static volatile int32_t vfield_count; + +/**************************************************************************//** + * @brief Interrupt callback function + * @param[in] int_type : VDC5 interrupt type + * @retval None +******************************************************************************/ +static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) +{ + if (vfield_count > 0) { + vfield_count--; + } +} + +/**************************************************************************//** + * @brief Wait for the specified number of times Vsync occurs + * @param[in] wait_count : Wait count + * @retval None +******************************************************************************/ +static void WaitVfield(const int32_t wait_count) +{ + vfield_count = wait_count; + while (vfield_count > 0) { + /* Do nothing */ + } +} + +/**************************************************************************//** + * @brief Interrupt callback function for Vsync interruption + * @param[in] int_type : VDC5 interrupt type + * @retval None +******************************************************************************/ +static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) +{ + if (vsync_count > 0) { + vsync_count--; + } +} + +/**************************************************************************//** + * @brief Wait for the specified number of times Vsync occurs + * @param[in] wait_count : Wait count + * @retval None +******************************************************************************/ +static void WaitVsync(const int32_t wait_count) +{ + vsync_count = wait_count; + while (vsync_count > 0) { + /* Do nothing */ + } +} + +uint8_t * write_buff_addr = FrameBuffer_Video_A; +uint8_t * save_buff_addr = FrameBuffer_Video_B; + +DisplayBase Display; + +void init_camera() +{ + //Camera-in Code + + + DisplayBase::graphics_error_t error; + +#if VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA + DisplayBase::video_ext_in_config_t ext_in_config; + PinName cmos_camera_pin[11] = { + /* data pin */ + P2_7, P2_6, P2_5, P2_4, P2_3, P2_2, P2_1, P2_0, + /* control pin */ + P10_0, /* DV0_CLK */ + P1_0, /* DV0_Vsync */ + P1_1 /* DV0_Hsync */ + }; +#endif + + /* Create DisplayBase object */ + + /* Graphics initialization process */ + error = Display.Graphics_init(NULL); + if (error != DisplayBase::GRAPHICS_OK) { + printf("Line %d, error %d\n", __LINE__, error); + while (1); + } + +#if VIDEO_INPUT_METHOD == VIDEO_CVBS + error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL); + if( error != DisplayBase::GRAPHICS_OK ) { + printf("Line %d, error %d\n", __LINE__, error); + while(1); + } + +#elif VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA + /* MT9V111 camera input config */ + ext_in_config.inp_format = DisplayBase::VIDEO_EXTIN_FORMAT_BT601; /* BT601 8bit YCbCr format */ + ext_in_config.inp_pxd_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing data */ + ext_in_config.inp_vs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Vsync signals */ + ext_in_config.inp_hs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Hsync signals */ + ext_in_config.inp_endian_on = DisplayBase::OFF; /* External input bit endian change on/off */ + ext_in_config.inp_swap_on = DisplayBase::OFF; /* External input B/R signal swap on/off */ + ext_in_config.inp_vs_inv = DisplayBase::SIG_POL_NOT_INVERTED; /* External input DV_VSYNC inversion control */ + ext_in_config.inp_hs_inv = DisplayBase::SIG_POL_INVERTED; /* External input DV_HSYNC inversion control */ + ext_in_config.inp_f525_625 = DisplayBase::EXTIN_LINE_525; /* Number of lines for BT.656 external input */ + ext_in_config.inp_h_pos = DisplayBase::EXTIN_H_POS_CRYCBY; /* Y/Cb/Y/Cr data string start timing to Hsync reference */ + ext_in_config.cap_vs_pos = 6; /* Capture start position from Vsync */ + ext_in_config.cap_hs_pos = 150; /* Capture start position form Hsync */ + ext_in_config.cap_width = 640; /* Capture width */ + ext_in_config.cap_height = 468u; /* Capture height Max 468[line] + Due to CMOS(MT9V111) output signal timing and VDC5 specification */ + error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_EXT, &ext_in_config); + if( error != DisplayBase::GRAPHICS_OK ) { + uart.printf("Line %d, error %d\n", __LINE__, error); + while(1); + } + + /* MT9V111 camera input port setting */ + error = Display.Graphics_Dvinput_Port_Init(cmos_camera_pin, 11); + if( error != DisplayBase::GRAPHICS_OK ) { + uart.printf("Line %d, error %d\n", __LINE__, error); + while (1); + } +#endif + + /* Interrupt callback function setting (Vsync signal input to scaler 0) */ + error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VI_VSYNC, 0, IntCallbackFunc_Vsync); + if (error != DisplayBase::GRAPHICS_OK) { + printf("Line %d, error %d\n", __LINE__, error); + while (1); + } + /* Video capture setting (progressive form fixed) */ + error = Display.Video_Write_Setting( + VIDEO_INPUT_CH, +#if VIDEO_PAL == 0 + DisplayBase::COL_SYS_NTSC_358, +#else + DisplayBase::COL_SYS_PAL_443, +#endif + write_buff_addr, + VIDEO_BUFFER_STRIDE, +#if VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 + DisplayBase::VIDEO_FORMAT_YCBCR422, + DisplayBase::WR_RD_WRSWA_NON, +#elif VIDEO_INPUT_FORMAT == VIDEO_RGB565 + DisplayBase::VIDEO_FORMAT_RGB565, + DisplayBase::WR_RD_WRSWA_32_16BIT, +#else + DisplayBase::VIDEO_FORMAT_RGB888, + DisplayBase::WR_RD_WRSWA_32BIT, +#endif + PIXEL_VW, + PIXEL_HW + ); + if (error != DisplayBase::GRAPHICS_OK) { + printf("Line %d, error %d\n", __LINE__, error); + while (1); + } + + /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */ + error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield); + if (error != DisplayBase::GRAPHICS_OK) { + printf("Line %d, error %d\n", __LINE__, error); + while (1); + } + + /* Video write process start */ + error = Display.Video_Start (VIDEO_INPUT_CH); + if (error != DisplayBase::GRAPHICS_OK) { + printf("Line %d, error %d\n", __LINE__, error); + while (1); + } + + /* Video write process stop */ + error = Display.Video_Stop (VIDEO_INPUT_CH); + if (error != DisplayBase::GRAPHICS_OK) { + printf("Line %d, error %d\n", __LINE__, error); + while (1); + } + + /* Video write process start */ + error = Display.Video_Start (VIDEO_INPUT_CH); + if (error != DisplayBase::GRAPHICS_OK) { + printf("Line %d, error %d\n", __LINE__, error); + while (1); + } + + /* Wait vsync to update resister */ + WaitVsync(1); + + /* Wait 2 Vfield(Top or bottom field) */ + WaitVfield(2); + + +} +