Open3
Maix Amigoの液晶を使いたい
とりあえず、前回( https://zenn.dev/okuoku/scraps/2f459d0b162a21 )で、crosstool-ngで用意したRISC-V64ツールチェーンを使ってhello worldできた。
まぁtwitterを検索してみるとやってる方が出てくるのでできるんだろう多分。。
データシートとソースコードを集める
Maix AmigoのLCDは、いわゆる8080 MCUインターフェースに接続されていて、 CPUからI/Oポートを使って制御を行うことになる。 ... CPU時間がもったいないからSPIとかにしてくれ〜 SPI0のoctalモードが使えるようだ。
- ILI9486のデータシート: https://github.com/AngainorDev/Maix-Amigo-Help/blob/main/Datasheets/Display_ILI9486/ILI9486-ILITEK.pdf
- MaixPyの初期化コード: https://github.com/sipeed/MaixPy/blob/8ddd9e5318a4c74cdd3056cfe98dd02a88bc5eeb/components/drivers/lcd/src/lcd_mcu.c#L97
- Maix Amigoの接続図: https://dl.sipeed.com/fileList/MAIX/HDK/Sipeed-Amigo/2970/Maix_Amigo_2970(Schematic).pdf
- MaixPy自体の _boot.py: https://github.com/sipeed/MaixPy/blob/8ddd9e5318a4c74cdd3056cfe98dd02a88bc5eeb/projects/maixpy_amigo_ips/builtin_py/_boot.py
- Maixduinoのピンレイアウト: https://github.com/sipeed/Maixduino/blob/e9532200e9f99535580c18cead65410927813525/variants/sipeed_maix_amigo/pins_arduino.h
- Maixduinoでカメラ表示をするデモ: https://github.com/fukuen/maixamigo-dvp-demo
- fMSX port: https://github.com/shuichitakano/fmsx210
- LCDサンプルコード: https://qiita.com/Lathe/items/75872f0c14b6fa9e0496#サンプルlcd
これベースで読んでいくのが良いかな。 Arduinoの有名なライブラリ TFT_eSPI ベースで書かれている。
SoC側の設定項目
LCDを駆動するには
- I/O電圧を設定して
- SPI0をoctalモードに設定し
- I/OのCLK、リセット、コマンド/データ切り替え ピンをそれぞれ設定する
必要がある。
Qiitaの例 が一番まとまっているかな。
I/O電圧の設定
sysctl_set_power_mode(SYSCTL_POWER_BANK6, SYSCTL_POWER_V18);
sysctl_set_power_mode(SYSCTL_POWER_BANK7, SYSCTL_POWER_V18);
ドキュメント によれば、
-
BANK6
= Power domain 6,contain IO36-IO41 -
BANK7
= Power domain 7,contain IO42-IO47
結線図によると、IO36等がLCDのI/Oに接続されていて、 データシート によるとSPI0のoctal専用pinは1.8v固定だから BANK6
も1.8vに設定するのは正しそう。
... BANK7
を設定している理由が謎だな。。これらはカメラに繋がっていて、まぁどうせカメラも使うから設定しっぱなしで良いとは思うけど。
SPI0のプロトコル設定
fpioa_set_function(36 /* LCD_CS */, FUNC_SPI0_SS3);
fpioa_set_function(39 /* LCD_WR */, FUNC_SPI0_SCLK);
fpioa_set_function(38 /* LCD_DC */, FUNC_GPIOHS0 + DCX_GPIONUM /* 38 */);
fpioa_set_function(37 /* LCD_RST */, FUNC_GPIOHS0 + RST_GPIONUM /* 37 */);
sysctl_set_spi0_dvp_data(1);
sysctl_set_spi0_dvp_data
に関してはドキュメントが無いので完全に不明。。最終的には、
spi_init(0, SPI_WORK_MODE_0, SPI_FF_OCTAL, 8, 0)
のように octalモードにして使う ことになるが、そもそも何で専用ピンが有るんだ。。?I/Oピン節約のため。。?