Spresense SDK で LCD サンプルプログラムを動かしてみた その1

**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のグラフィックスシステムです](https://nuttx.apache.org/docs/latest/components/nxgraphics/index.html)  

ちなみに[Spresense SDK チュートリアル](https://developer.sony.com/develop/spresense/docs/sdk_tutorials_ja.html)の
[10.1. NX サンプルアプリケーション](https://developer.sony.com/develop/spresense/docs/sdk_tutorials_ja.html#_graphics_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB)
に公式の情報が有ります。

**NuttX examples**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/bf155ac2-ed07-cbb3-c821-665329c69b9b.png)


**exeamples/camera** も動かない。
**camera**に関しては [こちら](https://kouya17.com/posts/14/) に動いた実績はあるみたいですが、
ピンの接続とかも同じにしたのですが動きませんでした。
「READMEには/sdk/configs/device/camera-defconfigに何個か設定を追記して」
と有りますが、これがなんの設定を追加するのか不明、そもそも**README**が無い。

それからこれはたぶん自分の知識不足のせいですが
SDKのコンフィギュレーションを実行するとエラーとなり、
```
$ make distclean
```
を実行しなさいと表示されますが
**make distclean**もエラーとなり、どうしようもなくて
**MSYS2** から再インスト―ル(環境の再セットアップ)これを何度も繰り返しました。
備忘録の意味も含めてやったことを時系列で記述しています。

***
まずはMSYS2の再インストールから始めて開発環境をインストールしました。
#### Spresense SDK 開発環境が正しくインストールされているのを確認するために examples/hello を動かしてみました ####
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/2117b283-386b-b82d-f21c-6ad30cf91569.png)
正しくmake(ビルド)できたので書き込みを行いました。
```
$ ./tools/flash.sh -c COM27 nuttx.spk
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/078addc7-da8f-ee49-4b0d-09c809c8986b.png)

teratermで動作を確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/73d631e2-dec6-6b02-5d41-81d238f43ec5.png)

開発環境は正しく構築されています。

***
## ここからexeamples/nxhello を ILI9341で動かそうとした履歴 ##

```
$ make distclean
$ tools/config.py examples/nxhello
$ make
```
make distclean がメチャクチャ時間がかかったが無事に終了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/2de90610-f6bf-228f-5f13-7dd67bc0e5f7.png)
次に **tools/config.py examples/nxhello** を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/837d5bd9-1f90-8278-2d0d-7aff20bd92fc.png)
続いて **make**
40分かかってやっと終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/3107eab2-91e6-1e4c-26a1-e5f620127eab.png)
**書き込みも正常に終了**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/309b93c3-1fa5-a645-2076-83bd693b23a7.png)
プログラムは実行していると思われるが何も表示しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/ed2d8d0a-2dde-f6c3-bd5d-3a810fe448af.png)
公式ドキュメントの実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/4d534330-b255-1937-82c2-a250948fed62.png)
***
### 推測した問題点 ###
1. 使っているSPIのポートは正しいか?
2. ILI9341の信号線 /CS RST DC はどのピンに設定されているか
3. DC の制御は正しく行われているか
***
**問題点 1 に関して**
公式の **10. Graphics チュートリアル**には動作環境として
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/6f4385a6-ab7c-44f4-fef3-ea4655a054ab.png)
とあるので使っているSPIは
**Spresense Extension Board**上の**SPI4**?
自分の環境はメインボードだけなのでメインボードの SPIポートは **5**
SPIのポートの指定はConfiguration で出来ると思ったが
~~SPI Driver Supportの中にポート選択の項目が無い。
**※SPIのポート設定の箇所ご存じの方、情報提供お願いします。**~~
[※ 設定箇所が分かりました。](#spiのポート設定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/43276efd-714b-c417-c689-d8704647e93b.png)
```
$ tools/config.py examples/nxhello -m
```
で**Configuration GUI**を起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/b3a684c8-e5ab-0227-54e6-32cdab652de4.png)
ちなみに **SPI CMD/DATA** という項目が **問題点3** に関する設定だと思われるのでここに **チェック** を入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/7ef2b444-cb2a-6ce5-9e2a-e6a6c55c3231.png)
***
**Configuration**を変更したので **make** を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/27218b3e-3e29-bfbe-a3ab-e40c821fb6dc.png)
エラーがでました(泣)
```
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で検索**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/ab089202-30ee-3f71-2034-efa0647ff415.png)
なんかどこにも関数本体がなさそうです。
実際に使われている個所は
**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で検索しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/668f8d48-720c-f3ba-a41f-9acb3247a2f7.png)
こちらは **C:\msys64\home\user\spresense\nuttx\boards\arm\cxd56xx\spresense\src\cxd56_spi.c(136,6)** に関数本体が有りました。
**cxd56_spi3cmddata**、**cxd56_spi4cmddata**、**cxd56_spi5cmddata**
これらの関数を追加する必要がありそうです。

