This program plays QuickTime movies on GR-Peach
Dependencies: AsciiFont GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP TLV320_RBSP mbed-rtos mbed
Requirements
- GR-Peach
- GR-Peach Audio Camera Shield or I²S compatible audio DAC
- GR-Peach LCD Shield
- USB memory stick
How to play movie files
- Encode movie files
encode movies with ffmpeg
$ ffmpeg -i <input -ar 44100 -acodec pcm_s16le -s 480x270 -vcodec mjpeg -q:v 3 -movflags faststart -threads 4 -vf fps=30 <output>.mov
- Copy movies to the root directory of USB memory
- Build and upload this program
- Run it
LCD.cpp@0:d0f130e27d32, 2017-03-10 (annotated)
- Committer:
- mtkrtk
- Date:
- Fri Mar 10 11:30:02 2017 +0000
- Revision:
- 0:d0f130e27d32
- Child:
- 1:3e638b9e91cd
initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mtkrtk | 0:d0f130e27d32 | 1 | #include "LCD.hpp" |
mtkrtk | 0:d0f130e27d32 | 2 | #include "rtos.h" |
mtkrtk | 0:d0f130e27d32 | 3 | |
mtkrtk | 0:d0f130e27d32 | 4 | #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB565) |
mtkrtk | 0:d0f130e27d32 | 5 | #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32_16BIT) |
mtkrtk | 0:d0f130e27d32 | 6 | |
mtkrtk | 0:d0f130e27d32 | 7 | volatile int32_t LCD::vsync_count = 0; |
mtkrtk | 0:d0f130e27d32 | 8 | uint8_t LCD::user_frame_buffer1[]; |
mtkrtk | 0:d0f130e27d32 | 9 | uint8_t LCD::user_frame_buffer2[]; |
mtkrtk | 0:d0f130e27d32 | 10 | frame_buffer_t LCD::frame_buffer_info; |
mtkrtk | 0:d0f130e27d32 | 11 | LCD LCD::instance; |
mtkrtk | 0:d0f130e27d32 | 12 | |
mtkrtk | 0:d0f130e27d32 | 13 | void LCD::IntCallbackFunc_LoVsync(DisplayBase::int_type_t MBED_UNUSED int_type) { |
mtkrtk | 0:d0f130e27d32 | 14 | /* Interrupt callback function for Vsync interruption */ |
mtkrtk | 0:d0f130e27d32 | 15 | if (vsync_count > 0) { |
mtkrtk | 0:d0f130e27d32 | 16 | vsync_count--; |
mtkrtk | 0:d0f130e27d32 | 17 | } |
mtkrtk | 0:d0f130e27d32 | 18 | } |
mtkrtk | 0:d0f130e27d32 | 19 | |
mtkrtk | 0:d0f130e27d32 | 20 | LCD::LCD() : lcd_pwon(P7_15), lcd_blon(P8_1), lcd_cntrst(P8_14), lcd_nctrst_dummy(P8_15) |
mtkrtk | 0:d0f130e27d32 | 21 | { |
mtkrtk | 0:d0f130e27d32 | 22 | } |
mtkrtk | 0:d0f130e27d32 | 23 | |
mtkrtk | 0:d0f130e27d32 | 24 | void LCD::start() |
mtkrtk | 0:d0f130e27d32 | 25 | { |
mtkrtk | 0:d0f130e27d32 | 26 | DisplayBase::graphics_error_t error; |
mtkrtk | 0:d0f130e27d32 | 27 | DisplayBase::lcd_config_t lcd_config; |
mtkrtk | 0:d0f130e27d32 | 28 | PinName lvds_pin[8] = { |
mtkrtk | 0:d0f130e27d32 | 29 | /* data pin */ |
mtkrtk | 0:d0f130e27d32 | 30 | P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0 |
mtkrtk | 0:d0f130e27d32 | 31 | }; |
mtkrtk | 0:d0f130e27d32 | 32 | |
mtkrtk | 0:d0f130e27d32 | 33 | lcd_pwon = 0; |
mtkrtk | 0:d0f130e27d32 | 34 | lcd_blon = 0; |
mtkrtk | 0:d0f130e27d32 | 35 | rtos::Thread::wait(100); |
mtkrtk | 0:d0f130e27d32 | 36 | lcd_pwon = 1; |
mtkrtk | 0:d0f130e27d32 | 37 | lcd_blon = 1; |
mtkrtk | 0:d0f130e27d32 | 38 | |
mtkrtk | 0:d0f130e27d32 | 39 | Display.Graphics_Lvds_Port_Init(lvds_pin, 8); |
mtkrtk | 0:d0f130e27d32 | 40 | |
mtkrtk | 0:d0f130e27d32 | 41 | /* Graphics initialization process */ |
mtkrtk | 0:d0f130e27d32 | 42 | lcd_config = LcdCfgTbl_LCD_shield; |
mtkrtk | 0:d0f130e27d32 | 43 | error = Display.Graphics_init(&lcd_config); |
mtkrtk | 0:d0f130e27d32 | 44 | if (error != DisplayBase::GRAPHICS_OK) { |
mtkrtk | 0:d0f130e27d32 | 45 | printf("Line %d, error %d\n", __LINE__, error); |
mtkrtk | 0:d0f130e27d32 | 46 | mbed_die(); |
mtkrtk | 0:d0f130e27d32 | 47 | } |
mtkrtk | 0:d0f130e27d32 | 48 | |
mtkrtk | 0:d0f130e27d32 | 49 | /* Interrupt callback function setting (Vsync signal output from scaler 0) */ |
mtkrtk | 0:d0f130e27d32 | 50 | error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, LCD::IntCallbackFunc_LoVsync); |
mtkrtk | 0:d0f130e27d32 | 51 | if (error != DisplayBase::GRAPHICS_OK) { |
mtkrtk | 0:d0f130e27d32 | 52 | printf("Line %d, error %d\n", __LINE__, error); |
mtkrtk | 0:d0f130e27d32 | 53 | mbed_die(); |
mtkrtk | 0:d0f130e27d32 | 54 | } |
mtkrtk | 0:d0f130e27d32 | 55 | |
mtkrtk | 0:d0f130e27d32 | 56 | memset(user_frame_buffer1, 0, sizeof(user_frame_buffer1)); |
mtkrtk | 0:d0f130e27d32 | 57 | memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2)); |
mtkrtk | 0:d0f130e27d32 | 58 | frame_buffer_info.buffer_address[0] = user_frame_buffer1; |
mtkrtk | 0:d0f130e27d32 | 59 | frame_buffer_info.buffer_address[1] = user_frame_buffer2; |
mtkrtk | 0:d0f130e27d32 | 60 | frame_buffer_info.buffer_count = 2; |
mtkrtk | 0:d0f130e27d32 | 61 | frame_buffer_info.show_buffer_index = 0; |
mtkrtk | 0:d0f130e27d32 | 62 | frame_buffer_info.draw_buffer_index = 0; |
mtkrtk | 0:d0f130e27d32 | 63 | frame_buffer_info.width = LCD_PIXEL_WIDTH; |
mtkrtk | 0:d0f130e27d32 | 64 | frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL; |
mtkrtk | 0:d0f130e27d32 | 65 | frame_buffer_info.stride = LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL; |
mtkrtk | 0:d0f130e27d32 | 66 | frame_buffer_info.height = LCD_PIXEL_HEIGHT; |
mtkrtk | 0:d0f130e27d32 | 67 | frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565; |
mtkrtk | 0:d0f130e27d32 | 68 | |
mtkrtk | 0:d0f130e27d32 | 69 | DisplayBase::rect_t rect; |
mtkrtk | 0:d0f130e27d32 | 70 | |
mtkrtk | 0:d0f130e27d32 | 71 | rect.vs = 0; |
mtkrtk | 0:d0f130e27d32 | 72 | rect.vw = LCD_PIXEL_HEIGHT; |
mtkrtk | 0:d0f130e27d32 | 73 | rect.hs = 0; |
mtkrtk | 0:d0f130e27d32 | 74 | rect.hw = LCD_PIXEL_WIDTH; |
mtkrtk | 0:d0f130e27d32 | 75 | Display.Graphics_Read_Setting(DisplayBase::GRAPHICS_LAYER_0, (void *)frame_buffer_info.buffer_address[0], |
mtkrtk | 0:d0f130e27d32 | 76 | FRAME_BUFFER_STRIDE, GRAPHICS_FORMAT, WR_RD_WRSWA, &rect); |
mtkrtk | 0:d0f130e27d32 | 77 | Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0); |
mtkrtk | 0:d0f130e27d32 | 78 | |
mtkrtk | 0:d0f130e27d32 | 79 | rtos::Thread::wait(200); |
mtkrtk | 0:d0f130e27d32 | 80 | lcd_cntrst.period_us(491); |
mtkrtk | 0:d0f130e27d32 | 81 | lcd_cntrst = 0.1; |
mtkrtk | 0:d0f130e27d32 | 82 | |
mtkrtk | 0:d0f130e27d32 | 83 | errnum_t err; |
mtkrtk | 0:d0f130e27d32 | 84 | Canvas2D_ContextConfigClass config; |
mtkrtk | 0:d0f130e27d32 | 85 | config.frame_buffer = &frame_buffer_info; |
mtkrtk | 0:d0f130e27d32 | 86 | canvas2d = R_RGA_New_Canvas2D_ContextClass(config); |
mtkrtk | 0:d0f130e27d32 | 87 | err = R_OSPL_GetErrNum(); |
mtkrtk | 0:d0f130e27d32 | 88 | if (err != 0) { |
mtkrtk | 0:d0f130e27d32 | 89 | printf("Line %d, error %d\n", __LINE__, err); |
mtkrtk | 0:d0f130e27d32 | 90 | while (1); |
mtkrtk | 0:d0f130e27d32 | 91 | } |
mtkrtk | 0:d0f130e27d32 | 92 | |
mtkrtk | 0:d0f130e27d32 | 93 | graphics = canvas2d.c_LanguageContext; |
mtkrtk | 0:d0f130e27d32 | 94 | } |
mtkrtk | 0:d0f130e27d32 | 95 | |
mtkrtk | 0:d0f130e27d32 | 96 | void LCD::stop() |
mtkrtk | 0:d0f130e27d32 | 97 | { |
mtkrtk | 0:d0f130e27d32 | 98 | lcd_pwon = 0; |
mtkrtk | 0:d0f130e27d32 | 99 | lcd_blon = 0; |
mtkrtk | 0:d0f130e27d32 | 100 | } |
mtkrtk | 0:d0f130e27d32 | 101 | |
mtkrtk | 0:d0f130e27d32 | 102 | void LCD::Wait_Vsync(const int32_t wait_count) |
mtkrtk | 0:d0f130e27d32 | 103 | { |
mtkrtk | 0:d0f130e27d32 | 104 | /* Wait for the specified number of times Vsync occurs */ |
mtkrtk | 0:d0f130e27d32 | 105 | vsync_count = wait_count; |
mtkrtk | 0:d0f130e27d32 | 106 | while (vsync_count > 0) { |
mtkrtk | 0:d0f130e27d32 | 107 | /* Do nothing */ |
mtkrtk | 0:d0f130e27d32 | 108 | } |
mtkrtk | 0:d0f130e27d32 | 109 | } |
mtkrtk | 0:d0f130e27d32 | 110 | |
mtkrtk | 0:d0f130e27d32 | 111 | void LCD::Swap_FrameBuffer() |
mtkrtk | 0:d0f130e27d32 | 112 | { |
mtkrtk | 0:d0f130e27d32 | 113 | if (frame_buffer_info.draw_buffer_index == 1) { |
mtkrtk | 0:d0f130e27d32 | 114 | frame_buffer_info.draw_buffer_index = 0; |
mtkrtk | 0:d0f130e27d32 | 115 | } else { |
mtkrtk | 0:d0f130e27d32 | 116 | frame_buffer_info.draw_buffer_index = 1; |
mtkrtk | 0:d0f130e27d32 | 117 | } |
mtkrtk | 0:d0f130e27d32 | 118 | } |
mtkrtk | 0:d0f130e27d32 | 119 | |
mtkrtk | 0:d0f130e27d32 | 120 | void LCD::Update_LCD_Display() |
mtkrtk | 0:d0f130e27d32 | 121 | { |
mtkrtk | 0:d0f130e27d32 | 122 | Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0, |
mtkrtk | 0:d0f130e27d32 | 123 | (void *)frame_buffer_info.buffer_address[frame_buffer_info.draw_buffer_index]); |
mtkrtk | 0:d0f130e27d32 | 124 | Wait_Vsync(1); |
mtkrtk | 0:d0f130e27d32 | 125 | } |
mtkrtk | 0:d0f130e27d32 | 126 |