![](/media/cache/group/renesas_logomark_l.jpg.50x50_q85.jpg)
Camera in sample for GR-PEACH. This sample works on GR-LYCHEE besides GR-PEACH.
Video Links on how to setup and run Camera_in Application:
Your video will be live at: https://youtu.be/XNH8jLhjeS4 Part1 of 1
Camera in sample for GR-PEACH or GR-LYCHEE. While USER_BUTTON0 is pressed, it will save the camera image(default is jpeg fotmat) to USB memory or SD card.
If both USB and SD are inserted, GR-PEACH or GR-LYCHEE connect to the previously detected device.
The default setting of serial communication (baud rate etc.) in mbed is shown the following link.
Please refer to the link and change the settings of your PC terminal software.
The default value of baud rate in mbed is 9600, and this application uses baud rate 9600.
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication
Please refer to following link about Audio/Camera Shield.
https://developer.mbed.org/teams/Renesas/wiki/Audio_Camera-shield
You can configure this sample application via the following definitions. If you set to 1, it will save the video file as a AVI format:
main.cpp
/**** User Selection *********/ #define SAVE_FILE_TYPE (0) /* Select 0(Image(.jpg)) or 1(Movie(.avi)) */ /*****************************/
- USB channel available in this sample program
By default, the GR-PEACH's USB connector (USB0) is configured to be used. When using USB0, please close GR-PEACH's JP3.
Or, you can use the Audio/Camera Shield's USB connector (USB1). When using USB1, you need to close JP1 of Audio/Camera Shield.
- Specify each configuration
To specify camera and LCD, add camera-type and lcd-type to mbed_app.json.
For details, please refer to mbed-gr-libs / README.md.
mbed_app.json
{ "config": { "camera":{ "help": "0:disable 1:enable", "value": "1" }, "camera-type":{ "help": "Please see mbed-gr-libs/README.md", "value": "CAMERA_CVBS" }, "lcd":{ "help": "0:disable 1:enable", "value": "0" }, "lcd-type":{ "help": "Please see mbed-gr-libs/README.md", "value": "GR_PEACH_4_3INCH_SHIELD" }, "usb-host-ch":{ "help": "(for GR-PEACH) 0:ch0 1:ch1", "value": "1" }, "audio-camera-shield":{ "help": "(for GR-PEACH) 0:not use 1:use", "value": "1" } } }
main.cpp
- Committer:
- dkato
- Date:
- 2016-04-18
- Revision:
- 1:aaa4b3e0f03c
- Parent:
- 0:2f1caf4ce924
- Child:
- 2:9d98159fa9c9
File content as of revision 1:aaa4b3e0f03c:
#include "mbed.h" #include "DisplayBace.h" #include "USBHostMSD.h" #include "bitmap.h" #if defined(TARGET_RZ_A1H) #include "usb_host_setting.h" #else #define USB_HOST_CH 0 #endif #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_RGB888) /* 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 (0) /* 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 (240u) /* QVGA */ #define VIDEO_BUFFER_STRIDE (((PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u) #define VIDEO_BUFFER_HEIGHT (PIXEL_VW) #if (USB_HOST_CH == 1) //Audio Camera Shield USB1 DigitalOut usb1en(P3_8); #endif DigitalOut led1(LED1); DigitalIn button(USER_BUTTON0); #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 */ } } /**************************************************************************//** * @brief * @param[in] void * @retval None ******************************************************************************/ int main(void) { DisplayBase::graphics_error_t error; uint8_t * write_buff_addr = FrameBuffer_Video_A; uint8_t * save_buff_addr = FrameBuffer_Video_B; #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 */ DisplayBase Display; /* 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 ) { 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 ) { 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 ) { 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); #if (USB_HOST_CH == 1) //Audio Shield USB1 //Audio Shield USB1 enable usb1en = 1; //Outputs high level Thread::wait(5); usb1en = 0; //Outputs low level #endif USBHostMSD msd("usb"); char file_name[32]; int file_name_index = 0; int save_file_size; while (1) { /* button check */ if (button == 0) { led1 = 1; if (write_buff_addr == FrameBuffer_Video_A) { write_buff_addr = FrameBuffer_Video_B; save_buff_addr = FrameBuffer_Video_A; } else { write_buff_addr = FrameBuffer_Video_A; save_buff_addr = FrameBuffer_Video_B; } /* Change write buffer */ error = Display.Video_Write_Change( VIDEO_INPUT_CH, write_buff_addr, VIDEO_BUFFER_STRIDE); if (error != DisplayBase::GRAPHICS_OK) { printf("Line %d, error %d\n", __LINE__, error); while (1); } /* Wait 2 Vfield(Top or bottom field) */ WaitVfield(2); /* FrameBuffer_Video_AorB capture completed */ /* USB connect check */ while (!msd.connected()) { if (!msd.connect()) { Thread::wait(500); } else { break; } } /* Data save */ #if ( VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 || VIDEO_INPUT_FORMAT == VIDEO_RGB565 ) /* Save ".bin" file */ sprintf(file_name, "/usb/video_%d.bin", file_name_index++); FILE * fp = fopen(file_name, "w"); save_file_size = fwrite(save_buff_addr, sizeof(char), (VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT), fp); fclose(fp); #else /* Save ".bmp" file */ sprintf(file_name, "/usb/video_%d.bmp", file_name_index++); bitmap bitmapfile; save_file_size = bitmapfile.Rgb888ToBmp(file_name, save_buff_addr, PIXEL_HW, PIXEL_VW); #endif printf("file name %s, file size %d\n", file_name, save_file_size); led1 = 0; } } }