2021年9月30日 星期四

STM32_USB_DIY(九)---MSDC 介面系列四:SCSI 命令應用-磁碟防寫保護

繼上一篇講到一般隨身碟的程式應用,之所以USB 系統上會用到MSDC ,無非就是

為了想藉由 FATFS 或簡單的檔案建立,來讓我們的應用系統跟電腦主機有個非常簡單

的資料傳輸。只要利用滑鼠輕輕點選作業系統裡的檔案管理員就可以達到目的了。

這樣子應用說是簡單, 但還是有一些風險的,舉個例子來說:我們在系統上可能就是

為了方便一些外掛檔案方便,譬如我們系統可能會用到一些字庫、圖片或影音資料等

供我們系統使用,因為像是開機畫面、文字顯示等,我們總不能全把這些純粹的資料檔

全塞進我們的程式碼,那檔案大小是很可怕的。那如果這些擺在FATFS 系統檔案,雖然

可以用檔案系統擺在我們外掛記憶體中時,可能會因為別人操作MSDC 時,可能會不小心

把你的檔案刪除;或是有一種系統應用可能是我們系統自己產生的一些記錄檔,我們藉由

FATFS 把它擺在外掛記憶體,然後透過USB MSDC,讓我們可以很方便的透過作業系統

的檔案管理員把它複製到電腦中整理查看,但一般人,可能就把我們這個小小的"隨身碟"

就當作一般大容量的隨身碟拿來隨便複製或破壞,進而影響干擾我們系統的FATFS 使用,

所以我們在這樣子的FATFS 檔案系統應用上,我們又想享受FATFS 與USB MSDC 的方便

性,卻又想保持我們系統獨立使用的專屬性時,那該怎麼辦:那就是最好是FATFS 檔案

系統,是我們系統可以讀寫,但透過USB MSDC 時,他就只有唯讀功能---只能看,不能

隨便刪除。我知道有人想到的方法就是把 USB MSDC 宣告成"光碟機",但你不覺得這樣子

當你這個 USB MSDC 看起來怪怪的嗎?


這樣子,你不是還要去K MSDC 中,關於光碟機的相關命令嗎?那為什麼就不能在一般

USB 隨身碟的SCSI 相關命令中做到呢?所以我這一篇就是要說明這樣子方法與做法。

---

先說明一下:我實驗用的平台,還是上回用來講解的平台


首先我們先來看:一般隨身碟插入電腦中可以操作的情形:


我們可以看到:我先在系統中自行產生一個小檔案:FatFsTest1.txt 文字檔。然後,

我們在系統的檔案管理員裡,就可以對它做刪除動作,這樣一來:我系統的檔案可能

就會誤砍掉(刪除)。那如果我的USB MSDC 可以做到唯讀的話呢?

所以我們就重新修改一下我們系統中,對於USB MSDC 的宣告與命令處理的話:

當我們重新更新韌體,然後再一次插入電腦中,再操作一次檔案管理員:


我們就可以發現:檔案管理員對我們系統中的檔案就沒有所謂的刪除選項了,

如果你不相信的話,那我們就直接對我們的USB MSDC 的隨身碟做格式化處理:


其實這個動作對我們系統就是一個非常嚴重的風險了,因為她不小心可能就毀了

我們系統的檔案結構了。


雖然我們的檔案系統只有小小的 1.74MB,如果你操作走到這裡還不回頭的話,

就有資料遺失的風險了,幸好我們在系統上做了保護措施:


看到沒有:螢幕出現所謂的"磁碟有防寫保護"...這樣子就可以完全保護到我們系統的

FATFS 檔案系統了。而在右邊你也可以看到我的韌體也是利用一個編譯選項來設定

我們的USB MSDC 有沒有"防寫保護"機制。這樣子系統維護不是很簡單嗎?

------

好了,功能演示講完了。我再簡單的帶一下這個功能是再SCSI 命令組裡怎麼完成的。

我在第一篇USB MSDC 文章中,有提到相關的技術參考文件:


這三篇就是最主要的參考標準文件,我們就先來看USB MSDC 的usbmass-ufi10.pdf 這一份

關於SCSI 命令的支持:


其中Mode Sense 就是拿來通知作業系統中的檔案管理員說:我們的檔案系統是有

磁碟防寫保護的:

這個 WP 就是 Write Protect。

當然啊,事情也不是你想像的那麼簡單,如果那麼簡單的話,那為什麼會有人想去研究

用光碟機的做法的呢?那肯定其中有鬼。為什麼?因為SCSI 命令組裡,關於 Mode Sense

還有另一個命令:0x1A ,完全沒有列在usbmass-ufi10.pdf 這份技術參考文件中,




你可以回頭再看一次:參考技術文件中的 Mode Sense 是:0x5A,而非 0x1A 。

你問我為什麼?我怎麼知道微軟在幹甚麼?人家就是老大啊。

你不信的話,我們就用USB 分析儀看一下:


