SD,SDIOの仕組みとデバイスドライバ

本記事では、SD, SDIOがどのようなハードウェアの構成になっているかをまとめたものです。また、組み込み開発としてどのようにデバイスドライバに必要な情報を入手していくかもまとめました。

SD, SDIOの仕組みや組み込み開発のSD,SDIOのデバイスドライバに関して興味がある方に呼んでいただけると幸いです。
また、デバイスドライバの実装に関しては別の記事で説明しようかと思います。

# SDとは

SD標準規格という規格に則った通信を行います。
SD標準規格は、SD card用のSDメモリカード規格や、データ形式やコーデックの共通化のためのアプリケーション規格、ホストデバイス開発のためのホストコントローラ規格、後述するSDIO規格など複数の規格で構成されています。本記事では主にSD CardとSDIOについて説明していきます。

また、SD標準規格に則ったSDカードや、SDのホストコントローラを製造する場合には、[こちら](https://www.sdcard.org/ja/join-2/ )からSDアソシエーションの会員に加入する必要があります。仕様に関しても一部は無料で閲覧できますが、全ての仕様を閲覧するには会員になる必要があります。
加えて、開発した製品がSDに対応していることを明記するためには、このSDアソシエーションのHALAなどの許諾契約をする必要があります。
必要な許諾に関しては、[こちら](https://www.sdcard.org/ja/developers-2/use-and-licensing/ )に詳しく書いてありますので、必要に応じて参照してください。

## SD Card

SD Cardは、標準サイズ、microSDの二つのサイズの規格が存在します(miniSDというものもありますが、ほぼ使われていないため省略)。物理仕様の違いとしては、下記のようになります。

|   |    標準サイズ    | microSD |
| ------------- |  -------------------- | -------------------- |
| 通信端子の数 | microSDより多い  | 標準サイズより少ない |
| 書き込み禁止スイッチ | あり  | なし |

また、SD Cardはメモリ容量や使用するファイルフォーマットで仕様が分けられています。その区分を下記に示します。

### 容量とファイルフォーマットにおける仕様区分

容量とファイルフォーマットにおける各仕様を表にまとめます。各仕様ごとに対応するバススピードも変わってきます。

|   |  容量  | ファイルシステム | 対応スピード |
| ------------- |  -------------------- | -------------------- | -------------------- |
|  SD(SD1.0、SD1.1)  |  最大2GB  |  FAT12,FAT16  |  デフォルトスピード、ハイスピード  |
|  SDHC(SD2.0)  | 最大32GB   |  FAT32  |   デフォルトスピード、ハイスピード  |
|  SDXC(SD3.0)  |  最大2TB  |  exFAT  |   デフォルトスピード、ハイスピード、UHS-I, UHS-II、UHS-III、SD Express  |
|  SDUC(SD7.0)  |  最大128TB  |  exFAT  |  デフォルトスピード、ハイスピード、UHS-I, UHS-II、UHS-III、SD Express   |

スピードがそれぞれどのくらいの速さか分かりにくいので、これも下記に示します。

## バスインターフェーススピード

| バスインターフェーススピード  |  最大スピード(MByte/s) |
| ------------- |  -------------------- |
| デフォルトスピード | 12.5 |
| ハイスピード  | 25 |
| UHS-I(SDR50, DDR50)  | 50  |
| UHS-I(SDR104)  | 104 |
| UHS-II(全二重通信)  | 156 |
| UHS-II(半二重通信)  | 312  |
| UHS-III(全二重通信)  | 312 |
| UHS-III(半二重通信)  | 624 |
| SD Express(SD 7.0)  | 985 |
| SD Express(SD 8.0~)  | 1970 or 3940 |

UHS-IのSDR104はクロック周波数を限界まで高くすることによりスピードを上げています。SDR, DDR50の場合はクロックの両エッジ(立ち上がりと立下り)を用いる方式を使用し、必要なクロック周波数を半分に設定することで最大スピードを上げています。SDR, DDR50はmicroSDで使われていることが多いです。
UHS-IIとUHS-IIIに関しては、LVDSと呼ばれる低電圧差動信号による高速伝送技術を採用することで、最大スピードを上げています。LVDSは専用の端子が必要なため、SDのホストコントローラが対応していないことも多々あります(ホストコントローラに関しては後述)。使用時はホストコントローラの仕様書で対応しているかを確認してください。また、半二重通信で通信を可能にすることにより、片方向の通信スピードを上げることも可能です。
SD Expressは、PCI-Express規格のインターフェースを使うことで速度を改善させています。こちらもハードによる対応が必要なもののため、使用時はホストコントローラの仕様書で対応しているかを確認してください。


## SDIO

SDIOは、SD Card用の通信仕様を使ってSD Card以外のモジュールを制御するための仕様です。例えば、WLAN,Bluetooth用のモジュールやカメラなどがあります。下記の図のような形のモジュールが多いです。モジュールにSDもしくはmicroSDの接続口がついています。

![SDIOカード例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/7ada2d76-02d2-1d5c-a23b-c7c02a4ff9c9.png)


バススピードに関しては、使用するSDホストコントローラとSDIOモジュールがどのバスインターフェーススピードに対応しているかで、設定可能なスピードクラスが決まります。(例えば、どちらもハイスピードに対応していれば、ハイスピードで通信可能)
よって、必ずSDホストコントローラの仕様とSDIOモジュールの仕様を確認する必要があります。

# SDホストコントローラ

SD Card、SDIOの通信を行うためには、SDホストコントローラが必要になります。よってノートPCやスマートフォンにも搭載されています。通常、このホストコントローラをデバイスドライバが制御することにより、SD CradやSDIOモジュールとの通信・制御を実現させています。下記の図のようなイメージです。

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/5a406e73-ca10-19fa-48f0-316cc91546c0.png)

加えて上記の図にある通り、SD Card, SDIOの通信はCMDと呼ばれる数バイトのデータによるやり取りで行っています。
CMDには、使用する電圧の設定からスピード設定、レジスタ設定に加え、データの送受信を行う時の合図にも使用されています。CMDには様々なものがあり、SDの全ての仕様を入手するにはSDアソシエーションの登録が必要ということもあるので、ここでは割愛します。
また、SD CardとSDIOの通信に使用するCMDのフォーマットが違ったり、SD Cardは主にファイルシステムとのやり取りを行うことから、SD用のデバイスドライバとSDIOのデバイスドライバが必要になります。

# SPIモードとMMCモード

SD,SDIOの通信には、SPIモードとMMCモードという二つのモード設定があります。
性能の面ではMMCモードの方が良いのですが、許諾契約を行わないとこのモードを使用した製品に「SD対応」ということを明記することができません。
SPIモードは、MMCモードを簡単に制御するために設定された代替の動作モードです。よって、上記の理由もあって、SPIモードで使用されることもあります。
SPIモードとMMCモードの大きな違いとしては、アサインされているピンの違いがあります。例えばデータ線となるピンがMMCの方が多くなります。このあたりは下記にて後述します。

# SD, SDIOのピン設定

SPIモードとMMCモードでピンアサインが違うので、下記の表にそれをまとめます。

| ピン | SPIモードでの機能 | MMCモードでの機能  |
| ------------- |  -------------------- |  -------------------- |
| DAT3/CS | チップセレクト |  データピン3 |
| CMD/DI | MOSI(master out slave in) | コマンド用通信ピン  |
| VSS1 |  グランド | グランド  |
| VDD | 電力供給 | 電力供給  |
| CLK | クロック供給 |  クロック供給 |
| VSS2  |  グランド | グランド  |
| DAT0/DO  | MISO(master in slave out) | データピン0  |
| DAT1/IRQ  | 割り込み通知用 | データピン1  |
| DAT2/NC  | 未使用 | データピン2  |

上記の通り、SPIモードではデータピンが二つでMMCモードはデータピンが四つあるため、SPIモードの方が性能自体は劣る。

# デバイスドライバ開発

SD、 SDIOのデバイスドライバを開発するうえで、まず必要となるのは下記のドキュメントです。これらについて説明します。

・ハードウェア(評価ボード)のリファレンスマニュアル
・評価ボードに搭載されているマイクロコントローラのリファレンスマニュアル
・回路図
・SDアソシエーションのSD、SDIOの仕様書

## ハードウェアのリファレンスマニュアル

　ハードウェアのリファレンスマニュアルは、SD、SDIOがハードウェアとしてどのような設定となっているか、ピンアサインはどのようになっているかを確認するのに使用します。
　「NUCLEO-F429Zi」の例を挙げると、下記のようなSD(SDMMC)のピンアサインの記述がいくつかあります。これを参考にピン設定を行います。

![ピンアサイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/8132db9e-3026-3053-c2e5-e5e179507b0a.png)

また、「NUCLEO-F429Zi」におけるハードウェアのリファレンスマニュアル[ここ](https://www.st.com/ja/evaluation-tools/nucleo-f429zi.html#documentation )にあります。「ユーザ・マニュアル」の項目にある、「UM1974 STM32 Nucleo-144 boards (MB1137)」がハードウェアのリファレンスマニュアルです。

## マイクロコントローラのリファレンスマニュアル

次に評価ボードに乗っているマイクロコントローラ、いわゆるマイコンのリファレンスマニュアルです。
このリファレンスマニュアルにはマイコンの説明だけでなく、SD、SDIOを含むハードウェアとして対応している機能の扱い方やレジスタ仕様が書かれています。デバイスドライバの開発など、低レイヤの開発をするうえで必ず必要になる資料です。

このマイコンのリファレンスマニュアルは、マイコンの型番から探します。「NUCLEO-F429Zi」においては、ハードウェアのリファレンスマニュアルに下記の画像のように型番が記されているので、この型番のマイコンのリファレンスマニュアルを探します。

![NUCLEO型番.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/e8edb540-8a89-71ab-1162-6a2d1afbb513.png)


Googleなどの検索サイトから検索したところ、[こちら](https://www.stmcu.jp/stm32/stm32f4/stm32f429439/12326/ )にあります。「リファレンスマニュアル(日本語)」の項目からダウンロードできます。

![リファレンスマニュアル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/7ff02134-49bd-c5a0-c8e0-9ed0040b4323.png)


主にこのリファレンスマニュアルとサンプルソースコードを確認しながらデバイスドライバを開発していくことが多いです。

ちなみに、リファレンスマニュアルで確認することが必要な項目は下記となります。

- 6 リセットおよびクロック制御（STM32F42xxx およびSTM32F43xxx 向け）（RCC）
  - クロック供給の設定の仕方を確認する
- 12 割り込みとイベント
  - SD、SDIOの割り込みの設定の仕方を確認する
- 31 セキュアデジタル入力／出力インタフェース（SDIO）
  - SD、SDIOの設定の仕方、SDホストコントローラの仕様を確認する
- 10 DMAコントローラ
  - SDのデータ通信時に使用するDMAのコントローラの設定の仕方を確認する
- 8.3.2 I/O ピンマルチプレクサとマッピング
  - 信号の入力に関して確認方法

## 回路図

次に、開発ボードの回路図を確認します。「NUCLEO-F429Zi」においては、[こちら](https://www.st.com/ja/evaluation-tools/nucleo-f429zi.html#cad-resources )にありました。
SD、SDIOのデバイスドライバを開発するうえでは、ピンの設定確認や、ジャンパとディップスイッチを操作する必要があるのかの確認に使用します。
また、ハードウェア側に問題があってデバイスドライバが動作しない場合等の原因究明にも使用します(市販のボードであればこの用途は稀です。まずはソフトウェアに間違いがないかを調べるのが先決です)。

![回路図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/dfead761-6985-e9d4-3cd7-a7ae2c8bbd2c.png)

## SDアソシエーションのSD、SDIOの仕様書

通信に使用するCMDや、SD card、SDIOモジュールの共通レジスタ設定の仕様を参照するのによく使用します。
[SDアソシエーションの公式サイト](https://www.sdcard.org/ja/developers-2/sd-standard-overview/  )から仕様書をダウンロードします。こちらは先述した通り、全ての仕様を確認するにはSDアソシエーションに加入する必要があります。

# 参考資料

https://www.sdcard.org/ja/developers-2/sd-standard-overview/
https://www.sdcard.org/ja/developers-2/sd-standard-overview/host-controllers/
http://elm-chan.org/docs/mmc/mmc.html
http://stm8sdatasheet.web.fc2.com/STVD-project33-SD-CARD/SD-card-investigation.html
https://memes.sakura.ne.jp/memes/?page_id=2124