LCD (4.3inch) Shield sample. While USER_BUTTON0 is pressed, it will save the image to the USB memory.When you use this program, we judge you have agreed to the following contents. https://developer.mbed.org/teams/Renesas/wiki/About-LICENSE

Dependencies:   GR-PEACH_video GraphicsFramework R_BSP USBHost mbed

License

When you use this program, we judge you have agreed to the following contents.

本プログラムを使用する際は、以下の内容に合意した事になります。

https://developer.mbed.org/teams/Renesas/wiki/About-LICENSE

Information

Japanese version is available in lower part of this page.

このページの後半に日本語版が用意されています.

What is this ?

This is a sample program that displays the image captured by the camera to the LCD by using the GR-PEACH AUDIO CAMERA Shield and GR-PEACH LCD Shield.
This program displays the NTSC input from NTSC1A on the screen of LCD shield.
When you touch on the screen of LCD Shield, the touch coordinates are displayed on the PC terminal software. You can touch the two points at the same time.
Inaddition, while you press USER_BUTTON0, th image is saved to the USB memory.

Composition

GR-PEACH, AUDIO CAMERA Shield, LCD Shield, Camera and USB memory.

Please refer to following link about Audio/Camera Shield.
https://developer.mbed.org/teams/Renesas/wiki/Audio_Camera-shield

MT9V111 is being used for a camera by this sample program. When using a camera besides MT9V111, please change the setting according to the used camera.

main.cpp (camera input config 1)

/**** User Selection *********/
#define VIDEO_INPUT_METHOD     (VIDEO_CMOS_CAMERA) /* 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              (0)                 /* Select  0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */

main.cpp (camera input config 2)

    /* 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 */


When you save a camera image to a USB memory, the image is converted along the following conversion method.

Value of "VIDEO_INPUT_FORMAT" in main.cppConversion method
VIDEO_YCBCR422JPEG
VIDEO_RGB888bitmap
VIDEO_RGB565binary (RAW data)


If you use a USB, according to the USB port to use, make the following changes and the jumper short. (define 0:USB0、define 1:USB1)

USBHost\USBHost\TARGET_RENESAS\TARGET_RZ_A1H\usb_host_setting.h

#define USB_HOST_CH                           0
↓
#define USB_HOST_CH                           1


If you use the GR-PEACH's USB connector (USB0), please close GR-PEACH's JP3.
/media/uploads/RyoheiHagimoto/usb.jpg

If you use the GR-PEACH AUDIO CAMERA Shield's USB connector (USB1), please close Audio/Camera Shield's JP1.
/media/uploads/dkato/audiocamerashield_jp1.jpg


概要

GR-PEACH AUDIO CAMERA ShieldとGR-PEACH LCD Shieldを使って、カメラで取り込んだ画像をLCDへ表示するサンプルプログラムです。
このプログラムは、NTSC1AからのNTSC入力をLCDシールドの画面上に表示します。
画面をタッチすると、タッチ座標がPCターミナルソフト上に表示されます。2点まで同時にタッチできます。
また、GR-PEACHのUSER_BOTTON0を押している間、カメラで取り込んだ画像をUSBメモリへ保存することができます。

構成

GR-PEACH、AUDIO CAMERA Shield、LCD Shield、 カメラ、USBメモリ

GR-PEACH AUDIO CAMERA Shieldについては下記を参照ください。
https://developer.mbed.org/teams/Renesas/wiki/Audio_Camera-shield

サンプルプログラムではCameraにMT9V111を使用しています。MT9V111以外のCameraを使用する際は使用するCameraにあわせて設定を変更して下さい。

main.cpp (camera input config 1)

/**** User Selection *********/
#define VIDEO_INPUT_METHOD     (VIDEO_CMOS_CAMERA) /* 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              (0)                 /* Select  0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */

main.cpp (camera input config 2)

    /* 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 */


カメラ画像をUSBメモリへ保存する際、以下の変換方法に沿って変換を行なって保存します。

main.cpp内の"VIDEO_INPUT_FORMAT"の値変換方法
VIDEO_YCBCR422JPEG
VIDEO_RGB888bitmap
VIDEO_RGB565binary (RAW data)


USBを使用する場合、使用するUSB口に合わせて、以下の変更とジャンパーショートを行なって下さい。
(define 0:USB0、define 1:USB1)

USBHost\USBHost\TARGET_RENESAS\TARGET_RZ_A1H\usb_host_setting.h

#define USB_HOST_CH                           0
↓
#define USB_HOST_CH                           1


GR-PEACH側のUSB0を使用する場合は、JP3をショートして下さい。
/media/uploads/RyoheiHagimoto/usb.jpg

GR-PEACH AUDIO CAMERA Shield側のUSB1を使用する場合は、JP1をショートして以下の変更を行なって下さい。
/media/uploads/dkato/audiocamerashield_jp1.jpg

