# ビルドシステムと設定プロファイル

> CMake ビルドシステムの構成、config.cmake による MACHIKANIA_BUILD 選択、LCD ドライバ・キーボード・WiFi ライブラリの自動切り替えロジック、RP2040/RP2350 向けリンカスクリプト、config/ ヘッダによるハードウェア定数の定義方法を解説します。

- Repository: machikania/phyllosoma
- GitHub: https://github.com/machikania/phyllosoma
- Human wiki: https://grok-wiki.com/public/wiki/machikania-phyllosoma-fab169c4381c
- Complete Markdown: https://grok-wiki.com/public/wiki/machikania-phyllosoma-fab169c4381c/llms-full.txt

## Source Files

- `CMakeLists.txt`
- `config.cmake`
- `config/pico_ili9341.h`
- `config/pico_ntsc.h`
- `memmap_machikania.ld`
- `memmap_machikania_pico2.ld`

---

<details>
<summary>関連するソースファイル</summary>
このWikiページの生成に使用したファイル:

- [CMakeLists.txt](CMakeLists.txt)
- [config.cmake](config.cmake)
- [config.h](config.h)
- [config/pico_ili9341.h](config/pico_ili9341.h)
- [config/pico_ntsc.h](config/pico_ntsc.h)
- [config/pico_w_ili9341.h](config/pico_w_ili9341.h)
- [config/rp2350_lcd_1_47.h](config/rp2350_lcd_1_47.h)
- [config/xiao_ntsc.h](config/xiao_ntsc.h)
- [config/pico_picocalc.h](config/pico_picocalc.h)
- [memmap_machikania.ld](memmap_machikania.ld)
- [memmap_machikania_pico2.ld](memmap_machikania_pico2.ld)
- [auxcode/auxcode.cmake](auxcode/auxcode.cmake)
</details>

# ビルドシステムと設定プロファイル

Phyllosoma/Puerulus ファームウェアは **CMake** を中心に構成されており、ターゲットハードウェアの選択は `config.cmake` の 1 行を書き換えるだけで完結します。このページでは、`MACHIKANIA_BUILD` 変数がどのように LCD ドライバ・キーボード・WiFi ライブラリの組み合わせを自動的に確定させるか、RP2040/RP2350 向けにどちらのリンカスクリプトが選ばれるか、そして `config/` ディレクトリ内のハードウェア定数ヘッダがどのように C コードへ届くかを解説します。

---

## CMake ビルドの全体像

```text
CMakeLists.txt
 ├─ include(pico_sdk_import.cmake)   # Pico SDK ルート設定
 ├─ include(config.cmake)            # MACHIKANIA_BUILD → 各変数を決定
 ├─ project(${MACHIKANIA_CODE_NAME}) # phyllosoma / puerulus
 └─ pico_sdk_init()
      ├─ add_library(shared_files)   # 共通ランタイム
      ├─ add_library(video_files)    # LCD/NTSC ドライバ (BUILD 依存)
      ├─ add_library(wifi_files)     # WiFi / ダミースタブ (BOARD 依存)
      ├─ add_library(aux_files)      # 補助コード (auxcode/auxcode.cmake)
      ├─ add_executable(*_kb)        # キーボード付きビルド → *.uf2
      └─ add_executable(*)           # USB-CDC (PC 接続) ビルド → *.uf2
```

ビルドは TinyUSB が初期化されているときのみ実行されます。`if (TARGET tinyusb_device)` ブロックで全ライブラリ・実行ファイルが定義されています。

Sources: [CMakeLists.txt:14-17]()

---

## config.cmake による `MACHIKANIA_BUILD` の選択

ユーザーが編集すべきファイルは `config.cmake` だけです。先頭のコメント解除で使用するハードウェアプロファイルを 1 つ選びます。

### 選択可能なプロファイル一覧

| `MACHIKANIA_BUILD` 値 | 対象ハードウェア |
|---|---|
| `pico_ili9341` | Raspberry Pi Pico / YD-RP2040 + ILI9341 LCD（**デフォルト**）|
| `pico_st7789` | Raspberry Pi Pico / YD-RP2040 + ST7789 LCD |
| `pico_ili9488` | Raspberry Pi Pico / YD-RP2040 + ILI9488 LCD |
| `pico_restouch` | Waveshare Pico-ResTouch-LCD-3.5 |
| `pico_picocalc` | ClockworkPi PicoCalc |
| `rp2350_lcd_1_47` | Waveshare RP2350-LCD-1.47 |
| `pico_ntsc` | Raspberry Pi Pico / YD-RP2040 + NTSC ビデオ出力 |
| `xiao_ntsc` | Seeed XIAO RP2040 + NTSC ビデオ出力 |