我沒有騙你吧:它真的就是 0x1A 啊。微軟就是要玩你,要不然你要怎樣呢?

反正你就乖乖的把他補上吧,其他的就不用多說甚麼了啦。

---

好了。本單元講完了。

其實,既然微軟要玩這個 SCSI 命令組的遊戲,那好,我們大家就來玩吧。

反正SCSI 命令組一大串的,總有可以讓我們發揮的地方吧。你可以去查一下關於



我們可以發現:在後面的 0xC0 ~ 0xFF 是所謂的 vendor specific ,就是我們可以自由

發揮的地方,所以我們在技術上就可以利用這個漏洞,我們可以透過這些 vendor specific

command ,可以透過PC 的APP 應用軟體,對我們USB MSDC 裝置,來下達一些我們

自己專屬的命令,就像一般Custom HID 裝置一樣,譬如可以拿來傳自己的資料,拿來

讀資料、控制燈號,甚至拿來做我們系統IAP (In-Application Programming,或有人稱為

ISP, In-System Programming, 就是智能升級,韌體程式更新功能啦) 。那不是很好嗎?

你也不用傷腦筋的要不要在USB 裝置上在搞個甚麼 MSDC + ? 的composite Device了啦。

所以:下一個單元,我就帶大家來看怎麼完成這種 vendor specific command 來作為

我們USB MSDC 系統中專屬客製化的USB 通訊界面。

下回見。謝謝 (待續...)

4 則留言:

  1. mode sense 有分mode sense(6) = 0x1A跟mode sense(10) = 0x5A

    差別只是在參數長度。你可以查查SCSI Primary Commands,我是查SCSI Primary Commands - 3 rev23.pdf

    至於為什麼微軟沒照UFI做,我它是沿用一般的SCSI driver,所以就會有一堆沒在UFI裡面的命令。

    回覆刪除
    回覆
    1. 感謝你的留言補充。

      你所提供的 SCSI Primary Commands - 3 rev23.pdf, 是 2008 年版的。

      而USB MSDC 的這一份 usbmass-ufi10.pdf 是 1998 年版的。相差有十年。

      當然啊,我想 SCSI 出現的時間是更早了。但其實 USB 相關規範起草,

      微軟也一直都是重要成員,所以這些東西他應該也不是不知道的。結果就是如此。

      所以啦,有些東西還是都有它的歷史包袱的啦,只不過,像 USB 這樣子的系統應用

      就一直陪著我一路從職場領域裡的菜鳥,再到公司技術主管...產品開發創業。

      再到現在提供我一份老年不用再拼命地跟著技術潮流學一大堆新技術領域,

      還可以騙吃騙喝的過日子,其實也蠻不錯的。只能說:感謝老天爺的眷顧吧。

      所以真的,學東學西、拼命跟著潮流學新玩意兒...或是搞了一大堆,也都不知道

      怎麼轉換成對自己真正有實質價值的技術或產品東西。倒不如真的:好好地完整的

      搞好一個業界真正務實的需求。市場就是如此:有需求,就有其價值。

      ---搞了二、三十年的老工程師的感想啊。

      刪除
  2. 以前主管想要我做 MSDC+CDROM,目的是要用CDROM可以執行autorun,就能自動安裝驅動程式,想得很美好,研究起來好費力

    還好沒繼續執行下去。畢竟autorun遲早會被禁止的,太多病毒用這途徑安裝,後來微軟也封了這條路

    想想現在人也不知道autorun是甚麼東西,光碟機也漸漸退出流行了,更別提SCSI很多工程師不知道,我手上還有一張SCSI卡還自己覺得很炫...這時候老經驗只成為過去,留在歷史裡。

    MSDC 也不知道還能用幾年,畢竟資料寬度越來越大,這個架構效率會越來越低,成為限制。

    回覆刪除
    回覆
    1. CDROM 幾乎已經退出市場了,但帶我入門電子系統的師傅,就是搞CDROM 的伺服工程師。

      不過,他早早就已經賺了一波,早早在十幾年前就退休了。

      產品或技術總有一天都會被新技術、新產品取代的,但重點就是這樣子:有沒有趕快撈到?

      至於你所提的MSDC 還可以撐幾年?我認為以 USB 的東西, 真的太普及了。

      可能在有些系統應用上會有所限制,但幾年內應該還不至於很快消失,

      尤其對有些還是應用小系統來說:還是夠用的,就像USB 2.0 的東西,還是有很多

      下載小工具,或是一些開發平台工具都還是很多的,所以我認為微軟不會把它拿掉的,

      頂多就是增加一些額外的支持來支援比較高階快速的應用吧。

      (你知道嗎:微軟的USB 驅動程式還是教你使用USB Full Speed 的東西呢!)

      不過呢?還是老話一句:好啦,就算有朝一日還是會被淘汰的,但那一天,我可能已經

      完全不碰這些東西了...幾歲了啦?

      我都還在想:過了十年,我都已經六十幾歲了...我的人生歲月應該已經與現在完全不同了吧。

      對不對啊?

      刪除