いろいろ試す25

今回はSDカード関連中心です。


●SDカードの規格がバージョンアップ
SDカードの規格(Specification)が今年夏にV5.00にバージョンアップしています。

主な変更点は4Kや8K等の高精細映像録画に対応した"Video Speed Class recording"
略して"VSC"の追加です。これに対応したカードは「V6」とか「V30」とかの転送MB数を
保証する"V値"の付いたロゴが付きます。
既存の速度規格もすべて付与されるのでカードはロゴだらけのゴテゴテ状態となっ
ちゃいますね…実際そうなってるようですけど。
市場には現実的に購入可能な値段で既に出回っております。私も金銭的に余裕が
出来たら買って試してみるつもりです。


また、SCRレジスタのSDSpecにはV5.0を示す値が新たに付与されています。V値が書か
れたロゴが付いているカードはこの値が"5"になるはずです。私のいつものの今月の
更新でこちらにも対応していますので、既に入手した人は試してみてください。

20161201追:
ねむいさんいますぐSDAのサイト見てください!!!ってメール頂いたのですが
お昼にSDAのサイト見たら早くもSDSpecV5.1のアナウンスがされていました…。
今度は"Application Performance Class"の追加だそうで…これに対応した
奴は新たにA1なるロゴが付くようです。
もうロゴだらけですよぅ!!!!!


●ところで電子工作でSDカードを使用する際のライセンスの件について
SDカードをシステム用ストレージとして使用する組み込み機器の開発の際に必要な
ライセンスについて、SDAの中の人(具体的にはP@n@s○nic(@と○は伏字)の人)に
確認を取ることになりました。それのついででさりげなく電子工作においてSPI互換
モードでSDカードを動作せしめる際のライセンシーの扱いについても尋ねてみました。
巷でよく言われている「SPIモードでSDカードを動かす時はSDAとライセンス契約を結ぶ
必要はあるのか!?」っていう定期的に話題に持ち上がるもやもやしたアレの事です。

本当は枝葉末節の細かい条件に至るまで尋ねたかったのですが、そこまでやって
しまうとさすがにコンサル料を取られてしまいそうなのであくまであたりさわりの
ない範疇で"さりげなく"です。

ね「そいえばSPI互換モードだとライセンス不要とかトラ技とかにたまに書いて
  あるんですけどやっぱSPI互換モードでSDカード使う場合でもちゃんと契約
  結ぶ必要ってあるんですよね?」

P「はい」