WiFi 対応ボード（`PICO_BOARD=pico_w` または `pico2_w`）が指定された場合、CMake が自動的に `MACHIKANIA_BUILD` を `pico_w_ili9341`、`pico_w_ntsc` 等の WiFi 版に書き換えます。

Sources: [config.cmake:1-30](), [config.cmake:77-92]()

### 自動切り替えロジックの流れ

```mermaid
flowchart TD
    A["MACHIKANIA_BUILD\n（ユーザーが config.cmake で設定）"]

    A -->|"pico_ili9488\npico_picocalc"| G1["MACHIKANIA_GRAPH_LIB\n= ili9488_spi"]
    A -->|"pico_st7789"| G2["MACHIKANIA_GRAPH_LIB\n= st7789_spi"]
    A -->|"pico_restouch"| G3["MACHIKANIA_GRAPH_LIB\n= ws_pico_restouch"]
    A -->|"rp2350_lcd_1_47"| G4["MACHIKANIA_GRAPH_LIB\n= rp2350_lcd_1_47"]
    A -->|"pico_ntsc\nxiao_ntsc"| G5["MACHIKANIA_GRAPH_LIB\n= rp2040_pwm_ntsc_textgraph"]
    A -->|"それ以外"| G6["MACHIKANIA_GRAPH_LIB\n= ili9341_spi（デフォルト）"]

    A -->|"pico_picocalc"| K1["MACHIKANIA_KEYBOARD\n= picocalc_keyboard"]
    A -->|"それ以外"| K2["MACHIKANIA_KEYBOARD\n= usbkeyboard"]

    A -->|"pico_ntsc\nxiao_ntsc"| M1["MACHIKANIA_MONITOR_LIB=graphlib_ntsc\nMACHIKANIA_EDITOR=editor_ntsc\nMACHIKANIA_CODE_NAME=puerulus"]
    A -->|"それ以外"| M2["MACHIKANIA_MONITOR_LIB=graphlib_lcd\nMACHIKANIA_EDITOR=editor\nMACHIKANIA_CODE_NAME=phyllosoma"]

    B["PICO_BOARD"]
    B -->|"pico_w / pico2_w"| W1["MACHIKANIA_WIFI=withwifi\nMACHIKANIA_BUILD を pico_w_* に変更"]
    B -->|"それ以外"| W2["MACHIKANIA_WIFI=withoutwifi"]
```

Sources: [config.cmake:33-92]()

#### LCD ドライバ (`MACHIKANIA_GRAPH_LIB`)

`MACHIKANIA_GRAPH_LIB` は `interface/` 内のドライバ C ファイル名に対応します。`video_files` ライブラリは次のように構築されます。

```cmake
add_library(video_files
    interface/${MACHIKANIA_GRAPH_LIB}.c
    interface/${MACHIKANIA_MONITOR_LIB}.c
    interface/fontdata.c
)
```

Sources: [CMakeLists.txt:51-60]()

#### WiFi ライブラリ (`MACHIKANIA_WIFI`)

WiFi が有効な場合はフル実装（`wifi/withwifi.c`、LwIP + mbedTLS）、無効な場合はスタブ（`wifi/withoutwifi.c`）のみがリンクされます。WiFi 有効時にはスタックサイズ・ヒープサイズに `4096` バイトが追加で割り当てられます。

```cmake
if (MACHIKANIA_WIFI STREQUAL "withwifi")
    add_library(wifi_files
        wifi/withwifi.c wifi/socket.c wifi/picow_ntp_client.c ...
    )
    target_link_libraries(wifi_files
        pico_cyw43_arch_lwip_threadsafe_background
        pico_lwip_mbedtls pico_mbedtls ...
    )
else()
    add_library(wifi_files wifi/withoutwifi.c)
endif()
```

Sources: [CMakeLists.txt:65-88]()

---

## 2 種類の実行バイナリ

`CMakeLists.txt` は常に 2 つの `.uf2` を生成します。

| バイナリ名 | 特徴 | USB 標準入出力 |
|---|---|---|
| `{CODE_NAME}_kb.uf2` | USB ホスト HID キーボードを使用 | 無効 |
| `{CODE_NAME}.uf2` | PC の USB-CDC 経由でコマンド入力 | USB CDC 有効 |

キーボード付きバイナリは `tinyusb_host` / `tinyusb_board` にリンクされ、キーなしバイナリは `pico_enable_stdio_usb` で USB CDC が有効になります。

Sources: [CMakeLists.txt:92-127]()

