Video image display and touch panel sample for GR-PEACH LCD Shield.

Information

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

Information

This sample has multiple frame buffers so that the clock source can display different cameras and LCDs cleanly. If you are using the NTSC signal, the following sample is simpler.
このサンプルはクロック元が異なるカメラとLCDを綺麗に表示するために、複数のフレームバッファを持っています。NTSC信号を使用するのであれば、以下のサンプルの方が単純です。

https://developer.mbed.org/users/dkato/code/GR-PEACH_NTSC_in_2ch/

What is this ?

The basic function of the GR-PEACH LCD Shield can be tried by this sample.
Display the information of the touch panel on the camera image.
A character font is shown to the screen lower right every 1 second.

Touch panel information

The touch location of the blue and the 2nd point becomes pink in the 1st touch location in case of a multi-touch.
While touching the screen, a white square in the upper left corner of the screen will be displayed.
Touch information is being output in printf. When doing terminal designation, please set 230400 as a baud rate.

Composition

GR-PEACH, GR-PEACH 4.3 inch LCD Shield or GR-PEACH 7.1 inch LCD Shield, GR-PEACH AUDIO CAMERA Shield and Camera.
/media/uploads/dkato/gr-peach_with_camera_lcd.png

When using analog input for video input, GR-PEACH AUDIO CAMERA Shield and the camera are unnecessary.
(Setting the VIDEO_CVBS to VIDEO_INPUT_METHOD)
Please input analog signal to NTSC1A pin. (Even if there are no input signals, a touch panel can be operated.).
/media/uploads/dkato/video_display_analog.jpg

Video input of default is a digital input (Cmos Camera). When changing the video input, please change the below.

mbed_app.json

{
    "config": {
        "camera":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "camera-type":{
            "help": "Please see README.md",
            "value": "CAMERA_CVBS"
        },
        "lcd":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "lcd-type":{
            "help": "Please see README.md",
            "value": "GR_PEACH_4_3INCH_SHIELD"
        }
    }
}
camera-type "value"Description
CAMERA_CVBSGR-PEACH NTSC signal
CAMERA_MT9V111GR-PEACH MT9V111
CAMERA_OV7725GR-LYHCEE included camera
CAMERA_OV5642GR-PEACH OV5642
CAMERA_WIRELESS_CAMERAGR-PEACH Wireless/Camera shield (MT9V111)
lcd-type "value"Description
GR_PEACH_4_3INCH_SHIELDGR-PEACH 4.3 inch LCD shield
GR_PEACH_7_1INCH_SHIELDGR-PEACH 7.1 inch LCD shield
GR_PEACH_RSK_TFTGR-PEACH RSK board LCD
GR_PEACH_DISPLAY_SHIELDGR-PEACH Display Shield or DVi-Board
GR_LYCHEE_LCDGR-LYHCEE TF043HV001A0..etc(40pin)




概要

このサンプルではGR-PEACH LCD Shieldの基本的な機能を試せます。
カメラ画像の上にタッチパネルの情報を重ねて表示します。
文字フォントが右下に1秒毎に表示されます。

タッチパネルの情報

マルチタッチの場合は1点目のタッチ位置は青、2点目のタッチ位置はピンクになります。
画面がタッチされている間、画面左上に白い四角が表示されます。
printfでもタッチ情報を出力しています。ターミナル表示を行う際は、ボーレートに230400を設定してください。

構成

GR-PEACH、GR-PEACH 4.3 inch LCD Shield または GR-PEACH 7.1 inch LCD Shield、GR-PEACH AUDIO CAMERA Shield 、カメラ。
/media/uploads/dkato/gr-peach_with_camera_lcd.png

ビデオ入力にアナログ入力を使用する場合はGR-PEACH AUDIO CAMERA Shield とカメラは不要です。
(VIDEO_INPUT_METHOD にVIDEO_CVBS を設定)
NTSC1Aピンにアナログ信号を入力してください。(入力信号が無くてもタッチパネルは操作できます。)
/media/uploads/dkato/video_display_analog.jpg

デフォルトのビデオ入力はデジタル入力(Cmos Camera)です。ビデオ入力を変更する際は以下を変更してください。

mbed_app.json

