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:
Thu Jun 30 13:26:05 2016 +0000
Revision:
1:54a3e69f6f09
Parent:
0:b2184c2d15dd
Child:
2:8721836b639d
minor change

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