ねむいさん藪をつついて蛇どころかオロチだしちゃいましたごめんね(テヘペロ
外人さんも正攻法で尋ねた方がいたみたいで同じ回答をもらっています。

別ジャンルですが今年頭に似たようなことやった人がいてちょっとした騒ぎ
なったケースがありますね。


そもそもの「SPIモードなら云々」経緯ですがこれに「2GBまでのカードなら云々」
「SPIモードはCPRM使えないから問題ない」とか尾ひれが付いたりした文章も
散見されますがMMCとSDカードの歴史を掘ってみると以下の経緯で現在の概念に
変質していったと私は推測します。

MMC登場!SPI互換モードも搭載!MMCホストはロイヤリティ不要!
           ↓
MMCをネイティブモードで動作させる際はお金払って動かし方教えて
 もらう必要がある(2016年現在は「あった」)。
           ↓
だけどSPI互換モードについては当時すでに解析されたり一部情報公開
 されたりでホビイストにもMMCの動作方法が知れ渡っていった。
           ↓
い討錣韻MMCをSPI互換モードで動かすだけならお金の心配は不要!
           ↓
SDカード登場や!MMC互換のインターフェースやけどSDホストの開発時
 とかSDホスト採用した製品とか売るときはしっかり銭取るで!

           ↓
Δ押次SDって開発だけでも金取るのかYO…
 ぁ…一部のSDカードはMMCの初期化(CMD1による初期化)が通るやん…
 これはMMCカードとして動かしてるよSDカードじゃないアルよ(棒
 「MMCホスト上で"たまたま"SDカードが動いてしまった場合開発側はSDAに
  対してロイヤリティを払う責は無い

           ↓
MMCの初期化が通るSDカードはSDv1のカードのみで一般的に流通している
 のは当時2GBが上限だった(例外はあるが)。当然4GB以上のSDHC(SDv2)は
 CMD8による初期化必須なのでMMCとしての初期化は一切不可能。
           ↓
─弔修靴童什
  銑Г泙任了柄が伝言ゲーム形式でまぜこぜになり「全てはMMCとして
 の動作である」という大前提も忘れ「2GBまでのSDカードでSPIモードで動
 かすならばライセンス不要って聞いた」とか挙句の果てには「SPIモードなら
 ライセンス不要
はず」と勝手に危険な解釈しだす。

これはいけない。



2016年現在ではJEDEC(旧MMCA)にもMMCネイティブモードについての簡易資料が
公開されてます。
また、アマチュアでもMMCネイティブモードでMMCeMMCを動作
させた作例
なぞ沢山溢れかえっていますからSPI互換モードがとかネイティブモードが
とかは実際はあまり関係はなくMMCとしての動作、つまりCMD1によるカードの初期化
にてカードを動作させているか否かが本当は重要
なのです。
それをしっかり理解して情報を公開されているのはサンテック社の製品解説の
ページ
ChaN氏の解説です。

マイコンでSDカードを使いたければ筋を通すのであればSDAとNDAを結び、さらに
maker系イベントで製作物を販売したいのならHALAも結ぶ必要があります。
企業ならともかく一個人がSDA+HALAの3000USD(2016年現在)の大金を毎年
払うのは荷が重すぎますしSDA側も民事訴訟を仕掛けて利益を回収できるレベルの
悪質な例を除いては黙認している状態なのでしょうね(この辺の関係ってなんだか
同人誌みたいだ…おっと現在は同人ではないケースもあるから薄い本でしたっけ)。

話を戻してわれわれ一個人のホビイストとしてどうすべきかですがねむいさんと
しましてはChaN氏の解説にある「MMCまたは互換カード対応」をお題目とすることを
支持いたします。MMC以外の形状互換のメモリーカードを「MMC互換カード」と纏めて
看做す作戦です。SDカードもFlashAirも立派なMMC互換カードですからね☆

ここまで徹底する必要があるのかと問われそうですがあなたがweb上で成果を
発表したりmaker系イベント等で成果物を販売したいなんてときにSDカードの
ライセンスを盾に正義感をはき違えたハナクソ野郎に絡まrt
問題点を鋭く見つけ出し
追及することに余念がない方の目に止まり貴重な時間を浪費しないためにも論理的
防御策を講じておくのはとても重要なことです。

そのためには実際にMMCもしくはeMMCを動作させることができるのは必要条件です!
これだけはしっかりと行ってください。メーカー配布のライブラリ等ではMMCは最早
過去のものと断定されCMD1による初期化そのものがソースコード上から消去
されてやがるケースもありますので
復活させてあげましょう!作品を展示する際も
eMMCをかっこよく使いこなしているところを魅せると一目置かれるかもしれませんヨ!?
↑なんかすでに「SD対応じゃなくてMMC対応といっておけばいいらしい」と都合よく
 曲解してる者たちがいるようですが何度も言いますがその製作物上でMMCが実際に
 動作できなかったりCMD1による初期化ルーチンを記述していないソースを公開し
 ちゃったりしてる場合はそのエクスキューズが一切まかり通りません。
 結局嘘ついてることになりますのでSDカードを「MMCの例外的実装」と主張できる
 ようにするためにもCMD1にて初期化するMMCが実際に動作するコードは必ず記述
 しておきましょう。



…ぇ?もしかしてねむいさんがわざわざ昔のMMC変換基板付きのeMMC入手して
動かしたぜアピールしてた
のってまさか…ですって?
はいそのまさかです。
でもAndroid等のボードだとロイヤリティフリーなeMMCが花形ですし凝った使い方
しなければSDHC/SDXCとおんなじ使用感覚ですし使い方は覚えておいて損はないと
言い切ることができます!さぁ今日から皆さんもお題目を唱えましょう!
MMCまたは互換カード対応!

MMCまたは互換カード対応!

MMCまたは互換カード対応!

20170107追:
CMD1の初期化がどこまで通るか実際に試しました。
20170107追:


でもめんどくさいのでこのぶろぐでは普通に「SDカード」って書いちゃいます。
SDAの中の人に怒られたら書き換えます><



肝心な事言い忘れていましたがこれは皆さん存じてるかと思いますがSDやMMCAの
ロゴを各組織のライセンス契約を結ばずに勝手に成果物や展示物に使用した場合、
商標権を侵害したこととなり非親告罪の刑事罰の対象になります!!!
おふざけでやっても御用となるので絶対にやめましょう!!!!!!!


●74クロックの怪
MMC/SDカードは電源投入後、VDDが2.0V(VDDmin)を越えたら74クロック分カードに
クロックを送出し最初のコマンド(CMD0とか)を受け付ける準備をします。


(part1_500.pdfより)
SDSpecV5.00では電源立ち上がりの規定がさらに詳しく描かれていますのでこれを
参考にしてドライバを組むとどんなカードでも安定して動くと思います。

SDカード/MMCに供給するクロックは400kHz〜100kHzに設定してマイコンのSPI
 若しくはSDIOモジュールを有効にする。
 (SPIと違いSDIO/SDMMCの場合はこの時点ですぐにクロック垂れ流しになる)
▲ードに電源投入してカードの電圧がVDD(2.7~3.6V)に達してからさらに1mSec
 待ち、その後最低74クロック供給する。SDIOの場合はクロック垂れ流しなので
 最低74クロック分供給されるまで待つ。
SPIモードならCS(DAT3)をLOにしてCRC付きでCMD0送信してSPIモードに移行。
 SD/MMCネイティブモードならそのまま各カードの初期化へ

SD/MMCの規格には上記の際のデータラインの信号レベルはどうすべきかが明記
されていませんがSD/MMCはネイティブ/SPI互換に限らずスタートビットで始まり
ストップビットで終わるクロックに同期したビットストリームによって処理されて
いるデバイスである
ためビット列の同期を取るため(=スタートビット(LOレベル)を
ちゃんと受けるため)には無信号時はデータ線をHIに固定しておくべきです。

SDIOではコマンド投げてないときはHIレベルでありさらにCLK垂れ流しのため勝手に
74クロック分進んでビットの同期が取れてしまい問題は無いのですがSPIモードの
場合は明示的に74クロック(SPIは8bit単位なので実際は80クロック)送信する必要が
あり、その際のデータとして0xFFを送信してビット同期をとっておかないといけません。

で、説明が長くなりましたがこの74クロックをわざと省くとどうなるか、SPIモードで
SDカードを動作させているSTM32F4Discoveryで実験してみました。


↑80クロック送信してる行をコメントアウトしただけです。

まずは大昔のSDV1.10の256MBのMicroSDカード
 ->無事動作
 ・・・あれ?
お次はさらに超大昔のSDv1.0xの256MBのMiniSD
 ->余裕で動いた
  あれれ???
超最新の東芝Exceria並行輸入版MicroSDXC64GBの奴!!
 ->余裕で動いた
  ?????
Sandiskの金色の奴!!
 ->余 裕 で 動 い た
  ?????
じ、じゃぁMMCPlusの2GBの奴!
 ->余裕余裕♥
  は?(CV:スパーク・マンドリラー)
  んぁ〜すまんが〜ねむいさんが正しくてお前が間違ってるってことはぁ〜ないかぁ?
さすがにMMCv3の128MBの骨董品なら74クロック抜きじゃ初期化できないでしょ!!
 ->余裕のよっちゃん
  ・・・・
・さっきのMMCPlusの2GBは1.8V動作も出来るからこれなら絶対動かんでしょ!!
 
 ここでちょっと素敵デヴァイスの紹介です。
 今年春にヘル朝鮮製のSD->MicroSDの変換アダプタ買ってウボァーしました
 その後台湾製のちゃんとした作りのSD->MicroSD変換基板を購入しました。
 これは信号も安定していて安心して使えます♥カードに供給する電圧も
 1.8Vに切り替えられますし♥
 ->1.8Vでも正常動作♥
  ?????????????????????????????????????????


・・・・・・・・・・・・・・
わけがわかりませんよぅ・・・

・結論・
結構いい加減な初期化でも大抵のカードは動いた。STM32はこういう結果になり
ましたが他のマイコンやChaN氏の作例に沿ったコーディング以外では動かないかも
しれませんのしっかり規格を守って動かしましょうね!特にCLKを除く信号線の
外部プルアップは必ず施しましょう!



20161214追:
xilinxのサイトで今回のSDカードの74クロックについて言及しているページ
ありました。やはり電源が+3.3Vになりさえすれば74クロック放たなくても
実際は殆どのカードで余裕で動いてしまうようですね!

その一方でChaN氏からコメントいただきましたとおりねむいさんのSTM32F4向け
SPI互換モード版ではCMDを発行する前にビジーチェックする先行ビジーチェックの
方式をとっていますのでこれにより最低3バイト分のSPIクロックを空撃ちをする形と
なります。xilinxの見解と合わせるとこれだけでもう十分なクロックを放っている
と言えますね。

そしてFatFsとSTM32F4のSPIを結合するHALに相当する私のコードはChaN氏の
AVR向け実装例を源流としています。今回の検証でChaN氏のコードのロバスト性の
高さが判明し今更ながらChaN氏の偉大さがまた一つ確認された形となりました。

・・・サスガダァ♥


●UHSモードの識別とか
現在主流になった"UHS-1"モードは通電中にI/Oの電圧を1.8Vに遷移させ消費電力の
低減と電圧スイング幅が狭くなった事による速度の向上を図るモードです。
しかしながらSTM32ですらマイコン単体でI/O電位を3.3V->1.8Vに遷移できる機構を
持つ品種は存在しないのであんまし意味は有りませんがUHSに対応しているか否か
程度は判別できるので組み込んでみました。



具体的には初期化動作時、つまりACMD41送出の際の引数にS18Rビット(24ビット目)を
立てるだけです。対応していればOCRレジスタに24番目のビットが立った状態で
返事が返ってきます。


通常OCRレジスタが0xC0FF0800と読み出されるところでS18Rビットが有効だった場合
0xC1FF0800となります。UHS-IIをサポートしたカードだと28ビット目がたちます。
でもそういったカードが私の手に入るのはまだまだ先でしょうけども。

ついでに今月のいつものの更新でSPI互換モードで取得できるSDカードの情報を大幅に
強化しています。SDIO/SDMMCとほぼ同じレベルとなりました♥


それはさておきちょっと興味深い発見をしました。
殆どのカードはSDネイティブモードでもSPI互換モードでも読み出された値は同じに
なるのですがSandiskのカードだけはSPI互換モードの場合はS18Rビットを立てた
引数でACMD41を送出しても反応がありませんでした。
いくつか試しましたがUHS-I対応を謳うUltraやExtremeのカードは全てダメでした。
もちろんSDネイティブモードの時は問題ないです。

Drive size: 15523840 sectors
Erase block size: 8192 sectors
Default r/w block size: 512 bytes
Card type: SDv2(Block)
CSD:
00000000 40 0E 00 32 5B 59 00 00 3B 37 7F 80 0A 40 40 AF @..2[Y..;7...@@.
CID:
00000000 03 53 44 53 55 30 38 47 80 1B B8 C2 F6 00 C8 2F .SDSU08G......./

Parsing SD CID Register
Manufacturer ID :0x3
OEM/Application ID :SD
Product Name :SU08G
Product HwRev :8
Product SwRev :0
Serial Number :0x1BB8C2F6
DateCode.Month :8
DateCode.Year :2012

OCR:
00000000 C1 FF 80 00 ....
SD Status:
00000000 80 00 00 00 03 00 00 00 04 00 90 00 14 05 1A 00 ................
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
SCR:
00000000 02 35 80 03 00 00 00 00 .5......

Parsing SCR
SD Spec Version :2
SD Spec Version 3 :1
SD Spec Version 4 :0
SD Spec Version X :0
SD Security :3
SD Bus Width :5

SD_Spec V3.0x!
Detected as SDHC Card!
Available UHS-I Mode.

SDネイティブモードの時
Drive size: 15523840 sectors
Erase block size: 8192 sectors
Default r/w block size: 512 bytes
Card type: SDv2(Block)
CSD:
00000000 40 0E 00 32 5B 59 00 00 3B 37 7F 80 0A 40 40 AF @..2[Y..;7...@@.
CID:
00000000 03 53 44 53 55 30 38 47 80 1B B8 C2 F6 00 C8 2F .SDSU08G......./

Parsing SD CID Register
Manufacturer ID :0x3
OEM/Application ID :SD
Product Name :SU08G
Product HwRev :8
Product SwRev :0
Serial Number :0x1BB8C2F6
DateCode.Month :8
DateCode.Year :2012

OCR:
00000000 C0 FF 80 00 ....
SD Status:
00000000 00 00 00 00 03 00 00 00 04 00 90 00 14 05 1A 00 ................
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
SCR:
00000000 02 35 80 03 00 00 00 00 .5......

Parsing SCR
SD Spec Version :2
SD Spec Version 3 :1
SD Spec Version 4 :0
SD Spec Version X :0
SD Security :3
SD Bus Width :5

SD_Spec V3.0x!
Detected as SDHC Card!
Available NS(or HS) Mode Only.

SPI互換モードの時


そもそもSPI互換モードではUHSモードは一切サポートせずNS(MAX25MHz)どまりなので
反応しなくても実害はないのですけど。


SDカードは奥が深いですね。

Comments

Post a Comment








Go to top of page