{
    "config": {
        "camera":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "camera-type":{
            "help": "Please see README.md",
            "value": "CAMERA_CVBS"
        },
        "lcd":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "lcd-type":{
            "help": "Please see README.md",
            "value": "GR_PEACH_4_3INCH_SHIELD"
        }
    }
}
camera-type "value"Description
CAMERA_CVBSGR-PEACH NTSC signal
CAMERA_MT9V111GR-PEACH MT9V111
CAMERA_OV7725GR-LYHCEE included camera
CAMERA_OV5642GR-PEACH OV5642
CAMERA_WIRELESS_CAMERAGR-PEACH Wireless/Camera shield (MT9V111)
lcd-type "value"Description
GR_PEACH_4_3INCH_SHIELDGR-PEACH 4.3 inch LCD shield
GR_PEACH_7_1INCH_SHIELDGR-PEACH 7.1 inch LCD shield
GR_PEACH_RSK_TFTGR-PEACH RSK board LCD
GR_PEACH_DISPLAY_SHIELDGR-PEACH Display Shield or DVi-Board
GR_LYCHEE_LCDGR-LYHCEE TF043HV001A0..etc(40pin)
Committer:
dkato
Date:
Fri Nov 25 10:04:49 2016 +0000
Revision:
2:8721836b639d
Parent:
1:54a3e69f6f09
Child:
4:bafd63604b7c
Improves the frame rate when VIDEO_CMOS_CAMERA is selected.
; Fix memory allocation when using IAR compiler.
; Fix warning.
;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:b2184c2d15dd 1 #include "mbed.h"
dkato 0:b2184c2d15dd 2 #include "DisplayBace.h"
dkato 0:b2184c2d15dd 3 #include "rtos.h"
dkato 0:b2184c2d15dd 4
dkato 0:b2184c2d15dd 5 #define VIDEO_CVBS (0) /* Analog Video Signal */
dkato 0:b2184c2d15dd 6 #define VIDEO_CMOS_CAMERA (1) /* Digital Video Signal */
dkato 0:b2184c2d15dd 7 #define VIDEO_YCBCR422 (0)
dkato 0:b2184c2d15dd 8 #define VIDEO_RGB888 (1)
dkato 0:b2184c2d15dd 9 #define VIDEO_RGB565 (2)
dkato 0:b2184c2d15dd 10
dkato 0:b2184c2d15dd 11 /**** User Selection *********/
dkato 1:54a3e69f6f09 12 /** Camera setting **/
dkato 0:b2184c2d15dd 13 #define VIDEO_INPUT_METHOD (VIDEO_CMOS_CAMERA) /* Select VIDEO_CVBS or VIDEO_CMOS_CAMERA */
dkato 0:b2184c2d15dd 14 #define VIDEO_INPUT_FORMAT (VIDEO_YCBCR422) /* Select VIDEO_YCBCR422 or VIDEO_RGB888 or VIDEO_RGB565 */
dkato 0:b2184c2d15dd 15 #define USE_VIDEO_CH (0) /* Select 0 or 1 If selecting VIDEO_CMOS_CAMERA, should be 0.) */
dkato 0:b2184c2d15dd 16 #define VIDEO_PAL (0) /* Select 0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */
dkato 1:54a3e69f6f09 17 /** LCD setting **/
dkato 0:b2184c2d15dd 18 #define LCD_TYPE (0) /* Select 0(4.3inch) or 1(7.1inch) */
dkato 0:b2184c2d15dd 19 /*****************************/
dkato 0:b2184c2d15dd 20
dkato 0:b2184c2d15dd 21 /** LCD shield config **/
dkato 0:b2184c2d15dd 22 #if (LCD_TYPE == 0)
dkato 0:b2184c2d15dd 23 #include "LCD_shield_config_4_3inch.h"
dkato 0:b2184c2d15dd 24 #else
dkato 0:b2184c2d15dd 25 #include "LCD_shield_config_7_1inch.h"
dkato 0:b2184c2d15dd 26 #endif
dkato 0:b2184c2d15dd 27
dkato 0:b2184c2d15dd 28 /** Video and Grapics (GRAPHICS_LAYER_0) parameter **/
dkato 0:b2184c2d15dd 29 /* video input */
dkato 0:b2184c2d15dd 30 #if USE_VIDEO_CH == (0)
dkato 0:b2184c2d15dd 31 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0)
dkato 0:b2184c2d15dd 32 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD)
dkato 0:b2184c2d15dd 33 #else
dkato 0:b2184c2d15dd 34 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_1)
dkato 0:b2184c2d15dd 35 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S1_VFIELD)
dkato 0:b2184c2d15dd 36 #endif
dkato 0:b2184c2d15dd 37
dkato 0:b2184c2d15dd 38 /* NTSC or PAL */
dkato 0:b2184c2d15dd 39 #if VIDEO_PAL == 0
dkato 0:b2184c2d15dd 40 #define COL_SYS (DisplayBase::COL_SYS_NTSC_358)
dkato 0:b2184c2d15dd 41 #else
dkato 0:b2184c2d15dd 42 #define COL_SYS (DisplayBase::COL_SYS_PAL_443)
dkato 0:b2184c2d15dd 43 #endif
dkato 0:b2184c2d15dd 44
dkato 0:b2184c2d15dd 45 /* Video input and LCD layer 0 output */
dkato 0:b2184c2d15dd 46 #if VIDEO_INPUT_FORMAT == VIDEO_YCBCR422
dkato 0:b2184c2d15dd 47 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_YCBCR422)
dkato 0:b2184c2d15dd 48 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_YCBCR422)
dkato 0:b2184c2d15dd 49 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_NON)
dkato 0:b2184c2d15dd 50 #elif VIDEO_INPUT_FORMAT == VIDEO_RGB565
dkato 0:b2184c2d15dd 51 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_RGB565)
dkato 0:b2184c2d15dd 52 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB565)
dkato 0:b2184c2d15dd 53 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32_16BIT)
dkato 0:b2184c2d15dd 54 #else
dkato 0:b2184c2d15dd 55 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_RGB888)
dkato 0:b2184c2d15dd 56 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB888)
dkato 0:b2184c2d15dd 57 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32BIT)
dkato 0:b2184c2d15dd 58 #endif
dkato 0:b2184c2d15dd 59
dkato 0:b2184c2d15dd 60 /* The size of the video input is adjusted to the LCD size. */
dkato 0:b2184c2d15dd 61 #define VIDEO_PIXEL_HW LCD_PIXEL_WIDTH
dkato 0:b2184c2d15dd 62 #define VIDEO_PIXEL_VW LCD_PIXEL_HEIGHT
dkato 0:b2184c2d15dd 63
dkato 0:b2184c2d15dd 64 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:b2184c2d15dd 65 in accordance with the frame buffer burst transfer mode. */
dkato 0:b2184c2d15dd 66 /* FRAME BUFFER Parameter GRAPHICS_LAYER_0 */
dkato 0:b2184c2d15dd 67 #define FRAME_BUFFER_NUM (3u)
dkato 0:b2184c2d15dd 68 #if ( VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 || VIDEO_INPUT_FORMAT == VIDEO_RGB565 )
dkato 0:b2184c2d15dd 69 #define FRAME_BUFFER_BYTE_PER_PIXEL (2u)
dkato 0:b2184c2d15dd 70 #else
dkato 0:b2184c2d15dd 71 #define FRAME_BUFFER_BYTE_PER_PIXEL (4u)
dkato 0:b2184c2d15dd 72 #endif
dkato 0:b2184c2d15dd 73 #define FRAME_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:b2184c2d15dd 74
dkato 0:b2184c2d15dd 75 /* TOUCH BUFFER Parameter GRAPHICS_LAYER_1 */
dkato 0:b2184c2d15dd 76 #define TOUCH_BUFFER_BYTE_PER_PIXEL (2u)
dkato 0:b2184c2d15dd 77 #define TOUCH_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * TOUCH_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:b2184c2d15dd 78
dkato 0:b2184c2d15dd 79 /* Touch panel parameter */
dkato 0:b2184c2d15dd 80 #define TOUCH_NUM (2u)
dkato 0:b2184c2d15dd 81 #define DROW_POINT (5)
dkato 0:b2184c2d15dd 82
dkato 0:b2184c2d15dd 83 static DisplayBase Display;
dkato 0:b2184c2d15dd 84 static DigitalOut lcd_pwon(P7_15);
dkato 0:b2184c2d15dd 85 static DigitalOut lcd_blon(P8_1);
dkato 0:b2184c2d15dd 86 static PwmOut lcd_cntrst(P8_15);
dkato 0:b2184c2d15dd 87 static Serial pc(USBTX, USBRX);
dkato 0:b2184c2d15dd 88 static Semaphore sem_touch_int(0);
dkato 0:b2184c2d15dd 89 static TouckKey_LCD_shield touch(P4_0, P2_13, I2C_SDA, I2C_SCL);
dkato 0:b2184c2d15dd 90 static Thread * p_VideoLcdTask = NULL;
dkato 0:b2184c2d15dd 91 static DigitalOut led_blue(LED_BLUE);
dkato 0:b2184c2d15dd 92
dkato 0:b2184c2d15dd 93 #if defined(__ICCARM__)
dkato 0:b2184c2d15dd 94 /* 32 bytes aligned */
dkato 0:b2184c2d15dd 95 #pragma data_alignment=32
dkato 0:b2184c2d15dd 96 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 2:8721836b639d 97 #pragma data_alignment=32
dkato 0:b2184c2d15dd 98 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 2:8721836b639d 99 #pragma data_alignment=32
dkato 0:b2184c2d15dd 100 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 2:8721836b639d 101 #pragma data_alignment=32
dkato 0:b2184c2d15dd 102 static uint8_t user_frame_buffer_touch[TOUCH_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 0:b2184c2d15dd 103 #else
dkato 0:b2184c2d15dd 104 /* 32 bytes aligned */
dkato 0:b2184c2d15dd 105 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
dkato 0:b2184c2d15dd 106 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
dkato 0:b2184c2d15dd 107 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
dkato 0:b2184c2d15dd 108 static uint8_t user_frame_buffer_touch[TOUCH_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
dkato 0:b2184c2d15dd 109 #endif
dkato 1:54a3e69f6f09 110 static uint8_t * FrameBufferTbl[FRAME_BUFFER_NUM] = {user_frame_buffer0, user_frame_buffer1, user_frame_buffer2};
dkato 2:8721836b639d 111 #if VIDEO_INPUT_METHOD == VIDEO_CVBS
dkato 0:b2184c2d15dd 112 static volatile int32_t vfield_count = 0;
dkato 2:8721836b639d 113 #endif
dkato 0:b2184c2d15dd 114 static int write_buff_num = 0;
dkato 0:b2184c2d15dd 115 static int read_buff_num = 0;
dkato 0:b2184c2d15dd 116 static bool graphics_init_end = false;
dkato 0:b2184c2d15dd 117
dkato 0:b2184c2d15dd 118 /****** cache control ******/
dkato 0:b2184c2d15dd 119 static void dcache_clean(void * p_buf, uint32_t size) {
dkato 0:b2184c2d15dd 120 uint32_t start_addr = (uint32_t)p_buf & 0xFFFFFFE0;
dkato 0:b2184c2d15dd 121 uint32_t end_addr = (uint32_t)p_buf + size;
dkato 0:b2184c2d15dd 122 uint32_t addr;
dkato 0:b2184c2d15dd 123
dkato 0:b2184c2d15dd 124 /* Data cache clean */
dkato 0:b2184c2d15dd 125 for (addr = start_addr; addr < end_addr; addr += 0x20) {
dkato 0:b2184c2d15dd 126 __v7_clean_dcache_mva((void *)addr);
dkato 0:b2184c2d15dd 127 }
dkato 0:b2184c2d15dd 128 }
dkato 0:b2184c2d15dd 129
dkato 0:b2184c2d15dd 130 /****** LCD ******/
dkato 0:b2184c2d15dd 131 #if(0) /* When needing LCD Vsync interrupt, please make it effective. */
dkato 0:b2184c2d15dd 132 static void IntCallbackFunc_LoVsync(DisplayBase::int_type_t int_type) {
dkato 0:b2184c2d15dd 133 /* Interrupt callback function for Vsync interruption */
dkato 0:b2184c2d15dd 134 }
dkato 0:b2184c2d15dd 135 #endif
dkato 0:b2184c2d15dd 136
dkato 0:b2184c2d15dd 137 static void Init_LCD_Display(void) {
dkato 0:b2184c2d15dd 138 DisplayBase::graphics_error_t error;
dkato 0:b2184c2d15dd 139 DisplayBase::lcd_config_t lcd_config;
dkato 0:b2184c2d15dd 140 PinName lvds_pin[8] = {
dkato 0:b2184c2d15dd 141 /* data pin */
dkato 0:b2184c2d15dd 142 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
dkato 0:b2184c2d15dd 143 };
dkato 0:b2184c2d15dd 144
dkato 0:b2184c2d15dd 145 lcd_pwon = 0;
dkato 0:b2184c2d15dd 146 lcd_blon = 0;
dkato 0:b2184c2d15dd 147 Thread::wait(100);
dkato 0:b2184c2d15dd 148 lcd_pwon = 1;
dkato 0:b2184c2d15dd 149 lcd_blon = 1;
dkato 0:b2184c2d15dd 150
dkato 0:b2184c2d15dd 151 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
dkato 0:b2184c2d15dd 152
dkato 0:b2184c2d15dd 153 /* Graphics initialization process */
dkato 0:b2184c2d15dd 154 lcd_config = LcdCfgTbl_LCD_shield;
dkato 0:b2184c2d15dd 155 error = Display.Graphics_init(&lcd_config);
dkato 0:b2184c2d15dd 156 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 157 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 158 mbed_die();
dkato 0:b2184c2d15dd 159 }
dkato 0:b2184c2d15dd 160 graphics_init_end = true;
dkato 0:b2184c2d15dd 161
dkato 0:b2184c2d15dd 162 #if(0) /* When needing LCD Vsync interrupt, please make it effective. */
dkato 0:b2184c2d15dd 163 /* Interrupt callback function setting (Vsync signal output from scaler 0) */
dkato 0:b2184c2d15dd 164 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_LoVsync);
dkato 0:b2184c2d15dd 165 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 166 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 167 mbed_die();
dkato 0:b2184c2d15dd 168 }
dkato 0:b2184c2d15dd 169 #endif
dkato 0:b2184c2d15dd 170 }
dkato 0:b2184c2d15dd 171
dkato 0:b2184c2d15dd 172 static void Start_LCD_Display(uint8_t * p_buf) {
dkato 0:b2184c2d15dd 173 DisplayBase::rect_t rect;
dkato 0:b2184c2d15dd 174
dkato 0:b2184c2d15dd 175 rect.vs = 0;
dkato 0:b2184c2d15dd 176 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:b2184c2d15dd 177 rect.hs = 0;
dkato 0:b2184c2d15dd 178 rect.hw = LCD_PIXEL_WIDTH;
dkato 0:b2184c2d15dd 179 Display.Graphics_Read_Setting(
dkato 0:b2184c2d15dd 180 DisplayBase::GRAPHICS_LAYER_0,
dkato 0:b2184c2d15dd 181 (void *)p_buf,
dkato 0:b2184c2d15dd 182 FRAME_BUFFER_STRIDE,
dkato 0:b2184c2d15dd 183 GRAPHICS_FORMAT,
dkato 0:b2184c2d15dd 184 WR_RD_WRSWA,
dkato 0:b2184c2d15dd 185 &rect
dkato 0:b2184c2d15dd 186 );
dkato 0:b2184c2d15dd 187 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 0:b2184c2d15dd 188 }
dkato 0:b2184c2d15dd 189
dkato 0:b2184c2d15dd 190 /****** Video ******/
dkato 0:b2184c2d15dd 191 #if(0) /* When needing video Vsync interrupt, please make it effective. */
dkato 0:b2184c2d15dd 192 static void IntCallbackFunc_ViVsync(DisplayBase::int_type_t int_type) {
dkato 0:b2184c2d15dd 193 /* Interrupt callback function for Vsync interruption */
dkato 0:b2184c2d15dd 194 }
dkato 0:b2184c2d15dd 195 #endif
dkato 0:b2184c2d15dd 196
dkato 0:b2184c2d15dd 197 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) {
dkato 0:b2184c2d15dd 198 /* Interrupt callback function */
dkato 2:8721836b639d 199 #if VIDEO_INPUT_METHOD == VIDEO_CVBS
dkato 0:b2184c2d15dd 200 if (vfield_count == 0) {
dkato 0:b2184c2d15dd 201 vfield_count = 1;
dkato 0:b2184c2d15dd 202 } else {
dkato 0:b2184c2d15dd 203 vfield_count = 0;
dkato 2:8721836b639d 204 #else
dkato 2:8721836b639d 205 {
dkato 2:8721836b639d 206 #endif
dkato 0:b2184c2d15dd 207 if (p_VideoLcdTask != NULL) {
dkato 0:b2184c2d15dd 208 p_VideoLcdTask->signal_set(1);
dkato 0:b2184c2d15dd 209 }
dkato 0:b2184c2d15dd 210 }
dkato 0:b2184c2d15dd 211 }
dkato 0:b2184c2d15dd 212
dkato 0:b2184c2d15dd 213 static void Init_Video(void) {
dkato 0:b2184c2d15dd 214 DisplayBase::graphics_error_t error;
dkato 0:b2184c2d15dd 215
dkato 0:b2184c2d15dd 216 /* Graphics initialization process */
dkato 0:b2184c2d15dd 217 if (graphics_init_end == false) {
dkato 0:b2184c2d15dd 218 /* When not initializing LCD, this processing is needed. */
dkato 0:b2184c2d15dd 219 error = Display.Graphics_init(NULL);
dkato 0:b2184c2d15dd 220 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 221 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 222 mbed_die();
dkato 0:b2184c2d15dd 223 }
dkato 0:b2184c2d15dd 224 graphics_init_end = true;
dkato 0:b2184c2d15dd 225 }
dkato 0:b2184c2d15dd 226
dkato 0:b2184c2d15dd 227 #if VIDEO_INPUT_METHOD == VIDEO_CVBS
dkato 0:b2184c2d15dd 228 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
dkato 0:b2184c2d15dd 229 if( error != DisplayBase::GRAPHICS_OK ) {
dkato 0:b2184c2d15dd 230 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 231 mbed_die();
dkato 0:b2184c2d15dd 232 }
dkato 0:b2184c2d15dd 233 #elif VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA
dkato 0:b2184c2d15dd 234 DisplayBase::video_ext_in_config_t ext_in_config;
dkato 0:b2184c2d15dd 235 PinName cmos_camera_pin[11] = {
dkato 0:b2184c2d15dd 236 /* data pin */
dkato 0:b2184c2d15dd 237 P2_7, P2_6, P2_5, P2_4, P2_3, P2_2, P2_1, P2_0,
dkato 0:b2184c2d15dd 238 /* control pin */
dkato 0:b2184c2d15dd 239 P10_0, /* DV0_CLK */
dkato 0:b2184c2d15dd 240 P1_0, /* DV0_Vsync */
dkato 0:b2184c2d15dd 241 P1_1 /* DV0_Hsync */
dkato 0:b2184c2d15dd 242 };
dkato 0:b2184c2d15dd 243
dkato 0:b2184c2d15dd 244 /* MT9V111 camera input config */
dkato 0:b2184c2d15dd 245 ext_in_config.inp_format = DisplayBase::VIDEO_EXTIN_FORMAT_BT601; /* BT601 8bit YCbCr format */
dkato 0:b2184c2d15dd 246 ext_in_config.inp_pxd_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing data */
dkato 0:b2184c2d15dd 247 ext_in_config.inp_vs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Vsync signals */
dkato 0:b2184c2d15dd 248 ext_in_config.inp_hs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Hsync signals */
dkato 0:b2184c2d15dd 249 ext_in_config.inp_endian_on = DisplayBase::OFF; /* External input bit endian change on/off */
dkato 0:b2184c2d15dd 250 ext_in_config.inp_swap_on = DisplayBase::OFF; /* External input B/R signal swap on/off */
dkato 0:b2184c2d15dd 251 ext_in_config.inp_vs_inv = DisplayBase::SIG_POL_NOT_INVERTED; /* External input DV_VSYNC inversion control */
dkato 0:b2184c2d15dd 252 ext_in_config.inp_hs_inv = DisplayBase::SIG_POL_INVERTED; /* External input DV_HSYNC inversion control */
dkato 0:b2184c2d15dd 253 ext_in_config.inp_f525_625 = DisplayBase::EXTIN_LINE_525; /* Number of lines for BT.656 external input */
dkato 0:b2184c2d15dd 254 ext_in_config.inp_h_pos = DisplayBase::EXTIN_H_POS_CRYCBY; /* Y/Cb/Y/Cr data string start timing to Hsync reference */
dkato 0:b2184c2d15dd 255 ext_in_config.cap_vs_pos = 6; /* Capture start position from Vsync */
dkato 0:b2184c2d15dd 256 ext_in_config.cap_hs_pos = 150; /* Capture start position form Hsync */
dkato 0:b2184c2d15dd 257 #if (LCD_TYPE == 0)
dkato 0:b2184c2d15dd 258 /* The same screen ratio as the screen ratio of the LCD. */
dkato 0:b2184c2d15dd 259 ext_in_config.cap_width = 640; /* Capture width */
dkato 0:b2184c2d15dd 260 ext_in_config.cap_height = 363; /* Capture height Max 468[line]
dkato 0:b2184c2d15dd 261 Due to CMOS(MT9V111) output signal timing and VDC5 specification */
dkato 0:b2184c2d15dd 262 #else
dkato 0:b2184c2d15dd 263 ext_in_config.cap_width = 640; /* Capture width */
dkato 1:54a3e69f6f09 264 ext_in_config.cap_height = 468; /* Capture height Max 468[line]
dkato 0:b2184c2d15dd 265 Due to CMOS(MT9V111) output signal timing and VDC5 specification */
dkato 0:b2184c2d15dd 266 #endif
dkato 0:b2184c2d15dd 267 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_EXT, &ext_in_config);
dkato 0:b2184c2d15dd 268 if( error != DisplayBase::GRAPHICS_OK ) {
dkato 0:b2184c2d15dd 269 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 270 mbed_die();
dkato 0:b2184c2d15dd 271 }
dkato 0:b2184c2d15dd 272
dkato 1:54a3e69f6f09 273 /* Camera input port setting */
dkato 0:b2184c2d15dd 274 error = Display.Graphics_Dvinput_Port_Init(cmos_camera_pin, 11);
dkato 0:b2184c2d15dd 275 if( error != DisplayBase::GRAPHICS_OK ) {
dkato 0:b2184c2d15dd 276 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 277 mbed_die();
dkato 0:b2184c2d15dd 278 }
dkato 0:b2184c2d15dd 279 #endif
dkato 0:b2184c2d15dd 280
dkato 0:b2184c2d15dd 281 #if(0) /* When needing video Vsync interrupt, please make it effective. */
dkato 0:b2184c2d15dd 282 /* Interrupt callback function setting (Vsync signal input to scaler 0) */
dkato 0:b2184c2d15dd 283 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VI_VSYNC, 0, IntCallbackFunc_ViVsync);
dkato 0:b2184c2d15dd 284 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 285 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 286 mbed_die();
dkato 0:b2184c2d15dd 287 }
dkato 0:b2184c2d15dd 288 #endif
dkato 0:b2184c2d15dd 289
dkato 0:b2184c2d15dd 290 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
dkato 0:b2184c2d15dd 291 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield);
dkato 0:b2184c2d15dd 292 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 293 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 294 mbed_die();
dkato 0:b2184c2d15dd 295 }
dkato 0:b2184c2d15dd 296 }
dkato 0:b2184c2d15dd 297
dkato 0:b2184c2d15dd 298 static void Start_Video(uint8_t * p_buf) {
dkato 0:b2184c2d15dd 299 DisplayBase::graphics_error_t error;
dkato 0:b2184c2d15dd 300
dkato 0:b2184c2d15dd 301 /* Video capture setting (progressive form fixed) */
dkato 0:b2184c2d15dd 302 error = Display.Video_Write_Setting(
dkato 0:b2184c2d15dd 303 VIDEO_INPUT_CH,
dkato 0:b2184c2d15dd 304 COL_SYS,
dkato 0:b2184c2d15dd 305 p_buf,
dkato 0:b2184c2d15dd 306 FRAME_BUFFER_STRIDE,
dkato 0:b2184c2d15dd 307 VIDEO_FORMAT,
dkato 0:b2184c2d15dd 308 WR_RD_WRSWA,
dkato 0:b2184c2d15dd 309 VIDEO_PIXEL_VW,
dkato 0:b2184c2d15dd 310 VIDEO_PIXEL_HW
dkato 0:b2184c2d15dd 311 );
dkato 0:b2184c2d15dd 312 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 313 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 314 mbed_die();
dkato 0:b2184c2d15dd 315 }
dkato 0:b2184c2d15dd 316
dkato 0:b2184c2d15dd 317 /* Video write process start */
dkato 0:b2184c2d15dd 318 error = Display.Video_Start(VIDEO_INPUT_CH);
dkato 0:b2184c2d15dd 319 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 320 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 321 mbed_die();
dkato 0:b2184c2d15dd 322 }
dkato 0:b2184c2d15dd 323
dkato 0:b2184c2d15dd 324 /* Video write process stop */
dkato 0:b2184c2d15dd 325 error = Display.Video_Stop(VIDEO_INPUT_CH);
dkato 0:b2184c2d15dd 326 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 327 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 328 mbed_die();
dkato 0:b2184c2d15dd 329 }
dkato 0:b2184c2d15dd 330
dkato 0:b2184c2d15dd 331 /* Video write process start */
dkato 0:b2184c2d15dd 332 error = Display.Video_Start(VIDEO_INPUT_CH);
dkato 0:b2184c2d15dd 333 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 334 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 335 mbed_die();
dkato 0:b2184c2d15dd 336 }
dkato 0:b2184c2d15dd 337 }
dkato 0:b2184c2d15dd 338
dkato 0:b2184c2d15dd 339 /****** Video input is output to LCD ******/
dkato 2:8721836b639d 340 static void video_lcd_task(void) {
dkato 0:b2184c2d15dd 341 DisplayBase::graphics_error_t error;
dkato 0:b2184c2d15dd 342 int wk_num;
dkato 0:b2184c2d15dd 343 int i;
dkato 0:b2184c2d15dd 344
dkato 0:b2184c2d15dd 345 /* Initialization memory */
dkato 0:b2184c2d15dd 346 for (i = 0; i < FRAME_BUFFER_NUM; i++) {
dkato 0:b2184c2d15dd 347 memset(FrameBufferTbl[i], 0, (FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT));
dkato 0:b2184c2d15dd 348 dcache_clean(FrameBufferTbl[i], (FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT));
dkato 0:b2184c2d15dd 349 }
dkato 0:b2184c2d15dd 350
dkato 0:b2184c2d15dd 351 /* Start of Video */
dkato 0:b2184c2d15dd 352 Start_Video(FrameBufferTbl[write_buff_num]);
dkato 0:b2184c2d15dd 353
dkato 0:b2184c2d15dd 354 /* Wait for first video drawing */
dkato 0:b2184c2d15dd 355 Thread::signal_wait(1);
dkato 0:b2184c2d15dd 356 write_buff_num++;
dkato 0:b2184c2d15dd 357 if (write_buff_num >= FRAME_BUFFER_NUM) {
dkato 0:b2184c2d15dd 358 write_buff_num = 0;
dkato 0:b2184c2d15dd 359 }
dkato 0:b2184c2d15dd 360 error = Display.Video_Write_Change(VIDEO_INPUT_CH, FrameBufferTbl[write_buff_num], FRAME_BUFFER_STRIDE);
dkato 0:b2184c2d15dd 361 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 362 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 363 mbed_die();
dkato 0:b2184c2d15dd 364 }
dkato 0:b2184c2d15dd 365
dkato 0:b2184c2d15dd 366 /* Start of LCD */
dkato 0:b2184c2d15dd 367 Start_LCD_Display(FrameBufferTbl[read_buff_num]);
dkato 0:b2184c2d15dd 368
dkato 0:b2184c2d15dd 369 /* Backlight on */
dkato 0:b2184c2d15dd 370 Thread::wait(200);
dkato 0:b2184c2d15dd 371 lcd_cntrst.write(1.0);
dkato 0:b2184c2d15dd 372
dkato 0:b2184c2d15dd 373 while (1) {
dkato 0:b2184c2d15dd 374 Thread::signal_wait(1);
dkato 0:b2184c2d15dd 375 wk_num = write_buff_num + 1;
dkato 0:b2184c2d15dd 376 if (wk_num >= FRAME_BUFFER_NUM) {
dkato 0:b2184c2d15dd 377 wk_num = 0;
dkato 0:b2184c2d15dd 378 }
dkato 0:b2184c2d15dd 379 /* If the next buffer is empty, it's changed. */
dkato 0:b2184c2d15dd 380 if (wk_num != read_buff_num) {
dkato 0:b2184c2d15dd 381 read_buff_num = write_buff_num;
dkato 0:b2184c2d15dd 382 write_buff_num = wk_num;
dkato 0:b2184c2d15dd 383 /* Change video buffer */
dkato 0:b2184c2d15dd 384 error = Display.Video_Write_Change(VIDEO_INPUT_CH, FrameBufferTbl[write_buff_num], FRAME_BUFFER_STRIDE);
dkato 0:b2184c2d15dd 385 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:b2184c2d15dd 386 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:b2184c2d15dd 387 mbed_die();
dkato 0:b2184c2d15dd 388 }
dkato 0:b2184c2d15dd 389 /* Change LCD buffer */
dkato 0:b2184c2d15dd 390 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0, (void *)FrameBufferTbl[read_buff_num]);
dkato 0:b2184c2d15dd 391 }
dkato 0:b2184c2d15dd 392 }
dkato 0:b2184c2d15dd 393 }
dkato 0:b2184c2d15dd 394
dkato 0:b2184c2d15dd 395 /****** Touch panel ******/
dkato 0:b2184c2d15dd 396 static void drow_touch_pos(uint8_t * p_buf, int id, int x, int y) {
dkato 0:b2184c2d15dd 397 int idx_base;
dkato 0:b2184c2d15dd 398 int wk_idx;
dkato 0:b2184c2d15dd 399 int i;
dkato 0:b2184c2d15dd 400 int j;
dkato 0:b2184c2d15dd 401 uint8_t coller_pix[TOUCH_BUFFER_BYTE_PER_PIXEL]; /* ARGB4444 */
dkato 0:b2184c2d15dd 402
dkato 0:b2184c2d15dd 403 /* A coordinate in the upper left is calculated from a central coordinate. */
dkato 0:b2184c2d15dd 404 if ((x - (DROW_POINT / 2)) >= 0) {
dkato 0:b2184c2d15dd 405 x -= (DROW_POINT / 2);
dkato 0:b2184c2d15dd 406 }
dkato 0:b2184c2d15dd 407 if (x > (LCD_PIXEL_WIDTH - DROW_POINT)) {
dkato 0:b2184c2d15dd 408 x = (LCD_PIXEL_WIDTH - DROW_POINT);
dkato 0:b2184c2d15dd 409 }
dkato 0:b2184c2d15dd 410 if ((y - (DROW_POINT / 2)) >= 0) {
dkato 0:b2184c2d15dd 411 y -= (DROW_POINT / 2);
dkato 0:b2184c2d15dd 412 }
dkato 0:b2184c2d15dd 413 if (y > (LCD_PIXEL_HEIGHT - DROW_POINT)) {
dkato 0:b2184c2d15dd 414 y = (LCD_PIXEL_HEIGHT - DROW_POINT);
dkato 0:b2184c2d15dd 415 }
dkato 0:b2184c2d15dd 416 idx_base = (x + (LCD_PIXEL_WIDTH * y)) * TOUCH_BUFFER_BYTE_PER_PIXEL;
dkato 0:b2184c2d15dd 417
dkato 0:b2184c2d15dd 418 /* Select color */
dkato 0:b2184c2d15dd 419 if (id == 0) {
dkato 0:b2184c2d15dd 420 /* Blue */
dkato 0:b2184c2d15dd 421 coller_pix[0] = 0x0F; /* 4:Green 4:Blue */
dkato 0:b2184c2d15dd 422 coller_pix[1] = 0xF0; /* 4:Alpha 4:Red */
dkato 0:b2184c2d15dd 423 } else {
dkato 0:b2184c2d15dd 424 /* Pink */
dkato 0:b2184c2d15dd 425 coller_pix[0] = 0x07; /* 4:Green 4:Blue */
dkato 0:b2184c2d15dd 426 coller_pix[1] = 0xFF; /* 4:Alpha 4:Red */
dkato 0:b2184c2d15dd 427 }
dkato 0:b2184c2d15dd 428
dkato 0:b2184c2d15dd 429 /* Drawing */
dkato 0:b2184c2d15dd 430 for (i = 0; i < DROW_POINT; i++) {
dkato 0:b2184c2d15dd 431 wk_idx = idx_base + (LCD_PIXEL_WIDTH * TOUCH_BUFFER_BYTE_PER_PIXEL * i);
dkato 0:b2184c2d15dd 432 for (j = 0; j < DROW_POINT; j++) {
dkato 0:b2184c2d15dd 433 p_buf[wk_idx++] = coller_pix[0];
dkato 0:b2184c2d15dd 434 p_buf[wk_idx++] = coller_pix[1];
dkato 0:b2184c2d15dd 435 }
dkato 0:b2184c2d15dd 436 }
dkato 0:b2184c2d15dd 437 }
dkato 0:b2184c2d15dd 438
dkato 0:b2184c2d15dd 439 static void drow_touch_keyonoff(uint8_t * p_buf, int id, bool onoff) {
dkato 0:b2184c2d15dd 440 int idx_base;
dkato 0:b2184c2d15dd 441 int wk_idx;
dkato 0:b2184c2d15dd 442 int i;
dkato 0:b2184c2d15dd 443 int j;
dkato 0:b2184c2d15dd 444 uint8_t coller_pix[TOUCH_BUFFER_BYTE_PER_PIXEL]; /* ARGB4444 */
dkato 0:b2184c2d15dd 445
dkato 0:b2184c2d15dd 446 /* Display position */
dkato 0:b2184c2d15dd 447 if (id == 0) {
dkato 0:b2184c2d15dd 448 idx_base = 0;
dkato 0:b2184c2d15dd 449 } else {
dkato 0:b2184c2d15dd 450 idx_base = DROW_POINT * TOUCH_BUFFER_BYTE_PER_PIXEL;
dkato 0:b2184c2d15dd 451 }
dkato 0:b2184c2d15dd 452
dkato 0:b2184c2d15dd 453 /* Select color */
dkato 0:b2184c2d15dd 454 if (onoff == false) {
dkato 0:b2184c2d15dd 455 /* Transparency */
dkato 0:b2184c2d15dd 456 coller_pix[0] = 0x00; /* 4:Green 4:Blue */
dkato 0:b2184c2d15dd 457 coller_pix[1] = 0x00; /* 4:Alpha 4:Red */
dkato 0:b2184c2d15dd 458 } else {
dkato 0:b2184c2d15dd 459 /* White */
dkato 0:b2184c2d15dd 460 coller_pix[0] = 0xff; /* 4:Green 4:Blue */
dkato 0:b2184c2d15dd 461 coller_pix[1] = 0xff; /* 4:Alpha 4:Red */
dkato 0:b2184c2d15dd 462 }
dkato 0:b2184c2d15dd 463
dkato 0:b2184c2d15dd 464 /* Drawing */
dkato 0:b2184c2d15dd 465 for (i = 0; i < DROW_POINT; i++) {
dkato 0:b2184c2d15dd 466 wk_idx = idx_base + (LCD_PIXEL_WIDTH * TOUCH_BUFFER_BYTE_PER_PIXEL * i);
dkato 0:b2184c2d15dd 467 for (j = 0; j < DROW_POINT; j++) {
dkato 0:b2184c2d15dd 468 p_buf[wk_idx++] = coller_pix[0];
dkato 0:b2184c2d15dd 469 p_buf[wk_idx++] = coller_pix[1];
dkato 0:b2184c2d15dd 470 }
dkato 0:b2184c2d15dd 471 }
dkato 0:b2184c2d15dd 472 }
dkato 0:b2184c2d15dd 473
dkato 0:b2184c2d15dd 474 static void touch_int_callback(void) {
dkato 0:b2184c2d15dd 475 sem_touch_int.release();
dkato 0:b2184c2d15dd 476 }
dkato 0:b2184c2d15dd 477
dkato 2:8721836b639d 478 static void touch_task(void) {
dkato 0:b2184c2d15dd 479 DisplayBase::rect_t rect;
dkato 0:b2184c2d15dd 480 TouchKey::touch_pos_t touch_pos[TOUCH_NUM];
dkato 0:b2184c2d15dd 481 int touch_num = 0;
dkato 0:b2184c2d15dd 482 int touch_num_last = 0;
dkato 0:b2184c2d15dd 483 int i;
dkato 0:b2184c2d15dd 484
dkato 0:b2184c2d15dd 485 /* The layer by which the touch panel location is drawn */
dkato 0:b2184c2d15dd 486 memset(user_frame_buffer_touch, 0, sizeof(user_frame_buffer_touch));
dkato 0:b2184c2d15dd 487 dcache_clean(user_frame_buffer_touch, sizeof(user_frame_buffer_touch));
dkato 0:b2184c2d15dd 488 rect.vs = 0;
dkato 0:b2184c2d15dd 489 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:b2184c2d15dd 490 rect.hs = 0;
dkato 0:b2184c2d15dd 491 rect.hw = LCD_PIXEL_WIDTH;
dkato 0:b2184c2d15dd 492 Display.Graphics_Read_Setting(
dkato 0:b2184c2d15dd 493 DisplayBase::GRAPHICS_LAYER_1,
dkato 0:b2184c2d15dd 494 (void *)user_frame_buffer_touch,
dkato 0:b2184c2d15dd 495 TOUCH_BUFFER_STRIDE,
dkato 0:b2184c2d15dd 496 DisplayBase::GRAPHICS_FORMAT_ARGB4444,
dkato 0:b2184c2d15dd 497 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:b2184c2d15dd 498 &rect
dkato 0:b2184c2d15dd 499 );
dkato 0:b2184c2d15dd 500 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_1);
dkato 0:b2184c2d15dd 501
dkato 0:b2184c2d15dd 502 /* Callback setting */
dkato 0:b2184c2d15dd 503 touch.SetCallback(&touch_int_callback);
dkato 0:b2184c2d15dd 504
dkato 0:b2184c2d15dd 505 /* Reset touch IC */
dkato 0:b2184c2d15dd 506 touch.Reset();
dkato 0:b2184c2d15dd 507
dkato 0:b2184c2d15dd 508 while (1) {
dkato 0:b2184c2d15dd 509 /* Wait touch event */
dkato 0:b2184c2d15dd 510 sem_touch_int.wait();
dkato 0:b2184c2d15dd 511
dkato 0:b2184c2d15dd 512 /* Get touch coordinates */
dkato 0:b2184c2d15dd 513 touch_num = touch.GetCoordinates(TOUCH_NUM, touch_pos);
dkato 0:b2184c2d15dd 514
dkato 0:b2184c2d15dd 515 /* When it's a new touch, touch frame buffer is initialized */
dkato 0:b2184c2d15dd 516 if ((touch_num != 0) && (touch_num_last == 0)) {
dkato 0:b2184c2d15dd 517 memset(user_frame_buffer_touch, 0, sizeof(user_frame_buffer_touch));
dkato 0:b2184c2d15dd 518 }
dkato 0:b2184c2d15dd 519 touch_num_last = touch_num;
dkato 0:b2184c2d15dd 520
dkato 0:b2184c2d15dd 521 /* Drawing of a touch coordinate */
dkato 0:b2184c2d15dd 522 for (i = 0; i < TOUCH_NUM; i ++) {
dkato 0:b2184c2d15dd 523 printf("{valid=%d,x=%d,y=%d} ", touch_pos[i].valid, touch_pos[i].x, touch_pos[i].y);
dkato 0:b2184c2d15dd 524 drow_touch_keyonoff(user_frame_buffer_touch, i, touch_pos[i].valid);
dkato 0:b2184c2d15dd 525 if (touch_pos[i].valid) {
dkato 0:b2184c2d15dd 526 drow_touch_pos(user_frame_buffer_touch, i, touch_pos[i].x, touch_pos[i].y);
dkato 0:b2184c2d15dd 527 }
dkato 0:b2184c2d15dd 528 }
dkato 0:b2184c2d15dd 529 printf("\n");
dkato 0:b2184c2d15dd 530
dkato 0:b2184c2d15dd 531 /* Data cache clean */
dkato 0:b2184c2d15dd 532 dcache_clean(user_frame_buffer_touch, sizeof(user_frame_buffer_touch));
dkato 0:b2184c2d15dd 533 }
dkato 0:b2184c2d15dd 534 }
dkato 0:b2184c2d15dd 535
dkato 0:b2184c2d15dd 536 /****** main ******/
dkato 0:b2184c2d15dd 537 int main(void) {
dkato 0:b2184c2d15dd 538 /* Change the baud rate of the printf() */
dkato 0:b2184c2d15dd 539 pc.baud(921600);
dkato 0:b2184c2d15dd 540
dkato 0:b2184c2d15dd 541 /* Initialization of LCD */
dkato 0:b2184c2d15dd 542 Init_LCD_Display(); /* When using LCD, please call before than Init_Video(). */
dkato 0:b2184c2d15dd 543
dkato 0:b2184c2d15dd 544 /* Initialization of Video */
dkato 0:b2184c2d15dd 545 Init_Video();
dkato 0:b2184c2d15dd 546
dkato 0:b2184c2d15dd 547 /* Start Video and Lcd processing */
dkato 2:8721836b639d 548 p_VideoLcdTask = new Thread;
dkato 2:8721836b639d 549 p_VideoLcdTask->start(video_lcd_task);
dkato 0:b2184c2d15dd 550
dkato 0:b2184c2d15dd 551 /* Start touch panel processing */
dkato 2:8721836b639d 552 Thread touchTask;
dkato 2:8721836b639d 553 touchTask.start(touch_task);
dkato 0:b2184c2d15dd 554
dkato 0:b2184c2d15dd 555 while (1) {
dkato 0:b2184c2d15dd 556 led_blue = !led_blue;
dkato 0:b2184c2d15dd 557 Thread::wait(1000);
dkato 0:b2184c2d15dd 558 }
dkato 0:b2184c2d15dd 559 }