Zephyr + STM32L476 > microSD(SPIモード接続) + FAT

```txt:動作環境　
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
Zephyr 2.1.0-rc1
microSDモジュール: CK-40 (サンハヤト)
ロジック確認: Analog Discovery 2 (AD2)
```

### 概要

- microSDをSPIモードで接続する
    - [MicroSD用コネクタ変換基板　CK-40](https://www.sunhayato.co.jp/material2/index.php/item?cell003=%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E5%A4%89%E6%8F%9B%E5%9F%BA%E6%9D%BF%E8%A3%BD%E5%93%81&cell004=%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E5%A4%89%E6%8F%9B%E5%9F%BA%E6%9D%BF&name=MicroSD%E7%94%A8%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E5%A4%89%E6%8F%9B%E5%9F%BA%E6%9D%BF%E3%80%80CK-40&id=490&label=1)
- FAT形式のファイルとディレクトリを表示する
    - サンプルのプロジェクトを実行

### 接続

参考: [Default Zephyr Peripheral Mapping:](https://docs.zephyrproject.org/1.12.0/boards/arm/nucleo_l476rg/doc/nucleol476rg.html#default-zephyr-peripheral-mapping)

SPI1を使う。

- [CK-40]<-->[STM32L476], (ケーブル色)
    - DAT/D0 <--> PA6(MISO), 青
    - VSS <--> GND, 緑
    - CLK <--> PB3(SCK), 黄
    - VDD <--> 3V3, 赤
    - CMD/DI <--> PA7(MOSI), オレンジ
    - CS <-- 100k --> PA4(NSS), 白

CSは100kでプルアップしたが、プルアップ抵抗値は一例を参考にしただけ。

## プロジェクトファイル

下記のプロジェクトファイルに変更をして使用した。

```
zephyr/samples/subsys/fs/fat_fs
```

### prj.conf

CONFIG_SPI_1を使用するようになっている。
そのまま使用した。

```prj.cconf
CONFIG_SPI=y
CONFIG_SPI_1=y
CONFIG_DISK_ACCESS=y
CONFIG_DISK_ACCESS_SDHC=y
CONFIG_DISK_ACCESS_SPI_SDHC=y
CONFIG_LOG=y
CONFIG_FILE_SYSTEM=y
CONFIG_FAT_FILESYSTEM_ELM=y
CONFIG_PRINTK=y
```
### オーバレイファイル: nucleo_l476rg.overlay

`<BOARD>.overlay`ファイルを作成した。
nrf52840_blip.overlayの内容をコピーした上でPC7をcs-gpiosに設定している。
実際にはCSはPA4に接続しているため、この作業は間違っているのかもしれない。

```nucleo_l476rg.overlay
/*
2019-12-15 yasokada
branched from [nrf52840_blip.overlay]
*/

/*
 * Copyright (c) 2019 Tavish Naruka <tavishnaruka@gmail.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

&spi1 {
        status = "okay";
        cs-gpios = <&gpioc 7 0>;

        sdhc0: sdhc@0 {
                compatible = "zephyr,mmc-spi-slot";
                reg = <0>;
                status = "okay";
                label = "SDHC0";
                spi-max-frequency = <24000000>;
        };
};
```

### microSDの準備

Windows 10 professionalのPCにて下記のようなディレクトリとファイルを作成した。

- SomeDir/
- hogehoge.txt
- fugafuga.txt

### 実行

```
$ west build -p auto -b nucleo_l476rg samples/subsys/fs/fat_fs/
$ west flash
$ west flash
```

west flashは一回だけの場合にエラーになることがある。
二回実施すると失敗しない。

```
$ west debug
(gdb) break main.c:69
c
```

main.cの69行目は
`	if (res == FR_OK) {`

ここでres=0だとFATマウントが成功していて、あとのリスト表示が実行される。
失敗時にはres=-5となっていた。

### 出力の確認

別のターミナルにて

```
$ sudo screen /dev/ttyACM0 115200
```

上記のwest debug以降の実行で下記のような結果になる。

```
***** Booting Zephyr OS build v2.1.0-rc1-252-g68729ad3f88e *****
[00:00:00.005,000] <inf> spi_ll_stm32: CS control inhibited (no GPIO device)
Sector size 512
Memory Size(MB) 1876
Disk mounted.

Listing dir /SD: ...
[DIR ] SYSTEM~1
[DIR ] SOMEDIR
[FILE] HOGEHOGE.TXT (size = 0)
[FILE] FUGAFUGA.TXT (size = 0)
[00:00:00.030,000] <inf> sdhc_spi: Found a ~1876 MiB SDHC card.
[00:00:00.031,000] <inf> sdhc_spi: Manufacturer ID=27 OEM='SM' Name='00000' Revision=0x10 Serial=0x928d5504
[00:00:00.031,000] <inf> main: Block count 3842048
```

SomeDir/とhogehoge.txt, fugafuga.txtが見えた。
成功。

screenはCtrl+a,kで終了


### はまった

最初はSTM32F769I-Discoveryで試そうとしていた。
次にSTM32L476に変更したが、Arduino connector使用で同じピン使用と思っていたら全然違った。

Analog Discovery 2にてロジックを確認して気づいた。

Analog Discovery 2に今回も助けられた。


### 関連情報

- [SDHC disks @ Zephyr API Reference](https://docs.zephyrproject.org/latest/reference/storage/disk/sdhc.html)
- [Devicetree Overlays @ Zephyr Project > Application Development](https://docs.zephyrproject.org/latest/application/index.html#application-dt)

### overlay

```
cs-gpios = <&gpioc 7 0>;
```

上記を下記のようにしたが、処理は成功した。

```
cs-gpios = <&gpioc 17 0>;
```

`<BOARD>.overlay`ファイルを別名にすると失敗した。
`<BOARD>.overlay`ファイル自体は必要だが、cs-gpiosの定義はSPI1のChipSelectに関係ないような気はする。