---

## コンパイル定義

`CMakeLists.txt` が付与する主要な `#define` を以下に示します。

| 定義名 | 値・条件 | 用途 |
|---|---|---|
| `MACHIKANIA_CONFIG` | `"./config/${MACHIKANIA_BUILD}.h"` | ハードウェアヘッダのインクルードパス |
| `PICO_CLOCK_ADJUST_PERI_CLOCK_WITH_SYS_CLOCK` | `1` | SPI 等の周辺クロック追従 |
| `PICO_PLATFORM_RP2350` | `rp2350-arm-s` 時のみ | プラットフォーム判別 |
| `MACHIKANIA_PHYLLOSOMA` / `MACHIKANIA_PUERULUS` | CODE_NAME による | システム種別判別 |
| `MACHIKANIA_DEBUG_MODE` | `config.cmake` で有効化 | デバッグモード |
| `PICO_STACK_SIZE` / `PICO_HEAP_SIZE` | WiFi 有効時 `4096` | スタック・ヒープ増量 |

Sources: [CMakeLists.txt:137-162]()

---

## リンカスクリプト

ターゲットプラットフォームに応じて、2 つのリンカスクリプトが切り替えられます。

```cmake
if(PICO_PLATFORM STREQUAL "rp2350-arm-s")
    pico_set_linker_script(... memmap_machikania_pico2.ld)
else()
    pico_set_linker_script(... memmap_machikania.ld)
endif()
```

Sources: [CMakeLists.txt:129-135]()

### メモリマップ比較

| 領域 | RP2040 (`memmap_machikania.ld`) | RP2350 (`memmap_machikania_pico2.ld`) |
|---|---|---|
| FLASH | `0x10000000` / 2048 KB | `0x10000000` / **4096 KB** |
| RAM | `0x20000000` / 256 KB | `0x20000000` / **512 KB** |
| SCRATCH_X | `0x20040000` / 4 KB | `0x20080000` / 4 KB |
| SCRATCH_Y | `0x20041000` / 4 KB | `0x20081000` / 4 KB |

両スクリプトとも先頭に `.kmbasicobject_section` を `0x20000000` に配置する点が共通です。これは BASIC インタープリタのオブジェクトコードを RAM の先頭固定アドレスに置くための設計です。

```ld
.kmbasicobject_section 0x20000000 (NOLOAD) : {
    KEEP(*(.kmbasicobject_section))
} > RAM
```

Sources: [memmap_machikania.ld:23-26](), [memmap_machikania_pico2.ld:23-26]()

### RP2040 と RP2350 のスクリプト差異

- **boot2 セクション**: RP2040 版ではサイズが正確に 256 バイトであることをアサートしますが、RP2350 版では「256 バイト以下」のアサートに緩和されています（RP2350 では boot2 の役割が縮小）。
- **TLS サポート**: RP2350 版には `.tdata`・`.tbss` セクションと picolibc/LLVM-libc 向けの `PROVIDE` シンボルが追加されています。
- **ヒープ**: RP2350 版では `.heap` セクションが RAM 全体に拡張され、`__HeapLimit` が `ORIGIN(RAM) + LENGTH(RAM)` に設定されます。
- **`KMBASIC_OBJECT_KBYTES_EXTENDED`**: `config.h` が RP2350 時に `KMBASIC_OBJECT_KBYTES + 256` を設定し、拡張 RAM を BASIC オブジェクト領域に活用します。

Sources: [memmap_machikania.ld:36-39](), [memmap_machikania_pico2.ld:95-98](), [config.h:43-48]()

---

## `config/` ヘッダによるハードウェア定数の定義

### ヘッダファイル一覧

| ファイル名 | 対象ハードウェア |
|---|---|
| `pico_ili9341.h` | Pico + ILI9341 |
| `pico_ili9488.h` | Pico + ILI9488 |
| `pico_st7789.h` | Pico + ST7789 |
| `pico_restouch.h` | Waveshare Pico-ResTouch |
| `pico_picocalc.h` | PicoCalc |
| `rp2350_lcd_1_47.h` | Waveshare RP2350-LCD-1.47 |
| `pico_ntsc.h` | Pico + NTSC 映像出力 |
| `xiao_ntsc.h` | XIAO RP2040 + NTSC 映像出力 |
| `pico_w_ili9341.h` | Pico W + ILI9341（`pico_ili9341.h` を include + WiFi 用定数追加）|
| `pico_w_*.h` | 上記 WiFi 版バリアント（同様のパターン）|

### 定義カテゴリ

各ヘッダは以下のカテゴリのマクロを定義します。

