ãã®èšäºã§ã¯ããã€ã¯ãããã»ããµäžã«ãŠã£ãžã§ãããåããã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã®æ©èœãšãäœ¿ãæ £ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãšé©åãªFPSã®äž¡æ¹ã䜿çšããæ¹æ³ã«ã€ããŠèª¬æããŸããæ³šæç¹å®ã®ã°ã©ãã£ãã¯ã©ã€ãã©ãªã§ã¯ãªããã¡ã¢ãªãããã»ããµãã£ãã·ã¥ãdmaãªã©ã®äžè¬çãªãã®ã«çŠç¹ãåœãŠãããšæããŸããç§ã¯EmboxããŒã ã®éçºè ãªã®ã§ãäŸãšå®éšã¯ãã®RTOSã§è¡ããŸãã
å ã»ã©ããã€ã¯ãããã»ããµã§Qtã©ã€ãã©ãªãå®è¡ããæ¹æ³ã«ã€ããŠèª¬æããŸãããã¢ãã¡ãŒã·ã§ã³ã¯éåžžã«ã¹ã ãŒãºã§ããããšã倿ããŸãããããã¡ãŒã ãŠã§ã¢ãä¿åããããã®ã¡ã¢ãªã³ã¹ããããªãã®ãã®ã§ãããã³ãŒãã¯å€éšQSPIãã©ãã·ã¥ã¡ã¢ãªããå®è¡ãããŸããããã¡ãããããçš®ã®ã¢ãã¡ãŒã·ã§ã³ã®å®è¡æ¹æ³ãç¥ã£ãŠããè€éã§å€æ©èœãªã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠãªå Žåã¯ãããŒããŠã§ã¢ãªãœãŒã¹ã®ã³ã¹ããããªãæ£åœåã§ããŸãïŒç¹ã«ããã®ã³ãŒããQtçšã«éçºããŠããå ŽåïŒã
ããããQtã®ãã¹ãŠã®æ©èœãå¿ èŠãªãå Žåã¯ã©ãã§ããããã 4ã€ã®ãã¿ã³ã1ã€ã®ããªã¥ãŒã ã³ã³ãããŒã«ãããã³2ã€ã®ãããã¢ããã¡ãã¥ãŒãããå Žåã¯ã©ããªããŸããïŒåæã«ããèŠæ ãããããé«éã«åäœãããããã«ãããã§ã:)次ã«ãlvglã©ã€ãã©ãªãªã©ã®ãã軜éãªããŒã«ã䜿çšããããšããå§ãããŸãã
ç§ãã¡ã®Emboxãããžã§ã¯ãã§ã¯ãNuklearãå°ãåã«ç§»æ€ãããŸãããããã¯ã1ã€ã®ããããŒã§æ§æãããéåžžã«è»œéãªã©ã€ãã©ãªãäœæããç°¡åãªGUIãç°¡åã«äœæã§ããããã«ãããããžã§ã¯ãã§ããããã䜿çšããŠãäžé£ã®ã°ã©ãã£ãã¯èŠçŽ ãåãããŠã£ãžã§ããããããã¿ããã¹ã¯ãªãŒã³ãä»ããŠå¶åŸ¡ã§ããå°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããããšã«ããŸããã
STM32F7-Cortex-M7ãšã¿ããã¹ã¯ãªãŒã³ã䜿çšããæ€åºããã©ãããã©ãŒã ãšããŠéžæãããŸããã
æåã®æé©åãã¡ã¢ãªãç¯çŽãã
ãããã£ãŠãã°ã©ãã£ãã¯ã©ã€ãã©ãªãéžæããããã©ãããã©ãŒã ãéžæãããŸããããã§ã¯ããªãœãŒã¹ãšã¯äœããçè§£ããŸããããããã§ãã¡ã€ã³ã¡ã¢ãªã®SRAMã¯å€éšã®SDRAMãããäœåãé«éã§ããããšã«æ³šæããŠãã ããããããã£ãŠãç»é¢ãµã€ãºãèš±ãã°ããã¡ãããã¬ãŒã ãããã¡ãSRAMã«é 眮ããããšããå§ãããŸããç»é¢ã®è§£å床ã¯480x272ã§ãããã¯ã»ã«ããã4ãã€ãã®è²ãå¿ èŠãªå ŽåãçŽ512KBã«ãªããŸããåæã«ãå éšRAMã®ãµã€ãºã¯ããã320ã§ããããããªã¡ã¢ãªãå€éšã«ãªãããšã¯ããã«æããã§ãããã1ã€ã®ãªãã·ã§ã³ã¯ãã«ã©ãŒãããã®æ·±ãã16ïŒã€ãŸãã2ãã€ãïŒã«æžãããŠãã¡ã¢ãªæ¶è²»ã256 KBã«æžããããšã§ããããã¯ããã§ã«ã¡ã€ã³RAMã«åãŸããŸãã
æåã«è©Šãããšãã§ããã®ã¯ããã¹ãŠãç¯çŽããããšã§ãã256 KBã®ãããªãããã¡ãäœæããRAMã«é 眮ããŠãããã«æç»ããŠã¿ãŸããããç§ãã¡ãããã«ééããåé¡ã¯ããããªã¡ã¢ãªã«çŽæ¥æç»ãããšãã«çºçããã·ãŒã³ã®ãã¡ãã€ããã§ãããNuklearã¯ã·ãŒã³å šäœãæåããåæç»ãããããæåã«ç»é¢å šäœããã£ã±ãã«ãªããã³ã«ããŠã£ãžã§ãããæç»ãããæ¬¡ã«ãã¿ã³ãæ¿å ¥ãããããã¹ããé 眮ãããŸãããã®çµæãã·ãŒã³å šäœãã©ã®ããã«åæç»ãããç»åããç¹æ» ãããããèçŒã§ç¢ºèªã§ããŸããã€ãŸããå éšã¡ã¢ãªã«åçŽã«é 眮ããŠãä¿åãããŸããã
äžéãããã¡ãŒãã³ã³ãã€ã©ã®æé©åãFPU
以åã®æ¹æ³ïŒå éšã¡ã¢ãªãžã®é 眮ïŒãå°ãããã£ãåŸãXServerãšWaylandã®èšæ¶ãããã«æãæµ®ãã³å§ããŸãããã¯ããå®éããŠã£ã³ããŠãããŒãžã£ã¯ãã¯ã©ã€ã¢ã³ãïŒã«ã¹ã¿ã ã¢ããªã±ãŒã·ã§ã³ã®ã¿ïŒããã®èŠæ±ãåŠçããèŠçŽ ãæçµã·ãŒã³ã«åéããŸããããšãã°ãLinuxã«ãŒãã«ã¯ãevdevãã©ã€ããŒãä»ããŠå ¥åããã€ã¹ãããµãŒããŒã«ã€ãã³ããéä¿¡ããŸããæ¬¡ã«ããµãŒããŒã¯ãã€ãã³ãã«å¯ŸåŠããã¯ã©ã€ã¢ã³ããæ±ºå®ããŸããã€ãã³ãïŒããšãã°ãã¿ããã¹ã¯ãªãŒã³ãæŒãïŒãåãåã£ãã¯ã©ã€ã¢ã³ãã¯ãå éšããžãã¯ãå®è¡ããŸãããã¿ã³ã匷調衚瀺ããæ°ããã¡ãã¥ãŒã衚瀺ããŸããããã«ïŒXãšWaylandã§ã¯å°ãç°ãªããŸãïŒãã¯ã©ã€ã¢ã³ãèªäœãŸãã¯ãµãŒããŒã®ããããã倿Žããããã¡ãŒã«æç»ããŸãããããŠãã³ã³ããžã¿ãŒã¯ç»é¢ã«æç»ããããã«ãã¹ãŠã®ããŒã¹ããŸãšããŠããŸããããã§ååã«åçŽã§æŠç¥çãªèª¬æããã
åæ§ã®ããžãã¯ãå¿ èŠã§ããããšãæããã«ãªããŸããããå°ããªã¢ããªã±ãŒã·ã§ã³ã®ããã«XServerãstm32ã«ããã·ã¥ãããã¯ãããŸããããããã£ãŠããããªã¡ã¢ãªã§ã¯ãªãéåžžã®ã¡ã¢ãªã«æç»ããŠã¿ãŸããããã·ãŒã³å šäœãã¬ã³ããªã³ã°ããåŸããããã¡ããããªã¡ã¢ãªã«ã³ããŒããŸãã
ãŠã£ãžã§ããã³ãŒã
if (nk_begin(&rawfb->ctx, "Demo", nk_rect(50, 50, 200, 200),
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|
NK_WINDOW_CLOSABLE|NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE)) {
enum {EASY, HARD};
static int op = EASY;
static int property = 20;
static float value = 0.6f;
if (mouse->type == INPUT_DEV_TOUCHSCREEN) {
/* Do not show cursor when using touchscreen */
nk_style_hide_cursor(&rawfb->ctx);
}
nk_layout_row_static(&rawfb->ctx, 30, 80, 1);
if (nk_button_label(&rawfb->ctx, "button"))
fprintf(stdout, "button pressed\n");
nk_layout_row_dynamic(&rawfb->ctx, 30, 2);
if (nk_option_label(&rawfb->ctx, "easy", op == EASY)) op = EASY;
if (nk_option_label(&rawfb->ctx, "hard", op == HARD)) op = HARD;
nk_layout_row_dynamic(&rawfb->ctx, 25, 1);
nk_property_int(&rawfb->ctx, "Compression:", 0, &property, 100, 10, 1);
nk_layout_row_begin(&rawfb->ctx, NK_STATIC, 30, 2);
{
nk_layout_row_push(&rawfb->ctx, 50);
nk_label(&rawfb->ctx, "Volume:", NK_TEXT_LEFT);
nk_layout_row_push(&rawfb->ctx, 110);
nk_slider_float(&rawfb->ctx, 0, &value, 1.0f, 0.1f);
}
nk_layout_row_end(&rawfb->ctx);
}
nk_end(&rawfb->ctx);
if (nk_window_is_closed(&rawfb->ctx, "Demo")) break;
/* Draw framebuffer */
nk_rawfb_render(rawfb, nk_rgb(30,30,30), 1);
memcpy(fb_info->screen_base, fb_buf, width * height * bpp);
ãã®äŸã§ã¯ã200 x 200 pxã®ãŠã£ã³ããŠãäœæããããã«ã°ã©ãã£ãã¯ãæç»ããŸããæåŸã®ã·ãŒã³èªäœã¯ãSDRAMã«å²ãåœãŠãfb_bufãããã¡ãŒã«æç»ãããŸãããããŠæåŸã®è¡ã§ã¯ãmemcpyã¯åã«åŒã³åºãããŸãããããŠããã¹ãŠãç¡éã®ãµã€ã¯ã«ã§ç¹°ãè¿ãããŸãã
ãã®äŸããã«ãããŠå®è¡ãããšãçŽ10ã15FPSã«ãªããŸããããã¯ç®ã§ãç®ç«ã€ã®ã§ãããã¯ç¢ºãã«ããŸãè¯ããããŸãããããã«ãNuklearã¬ã³ããªã³ã°ã³ãŒãã«ã¯å€ãã®æµ®åå°æ°ç¹èšç®ãå«ãŸããŠãããããæåã«ãµããŒããæå¹ã«ããŸãããããããªããšãFPSã¯ããã«äœããªããŸããæåã®æãåçŽãªïŒç¡æã®ïŒæé©åã¯ããã¡ãã-O2ã³ã³ãã€ã©ãã©ã°ã§ãã
åãäŸãäœæããŠå®è¡ããŠã¿ãŸãããã20FPSãåŸãããŸããããè¯ãã§ãããããã§ãè¯ãä»äºã«ã¯ååã§ã¯ãããŸããã
ããã»ããµãã£ãã·ã¥ã®æå¹åãã©ã€ãã¹ã«ãŒã¢ãŒã
ãããªãæé©åã«ç§»ãåã«ãã¡ã¢ãªã«çŽæ¥æç»ããNuklearã®äžéšãšããŠrawfbãã©ã°ã€ã³ã䜿çšããŠãããšèšããŸãããããã£ãŠãã¡ã¢ãªã®æé©åã¯éåžžã«ææã«èŠããŸããæåã«é ã«æµ®ãã¶ã®ã¯ãã£ãã·ã¥ã§ãã
Cortex-M7ïŒãã®å ŽåïŒãªã©ã®å€ãããŒãžã§ã³ã®Cortex-Mã«ã¯ã远å ã®ããã»ããµãã£ãã·ã¥ïŒåœä»€ãã£ãã·ã¥ãšããŒã¿ãã£ãã·ã¥ïŒãçµã¿èŸŒãŸããŠããŸããããã¯ãã·ã¹ãã å¶åŸ¡ãããã¯ã®CCRã¬ãžã¹ã¿ãä»ããŠæå¹ã«ãªããŸãããããããã£ãã·ã¥ãå«ãããšãæ°ããåé¡ãçºçããŸãããã£ãã·ã¥ãšã¡ã¢ãªå ã®ããŒã¿ã®äžæŽåã§ãããã£ãã·ã¥ã管çããæ¹æ³ã¯ããã€ããããŸããããã®èšäºã§ã¯ãããã«ã€ããŠã¯è©³ãã説æããŸããããã®ãããç§ã®æèŠã§ã¯ãæãåçŽãªæ¹æ³ã®1ã€ã«ç§»ããŸãããã£ãã·ã¥/ã¡ã¢ãªã®äžæŽåã®åé¡ã解決ããããã«ã䜿çšå¯èœãªãã¹ãŠã®ã¡ã¢ãªãããã£ãã·ã¥äžå¯ããšããŠããŒã¯ããã ãã§ããããã¯ããã®ã¡ã¢ãªãžã®ãã¹ãŠã®æžã蟌ã¿ãããã£ãã·ã¥ã§ã¯ãªãåžžã«ã¡ã¢ãªã«éãããããšãæå³ããŸãããããããã®æ¹æ³ã§ãã¹ãŠã®ã¡ã¢ãªã«ããŒã¯ãä»ãããšããã£ãã·ã¥ã«ãæå³ããªããªããŸããå¥ã®ãªãã·ã§ã³ããããŸããããã¯ããã¹ã¹ã«ãŒãã¢ãŒãã§ãããã©ã€ãã¹ã«ãŒãšããŠããŒã¯ãããã¡ã¢ãªãžã®ãã¹ãŠã®æžã蟌ã¿ãåæã«ãã£ãã·ã¥ã«éä¿¡ãããŸãããšã¡ã¢ãªå ãããã«ããæžã蟌ã¿ãªãŒããŒããããçºçããŸãããäžæ¹ã§èªã¿åããå€§å¹ ã«é«éåããããããçµæã¯ç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠç°ãªããŸãã
Nuklearã®å Žåãã©ã€ãã¹ã«ãŒã¢ãŒãã¯éåžžã«åªããŠããããšãããããŸãããããã©ãŒãã³ã¹ã¯20FPSãã45FPSã«äžæããããèªäœã¯ãã§ã«éåžžã«è¯å¥œã§ã¹ã ãŒãºã§ãããã®å¹æã¯ç¢ºãã«è峿·±ããã®ã§ãããŒã¿ã®äžæŽåã«æ³šæãæããã«ã©ã€ãã¹ã«ãŒã¢ãŒããç¡å¹ã«ããããšããŸããããFPSã¯50 FPSã«ããäžæããŸããã§ãããã€ãŸããã©ã€ãã¹ã«ãŒãšæ¯èŒããŠå€§ããªå¢å ã¯ãããŸããã§ããããã®ããšãããã¢ããªã±ãŒã·ã§ã³ã«ã¯æžã蟌ã¿ã§ã¯ãªããå€ãã®èªã¿åãæäœãå¿ èŠã§ãããšçµè«ä»ããŸãããåé¡ã¯ããã¡ãããã©ãã§ããïŒãããããæ¬¡ã®ä¿æ°ãªã©ãèªã¿åãããã«ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããšãå€ãrawfbã³ãŒãã®å€æã®æ°ãåå ã§ãã
ããã«ãããã¡ãªã³ã°ïŒãããŸã§ã¯äžéãããã¡ã䜿çšïŒãDMAã®æå¹å
45 FPSã§æ¢ãŸããããªãã£ãã®ã§ãããã«å®éšããããšã«ããŸãããæ¬¡ã®ã¢ã€ãã¢ã¯ããã«ãããã¡ãªã³ã°ã§ããããã®ã¢ã€ãã¢ã¯åºãç¥ãããŠãããäžè¬çã«ã¯åçŽã§ãã 1ã€ã®ããã€ã¹ã䜿çšããŠã·ãŒã³ã1ã€ã®ãããã¡ãŒã«æç»ããä»ã®ããã€ã¹ã¯å¥ã®ãããã¡ãŒãã衚瀺ããŸããåã®ã³ãŒããèŠããšãã·ãŒã³ãæåã«ãããã¡ã«æç»ãããæ¬¡ã«memcpyã䜿çšããŠã³ã³ãã³ãããããªã¡ã¢ãªã«ã³ããŒãããã«ãŒããã¯ã£ãããšããããŸãã memcpyãCPUã䜿çšããŠããããšã¯æããã§ããã€ãŸããã¬ã³ããªã³ã°ãšã³ããŒã¯é çªã«è¡ãããŸããç§ãã¡ã®ã¢ã€ãã¢ã¯ãDMAã䜿çšããŠã³ããŒã䞊è¡ããŠå®è¡ã§ãããšãããã®ã§ãããã€ãŸããããã»ããµãæ°ããã·ãŒã³ãæç»ããŠããéãDMAã¯åã®ã·ãŒã³ããããªã¡ã¢ãªã«ã³ããŒããŸãã
Memcpyã¯æ¬¡ã®ã³ãŒãã«çœ®ãæããããŸãã
while (dma_in_progress()) {
}
ret = dma_transfer((uint32_t) fb_info->screen_base,
(uint32_t) fb_buf[fb_buf_idx], (width * height * bpp) / 4);
if (ret < 0) {
printf("DMA transfer failed\n");
}
fb_buf_idx = (fb_buf_idx + 1) % 2;
ããã«fb_buf_idxïŒãããã¡ã®ã€ã³ããã¯ã¹ïŒãå ¥åãããŸãã fb_buf_idx = 0ã¯ããã³ããããã¡ãŒãfb_buf_idx = 1ã¯ããã¯ãããã¡ãŒã§ãã dma_transferïŒïŒé¢æ°ã¯ãå®å ããœãŒã¹ãããã³32ãããã¯ãŒãã®æ°ãåãåããŸããæ¬¡ã«ãDMAã«å¿ èŠãªããŒã¿ã課éãããäœæ¥ã¯æ¬¡ã®ãããã¡ãŒã§ç¶è¡ãããŸãã
ãã®ã¡ã«ããºã ã詊ããåŸãããã©ãŒãã³ã¹ã¯çŽ48FPSã«åäžããŸããã memcpyïŒïŒããããããã«åªããŠããŸããããããã§ãã DMAã圹ã«ç«ããªãã£ããšèšã£ãŠããããã§ã¯ãããŸãããããã®ç¹å®ã®äŸã§ã¯ãå šäœåã«å¯Ÿãããã£ãã·ã¥ã®å¹æãåªããŠããŸããã
DMAã®ããã©ãŒãã³ã¹ãäºæ³ãããæªãããšã«å°ãé©ããåŸãç§ãã¡ã¯ãåªããããã®ãæãã€ããŸãããããã¯ãããã€ãã®DMAãã£ãã«ã䜿çšãããšããã¢ã€ãã¢ã§ããããã€ã³ãã¯äœã§ããïŒ stm32f7xxã§äžåºŠã«DMAã«ããŒãã§ããããŒã¿ã®æ°ã¯256KBã§ããåæã«ãç»é¢ã480x272ã§ããããªã¡ã¢ãªãçŽ512 KBã§ããããšãå¿ããªãã§ãã ãããã€ãŸããããŒã¿ã®ååã1ã€ã®DMAãã£ãã«ã«ãåŸåãåŸåã«é 眮ã§ããããã«èŠããŸãããããŠããã¹ãŠãè¯ãããã§ã...ããããããã©ãŒãã³ã¹ã¯48FPSãã25-30FPSã«äœäžããŸããã€ãŸãããã£ãã·ã¥ããŸã æå¹ã«ãªã£ãŠããªãç¶æ³ã«æ»ããŸããäœãšæ¥ç¶ã§ããŸããïŒå®éãSDRAMã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ãåæãããŠãããããã¡ã¢ãªã§ããåæåçã©ã³ãã ã¢ã¯ã»ã¹ã¡ã¢ãªïŒSDRAMïŒãšåŒã°ããããããã®ãªãã·ã§ã³ã¯è¿œå ã®åæã远å ããã ãã§ããå¿ èŠã«å¿ããŠãã¡ã¢ãªãžã®æžã蟌ã¿ã䞊åã«ããããšãªããå°ãèããŠã¿ããšãã¡ã¢ãªã1ã€ã§ãããæžã蟌ã¿ãšèªã¿åãã®ãµã€ã¯ã«ã1ã€ã®ãã€ã¯ãåè·¯ïŒ1ã€ã®ãã¹äžïŒã«çæãããå¥ã®ãœãŒã¹/ã¬ã·ãŒããŒã远å ãããããããã¹äžã®åŒã³åºãã解決ããã¢ãŒãã¿ãŒã远å ããããããããã§ã¯é©ãã¹ãããšã¯äœããªãããšã«æ°ä»ããŸããã ãç°ãªãDMAãã£ãã«ããã®ã³ãã³ããµã€ã¯ã«ãæ··åšãããå¿ èŠããããŸãã
ããã«ãããã¡ãªã³ã°ãLTDCãšã®é£æº
äžéãããã¡ããã®ã³ããŒã¯ç¢ºãã«è¯ãã§ãããç§ãã¡ãç¥ã£ãããã«ãããã¯ååã§ã¯ãããŸããããã1ã€ã®æãããªæ¹åç¹ã§ããããã«ãããã¡ãªã³ã°ãèŠãŠã¿ãŸããããææ°ã®ãã£ã¹ãã¬ã€ã³ã³ãããŒã©ãŒã®å€§éšåã§ã¯ã䜿çšãããããªã¡ã¢ãªã«ã¢ãã¬ã¹ãèšå®ã§ããŸãããããã£ãŠãã³ããŒãå®å šã«åé¿ãããããªã¡ã¢ãªã¢ãã¬ã¹ãæºåããããããã¡ã«åé 眮ããã ãã§ãç»é¢ã³ã³ãããŒã©ã¯DMAãä»ããŠããŒã¿ãæé©ãªæ¹æ³ã§ååŸããŸããããã¯å®éã®ããã«ãããã¡ãªã³ã°ã§ããã以åã®ããã«äžéãããã¡ã¯ãããŸããããã£ã¹ãã¬ã€ã³ã³ãããŒã©ãŒã2ã€ä»¥äžã®ãããã¡ãŒãæã€ããšãã§ããå Žåã®ãªãã·ã§ã³ããããŸããããã¯åºæ¬çã«åãããšã§ããäžæ¹ã®ãããã¡ãŒã«æžã蟌ã¿ãããäžæ¹ã¯ã³ã³ãããŒã©ãŒã«ãã£ãŠäœ¿çšãããŸãããã³ããŒã¯å¿ èŠãããŸããã
stm32f74xxã®LTDCïŒLCD-TFTãã£ã¹ãã¬ã€ã³ã³ãããŒã©ãŒïŒã«ã¯ãã¬ã€ã€ãŒ1ãšã¬ã€ã€ãŒ2ã®2ã€ã®ããŒããŠã§ã¢ãªãŒããŒã¬ã€ã¬ã€ã€ãŒããããã¬ã€ã€ãŒ2ã¯ã¬ã€ã€ãŒ1ã«éããããŸããåã¬ã€ã€ãŒã¯åå¥ã«æ§æå¯èœã§ãããåå¥ã«æå¹ãŸãã¯ç¡å¹ã«ã§ããŸããã¬ã€ã€ãŒ1ã®ã¿ãæå¹ã«ããŠãããã³ããããã¡ãŒãŸãã¯ããã¯ãããã¡ãŒã®ãããªã¡ã¢ãªã¢ãã¬ã¹ãåé 眮ããããšããŸãããã€ãŸãã1ã€ããã£ã¹ãã¬ã€ã«æž¡ãããã1ã€ããã®æç¹ã§æç»ããŸãããããããªãŒããŒã¬ã€ãåãæ¿ãããšãã«é¡èãªãžãã¿ãŒãçºçããŸããã
äž¡æ¹ã®ã¬ã€ã€ãŒããªã³/ãªãã§äœ¿çšããå Žåãã€ãŸããåã¬ã€ã€ãŒã«ç¬èªã®ãããªã¡ã¢ãªã¢ãã¬ã¹ããããããã¯å€æŽããããäžæ¹ã®ã¬ã€ã€ãŒããªã³ã«ããŠããäžæ¹ã®ã¬ã€ã€ãŒããªãã«ããããšã§ãããã¡ãŒã倿Žãããå Žåã«ããã®ãªãã·ã§ã³ã詊ããŸãããå€åããžãã¿ãŒãåŒãèµ·ãããŸãããæåŸã«ãã¬ã€ã€ãŒããªãã«ãªã£ãŠããªããšãã«ãªãã·ã§ã³ã詊ããŸããããã¢ã«ãã¡ãã£ãã«ã¯ãŒã0ãŸãã¯æå€§ïŒ255ïŒã«èšå®ãããŸãããã€ãŸããéæåºŠãå¶åŸ¡ããŠãã¬ã€ã€ãŒã®1ã€ãé衚瀺ã«ããŸããããããããã®ãªãã·ã§ã³ã¯æåŸ ã«å¿ãããããéãã¯ãŸã ååšããŠããŸããã
çç±ã¯æç¢ºã§ã¯ãããŸããã§ãããããã¥ã¡ã³ãã«ã¯ãã¬ã€ã€ãŒã®ç¶æ ã®æŽæ°ããã®å Žã§å®è¡ã§ãããšèšèŒãããŠããŸããç°¡åãªãã¹ããè¡ããŸããããã£ãã·ã¥ãšãããŒãã£ã³ã°ãã€ã³ãããªãã«ããç»é¢ã®äžå€®ã«ç·è²ã®åè§ãä»ãã鿢ç»ãæç»ããŸãããããã¯ãã¬ã€ã€ãŒ1ãšã¬ã€ã€ãŒ2ã®äž¡æ¹ã§åãã§ã鿢ç»ãååŸããããšãæåŸ ããŠãã«ãŒãã§ã¬ãã«ãåãæ¿ãå§ããŸãããããããç§ãã¡ã¯åã³åãæºããåŸãŸããã
ããã¯å¥ã®ãã®ã§ããããšãæããã«ãªããŸããããããŠã圌ãã¯ã¡ã¢ãªå ã®ãã¬ãŒã ãããã¡ã¢ãã¬ã¹ã®é 眮ãæãåºããŸããããããã¡ã¯ããŒãããå²ãåœãŠããããããã®ã¢ãã¬ã¹ã¯æŽåãããŠããªãã£ããããã¢ãã¬ã¹ã1 KBæŽåããŸãããã€ãŸãããžãã¿ãŒã®ãªãæåŸ ã©ããã®ç»åãåŸãããŸãããæ¬¡ã«ãLTDCã64ãã€ãã®ãããã§ããŒã¿ãæžç®ããããŒã¿ã®äžåäžæ§ã«ãã£ãŠããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããããšãããã¥ã¡ã³ãã§çºèŠããŸããããã®å Žåããã¬ãŒã ãããã¡ã®å é ã®ã¢ãã¬ã¹ãšãã®å¹ ã®äž¡æ¹ãæããå¿ èŠããããŸãããã¹ãããããã«ã480x4ã®å¹ ã470x4ã«å€æŽããŸãããããã¯64ãã€ãã§å²ãåãããåããžãã¿ãçºçããŸããã
ãã®çµæãäž¡æ¹ã®ãããã¡ãŒã64ãã€ãã§æŽåãããå¹ ã64ãã€ãã§æŽåãããnuklearãå®è¡ããããšã確èªããŸããããžãã¿ãŒã¯ãªããªããŸãããããŸããã£ã解決çã¯æ¬¡ã®ããã«ãªããŸããã¬ã€ã€ãŒ1ãŸãã¯ã¬ã€ã€ãŒã®ãããããå®å šã«ç¡å¹ã«ããŠã¬ã€ã€ãŒãåãæ¿ãã代ããã«ãéæåºŠã䜿çšããŸããã€ãŸããã¬ãã«ãç¡å¹ã«ããã«ã¯ããã®éæåºŠã0ã«èšå®ããæå¹ã«ããã«ã¯-ã255ã«èšå®ããŸãã
BSP_LCD_SetTransparency_NoReload(fb_buf_idx, 0xff);
fb_buf_idx = (fb_buf_idx + 1) % 2;
BSP_LCD_SetTransparency(fb_buf_idx, 0x00);
70ã75 FPSãååŸããŸããïŒãªãªãžãã«ã®15ãããã¯ããã«åªããŠããŸãã
ãœãªã¥ãŒã·ã§ã³ã¯éæåºŠå¶åŸ¡ãä»ããŠæ©èœããã¬ãã«ã®1ã€ãç¡å¹ã«ãããªãã·ã§ã³ãšãã¬ãã«ã¢ãã¬ã¹ãåé 眮ãããªãã·ã§ã³ã«ãããFPSã40ã50ã®å€§ããªç»åãžãã¿ãŒãçºçããããšã«æ³šæããŠãã ãããçç±ã¯ãçŸæç¹ã§ã¯äžæã§ãããŸããå ã«é²ããšãããããã®ããŒãã®ãœãªã¥ãŒã·ã§ã³ã§ãããšèšããŸãã
DMA2Dãä»ããããŒããŠã§ã¢ã·ãŒã³ã®å¡ãã€ã¶ã
ããããããã¯å¶éã§ã¯ãããŸãããFPSãå¢ããããã®æåŸã®æé©åã¯ãããŒããŠã§ã¢ã·ãŒã³ã®å å¡«ã§ãããã®åã«ãããã°ã©ã ã§å å¡«ãè¡ããŸããã
nk_rawfb_render(rawfb, nk_rgb(30,30,30), 1);
ããã§ãrawfbãã©ã°ã€ã³ã«ãã·ãŒã³ãå¡ãã€ã¶ãå¿ èŠã¯ãªãããã€ã³ãããã ãã§ããããšãäŒããŸãããã
nk_rawfb_render(rawfb, nk_rgb(30,30,30), 0);
DMA2Dã³ã³ãããŒã©ãŒãä»ããããŒããŠã§ã¢ã§ã®ã¿ãã·ãŒã³ãåãè²0xff303030ã§å¡ãã€ã¶ããŸããDMA2Dã®äž»ãªæ©èœã®1ã€ã¯ãRAMå ã®é·æ¹åœ¢ãã³ããŒãŸãã¯å¡ãã€ã¶ãããšã§ããããã§ã®äž»ãªäŸ¿å©ãªç¹ã¯ããããé£ç¶ããã¡ã¢ãªã§ã¯ãªããã¡ã¢ãªå ã«ãã¬ãŒã¯ã®ããé·æ¹åœ¢ã®é åã§ãããšããããšã§ããã€ãŸããéåžžã®DMAãããã«å®è¡ããããšã¯ã§ããŸãããEmboxã§ã¯ããã®ããã€ã¹ããŸã 䜿çšããŠããªããããSTM32CubeããŒã«ïŒBSP_LCD_ClearïŒuint32_t ColorïŒé¢æ°ïŒã䜿çšããŠã¿ãŸããããDMA2Dã§ç»é¢å šäœã®å¡ãã€ã¶ãã®è²ãšãµã€ãºãããã°ã©ã ããŸãã
åçŽãã©ã³ãã³ã°æéïŒVBLANKïŒ
ãããã80 FPSã§ããé¡èãªåé¡ãæ®ã£ãŠããŸããããŠã£ãžã§ããã®äžéšã¯ãç»é¢äžãç§»åãããšãã«å°ããªãåãç®ãã§ç§»åããŸãããã€ãŸãããŠã£ãžã§ããã¯3ã€ïŒãŸãã¯ãã以äžïŒã®éšåã«åå²ãããŠããããã«èŠãããããã¯äžŠãã§ç§»åããŸããããããããªé å»¶ããããŸããããã®çç±ã¯ããããªã¡ã¢ãªã®æŽæ°ãæ£ãããªãããšãåå ã§ããããšã倿ããŸãããããæ£ç¢ºã«ã¯ãééã£ãæéééã§æŽæ°ããŸãã
ãã£ã¹ãã¬ã€ã³ã³ãããŒã©ã«ã¯VBLANKãªã©ã®ããããã£ããããVBIãŸãã¯åçŽãã©ã³ãã³ã°æéã§ããããŸãã飿¥ãããããªãã¬ãŒã éã®æéééã瀺ããŸããããæ£ç¢ºã«ã¯ãåã®ãããªãã¬ãŒã ã®æåŸã®è¡ã𿬡ã®ãããªãã¬ãŒã ã®æåã®è¡ã®éã®æéããã®ééã§ã¯ãæ°ããããŒã¿ã¯ãã£ã¹ãã¬ã€ã«è»¢éããããç»åã¯éæ¢ããŠããŸãããã®ãããVBLANKå ã®ãããªã¡ã¢ãªãæŽæ°ããŠãå®å šã§ãã
å®éã«ã¯ãLTDCã³ã³ãããŒã©ãŒã«ã¯ã次ã®ãã¬ãŒã ãããã¡ãŒã©ã€ã³ïŒLTDCã©ã€ã³å²ã蟌ã¿äœçœ®æ§æã¬ãžã¹ã¿ïŒLTDC_LIPCRïŒïŒã®åŠçåŸã«ããªã¬ãŒãããããã«æ§æãããå²ã蟌ã¿ããããŸãããããã£ãŠããã®å²ã蟌ã¿ãæåŸã®è¡çªå·ã«æ§æãããšãVBLANKééã®å§ãŸããååŸãããŸãããã®æç¹ã§ãå¿ èŠãªãããã¡åãæ¿ããè¡ããŸãã
ãã®ãããªè¡åã®çµæãçµµã¯æ£åžžã«æ»ããã®ã£ããã¯ãªããªããŸããããããåæã«ãFPSã¯80ãã60ã«äœäžããŸããããã®åäœã®çç±ãäœã§ããããçè§£ããŸããããæ¬¡ã®åŒã¯
ãããã¥ã¡ã³ãã«èšèŒãããŠããŸãã
LCD_CLK (MHz) = total_screen_size * refresh_rate,
ããã§ãtotal_screen_size = total_width xtotal_heightãLCD_CLKã¯ããã£ã¹ãã¬ã€ã³ã³ãããŒã©ããããªã¡ã¢ãªããç»é¢ã«ãã¯ã»ã«ãããŒãããåšæ³¢æ°ã§ãïŒããšãã°ããã£ã¹ãã¬ã€ã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ïŒDSIïŒãä»ããŠïŒããã ããrefresh_rateã¯ãã§ã«ç»é¢èªäœã®æŽæ°é床ã§ããããã®ç©ççç¹æ§ã§ããç»é¢ã®æŽæ°é床ãšãã®å¯žæ³ããããã°ããã£ã¹ãã¬ã€ã³ã³ãããŒã©ãŒã®åšæ³¢æ°ãæ§æã§ããŸããSTM32Cubeãäœæããæ§æã®ã¬ãžã¹ã¿ãŒããã§ãã¯ããåŸãã³ã³ãããŒã©ãŒã60Hzã®ç»é¢ã«èª¿æŽãããŠããããšãããããŸãããããã§ãããã¯ãã¹ãŠäžç·ã«ãªããŸããã
ãã®äŸã®å ¥åããã€ã¹ã«ã€ããŠå°ã
ã¢ããªã±ãŒã·ã§ã³ã«æ»ã£ãŠãã¿ããã¹ã¯ãªãŒã³ãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããããåç¥ã®ããã«ãææ°ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯å¯Ÿè©±æ§ãã€ãŸããŠãŒã¶ãŒãšã®å¯Ÿè©±ãæå³ããŸãã
ããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã«é 眮ãããŠããŸããå ¥åããã€ã¹ããã®ã€ãã³ãã¯ãã·ãŒã³ãã¬ã³ããªã³ã°ããçŽåã«ã¡ã€ã³ããã°ã©ã ã«ãŒãã§åŠçãããŸãã
/* Input */
nk_input_begin(&rawfb->ctx);
{
switch (mouse->type) {
case INPUT_DEV_MOUSE:
handle_mouse(mouse, fb_info, rawfb);
break;
case INPUT_DEV_TOUCHSCREEN:
handle_touchscreen(mouse, fb_info, rawfb);
break;
default:
/* Unreachable */
break;
}
}
nk_input_end(&rawfb->ctx);
ã¿ããã¹ã¯ãªãŒã³ããã®ã€ãã³ãã®åŠçã¯ãhandle_touchscreenïŒïŒé¢æ°ã§è¡ãããŸãã
handle_touchscreen
static void handle_touchscreen(struct input_dev *ts, struct fb_info *fb_info,
struct rawfb_context *rawfb) {
struct input_event ev;
int type;
static int x = 0, y = 0;
while (0 <= input_dev_event(ts, &ev)) {
type = ev.type & ~TS_EVENT_NEXT;
switch (type) {
case TS_TOUCH_1:
x = normalize_coord((ev.value >> 16) & 0xffff, 0, fb_info->var.xres);
y = normalize_coord(ev.value & 0xffff, 0, fb_info->var.yres);
nk_input_button(&rawfb->ctx, NK_BUTTON_LEFT, x, y, 1);
nk_input_motion(&rawfb->ctx, x, y);
break;
case TS_TOUCH_1_RELEASED:
nk_input_button(&rawfb->ctx, NK_BUTTON_LEFT, x, y, 0);
break;
default:
break;
}
}
}
å®éãããã¯å ¥åããã€ã¹ã€ãã³ããNuklearãçè§£ã§ãã圢åŒã«å€æãããå Žæã§ããå®éãããããããã ãã§ãã
å¥ã®ããŒãã§èµ·å
ããªããŸãšããªçµæãåãåã£ãã®ã§ãå¥ã®ããŒãã§ããããåçŸããããšã«ããŸãããå¥ã®åæ§ã®ããŒããSTM32F769I-DISCOããããŸãããåãLTDCã³ã³ãããŒã©ãŒããããŸãããè§£å床ã800x480ã®ç°ãªãç»é¢ã§ããèµ·ååŸã25FPSãååŸããŸãããã€ãŸããããã©ãŒãã³ã¹ã®é¡èãªäœäžã§ããããã¯ããã¬ãŒã ãããã¡ã®ãµã€ãºã«ãã£ãŠç°¡åã«èª¬æã§ããŸããããã¯ãã»ãŒ3åã®å€§ããã§ããããããäž»ãªåé¡ã¯ç°ãªãããšã倿ããŸãããç»åãéåžžã«æªãã§ããŠããŠã£ãžã§ããã1ãæã«é 眮ããå¿ èŠãããæç¹ã§éæ¢ç»åããããŸããã§ããã
çç±ã¯æç¢ºã§ã¯ãªãã£ãã®ã§ãSTM32Cubeã®æšæºçãªäŸã調ã¹ãŸããããã®ç¹å®ã®ããŒãã®ããã«ãããã¡ãªã³ã°ã®äŸããããŸããããã®äŸã§ã¯ãéçºè ã¯ãéæåºŠã倿Žããæ¹æ³ãšã¯ç°ãªããVBLANKå²ã蟌ã¿ã§ãã¬ãŒã ãããã¡ãŒãžã®ãã€ã³ã¿ãŒãç§»åããã ãã§ããæåã®ããŒãã§ãã®æ¹æ³ããã§ã«è©ŠããŸããããããŸããããŸããã§ãããããããSTM32F769I-DISCOã«ãã®æ¹æ³ã䜿çšãããšã25FPSããããªãã¹ã ãŒãºãªç»åã®å€åãåŸãããŸããã
åãã§ãæåã®ããŒãã§ãã®æ¹æ³ãïŒãã€ã³ã¿ãŒãåé 眮ããŠïŒå床ãã¹ãããŸããããããã§ãé«FPSã§ã¯æ©èœããŸããã§ããããã®çµæãã¬ã€ã€ãŒã®éæåºŠïŒ60 FPSïŒã䜿çšããæ¹æ³ã¯äžæ¹ã®ããŒãã§æ©èœãããã€ã³ã¿ãŒãåé 眮ããæ¹æ³ïŒ25 FPSïŒã¯ããäžæ¹ã®ããŒãã§æ©èœããŸããç¶æ³ã«ã€ããŠè©±ãåã£ãåŸãã°ã©ãã£ãã¯ã¹ã¿ãã¯ã®è©³çްãªèª¿æ»ãŸã§çµ±åãå»¶æããããšã«ããŸããã
çµæ
ããã§ã¯ãèŠçŽããŸãããã瀺ãããŠããäŸã¯ããã€ã¯ãã³ã³ãã¥ãŒã¿ãŒçšã®ã·ã³ãã«ã§ãããªããäžè¬çãªGUIãã¿ãŒã³ïŒããã€ãã®ãã¿ã³ãããªã¥ãŒã ã³ã³ãããŒã«ããŸãã¯ãã®ä»ïŒã衚ããŠããŸããã°ã©ãã£ãã¯ã«éç¹ã眮ãããŠããããããã®äŸã«ã¯ã€ãã³ãã«é¢é£ããããžãã¯ããããŸãããããã©ãŒãã³ã¹ã«é¢ããŠã¯ãããªããŸãšããªFPSå€ãåŸãããŸããã
ããã©ãŒãã³ã¹ãæé©åããããã®èç©ããããã¥ã¢ã³ã¹ã¯ãã°ã©ãã£ãã¯ã¹ãææ°ã®ãã€ã¯ãããã»ããµã§ããè€éã«ãªã£ãŠãããšããçµè«ã«ã€ãªãããŸããããã§ãå€§èŠæš¡ãªãã©ãããã©ãŒã ãšåæ§ã«ãããã»ããµãã£ãã·ã¥ãç£èŠããå€éšã¡ã¢ãªã«äœããé 眮ããããé«éãªã¡ã¢ãªã«äœããé 眮ããDMAã䜿çšããDMA2Dã䜿çšããVBLANKãç£èŠããå¿ èŠããããŸããããã¯ãã¹ãŠå€§ããªãã©ãããã©ãŒã ã®ããã«èŠãå§ããŸããããããŠå€åããã¯ç§ããã§ã«äœåºŠãXServerãšWaylandã«èšåããçç±ã§ãã
ããããæãæé©åãããŠããªãéšåã®1ã€ã¯ã¬ã³ããªã³ã°èªäœã§ãããã·ãŒã³å šäœãæåããå®å šã«åæç»ããŸãããã€ã¯ãã·ã¹ãã çšã®ä»ã®ã©ã€ãã©ãªãŒã§ãããã©ã®ããã«è¡ããããã¯èšããŸãããããããããã®æ®µéãã©ã€ãã©ãªãŒèªäœã«çµã¿èŸŒãŸããŠããå Žæã§ããããããNuklearã§ã®äœæ¥ã®çµæã«åºã¥ããšããã®å Žæã§ã¯X ServerãŸãã¯Waylandã®é¡äŒŒç©ãå¿ èŠã§ããããã«æãããŸãããã¡ããã軜éã§ãããããå°ããªã·ã¹ãã ã倧ããªã·ã¹ãã ã®ãã¹ãç¹°ãè¿ããšããèãã«ã€ãªãããŸãã
UPD1
ãã®çµæãéæåºŠã倿Žããæ¹æ³ã¯å¿ èŠãããŸããã§ãããäž¡æ¹ã®ããŒãã§ãå ±éã®ã³ãŒããæ©èœããŸãã-v-syncã«ãã£ãŠãããã¡ãŒã¢ãã¬ã¹ã亀æããŸããããŸããéæåºŠã®ããæ¹æ³ãæ£ããã®ã§ãå¿ èŠãããŸããã
UPD2
ããªãã«ãããã¡ãªã³ã°ãææ¡ããŠããããã¹ãŠã®äººã«æè¬ããŸãããŸã å®çŸããŠããŸãããããããããã¯å€å žçãªæ¹æ³ã§ããããšãããããŸãïŒç¹ã«ããã£ã¹ãã¬ã€ãžã®ãã¬ãŒã ã¬ãŒããé«ãFPSã®å ŽåïŒãããã«ãããç¹ã«ãv-syncãåŸ æ©ããããšã«ããã©ã°ãåãé€ãããšãã§ããŸãïŒã€ãŸãããœãããŠã§ã¢ãç»åãããèããé²ãã§ããå ŽåïŒãç§ãã¡ã¯ãŸã ããã«ééããŠããŸããããããã¯æéã®åé¡ã§ãããããŠãç§ãèšãããããªãã«ãããã¡ãªã³ã°ã«ã€ããŠã®è°è«ã«ç¹å¥ã«æè¬ããŸãbesitzeruf ãã㊠ãã©ãïŒ
é£çµ¡å ïŒ
GithubïŒhttpsïŒ//github.com/embox/embox
ãã¥ãŒã¹ã¬ã¿ãŒïŒembox-ru [at] googlegroups.com
ãã¬ã°ã©ã ãã£ããïŒt.me/embox_chat