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:
Wed Sep 14 10:53:51 2016 +0000
Revision:
6:3cb7758c3f17
Parent:
5:f6df6a4c32a7
Child:
7:2fb4359e5ea6
SDFileSystem_GR_PEACH???

Who changed what in which revision?

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