MY TRAIAL (1)

Dependencies:   FATFileSystem GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP mbed-rtos mbed

Fork of GR-PEACH_NTSC_in_2ch_MOD_try by Hirofumi Inomata

I put an OVERVIEW in the blow URL. https://developer.mbed.org/users/digiponta/notebook/my-trial-ar--vr-2-eyes-display-goes-by-a-gr-peach/

Committer:
digiponta
Date:
Sun Sep 11 13:38:32 2016 +0000
Revision:
5:f6df6a4c32a7
Parent:
4:2bea25cf1883
Child:
6:3cb7758c3f17
fread?????SD??????????????????????????JPEG????????????????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:f8cb87301ad8 1 #include "mbed.h"
digiponta 3:1daadbe91b49 2 #include "SDFileSystem.h"
digiponta 5:f6df6a4c32a7 3 #include "FATFileSystem.h"
digiponta 3:1daadbe91b49 4 #include "JPEG_Converter.h"
dkato 0:f8cb87301ad8 5 #include "DisplayBace.h"
dkato 0:f8cb87301ad8 6 #include "rtos.h"
dkato 0:f8cb87301ad8 7
digiponta 3:1daadbe91b49 8 DigitalOut led1(LED1);
digiponta 3:1daadbe91b49 9 Serial pc(USBTX, USBRX);
digiponta 3:1daadbe91b49 10 SDFileSystem sd(P8_5, P8_6, P8_3, P8_4, "sd");
digiponta 5:f6df6a4c32a7 11 FILE *rd_fp = NULL;
digiponta 5:f6df6a4c32a7 12 FILE *wr_fp = NULL;
digiponta 5:f6df6a4c32a7 13 long fsize = 0;
digiponta 5:f6df6a4c32a7 14 DIR *dir;
digiponta 5:f6df6a4c32a7 15 struct dirent *dp;
digiponta 3:1daadbe91b49 16
digiponta 3:1daadbe91b49 17 DigitalIn sw0(USER_BUTTON0);
digiponta 3:1daadbe91b49 18 // DigitalIn sw1(P6_1);
digiponta 3:1daadbe91b49 19 DigitalIn sw2(P4_0);
digiponta 3:1daadbe91b49 20 DigitalIn sw3(P2_13);
digiponta 3:1daadbe91b49 21
digiponta 3:1daadbe91b49 22 int prev_sw0 = 1;
digiponta 3:1daadbe91b49 23 // int prev_sw1 = 1;
digiponta 3:1daadbe91b49 24 int prev_sw2 = 1;
digiponta 3:1daadbe91b49 25 int prev_sw3 = 1;
digiponta 3:1daadbe91b49 26 int mode = 0;
digiponta 3:1daadbe91b49 27 char fname[64];
digiponta 3:1daadbe91b49 28
digiponta 3:1daadbe91b49 29 unsigned int imgCnt = 0;
digiponta 3:1daadbe91b49 30 unsigned int viewCnt = 0;
digiponta 3:1daadbe91b49 31
digiponta 3:1daadbe91b49 32
dkato 0:f8cb87301ad8 33 #define VIDEO_YCBCR422 (0)
dkato 0:f8cb87301ad8 34 #define VIDEO_RGB888 (1)
dkato 0:f8cb87301ad8 35 #define VIDEO_RGB565 (2)
dkato 0:f8cb87301ad8 36
dkato 0:f8cb87301ad8 37 /**** User Selection *********/
dkato 0:f8cb87301ad8 38 /** Camera setting **/
dkato 0:f8cb87301ad8 39 #define VIDEO_INPUT_FORMAT (VIDEO_YCBCR422) /* Select VIDEO_YCBCR422 or VIDEO_RGB888 or VIDEO_RGB565 */
dkato 0:f8cb87301ad8 40 #define VIDEO_PAL (0) /* Select 0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */
dkato 0:f8cb87301ad8 41 /** LCD setting **/
dkato 0:f8cb87301ad8 42 #define LCD_TYPE (0) /* Select 0(4.3inch) or 1(7.1inch) */
dkato 0:f8cb87301ad8 43 /*****************************/
dkato 0:f8cb87301ad8 44
dkato 0:f8cb87301ad8 45 /** LCD shield config **/
dkato 0:f8cb87301ad8 46 #if (LCD_TYPE == 0)
dkato 0:f8cb87301ad8 47 #include "LCD_shield_config_4_3inch.h"
dkato 0:f8cb87301ad8 48 #else
dkato 0:f8cb87301ad8 49 #include "LCD_shield_config_7_1inch.h"
dkato 0:f8cb87301ad8 50 #endif
dkato 0:f8cb87301ad8 51
dkato 0:f8cb87301ad8 52 /** Video and Grapics (GRAPHICS_LAYER_0) parameter **/
dkato 0:f8cb87301ad8 53 /* NTSC or PAL */
dkato 0:f8cb87301ad8 54 #if VIDEO_PAL == 0
dkato 0:f8cb87301ad8 55 #define COL_SYS (DisplayBase::COL_SYS_NTSC_358)
dkato 0:f8cb87301ad8 56 #else
dkato 0:f8cb87301ad8 57 #define COL_SYS (DisplayBase::COL_SYS_PAL_443)
dkato 0:f8cb87301ad8 58 #endif
dkato 0:f8cb87301ad8 59
dkato 0:f8cb87301ad8 60 /* Video input and LCD layer 0 output */
dkato 0:f8cb87301ad8 61 #if VIDEO_INPUT_FORMAT == VIDEO_YCBCR422
dkato 0:f8cb87301ad8 62 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_YCBCR422)
dkato 0:f8cb87301ad8 63 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_YCBCR422)
dkato 0:f8cb87301ad8 64 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_NON)
dkato 0:f8cb87301ad8 65 #elif VIDEO_INPUT_FORMAT == VIDEO_RGB565
dkato 0:f8cb87301ad8 66 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_RGB565)
dkato 0:f8cb87301ad8 67 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB565)
dkato 0:f8cb87301ad8 68 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32_16BIT)
dkato 0:f8cb87301ad8 69 #else
dkato 0:f8cb87301ad8 70 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_RGB888)
dkato 0:f8cb87301ad8 71 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB888)
dkato 0:f8cb87301ad8 72 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32BIT)
dkato 0:f8cb87301ad8 73 #endif
dkato 0:f8cb87301ad8 74
dkato 0:f8cb87301ad8 75 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:f8cb87301ad8 76 in accordance with the frame buffer burst transfer mode. */
dkato 0:f8cb87301ad8 77 /* FRAME BUFFER Parameter GRAPHICS_LAYER_0 */
dkato 0:f8cb87301ad8 78 #if ( VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 || VIDEO_INPUT_FORMAT == VIDEO_RGB565 )
dkato 0:f8cb87301ad8 79 #define FRAME_BUFFER_BYTE_PER_PIXEL (2u)
dkato 0:f8cb87301ad8 80 #else
dkato 0:f8cb87301ad8 81 #define FRAME_BUFFER_BYTE_PER_PIXEL (4u)
dkato 0:f8cb87301ad8 82 #endif
dkato 0:f8cb87301ad8 83 #define FRAME_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:f8cb87301ad8 84
dkato 0:f8cb87301ad8 85 static DisplayBase Display;
dkato 0:f8cb87301ad8 86 static DigitalOut lcd_pwon(P7_15);
dkato 0:f8cb87301ad8 87 static DigitalOut lcd_blon(P8_1);
dkato 0:f8cb87301ad8 88 static PwmOut lcd_cntrst(P8_15);
dkato 0:f8cb87301ad8 89 static DigitalOut led_blue(LED_BLUE);
dkato 0:f8cb87301ad8 90
dkato 0:f8cb87301ad8 91 #if defined(__ICCARM__)
dkato 0:f8cb87301ad8 92 /* 32 bytes aligned */
dkato 0:f8cb87301ad8 93 #pragma data_alignment=32
dkato 0:f8cb87301ad8 94 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
digiponta 3:1daadbe91b49 95 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 0:f8cb87301ad8 96 #pragma data_alignment=4
dkato 0:f8cb87301ad8 97 #else
dkato 0:f8cb87301ad8 98 /* 32 bytes aligned */
dkato 0:f8cb87301ad8 99 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
digiponta 3:1daadbe91b49 100 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
dkato 0:f8cb87301ad8 101 #endif
dkato 0:f8cb87301ad8 102 static bool graphics_init_end = false;
dkato 0:f8cb87301ad8 103
dkato 0:f8cb87301ad8 104 /****** LCD ******/
dkato 0:f8cb87301ad8 105 static void Init_LCD_Display(void) {
dkato 0:f8cb87301ad8 106 DisplayBase::graphics_error_t error;
dkato 0:f8cb87301ad8 107 DisplayBase::lcd_config_t lcd_config;
dkato 0:f8cb87301ad8 108 PinName lvds_pin[8] = {
dkato 0:f8cb87301ad8 109 /* data pin */
dkato 0:f8cb87301ad8 110 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
dkato 0:f8cb87301ad8 111 };
dkato 0:f8cb87301ad8 112
dkato 0:f8cb87301ad8 113 lcd_pwon = 0;
dkato 0:f8cb87301ad8 114 lcd_blon = 0;
dkato 0:f8cb87301ad8 115 Thread::wait(100);
dkato 0:f8cb87301ad8 116 lcd_pwon = 1;
dkato 0:f8cb87301ad8 117 lcd_blon = 1;
dkato 0:f8cb87301ad8 118
dkato 0:f8cb87301ad8 119 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
dkato 0:f8cb87301ad8 120
dkato 0:f8cb87301ad8 121 /* Graphics initialization process */
dkato 0:f8cb87301ad8 122 lcd_config = LcdCfgTbl_LCD_shield;
dkato 0:f8cb87301ad8 123 error = Display.Graphics_init(&lcd_config);
dkato 0:f8cb87301ad8 124 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 125 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 126 mbed_die();
dkato 0:f8cb87301ad8 127 }
dkato 0:f8cb87301ad8 128 graphics_init_end = true;
dkato 0:f8cb87301ad8 129 }
dkato 0:f8cb87301ad8 130
dkato 0:f8cb87301ad8 131 static void Start_LCD_Display(uint8_t * p_buf) {
dkato 0:f8cb87301ad8 132 DisplayBase::rect_t rect;
dkato 0:f8cb87301ad8 133
dkato 0:f8cb87301ad8 134 rect.vs = 0;
dkato 0:f8cb87301ad8 135 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:f8cb87301ad8 136 rect.hs = 0;
dkato 0:f8cb87301ad8 137 rect.hw = LCD_PIXEL_WIDTH;
dkato 0:f8cb87301ad8 138 Display.Graphics_Read_Setting(
dkato 0:f8cb87301ad8 139 DisplayBase::GRAPHICS_LAYER_0,
dkato 0:f8cb87301ad8 140 (void *)p_buf,
dkato 0:f8cb87301ad8 141 FRAME_BUFFER_STRIDE,
dkato 0:f8cb87301ad8 142 GRAPHICS_FORMAT,
dkato 0:f8cb87301ad8 143 WR_RD_WRSWA,
dkato 0:f8cb87301ad8 144 &rect
dkato 0:f8cb87301ad8 145 );
dkato 0:f8cb87301ad8 146 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 0:f8cb87301ad8 147 }
dkato 0:f8cb87301ad8 148
digiponta 4:2bea25cf1883 149 static volatile int32_t vfield_count_0 = 1;
digiponta 4:2bea25cf1883 150 static volatile int32_t vfield_count_1 = 1;
digiponta 3:1daadbe91b49 151
digiponta 3:1daadbe91b49 152 /** Video and Grapics (GRAPHICS_LAYER_0) parameter **/
digiponta 3:1daadbe91b49 153 /* video input */
digiponta 3:1daadbe91b49 154 #define VIDEO_INPUT_CH_0 (DisplayBase::VIDEO_INPUT_CHANNEL_0)
digiponta 4:2bea25cf1883 155 #define VIDEO_INPUT_CH_1 (DisplayBase::VIDEO_INPUT_CHANNEL_1)
digiponta 3:1daadbe91b49 156 #define VIDEO_INT_TYPE_0 (DisplayBase::INT_TYPE_S0_VFIELD)
digiponta 3:1daadbe91b49 157 #define VIDEO_INT_TYPE_1 (DisplayBase::INT_TYPE_S1_VFIELD)
digiponta 3:1daadbe91b49 158
digiponta 3:1daadbe91b49 159 static void IntCallbackFunc_Vfield_0(DisplayBase::int_type_t int_type) {
digiponta 4:2bea25cf1883 160 DisplayBase::graphics_error_t error;
digiponta 4:2bea25cf1883 161
digiponta 3:1daadbe91b49 162 /* Interrupt callback function */
digiponta 3:1daadbe91b49 163 if (vfield_count_0 == 0) {
digiponta 3:1daadbe91b49 164 vfield_count_0 = 1;
digiponta 4:2bea25cf1883 165 error = Display.Video_Stop( DisplayBase::VIDEO_INPUT_CHANNEL_0 );
digiponta 4:2bea25cf1883 166 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 4:2bea25cf1883 167 printf("Line %d, error %d\n", __LINE__, error);
digiponta 4:2bea25cf1883 168 mbed_die();
digiponta 4:2bea25cf1883 169 }
digiponta 4:2bea25cf1883 170
digiponta 3:1daadbe91b49 171 } else {
digiponta 3:1daadbe91b49 172 ;
digiponta 3:1daadbe91b49 173 }
digiponta 3:1daadbe91b49 174 }
digiponta 4:2bea25cf1883 175
digiponta 3:1daadbe91b49 176 static void IntCallbackFunc_Vfield_1(DisplayBase::int_type_t int_type) {
digiponta 4:2bea25cf1883 177 DisplayBase::graphics_error_t error;
digiponta 4:2bea25cf1883 178
digiponta 3:1daadbe91b49 179 /* Interrupt callback function */
digiponta 3:1daadbe91b49 180 if (vfield_count_1 == 0) {
digiponta 3:1daadbe91b49 181 vfield_count_1 = 1;
digiponta 4:2bea25cf1883 182 error = Display.Video_Stop( DisplayBase::VIDEO_INPUT_CHANNEL_1 );
digiponta 4:2bea25cf1883 183 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 4:2bea25cf1883 184 printf("Line %d, error %d\n", __LINE__, error);
digiponta 4:2bea25cf1883 185 mbed_die();
digiponta 4:2bea25cf1883 186 }
digiponta 3:1daadbe91b49 187 } else {
digiponta 3:1daadbe91b49 188 ;
digiponta 3:1daadbe91b49 189 }
digiponta 3:1daadbe91b49 190 }
digiponta 3:1daadbe91b49 191
digiponta 3:1daadbe91b49 192
dkato 0:f8cb87301ad8 193 /****** Video ******/
dkato 0:f8cb87301ad8 194 static void Init_Video(void) {
dkato 0:f8cb87301ad8 195 DisplayBase::graphics_error_t error;
dkato 0:f8cb87301ad8 196
dkato 0:f8cb87301ad8 197 /* Graphics initialization process */
dkato 0:f8cb87301ad8 198 if (graphics_init_end == false) {
dkato 0:f8cb87301ad8 199 /* When not initializing LCD, this processing is needed. */
dkato 0:f8cb87301ad8 200 error = Display.Graphics_init(NULL);
dkato 0:f8cb87301ad8 201 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 202 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 203 mbed_die();
dkato 0:f8cb87301ad8 204 }
dkato 0:f8cb87301ad8 205 graphics_init_end = true;
dkato 0:f8cb87301ad8 206 }
dkato 0:f8cb87301ad8 207
dkato 0:f8cb87301ad8 208 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
dkato 0:f8cb87301ad8 209 if( error != DisplayBase::GRAPHICS_OK ) {
dkato 0:f8cb87301ad8 210 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 211 mbed_die();
dkato 0:f8cb87301ad8 212 }
digiponta 3:1daadbe91b49 213
digiponta 3:1daadbe91b49 214 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
digiponta 3:1daadbe91b49 215 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE_0, 0, IntCallbackFunc_Vfield_0);
digiponta 3:1daadbe91b49 216 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 217 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 218 mbed_die();
digiponta 3:1daadbe91b49 219 }
digiponta 3:1daadbe91b49 220 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
digiponta 3:1daadbe91b49 221 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE_1, 0, IntCallbackFunc_Vfield_1);
digiponta 3:1daadbe91b49 222 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 223 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 224 mbed_die();
digiponta 3:1daadbe91b49 225 }
dkato 0:f8cb87301ad8 226 }
dkato 0:f8cb87301ad8 227
dkato 2:e59e938472ac 228 static void Start_Video(DisplayBase::video_input_channel_t ch, uint8_t * p_frame_buffer,
dkato 2:e59e938472ac 229 uint16_t pos_x, uint16_t pos_y, uint16_t width, uint16_t height) {
dkato 0:f8cb87301ad8 230 DisplayBase::graphics_error_t error;
dkato 2:e59e938472ac 231 uint8_t * p_buf;
dkato 2:e59e938472ac 232
dkato 2:e59e938472ac 233 p_buf = p_frame_buffer + (FRAME_BUFFER_BYTE_PER_PIXEL * pos_x) + (FRAME_BUFFER_STRIDE * pos_y);
dkato 0:f8cb87301ad8 234
dkato 0:f8cb87301ad8 235 /* Video capture setting (progressive form fixed) */
dkato 0:f8cb87301ad8 236 error = Display.Video_Write_Setting(
dkato 0:f8cb87301ad8 237 ch,
dkato 0:f8cb87301ad8 238 COL_SYS,
dkato 0:f8cb87301ad8 239 p_buf,
dkato 0:f8cb87301ad8 240 FRAME_BUFFER_STRIDE,
dkato 0:f8cb87301ad8 241 VIDEO_FORMAT,
dkato 0:f8cb87301ad8 242 WR_RD_WRSWA,
dkato 2:e59e938472ac 243 (height & ~7u), /* A multiple of 8 */
dkato 2:e59e938472ac 244 (width & ~15u) /* A multiple of 16 */
dkato 0:f8cb87301ad8 245 );
dkato 0:f8cb87301ad8 246 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 247 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 248 mbed_die();
dkato 0:f8cb87301ad8 249 }
dkato 0:f8cb87301ad8 250
dkato 0:f8cb87301ad8 251 /* Video write process start */
dkato 0:f8cb87301ad8 252 error = Display.Video_Start(ch);
dkato 0:f8cb87301ad8 253 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 254 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 255 mbed_die();
dkato 0:f8cb87301ad8 256 }
dkato 0:f8cb87301ad8 257
dkato 0:f8cb87301ad8 258 /* Video write process stop */
dkato 0:f8cb87301ad8 259 error = Display.Video_Stop(ch);
dkato 0:f8cb87301ad8 260 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 261 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 262 mbed_die();
dkato 0:f8cb87301ad8 263 }
dkato 0:f8cb87301ad8 264
dkato 0:f8cb87301ad8 265 /* Video write process start */
dkato 0:f8cb87301ad8 266 error = Display.Video_Start(ch);
dkato 0:f8cb87301ad8 267 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 268 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 269 mbed_die();
dkato 0:f8cb87301ad8 270 }
dkato 0:f8cb87301ad8 271 }
dkato 0:f8cb87301ad8 272
dkato 2:e59e938472ac 273 /****** Cache control ******/
dkato 2:e59e938472ac 274 static void dcache_clean(void * p_buf, uint32_t size){
dkato 2:e59e938472ac 275 uint32_t start_addr = (uint32_t)p_buf & 0xFFFFFFE0;
dkato 2:e59e938472ac 276 uint32_t end_addr = (uint32_t)p_buf + size;
dkato 2:e59e938472ac 277 uint32_t addr;
dkato 2:e59e938472ac 278
dkato 2:e59e938472ac 279 /* Data cache clean */
dkato 2:e59e938472ac 280 for (addr = start_addr; addr < end_addr; addr += 0x20) {
dkato 2:e59e938472ac 281 __v7_clean_dcache_mva((void *)addr);
dkato 2:e59e938472ac 282 }
dkato 2:e59e938472ac 283 }
dkato 2:e59e938472ac 284
dkato 0:f8cb87301ad8 285 /****** main ******/
dkato 0:f8cb87301ad8 286 int main(void) {
digiponta 4:2bea25cf1883 287 JPEG_Converter decoder;
digiponta 4:2bea25cf1883 288 JPEG_Converter::bitmap_buff_info_t aBitmapData;
digiponta 4:2bea25cf1883 289 DisplayBase::graphics_error_t error;
digiponta 4:2bea25cf1883 290 size_t EncodeSize;
digiponta 4:2bea25cf1883 291
dkato 0:f8cb87301ad8 292 /* Initialization of LCD */
dkato 0:f8cb87301ad8 293 Init_LCD_Display(); /* When using LCD, please call before than Init_Video(). */
dkato 0:f8cb87301ad8 294
dkato 0:f8cb87301ad8 295 /* Initialization of Video */
dkato 0:f8cb87301ad8 296 Init_Video();
dkato 0:f8cb87301ad8 297
dkato 0:f8cb87301ad8 298 /* Initialization memory */
dkato 2:e59e938472ac 299 #if VIDEO_INPUT_FORMAT == VIDEO_YCBCR422
dkato 2:e59e938472ac 300 for (int i = 0; i < sizeof(user_frame_buffer0); i += 2) {
dkato 2:e59e938472ac 301 user_frame_buffer0[i + 0] = 0x10;
dkato 2:e59e938472ac 302 user_frame_buffer0[i + 1] = 0x80;
dkato 2:e59e938472ac 303 }
dkato 2:e59e938472ac 304 #else
dkato 2:e59e938472ac 305 memset(user_frame_buffer0, 0, sizeof(user_frame_buffer0));
digiponta 4:2bea25cf1883 306 memset(user_frame_buffer1, 0, sizeof(user_frame_buffer1));
dkato 2:e59e938472ac 307 #endif
dkato 2:e59e938472ac 308 dcache_clean(user_frame_buffer0, sizeof(user_frame_buffer0));
digiponta 4:2bea25cf1883 309 dcache_clean(user_frame_buffer1, sizeof(user_frame_buffer1));
dkato 0:f8cb87301ad8 310
dkato 2:e59e938472ac 311 /* Start of Video ch0 */
dkato 2:e59e938472ac 312 Start_Video(
dkato 2:e59e938472ac 313 DisplayBase::VIDEO_INPUT_CHANNEL_0, /* Video input channe */
dkato 2:e59e938472ac 314 user_frame_buffer0, /* Output buffer */
dkato 2:e59e938472ac 315 0, /* The x coordinate of the upper-left corner */
dkato 2:e59e938472ac 316 0, /* The y coordinate of the upper-left corner */
dkato 2:e59e938472ac 317 (LCD_PIXEL_WIDTH / 2), /* width (A multiple of 16) */
dkato 2:e59e938472ac 318 LCD_PIXEL_HEIGHT /* height (A multiple of 8) */
dkato 2:e59e938472ac 319 );
dkato 2:e59e938472ac 320
dkato 2:e59e938472ac 321 /* Start of Video ch1 */
dkato 2:e59e938472ac 322 Start_Video(
dkato 2:e59e938472ac 323 DisplayBase::VIDEO_INPUT_CHANNEL_1, /* Video input channe */
dkato 2:e59e938472ac 324 user_frame_buffer0, /* Output buffer */
dkato 2:e59e938472ac 325 (LCD_PIXEL_WIDTH / 2), /* The x coordinate of the upper-left corner */
dkato 2:e59e938472ac 326 0, /* The y coordinate of the upper-left corner */
dkato 2:e59e938472ac 327 (LCD_PIXEL_WIDTH / 2), /* width (A multiple of 16) */
dkato 2:e59e938472ac 328 LCD_PIXEL_HEIGHT /* height (A multiple of 8) */
dkato 2:e59e938472ac 329 );
dkato 0:f8cb87301ad8 330
dkato 0:f8cb87301ad8 331 /* Start of LCD */
dkato 0:f8cb87301ad8 332 Start_LCD_Display(&user_frame_buffer0[0]);
dkato 0:f8cb87301ad8 333
dkato 0:f8cb87301ad8 334 /* Backlight on */
dkato 0:f8cb87301ad8 335 Thread::wait(200);
dkato 0:f8cb87301ad8 336 lcd_cntrst.write(1.0);
dkato 0:f8cb87301ad8 337
digiponta 5:f6df6a4c32a7 338 dir = opendir( "/sd" );
digiponta 4:2bea25cf1883 339 for ( imgCnt=0; ; imgCnt++) {
digiponta 4:2bea25cf1883 340 dp = readdir( dir );
digiponta 4:2bea25cf1883 341 if ( dp == NULL) break;
digiponta 4:2bea25cf1883 342 }
digiponta 4:2bea25cf1883 343 closedir( dir );
digiponta 4:2bea25cf1883 344
dkato 0:f8cb87301ad8 345 while (1) {
digiponta 3:1daadbe91b49 346
dkato 0:f8cb87301ad8 347 led_blue = !led_blue;
digiponta 3:1daadbe91b49 348 Thread::wait(100);
digiponta 3:1daadbe91b49 349
digiponta 3:1daadbe91b49 350 if ((mode == 0) && (prev_sw0 != 0) && (sw0 == 0))
digiponta 3:1daadbe91b49 351 {
digiponta 4:2bea25cf1883 352
digiponta 3:1daadbe91b49 353 #if 1
digiponta 4:2bea25cf1883 354 for ( vfield_count_0=0; vfield_count_0 == 0; ) {
digiponta 4:2bea25cf1883 355 }
digiponta 4:2bea25cf1883 356 for ( vfield_count_1=0; vfield_count_1 == 0; ) {
digiponta 3:1daadbe91b49 357 }
digiponta 4:2bea25cf1883 358
digiponta 4:2bea25cf1883 359 #if 1
digiponta 4:2bea25cf1883 360 dcache_clean(user_frame_buffer0, sizeof(user_frame_buffer0));
digiponta 4:2bea25cf1883 361 dcache_clean(user_frame_buffer1, sizeof(user_frame_buffer1));
digiponta 4:2bea25cf1883 362
digiponta 4:2bea25cf1883 363 Thread::wait(500);
digiponta 3:1daadbe91b49 364
digiponta 3:1daadbe91b49 365 //YCbCr setting
digiponta 3:1daadbe91b49 366 aBitmapData.width = LCD_PIXEL_WIDTH;
digiponta 3:1daadbe91b49 367 aBitmapData.height = LCD_PIXEL_HEIGHT;
digiponta 3:1daadbe91b49 368 aBitmapData.format = JPEG_Converter::WR_RD_YCbCr422; //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
digiponta 3:1daadbe91b49 369 aBitmapData.buffer_address = (void *)user_frame_buffer0;
digiponta 3:1daadbe91b49 370 pc.printf("File encode start\n");
digiponta 3:1daadbe91b49 371 // JPEG_Converter
digiponta 3:1daadbe91b49 372
digiponta 3:1daadbe91b49 373 if (decoder.encode(&aBitmapData, user_frame_buffer1, &EncodeSize) == JPEG_Converter::JPEG_CONV_OK) {
digiponta 4:2bea25cf1883 374 pc.printf("File encode done %dbyte, %d\n", EncodeSize, imgCnt );
digiponta 4:2bea25cf1883 375
digiponta 3:1daadbe91b49 376 pc.printf("File write start\n");
digiponta 3:1daadbe91b49 377 sprintf( fname, "/sd/img_%04d.jpg", imgCnt++ );
digiponta 5:f6df6a4c32a7 378 wr_fp = fopen( fname, "w");
digiponta 4:2bea25cf1883 379 for( long i=0; i < EncodeSize;i++) {
digiponta 4:2bea25cf1883 380 putc( user_frame_buffer1[i], wr_fp );
digiponta 4:2bea25cf1883 381 }
digiponta 4:2bea25cf1883 382 fflush(wr_fp);
digiponta 3:1daadbe91b49 383 fclose(wr_fp);
digiponta 3:1daadbe91b49 384 pc.printf("File write done\n");
digiponta 3:1daadbe91b49 385 led1 = 0;
digiponta 3:1daadbe91b49 386 } else {
digiponta 3:1daadbe91b49 387 pc.printf("Error:JCU encode error\n");
digiponta 3:1daadbe91b49 388 led1 = 0;
digiponta 3:1daadbe91b49 389 }
digiponta 4:2bea25cf1883 390 #endif
digiponta 4:2bea25cf1883 391
digiponta 4:2bea25cf1883 392 Thread::wait(500);
digiponta 4:2bea25cf1883 393 NVIC_SystemReset();
digiponta 3:1daadbe91b49 394
digiponta 3:1daadbe91b49 395 /* Video write process start */
digiponta 3:1daadbe91b49 396 error = Display.Video_Start( DisplayBase::VIDEO_INPUT_CHANNEL_0 );
digiponta 3:1daadbe91b49 397 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 398 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 399 mbed_die();
digiponta 3:1daadbe91b49 400 }
digiponta 3:1daadbe91b49 401 /* Video write process start */
digiponta 3:1daadbe91b49 402 error = Display.Video_Start( DisplayBase::VIDEO_INPUT_CHANNEL_1 );
digiponta 3:1daadbe91b49 403 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 404 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 405 mbed_die();
digiponta 3:1daadbe91b49 406 }
digiponta 3:1daadbe91b49 407 #endif
digiponta 3:1daadbe91b49 408 }
digiponta 4:2bea25cf1883 409
digiponta 3:1daadbe91b49 410 if (((mode == 0) || (mode == 1)) && (prev_sw2 != 0) && (sw2 == 0)) {
digiponta 3:1daadbe91b49 411 if ( mode == 0 ){
digiponta 3:1daadbe91b49 412
digiponta 3:1daadbe91b49 413 /* Video write process stop */
digiponta 3:1daadbe91b49 414 error = Display.Video_Stop( DisplayBase::VIDEO_INPUT_CHANNEL_0 );
digiponta 3:1daadbe91b49 415 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 416 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 417 mbed_die();
digiponta 3:1daadbe91b49 418 }
digiponta 3:1daadbe91b49 419 error = Display.Video_Stop( DisplayBase::VIDEO_INPUT_CHANNEL_1 );
digiponta 3:1daadbe91b49 420 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 421 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 422 mbed_die();
digiponta 3:1daadbe91b49 423 }
digiponta 3:1daadbe91b49 424 }
digiponta 3:1daadbe91b49 425
digiponta 3:1daadbe91b49 426 sprintf( fname, "/sd/img_%04d.jpg", viewCnt++ );
digiponta 3:1daadbe91b49 427 if ( viewCnt >= imgCnt ) viewCnt = 0;
digiponta 4:2bea25cf1883 428 pc.printf("File read start %s v=%d, i=%d\n", fname, viewCnt, imgCnt );
digiponta 5:f6df6a4c32a7 429 rd_fp = fopen( fname, "r" );
digiponta 5:f6df6a4c32a7 430 if (rd_fp == NULL ) {
digiponta 4:2bea25cf1883 431 pc.printf("can't open the file\n" );
digiponta 4:2bea25cf1883 432 mode = 1;
digiponta 4:2bea25cf1883 433 continue;
digiponta 4:2bea25cf1883 434 }
digiponta 5:f6df6a4c32a7 435 fseek( rd_fp, 0, SEEK_SET );
digiponta 5:f6df6a4c32a7 436 #if 0
digiponta 5:f6df6a4c32a7 437 fsize = ftell( rd_fp );
digiponta 4:2bea25cf1883 438 if (fsize == 0) {
digiponta 5:f6df6a4c32a7 439 pc.printf("fsize = 0 error\n" );
digiponta 4:2bea25cf1883 440 mode = 1;
digiponta 4:2bea25cf1883 441 continue;
digiponta 5:f6df6a4c32a7 442 }
digiponta 5:f6df6a4c32a7 443 pc.printf("fsize = %d\n", fsize );
digiponta 4:2bea25cf1883 444 fseek( rd_fp, 0, SEEK_SET );
digiponta 4:2bea25cf1883 445 for( long i=0; i < fsize ;i++) {
digiponta 3:1daadbe91b49 446 char cc = getc( rd_fp );
digiponta 4:2bea25cf1883 447 // if ( cc == EOF ) break;
digiponta 3:1daadbe91b49 448 user_frame_buffer1[i] = (unsigned char)cc;
digiponta 3:1daadbe91b49 449 }
digiponta 5:f6df6a4c32a7 450 #else
digiponta 5:f6df6a4c32a7 451 size_t len = fread(user_frame_buffer1, sizeof(char), (LCD_PIXEL_WIDTH * LCD_PIXEL_HEIGHT * 4), rd_fp);
digiponta 5:f6df6a4c32a7 452 pc.printf( "len = %d\n", len );
digiponta 5:f6df6a4c32a7 453 #endif
digiponta 3:1daadbe91b49 454 fclose(rd_fp);
digiponta 4:2bea25cf1883 455 pc.printf("File read done\n");
digiponta 3:1daadbe91b49 456
digiponta 3:1daadbe91b49 457 //YCbCr setting
digiponta 3:1daadbe91b49 458 aBitmapData.width = LCD_PIXEL_WIDTH;
digiponta 3:1daadbe91b49 459 aBitmapData.height = LCD_PIXEL_HEIGHT;
digiponta 3:1daadbe91b49 460 aBitmapData.format = JPEG_Converter::WR_RD_YCbCr422; //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
digiponta 3:1daadbe91b49 461 aBitmapData.buffer_address = (void *)user_frame_buffer0;
digiponta 3:1daadbe91b49 462 pc.printf("File decode start\n");
digiponta 3:1daadbe91b49 463 // JPEG_Converter
digiponta 3:1daadbe91b49 464 if (decoder.decode((void *)user_frame_buffer1, &aBitmapData) == JPEG_Converter::JPEG_CONV_OK) {
digiponta 3:1daadbe91b49 465 pc.printf("File decode done %dbyte\n", (LCD_PIXEL_WIDTH * LCD_PIXEL_HEIGHT * 4));
digiponta 3:1daadbe91b49 466 led1 = 0;
digiponta 3:1daadbe91b49 467 } else {
digiponta 3:1daadbe91b49 468 pc.printf("Error:JCU decode error\n");
digiponta 3:1daadbe91b49 469 led1 = 0;
digiponta 3:1daadbe91b49 470 }
digiponta 3:1daadbe91b49 471
digiponta 3:1daadbe91b49 472 mode = 1;
digiponta 3:1daadbe91b49 473 }
digiponta 3:1daadbe91b49 474
digiponta 3:1daadbe91b49 475 if ( (mode == 1) && (prev_sw3 != 0) && (sw3 == 0)) {
digiponta 3:1daadbe91b49 476
digiponta 3:1daadbe91b49 477 /* Video write process start */
digiponta 3:1daadbe91b49 478 error = Display.Video_Start( DisplayBase::VIDEO_INPUT_CHANNEL_0 );
digiponta 3:1daadbe91b49 479 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 480 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 481 mbed_die();
digiponta 3:1daadbe91b49 482 }
digiponta 3:1daadbe91b49 483 /* Video write process start */
digiponta 3:1daadbe91b49 484 error = Display.Video_Start( DisplayBase::VIDEO_INPUT_CHANNEL_1 );
digiponta 3:1daadbe91b49 485 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 486 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 487 mbed_die();
digiponta 3:1daadbe91b49 488 }
digiponta 3:1daadbe91b49 489
digiponta 3:1daadbe91b49 490 mode = 0; //
digiponta 3:1daadbe91b49 491 }
digiponta 3:1daadbe91b49 492
digiponta 3:1daadbe91b49 493
digiponta 3:1daadbe91b49 494
digiponta 3:1daadbe91b49 495 prev_sw0 = sw0;
digiponta 3:1daadbe91b49 496 // prev_sw1 = sw1;
digiponta 3:1daadbe91b49 497 prev_sw2 = sw2;
digiponta 3:1daadbe91b49 498 prev_sw3 = sw3;
dkato 0:f8cb87301ad8 499 }
dkato 0:f8cb87301ad8 500 }