macsbug

Easter Egg of ESP32

leave a comment »

ESP32 イースター・エッグ:ESP32 TinyBasic Plus            2017.01.04
ESP32のROMにベーシックインタープリターが隠されています。

CoolTerm での表示ですが Arduino IDE シリアルモニターでも可能です。
PEEK, POKE命令も使用できます。

TinyBasic の件は espressif/esp-idf/ROM Source Code Copyrights/ に書かれています。

詳細は BleuLlama/TinyBasicPlus にあり命令とサンプルが記載されています。
_ 追加機能:
_ fileio(SDライブラリ)。SDカードからのプログラムの自動実行。
_ smaller footprint (PROGMEM)。pin data IO 。on-chip EEProm storage
_ のサポートが含まれます。


.
手順:ESP32 は NANO32を使用。 ESP32 の GPIO 12 を HIGH にします。
1. ESP32 GPIO 12:HIGH ( Resistor で Pull_up) 。
2. シリアルモニター:Baudrate=115200, Enter Key Emulation=CR 。
3. ESP32:電源オン, EN Switch Push 。
4. Key Board:Enter Key 連打。
5. >:コマンドプロンプトがでたら BASIC が起動した事を示します。感動!

詳細:HACKAYDAY:BASIC INTERPRETER HIDDEN IN ESP32 SILICON
Elliot Williams氏に感謝!
ここでの内容とハイレベルの方のコメント欄は非常に参考になります。

メモ:ESP32のGPIO 12 をプルアップして起動すると Arduino IDE での書き込みは
_  出来ません。 理由は ESP32 のシリアル出力から メッセージが連続して流れ
_  続ける為です。回避する為には プルアップ抵抗を取り除きます。

参考:TinyBasic Plus


.
BASIC MODE:

GPIO 12 を HIGH にすると Arduino IDE シリアルからは以下のメッセージがでます。
ESP32 の状況と 「Falling back to built-in command interpreter.」のメッセージ。
これから キーボードの Enter key(CR) で BASICモードに入る事ができます。

>ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3bd80000,len:4
load:0x3ffc000c,len:1452
load:0x40078000,len:2908
ho 0 tail 12 room 4
load:0x40080000,len:256
csum err:0xa1!=0xb2
Falling back to built-in command interpreter.

.
>about と入力すると 以下のメッセージが出ます。
ESP32 ROM Basic (c) 2016 Espressif Shanghai Derived from TinyBasic Plus by Mike Field and Scott Lawrence

>help と入力すると 使用できるコマンドの一覧が出てきます。
_ LIST, NEW, RUN, NEXT, LET, IF, GOTO, GOSUB, RETURN ,REM,
_ FOR, INPUT, PRINT, PHEX, POKE, STOP, BYE, MEM, ? , ‘ ,
_ DELAY, END, RSEED, HELP, ABOUT, IOSET, IODIR, PEEK,
_ ABS, RND, IOGET, USR

この TinyBasic Plus を作られたのはEspressif Systems の
_ Mike Field 氏と Scott Lawrence 氏です。共に感謝致します。
_ BleuLlama/TinyBasicPlus:他の命令も記載されています。

BASIC in ESP32 で 操作を見る事ができます。


.
Lチカ を実行:ボード上の LED ( GPIO 16 ) が点滅します。

10 POKE &H60004570, 16  // LED ON
20 DELAY 25
30 POKE &H60004570, 0   // LED OFF
40 DELAY 1000
50 GOTO 10

POKE &H60004570, 16:GPIO 16 から “0” を出力し LED を点灯する。
POKE &H60004570, 00:GPIO 16 から “1” を出力し LED を消灯する。
GPIO_FUNC0_OUT_SEL_CFG_REG_16:0x60004570

同様に以下の記述でも点滅します。

10 IODIR 16,1
20 IOSET 16,0    // LED ON
30 DELAY 25
40 IOSET 16,1    // LED OFF
50 DELAY 1000
60 GOTO 20


.
Lチカ と ダイレクトアクセス:Arduino IDE スケッチでの表記:
1. GPIO 16 の LED を点灯させる。以下のいずれかで可能。
_  digitalWrite(16,0);
_  GPIO.enable_w1ts = ((uint32_t)1 << 16);
_  ESP_REG(GPIO_ENABLE_W1TS_REG) = ((uint32_t)1 << 16);
_  GPIO_OUTPUT_SET(16, 0);

2. GPIO 16 の LED を消灯させる。以下のいずれかで可能。
_  digitalWrite(16,1);
_  GPIO.enable_w1tc = ((uint32_t)1 << 16);
_  ESP_REG(GPIO_ENABLE_W1TC_REG) = ((uint32_t)1 << 16);
_  GPIO_OUTPUT_SET(16, 1);

3. ありがちなハマりどころ:
_  POKE &H60004570, 16 :アドレス に “1” を与え GPIO 16 は “0” となる。
_  POKE &H60004570, 00 :アドレス に “0” を与え GPIO 16 は “1” となる。
_  IOSET 16,0 :GPIO 16 に “0” を与え GPIO 16 は “0” となる。
_  IOSET 16,1 :GPIO 16 に “1” を与え GPIO 16 は “1” となる。
_  GPIO.enable_w1ts = (1 << 16);:enable_w1ts へ”1″ を与え GPIO 16 は “0” 。
_  GPIO.enable_w1tc = (1 << 16);:enable_w1tc へ”1″ を与え GPIO 16 は “1” 。
_  ポイント:delay を 異なる値にして LED の ON/OFF 状態を区別します。


.
ESP32 REGISTOR:
_ POKE文で操作する時は Resistor Address の把握が必要です。
_ ESP32 の Resistor Mapは「esp32_technical_reference_manual_en
_ に記載されています。ただし アドレスに誤記があり 当然ながら その
_ アドレスでは動きません。
_ それに対し「eco_and_workarounds_for_bugs_in_esp32_en」に
_ アドレスの修正が記載されており記載されたアドレスで動く事を確認
_ しました。


.
感想:
BASIC MODE:まさかの感動もの!
_ Espressif Systems は なかなか洒落た事をやりますね。素晴らしいです!
_ こういう 隠し技が好き なもので PEEK, POKE文にハマりそうです。
_ ESP32 のシリアル出力から
_ 「rst:0x10(RTCWDT_RTC_RESET),boot:0x33(SPI_FAST_FLASH_BOOT) 」
_ から始まり「ESP32の状態を示す」メッセージがでて 最下部には
_ 「Falling back to built-in command interpreter.」とでます。
_ それを Enter key(CR) で BASICモードに入るとは実に味な事をしますね。

PEEK, POKE:Apple II の時に PEEK, POKE 文で 周辺回路にアクセスしたのを
_ 懐かしく思い出しました。ROMにアクセスして内容を読むとか出来る訳です。

HACKAYDAY:BASIC INTERPRETER HIDDEN IN ESP32 SILICON
_ ここでのコメント欄では 私からすると神の様なハイレベル同士の話は
_ 凄く試になる事と 面白い内容で何回も読んでしまいました。

ESP32 mask ROM hardware includes:ROMに含まれているのは以下、
_ Newlib, XtentaLibhal, TinyBasic, miniz, wpa_supplicant, TjpgDec との


 

Written by macsbug

1月 4, 2017 @ 12:22 pm

カテゴリー: ESP32

コメントを残す