LCD Shield sample. 4.3inch.

Dependencies:   GR-PEACH_video mbed-rtos mbed

Fork of GR-PEACH_LCD_sample by Daiki Kato

Information

Japanese version is available in lower part of this page.
このページの後半に日本語版が用意されています.

This program displays the NTSC input from NTSC1A of LCD Shield on the screen. Touch coordinates are displayed on the terminal when you touch the screen. You can touch at the same time up to 2 points.

When you connect the "GR-PEACH AUDIO CAMERA Shield", you can display an image of the CMOS Camera(MT9V111).
If you use CMOS Camera, Please change the below in the “main.cpp”.

main.cpp

#define VIDEO_INPUT_METHOD     (VIDEO_CVBS)
->
#define VIDEO_INPUT_METHOD     (VIDEO_CMOS_CAMERA)


Please refer to following link about "GR-PEACH AUDIO CAMERA Shield".
https://developer.mbed.org/teams/Renesas/wiki/Audio_Camera-shield


このプログラムは、NTSC1AからのNTSC入力をLCDシールドの画面上に表示します。画面をタッチすると、タッチ座標がprintf表示されます。2点まで同時にタッチできます。
GR-PEACH AUDIO CAMERA Shieldを接続すると、CMOSカメラ(MT9V111)の画像を表示することができます。CMOSカメラを使用する場合は、「main.cpp」の以下を変更してください。

main.cpp

#define VIDEO_INPUT_METHOD     (VIDEO_CVBS)
->
#define VIDEO_INPUT_METHOD     (VIDEO_CMOS_CAMERA)


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

