FileSystem, FAT, FatFs, SD-Card,
バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
SDカードのCQ Modeの読み書き以外のコマンドたちの話。
今回は消去系コマンド群こと
CMD32(ERASE_WR_BLK_START)、CMD33(ERASE_WR_BLK_END)、CMD38(ERASE)
について。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
CQ Modeのステートマシンと読み書き以外のコマンド
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
今回は消去系コマンド群こと
CMD32(ERASE_WR_BLK_START)、CMD33(ERASE_WR_BLK_END)、CMD38(ERASE)
について。
CQ Modeのステートマシン図は以下。
![CQ Modeのステートマシン(State Diagram in CQ Mode)、CMD49(WRITE_EXTR_SINGLE) Enable CQ=1、CMD49(WRITE_EXTR_SINGLE) Enable CQ=0、CMD12(STOP_TRANSMISSION),CMD13(SEND_STATUS),CMD32(ERASE_WR_BLK_ADDR),CMD33(ERASE_WR_BLK_END_ADDR)、CMD44(Q_TASK_INFO_A),CMD45(Q_TASK_INFO_B)、Read:CMD19(SEND_TUNING_BLOCK),CMD46(Q_RD_TASK),CMD48(READ_EXTR_SINGLE),CMD58(READ_EXTR_MULTI)、Write:CMD47(Q_WR_TASK),CMD49(WRITE_EXTR_SINGLE),CMD59(WRITE_EXTR_MULTI)、CMD38(ERASE),CMD43(Q_MANAGEMENT)、End of R1b,End of Data Transfer、CMD12(STOP_TRANSMISSION),CMD13(SEND_STATUS)、CMD44(Q_TASK_INFO_A),CMD45(Q_TASK_INFO_B)、CQ Disable、CQ Tran、CQ Enabled](https://www.simulationroom999.com/blog/wp-content/uploads/2021/03/02_CQ-ModeのステートマシンState-Diagram-in-CQ-Mode-1024x707.png)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
そして、CQ Modeの読み書き以外のコマンドたち。
- CMD19(SEND_TUNING_BLOCK)
- CMD32(ERASE_WR_BLK_START) ← これ
- CMD33(ERASE_WR_BLK_END) ← これ
- CMD38(ERASE) ← これ
- CMD43(Q_MANAGEMENT)
消去系コマンド
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
マニアックなCMD19(SEND_TUNING_BLOCK)が終わったから、
次はCMD32(ERASE_WR_BLK_START)かな?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
まぁそうなんだけど、
実際のところ、消去系コマンドといことで、
CMD32(ERASE_WR_BLK_START)、
CMD33(ERASE_WR_BLK_END)、
CMD38(ERASE)
の3つで1セットなところがあるんだよねー。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
確かにそんな気がする。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
雰囲気としては
- CMD32(ERASE_WR_BLK_START)で消去ブロック開始アドレスを指定
- CMD33(ERASE_WR_BLK_END)で消去ブロック終了アドレスを指定
- CMD38(ERASE)で実際の消去を実行
って感じかな。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
そのイメージでOKだ。
消去系コマンドの存在理由
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
でも、SDカードって読むか書くかで、
消去の話って今まで出てこなかったよね?
消去処理っているの?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
まぁ汎用的に使う分には消去は要らないし、
消去しなくても書くときにSDカード内部で消去してるんで、基本問題にならない。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
ということはいらない?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
使わなくてもSDカードとしては使えるが、
スループットを最大化するという目的が入ってくると事情が変わる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
あ、そっか。
SDカードの内部はNAND-FlashRomだから、
事前に消去するところと範囲を指定してあげると、
書き込み指示をする前に消去を開始してもらえるから、
実際の書き込み時には高速に書ける。
ってことか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
ご明察。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
だったら、通常の読み書きの時もバンバン使えば良いのか。
消去系コマンドを使用する条件
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
うーん、実はそういうわけにも行かないんだよねー。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
というと?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
これらのコマンドが使えるのがCQモードが有効な時のみなんだよねー。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」10アップ.png)
なんでそんなことに・・・。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
恐らく想定利用手順が以下になっているのだと思う。
- CQモード有効
- CMD44(Q_TASK_INFO_A),CMD45(Q_TASK_INFO_B)で書き込みTaskをCommandQueueに“複数”登録
- “複数”のERASE実施
- CMD47(Q_WR_TASK)で“複数”書き込み実施
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
通常の書き込みの場合、
単発で書くだけなので、SDカード側でそのタイミングで消去すればOK。
よって、改めて消去コマンドを発行する意味はあまりないかもねー。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
そっか!
CommandQueueで先に書き込みの予約ができるのから、
一気にいろんなところを更新できる兼ね合いで、
事前に消去した方がスループットが上がり易いってことか!
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
とりあえず、大雑把な話としては以上だ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
(ということは次回から細けぇ話になるのか・・。)
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- 消去系コマンドの説明。
- CMD32(ERASE_WR_BLK_START)。
- CMD33(ERASE_WR_BLK_END)。
- CMD38(ERASE)。
- 消去系コマンドはCQモード時のみ使用可能。
- CommandQueueと連携することで効果が得られるためと思われる。
バックナンバーはこちら。
コメント