Committer:
1050186
Date:
Mon Apr 18 06:52:31 2016 +0000
Revision:
0:a8ad8fee330b
Child:
1:edcd6dd3a6f5
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
1050186 0:a8ad8fee330b 1 #include "mbed.h"
1050186 0:a8ad8fee330b 2 #include "DisplayBace.h"
1050186 0:a8ad8fee330b 3 #include "rtos.h"
1050186 0:a8ad8fee330b 4 #include "JPEG_Converter.h"
1050186 0:a8ad8fee330b 5 #include "USBHostMSD.h"
1050186 0:a8ad8fee330b 6 #include "bitmap.h"
1050186 0:a8ad8fee330b 7 #if defined(TARGET_RZ_A1H)
1050186 0:a8ad8fee330b 8 #include "usb_host_setting.h"
1050186 0:a8ad8fee330b 9 #else
1050186 0:a8ad8fee330b 10 #define USB_HOST_CH (0)
1050186 0:a8ad8fee330b 11 #endif
1050186 0:a8ad8fee330b 12
1050186 0:a8ad8fee330b 13 #define VIDEO_CVBS (0) /* Analog Video Signal */
1050186 0:a8ad8fee330b 14 #define VIDEO_CMOS_CAMERA (1) /* Digital Video Signal */
1050186 0:a8ad8fee330b 15 #define VIDEO_YCBCR422 (0)
1050186 0:a8ad8fee330b 16 #define VIDEO_RGB888 (1)
1050186 0:a8ad8fee330b 17 #define VIDEO_RGB565 (2)
1050186 0:a8ad8fee330b 18
1050186 0:a8ad8fee330b 19 /**** User Selection *********/
1050186 0:a8ad8fee330b 20 #define VIDEO_INPUT_METHOD (VIDEO_CMOS_CAMERA) /* Select VIDEO_CVBS or VIDEO_CMOS_CAMERA */
1050186 0:a8ad8fee330b 21 #define VIDEO_INPUT_FORMAT (VIDEO_YCBCR422) /* Select VIDEO_YCBCR422 or VIDEO_RGB888 or VIDEO_RGB565 */
1050186 0:a8ad8fee330b 22 #define USE_VIDEO_CH (0) /* Select 0 or 1 If selecting VIDEO_CMOS_CAMERA, should be 0.) */
1050186 0:a8ad8fee330b 23 #define VIDEO_PAL (0) /* Select 0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */
1050186 0:a8ad8fee330b 24 /*****************************/
1050186 0:a8ad8fee330b 25
1050186 0:a8ad8fee330b 26 /**** LCD Parameter **********/
1050186 0:a8ad8fee330b 27 #define LCD_DE_MODE (0)
1050186 0:a8ad8fee330b 28 #define LCD_SYNC_MODE (1)
1050186 0:a8ad8fee330b 29
1050186 0:a8ad8fee330b 30 #define LCD_DOT_CLOCK (13.40f) // 13.4MHz
1050186 0:a8ad8fee330b 31
1050186 0:a8ad8fee330b 32 #define LCD_H_WIDTH (480u)
1050186 0:a8ad8fee330b 33 #define LCD_H_BACK_PORCH (43u)
1050186 0:a8ad8fee330b 34 #define LCD_H_FRONT_PORCH (52u)
1050186 0:a8ad8fee330b 35 #define LCD_H_SYNC_WIDTH (41u)
1050186 0:a8ad8fee330b 36
1050186 0:a8ad8fee330b 37 #define LCD_V_WIDTH (272u)
1050186 0:a8ad8fee330b 38 #define LCD_V_BACK_PORCH (12u)
1050186 0:a8ad8fee330b 39 #define LCD_V_FRONT_PORCH (2u)
1050186 0:a8ad8fee330b 40 #define LCD_V_SYNC_WIDTH (10u)
1050186 0:a8ad8fee330b 41
1050186 0:a8ad8fee330b 42 #define LCD_MODE (LCD_SYNC_MODE)
1050186 0:a8ad8fee330b 43
1050186 0:a8ad8fee330b 44 /*****************************/
1050186 0:a8ad8fee330b 45
1050186 0:a8ad8fee330b 46
1050186 0:a8ad8fee330b 47 #if USE_VIDEO_CH == (0)
1050186 0:a8ad8fee330b 48 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0)
1050186 0:a8ad8fee330b 49 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD)
1050186 0:a8ad8fee330b 50 #else
1050186 0:a8ad8fee330b 51 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_1)
1050186 0:a8ad8fee330b 52 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S1_VFIELD)
1050186 0:a8ad8fee330b 53 #endif
1050186 0:a8ad8fee330b 54
1050186 0:a8ad8fee330b 55 #if ( VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 || VIDEO_INPUT_FORMAT == VIDEO_RGB565 )
1050186 0:a8ad8fee330b 56 #define DATA_SIZE_PER_PIC (2u)
1050186 0:a8ad8fee330b 57 #else
1050186 0:a8ad8fee330b 58 #define DATA_SIZE_PER_PIC (4u)
1050186 0:a8ad8fee330b 59 #endif
1050186 0:a8ad8fee330b 60
1050186 0:a8ad8fee330b 61 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
1050186 0:a8ad8fee330b 62 in accordance with the frame buffer burst transfer mode. */
1050186 0:a8ad8fee330b 63 #define PIXEL_HW (480u) /* WQVGA */
1050186 0:a8ad8fee330b 64 #define PIXEL_VW (272u) /* WQVGA */
1050186 0:a8ad8fee330b 65
1050186 0:a8ad8fee330b 66 #define VIDEO_BUFFER_STRIDE (((PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u)
1050186 0:a8ad8fee330b 67 #define VIDEO_BUFFER_HEIGHT (PIXEL_VW)
1050186 0:a8ad8fee330b 68
1050186 0:a8ad8fee330b 69 #if (USB_HOST_CH == 1) //Audio Camera Shield USB1
1050186 0:a8ad8fee330b 70 DigitalOut usb1en(P3_8);
1050186 0:a8ad8fee330b 71 #endif
1050186 0:a8ad8fee330b 72 DigitalOut led1(LED1);
1050186 0:a8ad8fee330b 73 DigitalIn button(USER_BUTTON0);
1050186 0:a8ad8fee330b 74 #if(1) //lcd
1050186 0:a8ad8fee330b 75 DigitalOut lcd_pwon(P7_15);
1050186 0:a8ad8fee330b 76 DigitalOut lcd_blon(P8_1);
1050186 0:a8ad8fee330b 77 DigitalOut touch_reset(P4_0);
1050186 0:a8ad8fee330b 78 PwmOut lcd_cntrst(P8_15);
1050186 0:a8ad8fee330b 79 I2C mI2c(I2C_SDA, I2C_SCL);
1050186 0:a8ad8fee330b 80
1050186 0:a8ad8fee330b 81 typedef struct {
1050186 0:a8ad8fee330b 82 uint8_t y_h: 3,
1050186 0:a8ad8fee330b 83 reserved: 1,
1050186 0:a8ad8fee330b 84 x_h: 3,
1050186 0:a8ad8fee330b 85 valid: 1;
1050186 0:a8ad8fee330b 86 uint8_t x_l;
1050186 0:a8ad8fee330b 87 uint8_t y_l;
1050186 0:a8ad8fee330b 88 } xyz_data_t;
1050186 0:a8ad8fee330b 89
1050186 0:a8ad8fee330b 90 typedef struct {
1050186 0:a8ad8fee330b 91 uint8_t fingers: 3,
1050186 0:a8ad8fee330b 92 reserved: 5;
1050186 0:a8ad8fee330b 93 uint8_t keys;
1050186 0:a8ad8fee330b 94 xyz_data_t xyz_data[2];
1050186 0:a8ad8fee330b 95 } stx_report_data_t;
1050186 0:a8ad8fee330b 96
1050186 0:a8ad8fee330b 97 static int get_coordinates(uint8_t *count, uint32_t *x0, uint32_t *y0, uint32_t *x1, uint32_t *y1) {
1050186 0:a8ad8fee330b 98 char buf[8];
1050186 0:a8ad8fee330b 99 stx_report_data_t *pdata;
1050186 0:a8ad8fee330b 100 int ret = -1;
1050186 0:a8ad8fee330b 101 *count = 0; // Set point detected count to 0.
1050186 0:a8ad8fee330b 102
1050186 0:a8ad8fee330b 103 if (mI2c.read((0x55 << 1), buf, sizeof(buf)) == 0) {
1050186 0:a8ad8fee330b 104 pdata = (stx_report_data_t *)buf;
1050186 0:a8ad8fee330b 105 if (pdata->fingers) {
1050186 0:a8ad8fee330b 106 if (pdata->xyz_data[0].valid) {
1050186 0:a8ad8fee330b 107 *x0 = (pdata->xyz_data[0].x_h << 8) | pdata->xyz_data[0].x_l;
1050186 0:a8ad8fee330b 108 *y0 = (pdata->xyz_data[0].y_h << 8) | pdata->xyz_data[0].y_l;
1050186 0:a8ad8fee330b 109 (*count)++;
1050186 0:a8ad8fee330b 110 }
1050186 0:a8ad8fee330b 111 }
1050186 0:a8ad8fee330b 112 if (pdata->xyz_data[1].valid) {
1050186 0:a8ad8fee330b 113 *x1 = (pdata->xyz_data[1].x_h << 8) | pdata->xyz_data[1].x_l;
1050186 0:a8ad8fee330b 114 *y1 = (pdata->xyz_data[1].y_h << 8) | pdata->xyz_data[1].y_l;
1050186 0:a8ad8fee330b 115 (*count)++;
1050186 0:a8ad8fee330b 116 }
1050186 0:a8ad8fee330b 117 ret = 0;
1050186 0:a8ad8fee330b 118 }
1050186 0:a8ad8fee330b 119
1050186 0:a8ad8fee330b 120 return ret;
1050186 0:a8ad8fee330b 121 }
1050186 0:a8ad8fee330b 122 #endif
1050186 0:a8ad8fee330b 123
1050186 0:a8ad8fee330b 124 static uint8_t FrameBuffer_Video_A[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!;
1050186 0:a8ad8fee330b 125 static uint8_t FrameBuffer_Video_B[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!;
1050186 0:a8ad8fee330b 126 static uint8_t JCUBuffer_OUTPUT[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(8))); //8 bytes aligned!;
1050186 0:a8ad8fee330b 127 static volatile int32_t vfield_count;
1050186 0:a8ad8fee330b 128 static volatile int32_t vsync_count;
1050186 0:a8ad8fee330b 129
1050186 0:a8ad8fee330b 130 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type)
1050186 0:a8ad8fee330b 131 {
1050186 0:a8ad8fee330b 132 //Interrupt callback function
1050186 0:a8ad8fee330b 133 if (vfield_count != 0) {
1050186 0:a8ad8fee330b 134 vfield_count = 0;
1050186 0:a8ad8fee330b 135 }
1050186 0:a8ad8fee330b 136 }
1050186 0:a8ad8fee330b 137
1050186 0:a8ad8fee330b 138 static void WaitVfield(const int32_t wait_count)
1050186 0:a8ad8fee330b 139 {
1050186 0:a8ad8fee330b 140 vfield_count = wait_count;
1050186 0:a8ad8fee330b 141 while (vfield_count > 0) {
1050186 0:a8ad8fee330b 142 /* Do nothing */
1050186 0:a8ad8fee330b 143 }
1050186 0:a8ad8fee330b 144 }
1050186 0:a8ad8fee330b 145
1050186 0:a8ad8fee330b 146 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type)
1050186 0:a8ad8fee330b 147 {
1050186 0:a8ad8fee330b 148 //Interrupt callback function for Vsync interruption
1050186 0:a8ad8fee330b 149 if (vsync_count > 0) {
1050186 0:a8ad8fee330b 150 vsync_count--;
1050186 0:a8ad8fee330b 151 }
1050186 0:a8ad8fee330b 152 }
1050186 0:a8ad8fee330b 153
1050186 0:a8ad8fee330b 154 static void WaitVsync(const int32_t wait_count)
1050186 0:a8ad8fee330b 155 {
1050186 0:a8ad8fee330b 156 //Wait for the specified number of times Vsync occurs
1050186 0:a8ad8fee330b 157 vsync_count = wait_count;
1050186 0:a8ad8fee330b 158 while (vsync_count > 0) {
1050186 0:a8ad8fee330b 159 /* Do nothing */
1050186 0:a8ad8fee330b 160 }
1050186 0:a8ad8fee330b 161 }
1050186 0:a8ad8fee330b 162
1050186 0:a8ad8fee330b 163 int main(void)
1050186 0:a8ad8fee330b 164 {
1050186 0:a8ad8fee330b 165 /* Create DisplayBase object */
1050186 0:a8ad8fee330b 166 DisplayBase Display;
1050186 0:a8ad8fee330b 167 DisplayBase::graphics_error_t error;
1050186 0:a8ad8fee330b 168 JPEG_Converter decoder;
1050186 0:a8ad8fee330b 169 JPEG_Converter::bitmap_buff_info_t aBitmapData;
1050186 0:a8ad8fee330b 170 FILE * wr_fp = NULL;
1050186 0:a8ad8fee330b 171 size_t EncodeSize;
1050186 0:a8ad8fee330b 172 uint8_t * write_buff_addr = FrameBuffer_Video_A;
1050186 0:a8ad8fee330b 173 uint8_t * save_buff_addr = FrameBuffer_Video_B;
1050186 0:a8ad8fee330b 174
1050186 0:a8ad8fee330b 175
1050186 0:a8ad8fee330b 176 #if VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA
1050186 0:a8ad8fee330b 177 DisplayBase::video_ext_in_config_t ext_in_config;
1050186 0:a8ad8fee330b 178 PinName cmos_camera_pin[11] = {
1050186 0:a8ad8fee330b 179 /* data pin */
1050186 0:a8ad8fee330b 180 P2_7, P2_6, P2_5, P2_4, P2_3, P2_2, P2_1, P2_0,
1050186 0:a8ad8fee330b 181 /* control pin */
1050186 0:a8ad8fee330b 182 P10_0, /* DV0_CLK */
1050186 0:a8ad8fee330b 183 P1_0, /* DV0_Vsync */
1050186 0:a8ad8fee330b 184 P1_1 /* DV0_Hsync */
1050186 0:a8ad8fee330b 185 };
1050186 0:a8ad8fee330b 186 #endif
1050186 0:a8ad8fee330b 187 #if(1) //lcd
1050186 0:a8ad8fee330b 188 lcd_pwon = 0;
1050186 0:a8ad8fee330b 189 lcd_blon = 0;
1050186 0:a8ad8fee330b 190 touch_reset = 0;
1050186 0:a8ad8fee330b 191 Thread::wait(100);
1050186 0:a8ad8fee330b 192
1050186 0:a8ad8fee330b 193 lcd_pwon = 1;
1050186 0:a8ad8fee330b 194 lcd_blon = 1;
1050186 0:a8ad8fee330b 195 touch_reset = 1;
1050186 0:a8ad8fee330b 196 Thread::wait(100);
1050186 0:a8ad8fee330b 197
1050186 0:a8ad8fee330b 198 DisplayBase::lcd_config_t lcd_config;
1050186 0:a8ad8fee330b 199 PinName lvds_pin[8] = {
1050186 0:a8ad8fee330b 200 /* data pin */
1050186 0:a8ad8fee330b 201 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
1050186 0:a8ad8fee330b 202 };
1050186 0:a8ad8fee330b 203 DisplayBase::rect_t rect;
1050186 0:a8ad8fee330b 204
1050186 0:a8ad8fee330b 205 lcd_config.lcd_type = DisplayBase::LCD_TYPE_LVDS;
1050186 0:a8ad8fee330b 206 lcd_config.intputClock = 66.67f;
1050186 0:a8ad8fee330b 207 lcd_config.outputClock = LCD_DOT_CLOCK;
1050186 0:a8ad8fee330b 208 lcd_config.lcd_outformat = DisplayBase::LCD_OUTFORMAT_RGB888;
1050186 0:a8ad8fee330b 209 lcd_config.lcd_edge = DisplayBase::EDGE_RISING;
1050186 0:a8ad8fee330b 210 #if(LCD_MODE) //SYNC Mode
1050186 0:a8ad8fee330b 211 lcd_config.h_toatal_period = (LCD_H_BACK_PORCH + LCD_H_WIDTH + LCD_H_FRONT_PORCH);
1050186 0:a8ad8fee330b 212 lcd_config.v_toatal_period = (LCD_V_BACK_PORCH + LCD_V_WIDTH + LCD_V_FRONT_PORCH);
1050186 0:a8ad8fee330b 213
1050186 0:a8ad8fee330b 214 lcd_config.h_disp_widht = (LCD_H_WIDTH);
1050186 0:a8ad8fee330b 215 lcd_config.v_disp_widht = (LCD_V_WIDTH);
1050186 0:a8ad8fee330b 216 lcd_config.h_back_porch = (LCD_H_BACK_PORCH);
1050186 0:a8ad8fee330b 217 lcd_config.v_back_porch = (LCD_V_BACK_PORCH);
1050186 0:a8ad8fee330b 218
1050186 0:a8ad8fee330b 219 lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_2;
1050186 0:a8ad8fee330b 220 lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_INVERTED;
1050186 0:a8ad8fee330b 221 lcd_config.h_sync_width = LCD_H_SYNC_WIDTH;
1050186 0:a8ad8fee330b 222
1050186 0:a8ad8fee330b 223 lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_0;
1050186 0:a8ad8fee330b 224 lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_INVERTED;
1050186 0:a8ad8fee330b 225 lcd_config.v_sync_width = LCD_V_SYNC_WIDTH;
1050186 0:a8ad8fee330b 226
1050186 0:a8ad8fee330b 227 lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3;
1050186 0:a8ad8fee330b 228 lcd_config.de_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
1050186 0:a8ad8fee330b 229 #else //DE Mode
1050186 0:a8ad8fee330b 230 lcd_config.h_toatal_period = (LCD_H_WIDTH + 80u);
1050186 0:a8ad8fee330b 231 lcd_config.v_toatal_period = (LCD_V_WIDTH);
1050186 0:a8ad8fee330b 232
1050186 0:a8ad8fee330b 233 lcd_config.h_disp_widht = (LCD_H_WIDTH);
1050186 0:a8ad8fee330b 234 lcd_config.v_disp_widht = (LCD_V_WIDTH);
1050186 0:a8ad8fee330b 235 lcd_config.h_back_porch = (68u);
1050186 0:a8ad8fee330b 236 lcd_config.v_back_porch = (18u);
1050186 0:a8ad8fee330b 237
1050186 0:a8ad8fee330b 238 lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_NON;
1050186 0:a8ad8fee330b 239 lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
1050186 0:a8ad8fee330b 240 lcd_config.h_sync_width = 0;
1050186 0:a8ad8fee330b 241
1050186 0:a8ad8fee330b 242 lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_NON;
1050186 0:a8ad8fee330b 243 lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
1050186 0:a8ad8fee330b 244 lcd_config.v_sync_width = 0;
1050186 0:a8ad8fee330b 245
1050186 0:a8ad8fee330b 246 lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3;
1050186 0:a8ad8fee330b 247 lcd_config.de_port_polarity = DisplayBase::SIG_POL_INVERTED;
1050186 0:a8ad8fee330b 248 #endif
1050186 0:a8ad8fee330b 249
1050186 0:a8ad8fee330b 250 /* Graphics initialization process */
1050186 0:a8ad8fee330b 251 error = Display.Graphics_init(&lcd_config);
1050186 0:a8ad8fee330b 252 #else
1050186 0:a8ad8fee330b 253 /* Graphics initialization process */
1050186 0:a8ad8fee330b 254 error = Display.Graphics_init(NULL);
1050186 0:a8ad8fee330b 255 #endif
1050186 0:a8ad8fee330b 256
1050186 0:a8ad8fee330b 257 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:a8ad8fee330b 258 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 259 while (1);
1050186 0:a8ad8fee330b 260 }
1050186 0:a8ad8fee330b 261
1050186 0:a8ad8fee330b 262 #if VIDEO_INPUT_METHOD == VIDEO_CVBS
1050186 0:a8ad8fee330b 263 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
1050186 0:a8ad8fee330b 264 if( error != DisplayBase::GRAPHICS_OK ) {
1050186 0:a8ad8fee330b 265 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 266 while(1);
1050186 0:a8ad8fee330b 267 }
1050186 0:a8ad8fee330b 268
1050186 0:a8ad8fee330b 269 #elif VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA
1050186 0:a8ad8fee330b 270 /* MT9V111 camera input config */
1050186 0:a8ad8fee330b 271 ext_in_config.inp_format = DisplayBase::VIDEO_EXTIN_FORMAT_BT601; /* BT601 8bit YCbCr format */
1050186 0:a8ad8fee330b 272 ext_in_config.inp_pxd_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing data */
1050186 0:a8ad8fee330b 273 ext_in_config.inp_vs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Vsync signals */
1050186 0:a8ad8fee330b 274 ext_in_config.inp_hs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Hsync signals */
1050186 0:a8ad8fee330b 275 ext_in_config.inp_endian_on = DisplayBase::OFF; /* External input bit endian change on/off */
1050186 0:a8ad8fee330b 276 ext_in_config.inp_swap_on = DisplayBase::OFF; /* External input B/R signal swap on/off */
1050186 0:a8ad8fee330b 277 ext_in_config.inp_vs_inv = DisplayBase::SIG_POL_NOT_INVERTED; /* External input DV_VSYNC inversion control */
1050186 0:a8ad8fee330b 278 ext_in_config.inp_hs_inv = DisplayBase::SIG_POL_INVERTED; /* External input DV_HSYNC inversion control */
1050186 0:a8ad8fee330b 279 ext_in_config.inp_f525_625 = DisplayBase::EXTIN_LINE_525; /* Number of lines for BT.656 external input */
1050186 0:a8ad8fee330b 280 ext_in_config.inp_h_pos = DisplayBase::EXTIN_H_POS_CRYCBY; /* Y/Cb/Y/Cr data string start timing to Hsync reference */
1050186 0:a8ad8fee330b 281 ext_in_config.cap_vs_pos = 6; /* Capture start position from Vsync */
1050186 0:a8ad8fee330b 282 ext_in_config.cap_hs_pos = 150; /* Capture start position form Hsync */
1050186 0:a8ad8fee330b 283 ext_in_config.cap_width = 640; /* Capture width */
1050186 0:a8ad8fee330b 284 ext_in_config.cap_height = 468u; /* Capture height Max 468[line]
1050186 0:a8ad8fee330b 285 Due to CMOS(MT9V111) output signal timing and VDC5 specification */
1050186 0:a8ad8fee330b 286 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_EXT, &ext_in_config);
1050186 0:a8ad8fee330b 287 if( error != DisplayBase::GRAPHICS_OK ) {
1050186 0:a8ad8fee330b 288 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 289 while(1);
1050186 0:a8ad8fee330b 290 }
1050186 0:a8ad8fee330b 291
1050186 0:a8ad8fee330b 292 /* MT9V111 camera input port setting */
1050186 0:a8ad8fee330b 293 error = Display.Graphics_Dvinput_Port_Init(cmos_camera_pin, 11);
1050186 0:a8ad8fee330b 294 if( error != DisplayBase::GRAPHICS_OK ) {
1050186 0:a8ad8fee330b 295 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 296 while (1);
1050186 0:a8ad8fee330b 297 }
1050186 0:a8ad8fee330b 298 #endif
1050186 0:a8ad8fee330b 299
1050186 0:a8ad8fee330b 300 /* Interrupt callback function setting (Vsync signal output from scaler 0) */
1050186 0:a8ad8fee330b 301 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_Vsync);
1050186 0:a8ad8fee330b 302 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:a8ad8fee330b 303 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 304 while (1);
1050186 0:a8ad8fee330b 305 }
1050186 0:a8ad8fee330b 306 /* Video capture setting (progressive form fixed) */
1050186 0:a8ad8fee330b 307 error = Display.Video_Write_Setting(
1050186 0:a8ad8fee330b 308 VIDEO_INPUT_CH,
1050186 0:a8ad8fee330b 309 #if VIDEO_PAL == 0
1050186 0:a8ad8fee330b 310 DisplayBase::COL_SYS_NTSC_358,
1050186 0:a8ad8fee330b 311 #else
1050186 0:a8ad8fee330b 312 DisplayBase::COL_SYS_PAL_443,
1050186 0:a8ad8fee330b 313 #endif
1050186 0:a8ad8fee330b 314 write_buff_addr,
1050186 0:a8ad8fee330b 315 VIDEO_BUFFER_STRIDE,
1050186 0:a8ad8fee330b 316 #if VIDEO_INPUT_FORMAT == VIDEO_YCBCR422
1050186 0:a8ad8fee330b 317 DisplayBase::VIDEO_FORMAT_YCBCR422,
1050186 0:a8ad8fee330b 318 DisplayBase::WR_RD_WRSWA_NON,
1050186 0:a8ad8fee330b 319 #elif VIDEO_INPUT_FORMAT == VIDEO_RGB565
1050186 0:a8ad8fee330b 320 DisplayBase::VIDEO_FORMAT_RGB565,
1050186 0:a8ad8fee330b 321 DisplayBase::WR_RD_WRSWA_32_16BIT,
1050186 0:a8ad8fee330b 322 #else
1050186 0:a8ad8fee330b 323 DisplayBase::VIDEO_FORMAT_RGB888,
1050186 0:a8ad8fee330b 324 DisplayBase::WR_RD_WRSWA_32BIT,
1050186 0:a8ad8fee330b 325 #endif
1050186 0:a8ad8fee330b 326 PIXEL_VW,
1050186 0:a8ad8fee330b 327 PIXEL_HW
1050186 0:a8ad8fee330b 328 );
1050186 0:a8ad8fee330b 329 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:a8ad8fee330b 330 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 331 while (1);
1050186 0:a8ad8fee330b 332 }
1050186 0:a8ad8fee330b 333
1050186 0:a8ad8fee330b 334 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
1050186 0:a8ad8fee330b 335 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield);
1050186 0:a8ad8fee330b 336 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:a8ad8fee330b 337 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 338 while (1);
1050186 0:a8ad8fee330b 339 }
1050186 0:a8ad8fee330b 340
1050186 0:a8ad8fee330b 341 /* Video write process start */
1050186 0:a8ad8fee330b 342 error = Display.Video_Start (VIDEO_INPUT_CH);
1050186 0:a8ad8fee330b 343 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:a8ad8fee330b 344 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 345 while (1);
1050186 0:a8ad8fee330b 346 }
1050186 0:a8ad8fee330b 347
1050186 0:a8ad8fee330b 348 /* Video write process stop */
1050186 0:a8ad8fee330b 349 error = Display.Video_Stop (VIDEO_INPUT_CH);
1050186 0:a8ad8fee330b 350 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:a8ad8fee330b 351 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 352 while (1);
1050186 0:a8ad8fee330b 353 }
1050186 0:a8ad8fee330b 354
1050186 0:a8ad8fee330b 355 /* Video write process start */
1050186 0:a8ad8fee330b 356 error = Display.Video_Start (VIDEO_INPUT_CH);
1050186 0:a8ad8fee330b 357 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:a8ad8fee330b 358 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 359 while (1);
1050186 0:a8ad8fee330b 360 }
1050186 0:a8ad8fee330b 361
1050186 0:a8ad8fee330b 362 /* Wait vsync to update resister */
1050186 0:a8ad8fee330b 363 WaitVsync(1);
1050186 0:a8ad8fee330b 364
1050186 0:a8ad8fee330b 365 /* Wait 2 Vfield(Top or bottom field) */
1050186 0:a8ad8fee330b 366 WaitVfield(2);
1050186 0:a8ad8fee330b 367
1050186 0:a8ad8fee330b 368 #if (USB_HOST_CH == 1) //Audio Shield USB1
1050186 0:a8ad8fee330b 369 //Audio Shield USB1 enable
1050186 0:a8ad8fee330b 370 usb1en = 1; //Outputs high level
1050186 0:a8ad8fee330b 371 Thread::wait(5);
1050186 0:a8ad8fee330b 372 usb1en = 0; //Outputs low level
1050186 0:a8ad8fee330b 373 #endif
1050186 0:a8ad8fee330b 374 USBHostMSD msd("usb");
1050186 0:a8ad8fee330b 375 char file_name[32];
1050186 0:a8ad8fee330b 376 int file_name_index = 0;
1050186 0:a8ad8fee330b 377 int save_file_size;
1050186 0:a8ad8fee330b 378
1050186 0:a8ad8fee330b 379 #if(1) //lcd
1050186 0:a8ad8fee330b 380 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
1050186 0:a8ad8fee330b 381 rect.vs = 0;
1050186 0:a8ad8fee330b 382 rect.vw = PIXEL_VW;
1050186 0:a8ad8fee330b 383 rect.hs = 0;
1050186 0:a8ad8fee330b 384 rect.hw = PIXEL_HW;
1050186 0:a8ad8fee330b 385
1050186 0:a8ad8fee330b 386 Display.Graphics_Read_Setting(
1050186 0:a8ad8fee330b 387 DisplayBase::GRAPHICS_LAYER_0,
1050186 0:a8ad8fee330b 388 (void *)write_buff_addr,
1050186 0:a8ad8fee330b 389 VIDEO_BUFFER_STRIDE,
1050186 0:a8ad8fee330b 390 DisplayBase::GRAPHICS_FORMAT_YCBCR422,
1050186 0:a8ad8fee330b 391 DisplayBase::WR_RD_WRSWA_NON,
1050186 0:a8ad8fee330b 392 &rect
1050186 0:a8ad8fee330b 393 );
1050186 0:a8ad8fee330b 394 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
1050186 0:a8ad8fee330b 395
1050186 0:a8ad8fee330b 396 lcd_cntrst.write(1.0);
1050186 0:a8ad8fee330b 397
1050186 0:a8ad8fee330b 398 while (1) {
1050186 0:a8ad8fee330b 399 uint8_t count = 0;
1050186 0:a8ad8fee330b 400 uint32_t x0 = 0;
1050186 0:a8ad8fee330b 401 uint32_t y0 = 0;
1050186 0:a8ad8fee330b 402 uint32_t x1 = 0;
1050186 0:a8ad8fee330b 403 uint32_t y1 = 0;
1050186 0:a8ad8fee330b 404
1050186 0:a8ad8fee330b 405 /* button check */
1050186 0:a8ad8fee330b 406 if (button == 0) {
1050186 0:a8ad8fee330b 407 if (!msd.connect()) {
1050186 0:a8ad8fee330b 408 printf("Device disconnected\n");
1050186 0:a8ad8fee330b 409 } else {
1050186 0:a8ad8fee330b 410 led1 = 1;
1050186 0:a8ad8fee330b 411 if (write_buff_addr == FrameBuffer_Video_A) {
1050186 0:a8ad8fee330b 412 write_buff_addr = FrameBuffer_Video_B;
1050186 0:a8ad8fee330b 413 save_buff_addr = FrameBuffer_Video_A;
1050186 0:a8ad8fee330b 414 } else {
1050186 0:a8ad8fee330b 415 write_buff_addr = FrameBuffer_Video_A;
1050186 0:a8ad8fee330b 416 save_buff_addr = FrameBuffer_Video_B;
1050186 0:a8ad8fee330b 417 }
1050186 0:a8ad8fee330b 418
1050186 0:a8ad8fee330b 419 /* Change write buffer */
1050186 0:a8ad8fee330b 420 error = Display.Video_Write_Change(
1050186 0:a8ad8fee330b 421 VIDEO_INPUT_CH,
1050186 0:a8ad8fee330b 422 write_buff_addr,
1050186 0:a8ad8fee330b 423 VIDEO_BUFFER_STRIDE);
1050186 0:a8ad8fee330b 424 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:a8ad8fee330b 425 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:a8ad8fee330b 426 while (1);
1050186 0:a8ad8fee330b 427 }
1050186 0:a8ad8fee330b 428 /* Wait 2 Vfield(Top or bottom field) */
1050186 0:a8ad8fee330b 429 WaitVfield(2);
1050186 0:a8ad8fee330b 430
1050186 0:a8ad8fee330b 431 /* FrameBuffer_Video_A or FrameBuffer_Video_B capture completed */
1050186 0:a8ad8fee330b 432 printf("USB connect checking...\n");
1050186 0:a8ad8fee330b 433 while (!msd.connected()) {
1050186 0:a8ad8fee330b 434 if (!msd.connect()) {
1050186 0:a8ad8fee330b 435 Thread::wait(500);
1050186 0:a8ad8fee330b 436 } else {
1050186 0:a8ad8fee330b 437 break;
1050186 0:a8ad8fee330b 438 }
1050186 0:a8ad8fee330b 439 }
1050186 0:a8ad8fee330b 440 printf("USB connect check OK!\n");
1050186 0:a8ad8fee330b 441
1050186 0:a8ad8fee330b 442 /* Data save */
1050186 0:a8ad8fee330b 443 #if ( VIDEO_INPUT_FORMAT == VIDEO_RGB565 )
1050186 0:a8ad8fee330b 444 /* Save ".bin" file */
1050186 0:a8ad8fee330b 445 sprintf(file_name, "/usb/video_%d.bin", file_name_index++);
1050186 0:a8ad8fee330b 446 FILE * fp = fopen(file_name, "w");
1050186 0:a8ad8fee330b 447 save_file_size = fwrite(save_buff_addr, sizeof(char), (VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT), fp);
1050186 0:a8ad8fee330b 448 fclose(fp);
1050186 0:a8ad8fee330b 449 #elif ( VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 )
1050186 0:a8ad8fee330b 450 /* Save ".jpg" file */
1050186 0:a8ad8fee330b 451 sprintf(file_name, "/usb/image_%d.jpg", file_name_index++);
1050186 0:a8ad8fee330b 452 //YCbCr setting
1050186 0:a8ad8fee330b 453 aBitmapData.width = PIXEL_HW;
1050186 0:a8ad8fee330b 454 aBitmapData.height = PIXEL_VW;
1050186 0:a8ad8fee330b 455 aBitmapData.format = JPEG_Converter::WR_RD_YCbCr422; //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
1050186 0:a8ad8fee330b 456 aBitmapData.buffer_address = save_buff_addr;
1050186 0:a8ad8fee330b 457 printf("File encode start\n");
1050186 0:a8ad8fee330b 458 // JPEG_Converter
1050186 0:a8ad8fee330b 459 if (decoder.encode(&aBitmapData, JCUBuffer_OUTPUT, &EncodeSize) == JPEG_Converter::JPEG_CONV_OK) {
1050186 0:a8ad8fee330b 460 printf("File encode done\n");
1050186 0:a8ad8fee330b 461 printf("File write start\n");
1050186 0:a8ad8fee330b 462 wr_fp = fopen(file_name, "w");
1050186 0:a8ad8fee330b 463 save_file_size = fwrite(JCUBuffer_OUTPUT, sizeof(char), EncodeSize, wr_fp);
1050186 0:a8ad8fee330b 464 fclose(wr_fp);
1050186 0:a8ad8fee330b 465 printf("File write done\n");
1050186 0:a8ad8fee330b 466 led1 = 0;
1050186 0:a8ad8fee330b 467 } else {
1050186 0:a8ad8fee330b 468 printf("Error:JCU encode error\n");
1050186 0:a8ad8fee330b 469 led1 = 0;
1050186 0:a8ad8fee330b 470 }
1050186 0:a8ad8fee330b 471 #else
1050186 0:a8ad8fee330b 472 /* Save ".bmp" file */
1050186 0:a8ad8fee330b 473 sprintf(file_name, "/usb/video_%d.bmp", file_name_index++);
1050186 0:a8ad8fee330b 474
1050186 0:a8ad8fee330b 475 bitmap bitmapfile;
1050186 0:a8ad8fee330b 476 save_file_size = bitmapfile.Rgb888ToBmp(file_name, save_buff_addr, PIXEL_HW, PIXEL_VW);
1050186 0:a8ad8fee330b 477 #endif
1050186 0:a8ad8fee330b 478 printf("file name : %s, file size : %d\n", file_name, save_file_size);
1050186 0:a8ad8fee330b 479
1050186 0:a8ad8fee330b 480 /* Swap frame buffer */
1050186 0:a8ad8fee330b 481 Display.Graphics_Read_Change(
1050186 0:a8ad8fee330b 482 DisplayBase::GRAPHICS_LAYER_0,
1050186 0:a8ad8fee330b 483 write_buff_addr);
1050186 0:a8ad8fee330b 484 /* Wait vsync to update resister */
1050186 0:a8ad8fee330b 485 WaitVsync(1);
1050186 0:a8ad8fee330b 486 led1 = 0;
1050186 0:a8ad8fee330b 487 }
1050186 0:a8ad8fee330b 488 }
1050186 0:a8ad8fee330b 489
1050186 0:a8ad8fee330b 490 /* coordinates check */
1050186 0:a8ad8fee330b 491 get_coordinates(&count, &x0, &y0, &x1, &y1);
1050186 0:a8ad8fee330b 492 if (count != 0) {
1050186 0:a8ad8fee330b 493 printf("count=%d, {X=%d,Y=%d}, {X=%d,Y=%d} \n", count, x0, y0, x1, y1);
1050186 0:a8ad8fee330b 494 }
1050186 0:a8ad8fee330b 495 Thread::wait(100);
1050186 0:a8ad8fee330b 496 }
1050186 0:a8ad8fee330b 497 #endif
1050186 0:a8ad8fee330b 498 }