はじめに
Jetson Xavier NX (JetPack 4.6)でSPI接続の1.3' 240*240 IPS ST7789(CS ピン無し)ディスプレイの動作確認をしてみました。
過去、JetPack 4.3 (r32.3.1)で動作しなかった部分がJetPack 4.6 (r32.6.1)で動作するようになりました。
OLED 128x 64 SSD1306 | 1.8' SPI 128x160 ST7735 | 1.3' 240*240 IPS ST7789 | |
---|---|---|---|
Raspberry Pi 3B+ | OK | OK | OK |
Jetson Nano | NG | OK | OK |
Xavier NX | NG | OK | OK |
環境
- Jetson Xavier NX
- IPS 240x240@ST7789ディスプレイ
SPIを有効にする
Jetson-IO tool を使用してSPI (spi1)を有効にします。
Jetson-IO
Configure Jetson 40pin Headerを選択します。(Enterキーを押す)
Configure header pins manuallyを選択します。(矢印キーでカーソルを選択してEnterキーを押す)
spi1を選択します。(矢印キーでカーソルを移動してスペースキーを押すと[*]マークが付きます)
spi1を選択した後はBackで戻ります。(矢印キーでカーソルを移動してEnterキーを押す)
Save and reboot to reconfigure pinsを選択します。(矢印キーでカーソルを選択してEnterキーを押す)
DTBファイルが格納され、何かキーを押すとJetson Xavier NXが再起動します。
再起動後にSPIが有効になっているか確認します。
SPIデバイスを認識させる
SPIデバイスが認識されているかどうか確認します。spidev0とspidev2が認識されます。
$ ls /dev/spidev*
/dev/spidev0.0 /dev/spidev0.1 /dev/spidev2.0 /dev/spidev2.1
SPIデバイスの動作確認
テストスクリプト(loop.py)を実行すると、1秒毎に"0x00 0x81"が出力されました。
$ python3 loop.py
0x00 0x81
0x00 0x81
...
ジャンパーケーブルを接続しない場合は、1秒毎に"0x00 0x00"が出力されます。
$ python3 loop.py
0x00 0x00
0x00 0x00
...
別のループバックテスト
$ git clone https://github.com/rm-hull/spidev-test
$ cd spidev-test
$ gcc spidev_test.c -o spidev_test
$ ./spidev_test -v
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@....?..................?.
RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@....?..................?.
ケーブルを接続しない場合
$ ./spidev_test -v
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D | ......@.......................
RX | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................
ディスプレイ(CSピンが無い1.3' IPS 240*240 @ ST7789)の表示確認
ケーブル配線はJetson Nanoと同じです。
ST7789 (Python_ST7789) ライブラリ
問題なく動作しました。
Pimoroni ライブラリ
最初、display.pyは動きませんでした。動作速度(spi_speed_hz)を下げる(80 → 50 MHz)必要がありました。
disp = ST7789.ST7789(port=0, cs=1, rst=24, dc=25, backlight=27, spi_speed_hz=80 * 1000 * 1000)
↓
disp = ST7789.ST7789(port=0, cs=1, rst=24, dc=25, backlight=27, spi_speed_hz=50 * 1000 * 1000)
Framebufferの動作確認
カーネルビルド
カーネルイメージのビルドにかかった時間は以下のとおりでした。
real 19m9.163s
user 85m15.628s
sys 6m29.704s
カーネルモジュールのビルドにかかった時間は以下のとおりでした。
real 28m1.726s
user 126m12.776s
sys 10m30.132s
ビルド完了後、新しい Image をコピーして再起動します。
OS起動後、カーネルモジュールの組み込みでエラーが出ました。
Jetson Xavier NXのGPIO番号は以下のSecond ( gpioXXXX ) is the global Linux GPIO numberを指定する必要がありました。
$ sudo modprobe fbtft_device name=flexfb busnum=0 cs=1 gpios=reset:483,dc:481,led:480 speed=40000000 bgr=1 fps=60 custom=1 height=240 width=240 mode=3
$ sudo modprobe flexfb setaddrwin=0 width=240 height=240 init=-1,0x11,-2,120,-1,0x36,0x70,-1,0x3A,0x05,-1,0xB2,0x0C,0x0C,0x00,0x33,0x33,-1,0xB7,0x35,-1,0xBB,0x1A,-1,0xC0,0x2C,-1,0xC2,0x01,-1,0xC3,0x0B,-1,0xC4,0x20,-1,0xC6,0x0F,-1,0xD0,0xA4,0xA1,-1,0x21,-1,0xE0,0x00,0x19,0x1E,0x0A,0x09,0x15,0x3D,0x44,0x51,0x12,0x03,0x00,0x3F,0x3F,-1,0xE1,0x00,0x18,0x1E,0x0A,0x09,0x25,0x3F,0x43,0x52,0x33,0x03,0x00,0x3F,0x3F,-1,0x29,-3
$ dmesg
...
[ 171.435983] fbtft: module is from the staging directory, the quality is unknown, you have been warned.
[ 171.438672] fbtft_device: module is from the staging directory, the quality is unknown, you have been warned.
[ 171.439707] spidev spi0.0: tegra-spidev spi0.0 50000kHz 8 bits mode=0x00
[ 171.439715] spidev spi2.0: tegra-spidev spi2.0 50000kHz 8 bits mode=0x00
[ 171.439721] spidev spi2.1: tegra-spidev spi2.1 50000kHz 8 bits mode=0x00
[ 171.439728] qspi_mtd spi6.0: s25fs256s spi6.0 136000kHz 8 bits mode=0x00
[ 171.440439] fbtft_device: GPIOS used by 'flexfb':
[ 171.440445] fbtft_device: 'reset' = GPIO483
[ 171.440451] fbtft_device: 'dc' = GPIO481
[ 171.440455] fbtft_device: 'led' = GPIO480
[ 171.440465] spidev spi0.0: tegra-spidev spi0.0 50000kHz 8 bits mode=0x00
[ 171.440471] spidev spi2.0: tegra-spidev spi2.0 50000kHz 8 bits mode=0x00
[ 171.440477] spidev spi2.1: tegra-spidev spi2.1 50000kHz 8 bits mode=0x00
[ 171.440483] qspi_mtd spi6.0: s25fs256s spi6.0 136000kHz 8 bits mode=0x00
[ 171.440495] spi spi0.1: flexfb spi0.1 40000kHz 8 bits mode=0x03
[ 176.692595] flexfb: module is from the staging directory, the quality is unknown, you have been warned.
[ 176.963999] graphics fb2: flexfb frame buffer, 240x240, 112 KiB video memory, 4 KiB DMA buffer memory, fps=62, spi0.1 at 40 MHz
$ ls -la /dev/fb*
crw-rw---- 1 root video 29, 0 2月 28 23:02 /dev/fb0
crw-rw---- 1 root video 29, 1 2月 28 23:02 /dev/fb1
crw-rw---- 1 root video 29, 2 2月 28 23:06 /dev/fb2
$ cd fbtest
$ ./fbtest --fbdev /dev/fb2
Using drawops cfb16 (16 bpp packed pixels)
Available visuals:
Monochrome
Grayscale 32
Truecolor 5:6:5:0
Using visops truecolor
Running all tests
test001: PASSED
test002: PASSED
test003: PASSED
test004: PASSED
test005: PASSED
test006: PASSED
test008: PASSED
test009: PASSED
test010: PASSED
Benchmarking... 10x10 squares: 198.47 Mpixels/s
Benchmarking... 20x20 squares: 456.42 Mpixels/s
Benchmarking... 50x50 squares: 713.81 Mpixels/s
Benchmarking... 100x100 squares: 1232.68 Mpixels/s
Benchmarking... 200x200 squares: 1123.73 Mpixels/s
test012: PASSED
Benchmarking... R5 circles: 78.06 Mpixels/s
Benchmarking... R10 circles: 170.10 Mpixels/s
Benchmarking... R25 circles: 440.38 Mpixels/s
Benchmarking... R50 circles: 734.39 Mpixels/s
Benchmarking... R100 circles: 918.28 Mpixels/s
test013: PASSED