Open5

BT816(Bridgetek EVE3)の開発環境の調査

okuokuokuoku

EVE3

SPI接続のマイコン向けGPU。コマンドリストをスキャンライン毎に毎度実行するNintendoDSに近い方式の出力を行う。

https://brtchip.com/product/bt816/

去年既に1280x800解像度に対応するEVE4が出ていたりする。

https://brtchip.com/product/bt818/

ただしEVE3とEVE4の差はあまり無い。

基本的にはベンダ提供のアセットビルダで画面を作ることを想定しているようだ。

https://brtchip.com/document/programming-guides/

エミュレータはEVE Screen editorに収録されていて、

https://brtchip.com/ese-2/

ヘッダファイルは EVE_Hal_Library/Hdr/Msvc_Emulator/Emulator.h にある。

しかし、エミュレータは

https://github.com/Bridgetek/EveApps

に収録されているものの方が新しいようだ。

okuokuokuoku

EVE3とEVE4の違い

プログラミングガイド https://brtchip.com/wp-content/uploads/2022/12/BRT_AN_033_BT81X-Series-Programming-Guide.pdf に言及がある。

  • HSYNC/VSYNCタイミングが調整可能になった
  • 垂直方向のスケーラが追加された (スケールは変更できるもののスケーラ係数は変更できないようだ)
  • アダプティブHSYNCモード (?) 外部同期モードのことかな。。
  • アニメーションを内蔵RAM内で定義可能になった (従来はFlash)
  • コマンドリストを内蔵RAM内に置けるようになった (従来は専用FIFO)
  • フォントキャッシュ (従来ASTCフォントはflashに置く必要があったがRAMに置けるようになった)

リストに言及が無いが、

  • アンダーラン検出レジスタ REG_UNDERRUN の追加。1ラインあたり2048クロックしか使えないが、これを超えたライン数がカウントされる。というか今まで無かったのかよ!
  • タッチスクリーンを特定領域で使用する CMD_CALIBRATESUB コマンドの追加
  • テストスクリーンの追加 CMD_TESTCARD
  • ディレイコマンドの追加 CMD_WAIT

全体にFlashの負荷を下げる方向の変更が目立つ。まぁ取り廻しわるいし顧客要望があったのかな。。

okuokuokuoku

simavrでサンプルを動かしてみる

Arduinoで普通にコンパイルして出てきたhexを掛ければ動くようだ。ただし、UARTは実物を開くように変更している(& com0comでローカルにループバックしている)

diff --git a/examples/parts/uart_pty.c b/examples/parts/uart_pty.c
index 0f6297e..9215b26 100644
--- a/examples/parts/uart_pty.c
+++ b/examples/parts/uart_pty.c
@@ -38,6 +38,8 @@
 #include <pty.h>
 #endif

+#include <fcntl.h>
+
 #include "uart_pty.h"
 #include "avr_uart.h"
 #include "sim_time.h"
@@ -249,6 +251,7 @@ uart_pty_init(
                        (getenv("SIMAVR_UART_XTERM") && atoi(getenv("SIMAVR_UART_XTERM")));
        p->hastap = hastap;

+#if 0
        for (int ti = 0; ti < 1 + hastap; ti++) {
                int m, s;

@@ -266,6 +269,11 @@ uart_pty_init(
                printf("uart_pty_init %s on port *** %s ***\n",
                                ti == 0 ? "bridge" : "tap", p->port[ti].slavename);
        }
+#endif
+        p->port[0].s = open("/dev/com4", O_RDWR);
+        p->port[0].tap = 1;
+        p->port[0].crlf = 1;
+

        pthread_create(&p->thread, NULL, uart_pty_thread, p);