**ちなみに公式のページでは実行結果を掲載してありますが、ちゃんと動いたのでしようか?
動かすために色々と変更を加えてある?
もしそうだとしたら、その情報を公開して欲しいです。**
まぁ、でもオープンソースだから仕方ないですね。
***
とりあえず中身の無い空の関数を登録して make してみました。
でもやっぱりエラーとなりました。
前回と同じエラーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/e0f86418-3f58-011d-f552-06553cb21be8.png)
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を使う](https://qiita.com/yunkya2/items/2c73efe937e1c83caf2a)
[ST7789 Display with LVGL Graphics on Apache NuttX RTOS](https://lupyuen.github.io/articles/st7789#appendix-spi-cmddata-on-bl602)
NUTTXは**Spresense版**だけでなく、他のマイコン版でも同じくcmddataの関数が無いみたいです。
これって **オープンソース あるある?**
***
問題点 1 のSPIポート
SPI portの指定はここにありました。
```C:\msys64\home\user\spresense\nuttx\boards\arm\cxd56xx\spresense\include\board.h(246,25)
/* 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検索した結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/c6284c49-415a-af9f-49fb-666dcc0d996b.png)
Configurationの項目にもこれらの設定はなさそうなので、
**board.h** の定義部分を
```
#define DISPLAY_RST     PIN_I2S0_DATA_OUT
#define DISPLAY_DC      PIN_I2S0_BCK
```
~~テストしているボードに合わせて暫定的に書き換えました。~~
[※PINの設定箇所](#spiのポート設定)が見つかったのでこの部分修正予定です。
***
**board.h**と**cxd56_spi.c**を変更して **make**
無事にコンパイルできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/c62242ae-1289-57c7-b7bd-d2de7ac376db.png)
ちなみに変更した **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
```
***
spresenseへの書き込み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/bf8048ce-0607-157b-fa6a-054644212cdb.png)

実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/9044dbbc-07db-7647-6123-824f7dfb2f4d.png)

プログラムは走っているようですが、LCDに何も表示しません(泣)。
![IMG-0507.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/a21572c2-24c2-ade7-a16c-2346d59bcbf4.jpeg)
~~原因は最初から懸念していた 問題点1 のSPIのポートかと思いますが対応の方法が分かりません。~~
すごい凡ミスを犯していました。
LCDのドライバーボード、RSTとDCの信号線が違っているボードを使っていました。
今回のプログラムの信号線に合わせたボードに差し替えたら、文字が左右反転していますが表示しました。
![IMG-0508.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/cff6d97c-d09d-3c1f-bdfd-36c6069fc1bb.jpeg)
まだ課題は残っていますがやっと表示までたどり着きました。
参考までにdeconfigファイルを掲載しておきます。
```C:\msys64\home\user\spresense\sdk\configs\default\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**が選択されるようになります。
(たぶんそのはずです)

```C:\msys64\home\user\spresense\sdk\configs\device\lcd\defconfig
-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
```
```C:\msys64\home\user\spresense\sdk\configs\examples\nxhello\defconfig
-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設定もこのページにありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/a55973c5-b27a-5351-467c-5baf2e4dfa08.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/bb394e09-fb08-a23b-608c-af0155644dfb.png)
ここでの設定を行って再度makeしてみます。
***
必要だと思われる **Configuration** の項目をまとめてみました。
[Spresense SDK で LCD サンプルプログラムを動かしてみた その2(Configuration)](https://qiita.com/kaz19610303/items/52b0cbbc63081730322f)  
***
※ ファイルのパスは私の環境で書いていますので適時変更をお願いします。
***
参考にしたサイト
[Spresense SDK スタートガイド (CLI 版)](https://developer.sony.com/develop/spresense/docs/sdk_set_up_ja.html)
[Spresense SDK チュートリアル](https://developer.sony.com/develop/spresense/docs/sdk_tutorials_ja.html)
[Spresense SDKでカメラモジュール用のサンプルを動かした](https://kouya17.com/posts/14/)
[NuttX for Raspberry Pi PicoでPico Display Packを使う](https://qiita.com/yunkya2/items/2c73efe937e1c83caf2a)
[ST7789 Display with LVGL Graphics on Apache NuttX RTOS](https://lupyuen.github.io/articles/st7789#appendix-spi-cmddata-on-bl602)