Committer:
dkato
Date:
Thu Apr 07 07:28:19 2016 +0000
Revision:
3:b5aaf7215800
Parent:
2:8e78c957adb5
Child:
4:c1e61a1d75df
Bug fixes, touch panel operation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:47ea8de0be6c 1 #include "mbed.h"
dkato 0:47ea8de0be6c 2 #include "DisplayBace.h"
dkato 0:47ea8de0be6c 3 #include "rtos.h"
dkato 0:47ea8de0be6c 4
dkato 0:47ea8de0be6c 5 #define VIDEO_CVBS (0) /* Analog Video Signal */
dkato 0:47ea8de0be6c 6 #define VIDEO_CMOS_CAMERA (1) /* Digital Video Signal */
dkato 0:47ea8de0be6c 7 #define VIDEO_YCBCR422 (0)
dkato 0:47ea8de0be6c 8 #define VIDEO_RGB888 (1)
dkato 0:47ea8de0be6c 9 #define VIDEO_RGB565 (2)
dkato 0:47ea8de0be6c 10
dkato 0:47ea8de0be6c 11 /**** User Selection *********/
dkato 0:47ea8de0be6c 12 #define VIDEO_INPUT_METHOD (VIDEO_CVBS) /* Select VIDEO_CVBS or VIDEO_CMOS_CAMERA */
dkato 0:47ea8de0be6c 13 #define VIDEO_INPUT_FORMAT (VIDEO_YCBCR422) /* Select VIDEO_YCBCR422 or VIDEO_RGB888 or VIDEO_RGB565 */
dkato 0:47ea8de0be6c 14 #define USE_VIDEO_CH (0) /* Select 0 or 1 If selecting VIDEO_CMOS_CAMERA, should be 0.) */
dkato 0:47ea8de0be6c 15 #define VIDEO_PAL (0) /* Select 0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */
dkato 0:47ea8de0be6c 16 /*****************************/
dkato 1:f0d5f9c28404 17
dkato 1:f0d5f9c28404 18 /**** LCD Parameter **********/
dkato 1:f0d5f9c28404 19 #define LCD_DE_MODE (0)
dkato 1:f0d5f9c28404 20 #define LCD_SYNC_MODE (1)
dkato 1:f0d5f9c28404 21
dkato 1:f0d5f9c28404 22 #define LCD_DOT_CLOCK (13.40f) // 13.4MHz
dkato 1:f0d5f9c28404 23
dkato 1:f0d5f9c28404 24 #define LCD_H_WIDTH (480u)
dkato 1:f0d5f9c28404 25 #define LCD_H_BACK_PORCH (43u)
dkato 1:f0d5f9c28404 26 #define LCD_H_FRONT_PORCH (52u)
dkato 1:f0d5f9c28404 27 #define LCD_H_SYNC_WIDTH (41u)
dkato 1:f0d5f9c28404 28
dkato 1:f0d5f9c28404 29 #define LCD_V_WIDTH (272u)
dkato 1:f0d5f9c28404 30 #define LCD_V_BACK_PORCH (12u)
dkato 1:f0d5f9c28404 31 #define LCD_V_FRONT_PORCH (2u)
dkato 1:f0d5f9c28404 32 #define LCD_V_SYNC_WIDTH (10u)
dkato 1:f0d5f9c28404 33
dkato 1:f0d5f9c28404 34 #define LCD_MODE (LCD_SYNC_MODE)
dkato 1:f0d5f9c28404 35
dkato 1:f0d5f9c28404 36 /*****************************/
dkato 1:f0d5f9c28404 37
dkato 0:47ea8de0be6c 38
dkato 0:47ea8de0be6c 39 #if USE_VIDEO_CH == (0)
dkato 0:47ea8de0be6c 40 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0)
dkato 0:47ea8de0be6c 41 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD)
dkato 0:47ea8de0be6c 42 #else
dkato 0:47ea8de0be6c 43 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_1)
dkato 0:47ea8de0be6c 44 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S1_VFIELD)
dkato 0:47ea8de0be6c 45 #endif
dkato 0:47ea8de0be6c 46
dkato 0:47ea8de0be6c 47 #if ( VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 || VIDEO_INPUT_FORMAT == VIDEO_RGB565 )
dkato 0:47ea8de0be6c 48 #define DATA_SIZE_PER_PIC (2u)
dkato 0:47ea8de0be6c 49 #else
dkato 0:47ea8de0be6c 50 #define DATA_SIZE_PER_PIC (4u)
dkato 0:47ea8de0be6c 51 #endif
dkato 0:47ea8de0be6c 52
dkato 0:47ea8de0be6c 53 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:47ea8de0be6c 54 in accordance with the frame buffer burst transfer mode. */
dkato 1:f0d5f9c28404 55 #define PIXEL_HW (480u) /* WQVGA */
dkato 1:f0d5f9c28404 56 #define PIXEL_VW (272u) /* WQVGA */
dkato 0:47ea8de0be6c 57
dkato 0:47ea8de0be6c 58 #define VIDEO_BUFFER_STRIDE (((PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u)
dkato 0:47ea8de0be6c 59 #define VIDEO_BUFFER_HEIGHT (PIXEL_VW)
dkato 0:47ea8de0be6c 60
dkato 0:47ea8de0be6c 61 DigitalIn button(USER_BUTTON0);
dkato 0:47ea8de0be6c 62 #if(1) //lcd
dkato 0:47ea8de0be6c 63 DigitalOut lcd_pwon(P7_15);
dkato 0:47ea8de0be6c 64 DigitalOut lcd_blon(P8_1);
dkato 3:b5aaf7215800 65 DigitalOut touch_reset(P4_0);
dkato 0:47ea8de0be6c 66 PwmOut lcd_cntrst(P8_15);
dkato 0:47ea8de0be6c 67 I2C mI2c(I2C_SDA, I2C_SCL);
dkato 0:47ea8de0be6c 68
dkato 0:47ea8de0be6c 69 typedef struct {
dkato 0:47ea8de0be6c 70 uint8_t y_h: 3,
dkato 0:47ea8de0be6c 71 reserved: 1,
dkato 0:47ea8de0be6c 72 x_h: 3,
dkato 0:47ea8de0be6c 73 valid: 1;
dkato 0:47ea8de0be6c 74 uint8_t x_l;
dkato 0:47ea8de0be6c 75 uint8_t y_l;
dkato 0:47ea8de0be6c 76 } xyz_data_t;
dkato 0:47ea8de0be6c 77
dkato 0:47ea8de0be6c 78 typedef struct {
dkato 3:b5aaf7215800 79 uint8_t fingers: 3,
dkato 3:b5aaf7215800 80 reserved: 5;
dkato 0:47ea8de0be6c 81 uint8_t keys;
dkato 0:47ea8de0be6c 82 xyz_data_t xyz_data[2];
dkato 0:47ea8de0be6c 83 } stx_report_data_t;
dkato 0:47ea8de0be6c 84
dkato 0:47ea8de0be6c 85 static int get_coordinates(uint8_t *count, uint32_t *x0, uint32_t *y0, uint32_t *x1, uint32_t *y1) {
dkato 3:b5aaf7215800 86 char buf[8];
dkato 0:47ea8de0be6c 87 stx_report_data_t *pdata;
dkato 0:47ea8de0be6c 88 int ret = -1;
dkato 0:47ea8de0be6c 89 *count = 0; // Set point detected count to 0.
dkato 0:47ea8de0be6c 90
dkato 0:47ea8de0be6c 91 if (mI2c.read((0x55 << 1), buf, sizeof(buf)) == 0) {
dkato 0:47ea8de0be6c 92 pdata = (stx_report_data_t *)buf;
dkato 0:47ea8de0be6c 93 if (pdata->fingers) {
dkato 0:47ea8de0be6c 94 if (pdata->xyz_data[0].valid) {
dkato 0:47ea8de0be6c 95 *x0 = (pdata->xyz_data[0].x_h << 8) | pdata->xyz_data[0].x_l;
dkato 0:47ea8de0be6c 96 *y0 = (pdata->xyz_data[0].y_h << 8) | pdata->xyz_data[0].y_l;
dkato 0:47ea8de0be6c 97 (*count)++;
dkato 0:47ea8de0be6c 98 }
dkato 0:47ea8de0be6c 99 }
dkato 0:47ea8de0be6c 100 if (pdata->xyz_data[1].valid) {
dkato 0:47ea8de0be6c 101 *x1 = (pdata->xyz_data[1].x_h << 8) | pdata->xyz_data[1].x_l;
dkato 0:47ea8de0be6c 102 *y1 = (pdata->xyz_data[1].y_h << 8) | pdata->xyz_data[1].y_l;
dkato 0:47ea8de0be6c 103 (*count)++;
dkato 0:47ea8de0be6c 104 }
dkato 0:47ea8de0be6c 105 ret = 0;
dkato 0:47ea8de0be6c 106 }
dkato 0:47ea8de0be6c 107
dkato 0:47ea8de0be6c 108 return ret;
dkato 0:47ea8de0be6c 109 }
dkato 0:47ea8de0be6c 110 #endif
dkato 0:47ea8de0be6c 111
dkato 0:47ea8de0be6c 112 static uint8_t FrameBuffer_Video[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!;
dkato 0:47ea8de0be6c 113 static volatile int32_t vsync_count = 0;
dkato 0:47ea8de0be6c 114 static volatile int32_t vfield_count = 1;
dkato 0:47ea8de0be6c 115 static int image_change = 0;
dkato 0:47ea8de0be6c 116
dkato 0:47ea8de0be6c 117 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type)
dkato 0:47ea8de0be6c 118 {
dkato 0:47ea8de0be6c 119 //Interrupt callback function
dkato 0:47ea8de0be6c 120 if (vfield_count != 0) {
dkato 0:47ea8de0be6c 121 vfield_count = 0;
dkato 0:47ea8de0be6c 122 } else {
dkato 0:47ea8de0be6c 123 vfield_count = 1;
dkato 0:47ea8de0be6c 124 image_change = 1;
dkato 0:47ea8de0be6c 125 }
dkato 0:47ea8de0be6c 126 }
dkato 0:47ea8de0be6c 127
dkato 0:47ea8de0be6c 128 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type)
dkato 0:47ea8de0be6c 129 {
dkato 0:47ea8de0be6c 130 //Interrupt callback function for Vsync interruption
dkato 0:47ea8de0be6c 131 if (vsync_count > 0) {
dkato 0:47ea8de0be6c 132 vsync_count--;
dkato 0:47ea8de0be6c 133 }
dkato 0:47ea8de0be6c 134 }
dkato 0:47ea8de0be6c 135
dkato 0:47ea8de0be6c 136 static void WaitVsync(const int32_t wait_count)
dkato 0:47ea8de0be6c 137 {
dkato 0:47ea8de0be6c 138 //Wait for the specified number of times Vsync occurs
dkato 0:47ea8de0be6c 139 vsync_count = wait_count;
dkato 0:47ea8de0be6c 140 while (vsync_count > 0) {
dkato 0:47ea8de0be6c 141 /* Do nothing */
dkato 0:47ea8de0be6c 142 }
dkato 0:47ea8de0be6c 143 }
dkato 0:47ea8de0be6c 144
dkato 0:47ea8de0be6c 145 int main(void)
dkato 0:47ea8de0be6c 146 {
dkato 0:47ea8de0be6c 147 /* Create DisplayBase object */
dkato 0:47ea8de0be6c 148 DisplayBase Display;
dkato 0:47ea8de0be6c 149 DisplayBase::graphics_error_t error;
dkato 0:47ea8de0be6c 150
dkato 0:47ea8de0be6c 151 #if VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA
dkato 0:47ea8de0be6c 152 DisplayBase::video_ext_in_config_t ext_in_config;
dkato 0:47ea8de0be6c 153 PinName cmos_camera_pin[11] = {
dkato 0:47ea8de0be6c 154 /* data pin */
dkato 0:47ea8de0be6c 155 P2_7, P2_6, P2_5, P2_4, P2_3, P2_2, P2_1, P2_0,
dkato 0:47ea8de0be6c 156 /* control pin */
dkato 0:47ea8de0be6c 157 P10_0, /* DV0_CLK */
dkato 0:47ea8de0be6c 158 P1_0, /* DV0_Vsync */
dkato 0:47ea8de0be6c 159 P1_1 /* DV0_Hsync */
dkato 0:47ea8de0be6c 160 };
dkato 0:47ea8de0be6c 161 #endif
dkato 0:47ea8de0be6c 162 #if(1) //lcd
dkato 1:f0d5f9c28404 163 lcd_pwon = 0;
dkato 1:f0d5f9c28404 164 lcd_blon = 0;
dkato 3:b5aaf7215800 165 touch_reset = 0;
dkato 1:f0d5f9c28404 166 Thread::wait(100);
dkato 1:f0d5f9c28404 167
dkato 0:47ea8de0be6c 168 lcd_pwon = 1;
dkato 0:47ea8de0be6c 169 lcd_blon = 1;
dkato 3:b5aaf7215800 170 touch_reset = 1;
dkato 1:f0d5f9c28404 171 Thread::wait(100);
dkato 0:47ea8de0be6c 172
dkato 0:47ea8de0be6c 173 DisplayBase::lcd_config_t lcd_config;
dkato 0:47ea8de0be6c 174 PinName lvds_pin[8] = {
dkato 0:47ea8de0be6c 175 /* data pin */
dkato 0:47ea8de0be6c 176 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
dkato 0:47ea8de0be6c 177 };
dkato 0:47ea8de0be6c 178 DisplayBase::rect_t rect;
dkato 0:47ea8de0be6c 179
dkato 0:47ea8de0be6c 180 lcd_config.lcd_type = DisplayBase::LCD_TYPE_LVDS;
dkato 0:47ea8de0be6c 181 lcd_config.intputClock = 66.67f;
dkato 1:f0d5f9c28404 182 lcd_config.outputClock = LCD_DOT_CLOCK;
dkato 0:47ea8de0be6c 183 lcd_config.lcd_outformat = DisplayBase::LCD_OUTFORMAT_RGB888;
dkato 0:47ea8de0be6c 184 lcd_config.lcd_edge = DisplayBase::EDGE_RISING;
dkato 1:f0d5f9c28404 185 #if(LCD_MODE) //SYNC Mode
dkato 1:f0d5f9c28404 186 lcd_config.h_toatal_period = (LCD_H_BACK_PORCH + LCD_H_WIDTH + LCD_H_FRONT_PORCH);
dkato 1:f0d5f9c28404 187 lcd_config.v_toatal_period = (LCD_V_BACK_PORCH + LCD_V_WIDTH + LCD_V_FRONT_PORCH);
dkato 1:f0d5f9c28404 188
dkato 1:f0d5f9c28404 189 lcd_config.h_disp_widht = (LCD_H_WIDTH);
dkato 1:f0d5f9c28404 190 lcd_config.v_disp_widht = (LCD_V_WIDTH);
dkato 1:f0d5f9c28404 191 lcd_config.h_back_porch = (LCD_H_BACK_PORCH);
dkato 1:f0d5f9c28404 192 lcd_config.v_back_porch = (LCD_V_BACK_PORCH);
dkato 1:f0d5f9c28404 193
dkato 1:f0d5f9c28404 194 lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_2;
dkato 1:f0d5f9c28404 195 lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_INVERTED;
dkato 1:f0d5f9c28404 196 lcd_config.h_sync_width = LCD_H_SYNC_WIDTH;
dkato 1:f0d5f9c28404 197
dkato 1:f0d5f9c28404 198 lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_0;
dkato 1:f0d5f9c28404 199 lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_INVERTED;
dkato 1:f0d5f9c28404 200 lcd_config.v_sync_width = LCD_V_SYNC_WIDTH;
dkato 1:f0d5f9c28404 201
dkato 2:8e78c957adb5 202 lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3;
dkato 1:f0d5f9c28404 203 lcd_config.de_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 1:f0d5f9c28404 204 #else //DE Mode
dkato 1:f0d5f9c28404 205 lcd_config.h_toatal_period = (LCD_H_WIDTH + 80u);
dkato 1:f0d5f9c28404 206 lcd_config.v_toatal_period = (LCD_V_WIDTH);
dkato 0:47ea8de0be6c 207
dkato 1:f0d5f9c28404 208 lcd_config.h_disp_widht = (LCD_H_WIDTH);
dkato 1:f0d5f9c28404 209 lcd_config.v_disp_widht = (LCD_V_WIDTH);
dkato 1:f0d5f9c28404 210 lcd_config.h_back_porch = (68u);
dkato 1:f0d5f9c28404 211 lcd_config.v_back_porch = (18u);
dkato 0:47ea8de0be6c 212
dkato 0:47ea8de0be6c 213 lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_NON;
dkato 0:47ea8de0be6c 214 lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 0:47ea8de0be6c 215 lcd_config.h_sync_width = 0;
dkato 0:47ea8de0be6c 216
dkato 0:47ea8de0be6c 217 lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_NON;
dkato 0:47ea8de0be6c 218 lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 0:47ea8de0be6c 219 lcd_config.v_sync_width = 0;
dkato 0:47ea8de0be6c 220
dkato 0:47ea8de0be6c 221 lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3;
dkato 1:f0d5f9c28404 222 lcd_config.de_port_polarity = DisplayBase::SIG_POL_INVERTED;
dkato 1:f0d5f9c28404 223 #endif
dkato 0:47ea8de0be6c 224
dkato 0:47ea8de0be6c 225 /* Graphics initialization process */
dkato 0:47ea8de0be6c 226 error = Display.Graphics_init(&lcd_config);
dkato 0:47ea8de0be6c 227 #else
dkato 0:47ea8de0be6c 228 /* Graphics initialization process */
dkato 0:47ea8de0be6c 229 error = Display.Graphics_init(NULL);
dkato 0:47ea8de0be6c 230 #endif
dkato 0:47ea8de0be6c 231
dkato 0:47ea8de0be6c 232 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:47ea8de0be6c 233 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 234 while (1);
dkato 0:47ea8de0be6c 235 }
dkato 0:47ea8de0be6c 236
dkato 0:47ea8de0be6c 237 #if VIDEO_INPUT_METHOD == VIDEO_CVBS
dkato 0:47ea8de0be6c 238 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
dkato 0:47ea8de0be6c 239 if( error != DisplayBase::GRAPHICS_OK ) {
dkato 0:47ea8de0be6c 240 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 241 while(1);
dkato 0:47ea8de0be6c 242 }
dkato 0:47ea8de0be6c 243
dkato 0:47ea8de0be6c 244 #elif VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA
dkato 0:47ea8de0be6c 245 /* MT9V111 camera input config */
dkato 0:47ea8de0be6c 246 ext_in_config.inp_format = DisplayBase::VIDEO_EXTIN_FORMAT_BT601; /* BT601 8bit YCbCr format */
dkato 0:47ea8de0be6c 247 ext_in_config.inp_pxd_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing data */
dkato 0:47ea8de0be6c 248 ext_in_config.inp_vs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Vsync signals */
dkato 0:47ea8de0be6c 249 ext_in_config.inp_hs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Hsync signals */
dkato 0:47ea8de0be6c 250 ext_in_config.inp_endian_on = DisplayBase::OFF; /* External input bit endian change on/off */
dkato 0:47ea8de0be6c 251 ext_in_config.inp_swap_on = DisplayBase::OFF; /* External input B/R signal swap on/off */
dkato 0:47ea8de0be6c 252 ext_in_config.inp_vs_inv = DisplayBase::SIG_POL_NOT_INVERTED; /* External input DV_VSYNC inversion control */
dkato 0:47ea8de0be6c 253 ext_in_config.inp_hs_inv = DisplayBase::SIG_POL_INVERTED; /* External input DV_HSYNC inversion control */
dkato 0:47ea8de0be6c 254 ext_in_config.inp_f525_625 = DisplayBase::EXTIN_LINE_525; /* Number of lines for BT.656 external input */
dkato 0:47ea8de0be6c 255 ext_in_config.inp_h_pos = DisplayBase::EXTIN_H_POS_CRYCBY; /* Y/Cb/Y/Cr data string start timing to Hsync reference */
dkato 0:47ea8de0be6c 256 ext_in_config.cap_vs_pos = 6; /* Capture start position from Vsync */
dkato 0:47ea8de0be6c 257 ext_in_config.cap_hs_pos = 150; /* Capture start position form Hsync */
dkato 0:47ea8de0be6c 258 ext_in_config.cap_width = 640; /* Capture width */
dkato 0:47ea8de0be6c 259 ext_in_config.cap_height = 468u; /* Capture height Max 468[line]
dkato 0:47ea8de0be6c 260 Due to CMOS(MT9V111) output signal timing and VDC5 specification */
dkato 0:47ea8de0be6c 261 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_EXT, &ext_in_config);
dkato 0:47ea8de0be6c 262 if( error != DisplayBase::GRAPHICS_OK ) {
dkato 0:47ea8de0be6c 263 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 264 while(1);
dkato 0:47ea8de0be6c 265 }
dkato 0:47ea8de0be6c 266
dkato 0:47ea8de0be6c 267 /* MT9V111 camera input port setting */
dkato 0:47ea8de0be6c 268 error = Display.Graphics_Dvinput_Port_Init(cmos_camera_pin, 11);
dkato 0:47ea8de0be6c 269 if( error != DisplayBase::GRAPHICS_OK ) {
dkato 0:47ea8de0be6c 270 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 271 while (1);
dkato 0:47ea8de0be6c 272 }
dkato 0:47ea8de0be6c 273 #endif
dkato 0:47ea8de0be6c 274
dkato 0:47ea8de0be6c 275 /* Interrupt callback function setting (Vsync signal input to scaler 0) */
dkato 0:47ea8de0be6c 276 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VI_VSYNC, 0, IntCallbackFunc_Vsync);
dkato 0:47ea8de0be6c 277 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:47ea8de0be6c 278 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 279 while (1);
dkato 0:47ea8de0be6c 280 }
dkato 0:47ea8de0be6c 281 /* Video capture setting (progressive form fixed) */
dkato 0:47ea8de0be6c 282 error = Display.Video_Write_Setting(
dkato 0:47ea8de0be6c 283 VIDEO_INPUT_CH,
dkato 0:47ea8de0be6c 284 #if VIDEO_PAL == 0
dkato 0:47ea8de0be6c 285 DisplayBase::COL_SYS_NTSC_358,
dkato 0:47ea8de0be6c 286 #else
dkato 0:47ea8de0be6c 287 DisplayBase::COL_SYS_PAL_443,
dkato 0:47ea8de0be6c 288 #endif
dkato 0:47ea8de0be6c 289 FrameBuffer_Video,
dkato 0:47ea8de0be6c 290 VIDEO_BUFFER_STRIDE,
dkato 0:47ea8de0be6c 291 #if VIDEO_INPUT_FORMAT == VIDEO_YCBCR422
dkato 0:47ea8de0be6c 292 DisplayBase::VIDEO_FORMAT_YCBCR422,
dkato 0:47ea8de0be6c 293 DisplayBase::WR_RD_WRSWA_NON,
dkato 0:47ea8de0be6c 294 #elif VIDEO_INPUT_FORMAT == VIDEO_RGB565
dkato 0:47ea8de0be6c 295 DisplayBase::VIDEO_FORMAT_RGB565,
dkato 0:47ea8de0be6c 296 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:47ea8de0be6c 297 #else
dkato 0:47ea8de0be6c 298 DisplayBase::VIDEO_FORMAT_RGB888,
dkato 0:47ea8de0be6c 299 DisplayBase::WR_RD_WRSWA_32BIT,
dkato 0:47ea8de0be6c 300 #endif
dkato 0:47ea8de0be6c 301 PIXEL_VW,
dkato 0:47ea8de0be6c 302 PIXEL_HW
dkato 0:47ea8de0be6c 303 );
dkato 0:47ea8de0be6c 304 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:47ea8de0be6c 305 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 306 while (1);
dkato 0:47ea8de0be6c 307 }
dkato 0:47ea8de0be6c 308
dkato 0:47ea8de0be6c 309 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
dkato 0:47ea8de0be6c 310 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield);
dkato 0:47ea8de0be6c 311 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:47ea8de0be6c 312 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 313 while (1);
dkato 0:47ea8de0be6c 314 }
dkato 0:47ea8de0be6c 315
dkato 0:47ea8de0be6c 316 /* Video write process start */
dkato 0:47ea8de0be6c 317 error = Display.Video_Start (VIDEO_INPUT_CH);
dkato 0:47ea8de0be6c 318 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:47ea8de0be6c 319 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 320 while (1);
dkato 0:47ea8de0be6c 321 }
dkato 0:47ea8de0be6c 322
dkato 0:47ea8de0be6c 323 /* Video write process stop */
dkato 0:47ea8de0be6c 324 error = Display.Video_Stop (VIDEO_INPUT_CH);
dkato 0:47ea8de0be6c 325 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:47ea8de0be6c 326 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 327 while (1);
dkato 0:47ea8de0be6c 328 }
dkato 0:47ea8de0be6c 329
dkato 0:47ea8de0be6c 330 /* Video write process start */
dkato 0:47ea8de0be6c 331 error = Display.Video_Start (VIDEO_INPUT_CH);
dkato 0:47ea8de0be6c 332 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:47ea8de0be6c 333 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:47ea8de0be6c 334 while (1);
dkato 0:47ea8de0be6c 335 }
dkato 0:47ea8de0be6c 336
dkato 0:47ea8de0be6c 337 /* Wait vsync to update resister */
dkato 0:47ea8de0be6c 338 WaitVsync(1);
dkato 0:47ea8de0be6c 339
dkato 0:47ea8de0be6c 340 #if(1) //lcd
dkato 0:47ea8de0be6c 341 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
dkato 0:47ea8de0be6c 342 rect.vs = 0;
dkato 0:47ea8de0be6c 343 rect.vw = PIXEL_VW;
dkato 0:47ea8de0be6c 344 rect.hs = 0;
dkato 0:47ea8de0be6c 345 rect.hw = PIXEL_HW;
dkato 0:47ea8de0be6c 346
dkato 0:47ea8de0be6c 347 Display.Graphics_Read_Setting(
dkato 0:47ea8de0be6c 348 DisplayBase::GRAPHICS_LAYER_0,
dkato 0:47ea8de0be6c 349 (void *)FrameBuffer_Video,
dkato 0:47ea8de0be6c 350 VIDEO_BUFFER_STRIDE,
dkato 0:47ea8de0be6c 351 DisplayBase::GRAPHICS_FORMAT_YCBCR422,
dkato 0:47ea8de0be6c 352 DisplayBase::WR_RD_WRSWA_NON,
dkato 0:47ea8de0be6c 353 &rect
dkato 0:47ea8de0be6c 354 );
dkato 0:47ea8de0be6c 355 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 0:47ea8de0be6c 356
dkato 0:47ea8de0be6c 357 lcd_cntrst.write(1.0);
dkato 0:47ea8de0be6c 358
dkato 0:47ea8de0be6c 359 while (1) {
dkato 0:47ea8de0be6c 360 uint8_t count;
dkato 0:47ea8de0be6c 361 uint32_t x0;
dkato 0:47ea8de0be6c 362 uint32_t y0;
dkato 0:47ea8de0be6c 363 uint32_t x1;
dkato 0:47ea8de0be6c 364 uint32_t y1;
dkato 0:47ea8de0be6c 365
dkato 0:47ea8de0be6c 366 count = 0;
dkato 0:47ea8de0be6c 367 x0 = 0;
dkato 0:47ea8de0be6c 368 y0 = 0;
dkato 0:47ea8de0be6c 369 x1 = 0;
dkato 0:47ea8de0be6c 370 y1 = 0;
dkato 0:47ea8de0be6c 371 get_coordinates(&count, &x0, &y0, &x1, &y1);
dkato 0:47ea8de0be6c 372 if (count != 0) {
dkato 0:47ea8de0be6c 373 printf("count=%d, {X=%d,Y=%d}, {X=%d,Y=%d} \n", count, x0, y0, x1, y1);
dkato 0:47ea8de0be6c 374 }
dkato 0:47ea8de0be6c 375 Thread::wait(100);
dkato 0:47ea8de0be6c 376 }
dkato 0:47ea8de0be6c 377 #endif
dkato 0:47ea8de0be6c 378 }