Arduino IDE を使って Spresense で LCDを動かすのは簡単でしたが、
Spresense SDK で動かすのにメチャクチャ苦労しました。
そもそも、Spresense SDK(Nuttx)の知識がほとんどないのが原因ですが。
環境
Windows10
msys2
Spresense SDK(v2.5.0)
ST7789を使った LCD表示器
ILI9341を使った LCD表示器
Spresense SDK には LCDドライバーのST7789、ILI9341ともにデバイスドライバーが用意されていて
LCD表示プログラムもexeampleとしてnx*****が有るので簡単に動かせると思ったのですが、これが甘かった。
※ NXはNuttXのグラフィックスシステムです
ちなみにSpresense SDK チュートリアルの
10.1. NX サンプルアプリケーション
に公式の情報が有ります。
exeamples/camera も動かない。
cameraに関しては こちら に動いた実績はあるみたいですが、
ピンの接続とかも同じにしたのですが動きませんでした。
「READMEには/sdk/configs/device/camera-defconfigに何個か設定を追記して」
と有りますが、これがなんの設定を追加するのか不明、そもそもREADMEが無い。
それからこれはたぶん自分の知識不足のせいですが
SDKのコンフィギュレーションを実行するとエラーとなり、
$ make distclean
を実行しなさいと表示されますが
make distcleanもエラーとなり、どうしようもなくて
MSYS2 から再インスト―ル(環境の再セットアップ)これを何度も繰り返しました。
備忘録の意味も含めてやったことを時系列で記述しています。
まずはMSYS2の再インストールから始めて開発環境をインストールしました。
Spresense SDK 開発環境が正しくインストールされているのを確認するために examples/hello を動かしてみました
$ ./tools/flash.sh -c COM27 nuttx.spk
開発環境は正しく構築されています。
ここからexeamples/nxhello を ILI9341で動かそうとした履歴
$ make distclean
$ tools/config.py examples/nxhello
$ make
make distclean がメチャクチャ時間がかかったが無事に終了。
次に tools/config.py examples/nxhello を実行
続いて make
40分かかってやっと終了
書き込みも正常に終了
プログラムは実行していると思われるが何も表示しない。
公式ドキュメントの実行結果
推測した問題点
- 使っているSPIのポートは正しいか?
- ILI9341の信号線 /CS RST DC はどのピンに設定されているか
- DC の制御は正しく行われているか
問題点 1 に関して
公式の 10. Graphics チュートリアルには動作環境として
とあるので使っているSPIは
Spresense Extension Board上のSPI4?
自分の環境はメインボードだけなのでメインボードの SPIポートは 5
SPIのポートの指定はConfiguration で出来ると思ったが
SPI Driver Supportの中にポート選択の項目が無い。
※SPIのポート設定の箇所ご存じの方、情報提供お願いします。
※ 設定箇所が分かりました。
$ tools/config.py examples/nxhello -m
でConfiguration GUIを起動
ちなみに SPI CMD/DATA という項目が 問題点3 に関する設定だと思われるのでここに チェック を入れる。
Configurationを変更したので make を実行
エラーがでました(泣)
C:\msys64\opt\spresenseenv\usr\bin\arm-none-eabi-ld.exe: C:/msys64/home/user/spresense/nuttx/staging\libarch.a(cxd56_spi.o):(.rodata.g_spi3ops+0x18): undefined reference to `cxd56_spi3cmddata'
C:\msys64\opt\spresenseenv\usr\bin\arm-none-eabi-ld.exe: C:/msys64/home/user/spresense/nuttx/staging\libarch.a(cxd56_spi.o):(.rodata.g_spi4ops+0x18): undefined reference to `cxd56_spi4cmddata'
C:\msys64\opt\spresenseenv\usr\bin\arm-none-eabi-ld.exe: C:/msys64/home/user/spresense/nuttx/staging\libarch.a(cxd56_spi.o):(.rodata.g_spi5ops+0x18): undefined reference to `cxd56_spi5cmddata'
cxd56_spi3cmddata、cxd56_spi4cmddata、cxd56_spi5cmddata
3つの関数が無いためのエラーみたいです。
ちなみにこれらの関数は先ほどConfigurationでSPI CMD/DATAを有効にしたために必要となった関数だと思われます。
cxd56_spi5cmddataをGREPで検索
なんかどこにも関数本体がなさそうです。
実際に使われている個所は
cxd56_spi.cの198行目から
#ifdef CONFIG_CXD56_SPI5
static const struct spi_ops_s g_spi5ops =
{
.lock = spi_lock,
.select = cxd56_spi5select, /* Provided externally */
.setfrequency = spi_setfrequency,
.setmode = spi_setmode,
.setbits = spi_setbits,
.status = cxd56_spi5status, /* Provided externally */
#ifdef CONFIG_SPI_CMDDATA
.cmddata = cxd56_spi5cmddata, /* Provided externally */
#endif
.send = spi_send,
#ifdef CONFIG_SPI_EXCHANGE
.exchange = spi_exchange,
#else
.sndblock = spi_sndblock,
.recvblock = spi_recvblock,
#endif
#ifdef CONFIG_SPI_CALLBACK
.registercallback = cxd56_spi5register, /* Provided externally */
#else
.registercallback = 0, /* Not implemented */
#endif
};
同じようにここで使われている cxd56_spi5select をGREPで検索しました。
こちらは C:\msys64\home\user\spresense\nuttx\boards\arm\cxd56xx\spresense\src\cxd56_spi.c(136,6) に関数本体が有りました。
cxd56_spi3cmddata、cxd56_spi4cmddata、cxd56_spi5cmddata
これらの関数を追加する必要がありそうです。
ちなみに公式のページでは実行結果を掲載してありますが、ちゃんと動いたのでしようか?
動かすために色々と変更を加えてある?
もしそうだとしたら、その情報を公開して欲しいです。
まぁ、でもオープンソースだから仕方ないですね。
とりあえず中身の無い空の関数を登録して make してみました。
でもやっぱりエラーとなりました。
前回と同じエラーです。
cxd56_spi.cファイルが複数存在するので変更するファイルを間違えた?
と思ったのですが、この cxd56_spi.c を書き換えたら config を実行しないとダメみたいです。
config を 実行すると 加えた変更が
C:\msys64\home\user\spresense\nuttx\arch\arm\src\board\board\cxd56_spi.c
(このファイルはGit cloneした直後は存在しませんでした)
に反映されて、実際のコンパイル時はこちらのファイルが使われるみたいです。
Nuttxの構成とか仕組みが良く分かっていないので当たり前の事が分かっていません。
cxd56_spi.c
C:\msys64\home\user\spresense\nuttx\boards\arm\cxd56xx\spresense\src(変更するファイル)
C:\msys64\home\user\spresense\nuttx\arch\arm\src\board\board(コンパイル時に使われるファイル)
次にcxd56_spi3cmddata、cxd56_spi4cmddata、cxd56_spi5cmddata関数の中身を書いてみます。
ただ自分で1からかけないので以下のサイトを参考にしました。
NuttX for Raspberry Pi PicoでPico Display Packを使う
ST7789 Display with LVGL Graphics on Apache NuttX RTOS
NUTTXはSpresense版だけでなく、他のマイコン版でも同じくcmddataの関数が無いみたいです。
これって オープンソース あるある?
問題点 1 のSPIポート
SPI portの指定はここにありました。
/* Display device pin definitions *******************************************/
#if defined(CONFIG_LCD_ON_MAIN_BOARD) /* Display connected to main board. */
#define DISPLAY_SPI 5
#define DISPLAY_DMA_TXCH (4)
#define DISPLAY_DMA_RXCH (5)
#define DISPLAY_DMA_TXCH_CFG CXD56_DMA_PERIPHERAL_SPI5_TX
#define DISPLAY_DMA_RXCH_CFG CXD56_DMA_PERIPHERAL_SPI5_RX
#define DISPLAY_DMA_TX_MAXSIZE (192000)
#define DISPLAY_DMA_RX_MAXSIZE (192000)
#else /* Display is connected through extension board. */
#define DISPLAY_SPI 4
#define DISPLAY_DMA_TXCH (2)
#define DISPLAY_DMA_RXCH (3)
#define DISPLAY_DMA_TXCH_CFG CXD56_DMA_PERIPHERAL_SPI4_TX
#define DISPLAY_DMA_RXCH_CFG CXD56_DMA_PERIPHERAL_SPI4_RX
#define DISPLAY_DMA_TX_MAXSIZE (192000)
#define DISPLAY_DMA_RX_MAXSIZE (192000)
#endif
CONFIG_LCD_ON_MAIN_BOARD が定義されていれば ポート5
を使うようになっていますが
CONFIG_LCD_ON_MAIN_BOARD を定義している個所が分かりません。
またここで、問題 2 の RSTピンとDCピンの定義もされています。
ピンの定義は ILI934X_RST_PIN、ILI934X_DC_PIN となっています。
この2つは
C:\msys64\home\user\spresense\nuttx\boards\arm\cxd56xx\spresense\include\board_lcdpins.h
と
C:\msys64\home\user\spresense\nuttx\include\arch\board\board_lcdpins.h
で定義されていますが、
ここで ILI934X_RST_PIN と ILI934X_DC_PIN を設定している条件文に使われている
CONFIG_LCD_RSTPIN_I2S0_BCK とかがどこにも定義されていません。
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* ILI934X RST pin definition */
#if defined(CONFIG_LCD_RSTPIN_UART2_TX) \
|| defined(CONFIG_LCD_RSTPIN_UART2_TX_E)
# define ILI934X_RST_PIN PIN_UART2_TXD
#elif defined(CONFIG_LCD_RSTPIN_UART2_RX) \
|| defined(CONFIG_LCD_RSTPIN_UART2_RX_E)
# define ILI934X_RST_PIN PIN_UART2_RXD
#elif defined(CONFIG_LCD_RSTPIN_UART2_RTS)
# define ILI934X_RST_PIN PIN_UART2_RTS
#elif defined(CONFIG_LCD_RSTPIN_UART2_CTS)
# define ILI934X_RST_PIN PIN_UART2_CTS
#elif defined(CONFIG_LCD_RSTPIN_I2S0_BCK)
# define ILI934X_RST_PIN PIN_I2S0_BCK
#elif defined(CONFIG_LCD_RSTPIN_I2S0_LRCK)
# define ILI934X_RST_PIN PIN_I2S0_LRCK
#elif defined(CONFIG_LCD_RSTPIN_SEN_IRQ_IN)
# define ILI934X_RST_PIN PIN_SEN_IRQ_IN
以下続く
CONFIG_LCD_RSTPIN_I2S0_BCK をGREP検索した結果
Configurationの項目にもこれらの設定はなさそうなので、
board.h の定義部分を
#define DISPLAY_RST PIN_I2S0_DATA_OUT
#define DISPLAY_DC PIN_I2S0_BCK
テストしているボードに合わせて暫定的に書き換えました。
※PINの設定箇所が見つかったのでこの部分修正予定です。
board.hとcxd56_spi.cを変更して make
無事にコンパイルできました。
ちなみに変更した cxd56_spi.c です。
/****************************************************************************
* boards/arm/cxd56xx/spresense/src/cxd56_spi.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <errno.h>
#include <debug.h>
#include <nuttx/spi/spi.h>
#include <arch/board/board.h>
#include "arm_arch.h"
#include "chip.h"
#include "hardware/cxd56_spi.h"
#include "cxd56_clock.h"
#include "cxd56_gpio.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: cxd56_spi0/3/4/5select and cxd56_spi0/3/4/5status
*
* Description:
* The external functions, cxd56_spi1/2/3select and cxd56_spi1/2/3 status
* must be provided by board-specific logic.
* They are implementations of the select and status methods of the SPI
* interface defined by struct spi_ops_s (see include/nuttx/spi/spi.h).
* All other methods (including cxd56_spibus_initialize()) are provided by
* common CXD56 logic. To use this common SPI logic on your board:
*
* 1. Provide logic in cxd56_boardinitialize() to configure SPI chip select
* pins.
* 2. Provide cxd56_spi0/3/4/5select() and cxd56_spi0/3/4/5status()
* functions in your board-specific logic.
* These functions will perform chip selection and status operations
* using GPIOs in the way your board is configured.
* 3. Add a calls to cxd56_spibus_initialize() in your low level
* application initialization logic
* 4. The handle returned by cxd56_spibus_initialize() may then be used to
* bind the SPI driver to higher level logic (e.g., calling
* mmcsd_spislotinitialize(), for example, will bind the SPI driver to
* the SPI MMC/SD driver).
*
****************************************************************************/
#ifdef CONFIG_CXD56_SPI0
void cxd56_spi0select(FAR struct spi_dev_s *dev, uint32_t devid,
bool selected)
{
spiinfo("devid: %d CS: %s\n", (int)devid,
selected ? "assert" : "de-assert");
}
uint8_t cxd56_spi0status(FAR struct spi_dev_s *dev, uint32_t devid)
{
return 0;
}
#endif
#ifdef CONFIG_CXD56_SPI3
void cxd56_spi3select(FAR struct spi_dev_s *dev, uint32_t devid,
bool selected)
{
spiinfo("devid: %d CS: %s\n", (int)devid,
selected ? "assert" : "de-assert");
/* Disable clock gating (clock enable) */
cxd56_spi_clock_gate_disable(3);
if (selected)
{
putreg32(0, CXD56_SPI3_CS);
}
else
{
putreg32(1, CXD56_SPI3_CS);
}
/* Enable clock gating (clock disable) */
cxd56_spi_clock_gate_enable(3);
}
uint8_t cxd56_spi3status(FAR struct spi_dev_s *dev, uint32_t devid)
{
return 0;
}
#ifdef CONFIG_SPI_CMDDATA
uint8_t cxd56_spi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
{
#if defined(CONFIG_LCD_ST7735) || defined(CONFIG_LCD_ST7789) || defined(CONFIG_LCD_ILI9340)
if (devid == SPIDEV_DISPLAY(0))
{
/* This is the Data/Command control pad which determines whether the
* data bits are data or a command.
*/
cxd56_gpio_write(DISPLAY_DC, !cmd);
return OK;
}
#endif
return -ENODEV;
}
#endif
#endif
#ifdef CONFIG_CXD56_SPI4
void cxd56_spi4select(FAR struct spi_dev_s *dev, uint32_t devid,
bool selected)
{
spiinfo("devid: %d CS: %s\n", (int)devid,
selected ? "assert" : "de-assert");
}
uint8_t cxd56_spi4status(FAR struct spi_dev_s *dev, uint32_t devid)
{
uint8_t ret = 0;
# if defined(CONFIG_CXD56_SPISD) && (CONFIG_CXD56_SPISD_SPI_CH == 4)
ret = board_spisd_status(dev, devid);
# endif
return ret;
}
#ifdef CONFIG_SPI_CMDDATA
uint8_t cxd56_spi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
{
#if defined(CONFIG_LCD_ST7735) || defined(CONFIG_LCD_ST7789) || defined(CONFIG_LCD_ILI9340)
if (devid == SPIDEV_DISPLAY(0))
{
/* This is the Data/Command control pad which determines whether the
* data bits are data or a command.
*/
cxd56_gpio_write(DISPLAY_DC, !cmd);
return OK;
}
#endif
return -ENODEV;
}
#endif
#endif
#ifdef CONFIG_CXD56_SPI5
void cxd56_spi5select(FAR struct spi_dev_s *dev, uint32_t devid,
bool selected)
{
spiinfo("devid: %d CS: %s\n", (int)devid,
selected ? "assert" : "de-assert");
}
uint8_t cxd56_spi5status(FAR struct spi_dev_s *dev, uint32_t devid)
{
uint8_t ret = 0;
# if defined(CONFIG_CXD56_SPISD) && (CONFIG_CXD56_SPISD_SPI_CH == 5)
ret = board_spisd_status(dev, devid);
# endif
return ret;
}
#ifdef CONFIG_SPI_CMDDATA
uint8_t cxd56_spi5cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
{
#if defined(CONFIG_LCD_ST7735) || defined(CONFIG_LCD_ST7789) || defined(CONFIG_LCD_ILI9340)
if (devid == SPIDEV_DISPLAY(0))
{
/* This is the Data/Command control pad which determines whether the
* data bits are data or a command.
*/
cxd56_gpio_write(DISPLAY_DC, !cmd);
return OK;
}
#endif
return -ENODEV;
}
#endif
#endif
プログラムは走っているようですが、LCDに何も表示しません(泣)。
原因は最初から懸念していた 問題点1 のSPIのポートかと思いますが対応の方法が分かりません。
すごい凡ミスを犯していました。
LCDのドライバーボード、RSTとDCの信号線が違っているボードを使っていました。
今回のプログラムの信号線に合わせたボードに差し替えたら、文字が左右反転していますが表示しました。
まだ課題は残っていますがやっと表示までたどり着きました。
参考までにdeconfigファイルを掲載しておきます。
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_ARCH_LEDS is not set
# CONFIG_CXD56_I2C0_SCUSEQ is not set
# CONFIG_CXD56_SPI3_SCUSEQ is not set
# CONFIG_MMCSD_MMCSUPPORT is not set
# CONFIG_MMCSD_SPI is not set
# CONFIG_MTD_SMART_WEAR_LEVEL is not set
# CONFIG_NET_IPv4 is not set
# CONFIG_NXFONTS_PACKEDMSFIRST is not set
# CONFIG_STANDARD_SERIAL is not set
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD="spresense"
CONFIG_ARCH_BOARD_SPRESENSE=y
CONFIG_ARCH_CHIP="cxd56xx"
CONFIG_ARCH_CHIP_CXD56XX=y
CONFIG_ARCH_INTERRUPTSTACK=2048
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARMV7M_USEBASEPRI=y
CONFIG_BATTERY_CHARGER=y
CONFIG_BATTERY_GAUGE=y
CONFIG_BOARDCTL_IOCTL=y
CONFIG_BOARDCTL_POWEROFF=y
CONFIG_BOARDCTL_RESET=y
CONFIG_BOARDCTL_UNIQUEID=y
CONFIG_BOARDCTL_UNIQUEID_SIZE=5
CONFIG_BOARDCTL_USBDEVCTRL=y
CONFIG_BOARD_CRASHDUMP=y
CONFIG_BOARD_LATE_INITIALIZE=y
CONFIG_BOARD_LOOPSPERMSEC=5434
CONFIG_BOOT_RUNFROMISRAM=y
CONFIG_BUILTIN=y
CONFIG_CDCACM=y
CONFIG_CDCACM_EPBULKIN=4
CONFIG_CDCACM_EPBULKOUT=5
CONFIG_CDCACM_EPINTIN=6
CONFIG_CDCACM_PRODUCTID=0x0bc2
CONFIG_CDCACM_RXBUFSIZE=3080
CONFIG_CDCACM_VENDORID=0x054c
CONFIG_CDCACM_VENDORSTR="SONY"
CONFIG_CLOCK_MONOTONIC=y
CONFIG_CXD56_BINARY=y
CONFIG_CXD56_I2C0=y
CONFIG_CXD56_I2C=y
CONFIG_CXD56_I2C_DRIVER=y
CONFIG_CXD56_PWM=y
CONFIG_CXD56_SPI3=y
CONFIG_CXD56_SPI4=y
CONFIG_CXD56_SPI5=y
CONFIG_CXD56_SPI=y
CONFIG_CXD56_UART2=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_FAT_LCNAMES=y
CONFIG_FAT_LFN=y
CONFIG_FAT_MAXFNAME=64
CONFIG_FS_FAT=y
CONFIG_FS_FATTIME=y
CONFIG_FS_PROCFS=y
CONFIG_FS_PROCFS_REGISTER=y
CONFIG_FS_ROMFS=y
CONFIG_FS_SMARTFS=y
CONFIG_HAVE_CXX=y
CONFIG_HAVE_CXXINITIALIZE=y
CONFIG_LCD=y
CONFIG_LCD_NOGETRUN=y
CONFIG_LCD_ON_MAIN_BOARD=y
CONFIG_LIBC_FLOATINGPOINT=y
CONFIG_LIBC_IPv4_ADDRCONV=y
CONFIG_LIBC_IPv6_ADDRCONV=y
CONFIG_LIBC_KBDCODEC=y
CONFIG_MMCSD=y
CONFIG_MMCSD_SDIO=y
CONFIG_MTD_BYTE_WRITE=y
CONFIG_MTD_SMART=y
CONFIG_MTD_SMART_ENABLE_CRC=y
CONFIG_MTD_SMART_FSCK=y
CONFIG_MTD_SMART_SECTOR_SIZE=4096
CONFIG_NAME_MAX=64
CONFIG_NET=y
CONFIG_NETDEVICES=y
CONFIG_NETDEV_LATEINIT=y
CONFIG_NET_SOCKOPTS=y
CONFIG_NET_TCP_NO_STACK=y
CONFIG_NET_UDP_NO_STACK=y
CONFIG_NET_USRSOCK=y
CONFIG_NET_USRSOCK_TCP=y
CONFIG_NET_USRSOCK_UDP=y
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_DISABLE_LOSMART=y
CONFIG_NSH_LINELEN=160
CONFIG_NSH_MAXARGUMENTS=16
CONFIG_NSH_READLINE=y
CONFIG_PIPES=y
CONFIG_PREALLOC_TIMERS=4
CONFIG_PWM=y
CONFIG_RAM_SIZE=1572864
CONFIG_RAM_START=0x0d000000
CONFIG_READLINE_CMD_HISTORY=y
CONFIG_READLINE_CMD_HISTORY_LINELEN=160
CONFIG_READLINE_TABCOMPLETION=y
CONFIG_RR_INTERVAL=200
CONFIG_RTC=y
CONFIG_RTC_ALARM=y
CONFIG_RTC_DRIVER=y
CONFIG_RTC_FREQUENCY=32768
CONFIG_RTC_HIRES=y
CONFIG_SCHED_CHILD_STATUS=y
CONFIG_SCHED_HAVE_PARENT=y
CONFIG_SCHED_HPWORK=y
CONFIG_SCHED_LPNTHREADS=3
CONFIG_SCHED_LPWORK=y
CONFIG_SCHED_WAITPID=y
CONFIG_SDCLONE_DISABLE=y
CONFIG_SDIO_MUXBUS=y
CONFIG_SERIAL_TERMIOS=y
CONFIG_SMARTFS_ALIGNED_ACCESS=y
CONFIG_SMARTFS_MAXNAMLEN=30
CONFIG_SMARTFS_MULTI_ROOT_DIRS=y
CONFIG_SPI=y
CONFIG_SPRESENSE_EXTENSION=n
CONFIG_STACK_COLORATION=y
CONFIG_START_DAY=6
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2011
CONFIG_SYSTEM_CLE=y
CONFIG_SYSTEM_NSH=y
CONFIG_UART1_RXBUFSIZE=1024
CONFIG_UART1_SERIAL_CONSOLE=y
CONFIG_UART1_TXBUFSIZE=1024
CONFIG_UART2_IFLOWCONTROL=y
CONFIG_UART2_OFLOWCONTROL=y
CONFIG_USBDEV=y
CONFIG_USBDEV_DMA=y
CONFIG_USBDEV_DUALSPEED=y
CONFIG_USBMSC=y
CONFIG_USBMSC_EPBULKIN=1
CONFIG_USBMSC_PRODUCTID=0x0bc2
CONFIG_USBMSC_REMOVABLE=y
CONFIG_USBMSC_VENDORID=0x054c
CONFIG_USBMSC_VENDORSTR="Sony"
CONFIG_USERMAIN_STACKSIZE=8192
CONFIG_USER_ENTRYPOINT="spresense_main"
CONFIG_LCD_ON_MAIN_BOARD=y
これを手動で追加しています。
これにより、board.h で SPI5が選択されるようになります。
(たぶんそのはずです)
-NXFONTS_PACKEDMSFIRST=n
+LCD_ILI9340=y
+LCD_ILI9340_IFACE0=y
+LCD_ILI9340_IFACE0_RLANDSCAPE=y
+MMCSD_HAVE_WRITEPROTECT=n
+MQ_MAXMSGSIZE=64
+NX=y
+NXFONTS_DISABLE_16BPP=n
+NXFONT_SERIF22X29=y
+NX_BLOCKING=y
+NX_DISABLE_16BPP=n
-NXFONTS_PACKEDMSFIRST=n
+DRIVERS_VIDEO=y
+EXAMPLES_NXHELLO=y
+EXAMPLES_NXHELLO_BPP=16
+LCD_FRAMEBUFFER=y
+LCD_ILI9340=y
+LCD_ILI9340_IFACE0=y
+LCD_ILI9340_IFACE0_RLANDSCAPE=y
+MQ_MAXMSGSIZE=64
+NX=y
+NXFONTS_DISABLE_16BPP=n
+NXFONT_SERIF22X29=y
+NX_BLOCKING=y
+NX_DISABLE_16BPP=n
とりあえず理解していない部分もありますが何とか動きました。
たぶんツッコミ所満載なので指摘をお願いします。
次に ST7789 で動かしてみます。
spiのポート設定
メインボードのSPIを使うか拡張ボードのSPIを使うかの設定ページが有りました。
Board Selection のページにあります、またRST、DCのPIN設定もこのページにありました。
ここでの設定を行って再度makeしてみます。
必要だと思われる Configuration の項目をまとめてみました。
Spresense SDK で LCD サンプルプログラムを動かしてみた その2(Configuration)
※ ファイルのパスは私の環境で書いていますので適時変更をお願いします。
参考にしたサイト
Spresense SDK スタートガイド (CLI 版)
Spresense SDK チュートリアル
Spresense SDKでカメラモジュール用のサンプルを動かした
NuttX for Raspberry Pi PicoでPico Display Packを使う
ST7789 Display with LVGL Graphics on Apache NuttX RTOS