2021.11.12現在 → nRF9160 feather＆ nRF Connect SDK 基礎知識的な何か (1)

# ファイル構成

nRF Connect SDK の Sample プログラムは、
```ncs/nrf/samples/```
もしくは、
```ncs/zephyr/samples/```
もしくは、
```ncs/nrf/applications/```
のディレクトリの中に入っている。
（ncs ディレクトリは、環境構築時に作成するディレクトリ）

それらを見てみると似た感じの構成になっている。

・CMakeLists.txt
・prj.conf
・Kconfig
・src/main.c
・build_circuitdojo_feather_nrf9160ns (プロジェクト作成時に動的に生成されるフォルダ)
・circuitdojo_feather_nrf9160ns.overlay（デフォルトのデバイスツリー設定を変更する場合に、自力で追加するファイル）


## CMakeLists.txt

src ディレクトリ以下などに存在するソースファイルをプロジェクトに取り込むための定義ファイル的になもの。
Make ファイルもどき。

zephyr_library_sources() の中に tab や space 区切りで、ソースファイルのパスを記述してやるとプロジェクトに取り込まれる。

```CMakeLists.txtの一例
#
# Copyright (c) 2019 Nordic Semiconductor
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

cmake_minimum_required(VERSION 3.13.1)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(sample_project)

zephyr_library_sources(
　src/main.c
　src/Ethernet/wizchip_conf.c
　src/Ethernet/socket.c
　src/Ethernet/W5500/w5500.c)
```
上記の定義によって、
main.c
wizchip_conf.c
socket.c
w5500.c
が、プロジェクトに取り込まれる。

（その他の項目についての説明は省略）


## prj.conf

ソースファイルの中でライブラリをインクルードするだけではプロジェクトには取り込まれない。

prj.conf にて、フラグを立てたり、必要なパラメータなどを指定してあげる必要がある。
Segger Embeded Studio（IDE）の Project メニューから Configure nRF Connect Project... をGUIで選択できる menu config がこのファイルに近いが、IDEで設定した内容は、動的に生成される build_circuitdojo_feather_nrf9160ns フォルダ以下のどこかのディレクトリに保存されるので、共通仕様については、prj.conf に記述しておく必要がある。

ここで記述した内容は、menu config に反映される。

```prj.confの一例
#
# Copyright (c) 2019 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

CONFIG_FPU=y
CONFIG_NRF_MODEM_LIB=y
CONFIG_NRF_MODEM_LIB_SYS_INIT=n
CONFIG_STDOUT_CONSOLE=y
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
CONFIG_AT_CMD=y
CONFIG_REBOOT=y

CONFIG_LTE_NETWORK_MODE_LTE_M_GPS=n

CONFIG_LTE_LINK_CONTROL=n
CONFIG_LTE_AUTO_INIT_AND_CONNECT=n

CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_OFFLOAD=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n

CONFIG_NET_IPV6=n
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_CONFIG_NEED_IPV4=y
CONFIG_NET_NATIVE=y
CONFIG_NET_TCP=y

CONFIG_HEAP_MEM_POOL_SIZE=2048
CONFIG_MAIN_STACK_SIZE=4096

CONFIG_SERIAL=y
CONFIG_UART_LINE_CTRL=n
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_ASYNC_API=y
CONFIG_UART_CONSOLE_ON_DEV_NAME="UART_0"

CONFIG_MODEM_INFO=y
CONFIG_GPIO=y
CONFIG_SPI=n
CONFIG_NRFX_SPIM=y
CONFIG_NRFX_SPIM2=y
CONFIG_NRFX_SPIM3=y


CONFIG_DISK_ACCESS=y
CONFIG_DISK_DRIVER_SDMMC=y
CONFIG_SDMMC_OVER_SPI=y
CONFIG_FILE_SYSTEM=y
CONFIG_FAT_FILESYSTEM_ELM=y

CONFIG_DYNAMIC_INTERRUPTS=y
CONFIG_DYNAMIC_DIRECT_INTERRUPTS=y
```

これは、LTE通信 ＋ SDカード＆Ethernet Sheild のプログラムを書いたときの prj.conf。
（不要な項目も含まれているが、切り分けきれていない……）

## Kconfig

フラグやパラメータのデフォルト値などを定義できる。
ここで記述した内容は、menu config に反映される。

```Kconfigの一例
#
# Copyright (c) 2020 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

menu "TEST"

config W5500_RX_THREAD_STACK_SIZE
        int "Stack size for internal incoming packet handler"
        default 800
        help
          Size of the stack used for internal thread which is ran for
          incoming packet processing.

config W5500_RX_THREAD_PRIO
        int "Priority for internal incoming packet handler"
        default 2
        help
          Priority level for internal thread which is ran for incoming
          packet processing.

config W5500_TIMEOUT
        int "IP buffer timeout"
        default 100
        help
          Given timeout in milliseconds. Maximum amount of time
          that the driver will wait from the IP stack to get
          a memory buffer before the Ethernet frame is dropped.

endmenu

menu "Zephyr Kernel"
source "Kconfig.zephyr"
endmenu
```


## src/main.c

ソースファイル。
main関数を定義する。

# build_circuitdojo_feather_nrf9160ns

プロジェクト作成時に動的に生成されるフォルダ。
build_ターゲット基板名 で作られる。

## circuitdojo_feather_nrf9160ns.overlay

デフォルトのデバイスツリー設定を変更する場合に、自力で追加するファイル。

ターゲット基板名.overlay という名称でつくる。

デバイスツリーは、基板の何番 PIN にどのデバイスがつながっているとか、
どのデバイスがどの割り込みの番号をつかうかなどの定義。

* * *

すでにめんどくさいことになっているが、慣れるしか無い。

続くかも（？）

* * *