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