**GPIO マスク**
```c
// pico_ili9341.h より
//                     31     24      16       8       0
#define GPIO_ALL_MASK 0b00011100011100000000001111111111
```

**SPI / I2C / UART ピン**
```c
#define IO_SPI_CS 3
#define IO_I2C_SDA 6
#define IO_I2C_SCL 7
#define IO_UART_TX 4
#define IO_UART_RX 5
#define IO_UART_CH uart1
```

**ボタン GPIO**
```c
#define GPIO_KEYUP 8
#define GPIO_KEYLEFT 9
#define GPIO_KEYRIGHT 20
#define GPIO_KEYDOWN 21
#define GPIO_KEYSTART 22
#define GPIO_KEYFIRE 26
```

**LCD 設定（LCD 搭載モデルのみ）**
```c
#define LCD_CS 13
#define LCD_DC 10
#define LCD_COLUMN_RES 240
#define LCD_ROW_RES 320
#define LCD_SPI_BAUDRATE (50*1000*1000)
#define LCD_SPI_BAUDRATE_R (15*1000*1000)
```

**SD カード SPI 設定**
```c
#define SD_SPI_CS 17
#define SD_SPI_TX 19
#define SD_SPI_RX 16
#define SD_SPI_SCK 18
#define SD_SPICH spi0
#define SD_SPI_BAUDRATE (10*1000*1000)
```

NTSC モデルでは LCD 関連マクロが存在せず、`NTSC_VIDEO_OUT 15` のような映像出力ピン定義に置き換えられます。

Sources: [config/pico_ili9341.h:35-100](), [config/pico_ntsc.h:35-100]()

#### WiFi 版ヘッダの継承パターン

`pico_w_ili9341.h` のように WiFi 版ヘッダは非 WiFi 版ヘッダを `#include` し、差分定数（主に `KMBASIC_OBJECT_KBYTES` の縮小）だけを追加します。

```c
// pico_w_ili9341.h
#include "./pico_ili9341.h"
#define KMBASIC_OBJECT_KBYTES 176
```

WiFi スタックがメモリを消費するため、BASIC オブジェクト用 RAM を 192 KB → 176 KB に削減しています。

Sources: [config/pico_w_ili9341.h:1-8]()

---

## `config.h`: 共通ブリッジヘッダ

`config/` ヘッダを C コードに届けるのが **`config.h`** です。`MACHIKANIA_CONFIG` マクロを使ってコンパイル時にインクルードパスを解決します。

```c
// config.h
#ifdef MACHIKANIA_CONFIG
#include MACHIKANIA_CONFIG   // "例: ./config/pico_ili9341.h"
#else
#error MACHIKANIA_CONFIG not defined
#endif
```

その後、ハードウェア非依存の共通定義が続きます。

| 定義 | 内容 |
|---|---|
| `PUERULUS` / `PHYLLOSOMA` マクロ | システム種別フラグ（0/1）|
| `MONITOR_TYPE` | `"LCD"` または `"NTSC"` |
| `SYSVER1`, `SYSVER2`, `BASVER` | バージョン文字列 |
| `RP2040` / `RP2350` | プラットフォームフラグ |
| `KMBASIC_OBJECT_KBYTES_EXTENDED` | RP2350 時は `+256` KB |
| `IO_SPI_TX/RX/SCK/CH` のフォールバック | 未定義時は SD カード SPI を共用 |
| `KEYUP`〜`KEYSMASK` | GPIO ビットマスク定数 |
| `rotate_buttons_data()` | LCD 回転時のボタン方向変換マクロ |

Sources: [config.h:1-89]()

---

## まとめ

Phyllosoma のビルドシステムは、`config.cmake` の `MACHIKANIA_BUILD` 変数を起点とした段階的な変数導出により、LCD ドライバ・キーボード・モニタ・WiFi の 4 軸を同時に制御します。WiFi 対応は `PICO_BOARD` フラグで自動判別され、WiFi 版ヘッダは非 WiFi 版を継承して差分だけを上書きするという簡潔な設計です。リンカスクリプトは RP2040（FLASH 2 MB / RAM 256 KB）と RP2350（FLASH 4 MB / RAM 512 KB）で切り替えられ、いずれも `.kmbasicobject_section` を RAM 先頭の固定アドレス `0x20000000` に配置します。C コードへのハードウェア定数の供給は `config.h` → `#include MACHIKANIA_CONFIG` の単一インダイレクションで完結しており、新しいハードウェアターゲットの追加は `config/` への新規ヘッダ追加と `config.cmake` への数行の追記だけで対応できます。
