2021年9月6日 星期一

STM32_USB_DIY(八)---MSDC 介面系列三:Device Description

關於USB 裝置來說:有一個標準 Class 宣告是不用寫PC (Host) 驅動程式,

也有現成的APP 軟體可以用,那就是 MSDC。當USB MSDC 裝置插入

PC (Host ) 時,Windows 作業系統就會以檔案管理員來處理了這個USB 裝置。

當然啊,如果單純以 MSDC 裝置來說:就是彷彿類似是一支隨身碟裝置而已。

但如果以MCU 系統應用來說:搞一個 MSDC 的目的,大概就是有檔案傳輸

的應用需求,要不然用一顆MCU 來做隨身碟的產品,在市場上是絕對打不過

那些甚麼隨身碟/讀卡機 專用ASIC 的啦。但如果MCU 系統既然都已經搞一個

在USB 介面上,可以連接PC 時,是不是除了搞個隨身碟功能之外,還可以幫

我們MCU 系統應用增加一些額外的功能呢?這個就是我這一MSDC 介面系列

要講的東西。

但一般人如果聽到一個標準的USB 要搞兩個功能介面,第一個想到的就是所謂

Composite device。最常見的東西就是滑鼠與鍵盤兩者合一功能的東西。

當然啊,一般MCU 原廠也會提供其他 Composite Device 應用範例,但說真的

只要 USB Device 裝置介面宣告越複雜,系統程式就比較複雜,而系統兼容性

問題也會比較多。所以啦,如果可以的話,有些系統應用若能以簡單單一的

裝置宣告 (Device Description) 可以做得到多項功能的話,那就以簡單單一的

裝置宣告來做就好了,搞系統不是要凸顯自己技術多高超,而是簡單容易

維護的東西是最好,不要把自己搞得灰頭土臉的。所以這也是我要講這一項

MSDC 的部分。但這一篇還不會涉及這一部分,我此一部分先交代一下

USB MSDC 的宣告與PC (Host)  之間的關係。

這些東西在網路上都應該很容易搜尋到相關原始碼,及相關範例程式,

只需要你找個平台,三兩下就可以架設與驗證功能了。我只不過再幫大家

整理一下罷了。


這是我的示範硬體平台。他的電路圖在網路上也有

我只是在外面在外掛一顆 Winbond 的 W25Q16 (16Mbit/2MByte) 的Serial Flash

當我們MSDC 的儲存裝置。至於標準的函數庫呢?


我用的是原廠提供的標準函數:可以從左邊可以看到是:StdLib361 ,3.61 版。

至於USB 標準函數庫呢?是 USBLib410 , 4.10 版。這些都可以從網路上或

官方網站下載的。至於那個FATFS 函數庫,上回我不是提到搞 USB MSDC

用不到的嗎?



那為什麼,還要這個標準函數呢?等一下解說時,你就知道了。
----
當你把這些原廠或在網路上找到的參考原始碼架起來之後,當USB MSDC 裝置

插入電腦之後。(至於這些逐一如何完成的步驟,我就不講了,網路上一堆,

而且這也是你自己要下功夫的地方。)。 你就可以在電腦上看到這些資訊了:



裝置管理員裡有所謂的新增一台磁碟機,而在E 槽有個 TEST UDISK。(不是

每一台都會掛在E槽的。以你自己的電腦裝置而定)。而E 槽的容量大小。

這邊為什麼會出現 < 2MB ,一來 FAT Table 會用掉一些,另外我自己本身也保留

了兩塊 Sector 供我們系統使用。(就是一開始的 Partition 的設定啦。)

而這些顯示的裝置資訊到底是來自於我們系統的那些宣告設定呢?

首先就是在往上圖中 的 4 。(usb_desc.c)  程式中的USB Device Description。


我們的USB 裝置的 VID/PID 及相關的 String Descriptions。
 


這個可以點選裝置管理員內相對磁碟機的內容查看。要不然也可以從另一個

Regedit (登錄編輯成是)指令來查:


其中右邊就可以看到我們宣告的裝置版本:REV 0200,這個也是我們提供給

PC 系統的。至於那個裝置序號:UDISK80000001。你也可以在系統應用上

用滾動碼(Rolling Code) 來自動產生,據我所知:有些USB 系統工程師很懶。

產品從頭到尾都只有單一個裝置序號而已,這個會產生甚麼問題?

很簡單:萬一有你們家的兩個產品同時插在同一台電腦時,作業系統會搞不清楚

哪一台?是哪一台?因為兩台的宣告一模一樣啊。如果你還有如我這一系列要

講的內容來說:那肯定就會碰到系統應用上的大問題的啦。
---
好了,接下來呢?

你沒有發現:在裝置管理員裡的那個 ChamberPlus_TEST_UDISK 字串並沒有在

usb_desc.c 的檔案內?是的,這個字串是在另一個MSDC 專屬的宣告內,

在那個 scsi_data.c 檔案內的:



神奇吧。

那至於那個在 E 槽前面的磁碟機名字又在哪裡宣告呢?

這個就回到我一開始說的:明明 USB MSDC 不需要 FATFS ,那為什麼我的

範例程式裡有呢?因為這個磁碟機名稱就是由這個FATFS 在 Format 時產生的啦。


當然啊,你也可以不用這樣子,PC 作業系統也會自動給你一個非常中性的名字,

就是我們一般常看到的:"USB 磁碟機"。只是我們搞系統應用的,就是喜歡搞

個與眾不同的東西罷了。



---
好了,我已經簡單的交代完,在USB MSDC 的應用裡,我們在USB 裝置的韌體

程式裡如何宣告我們的裝置相關字串名稱,他又如何顯示在PC 作業系統裡的?

這樣子看起來不覺得很有成就感嗎?一副好像微軟的Windows 作業系統似乎也

會乖乖地聽你的話嗎?哈~哈~

其實這些東西都是很簡單的基本功而已,我也只不過幫你整理說明一下而已。

也可以幫忙一些剛入門,又有些時候一下子忘了這些東西是躲在哪裡?

雖然我是用 stm32 平台驗證測試,但因為USB 裝置都是標準規範,所以在不同

的MCU 平台都可以通用的。下次如果碰到這樣的問題或需求時,你就可以很快

找到程式修改位置及將你所需要的內容修改一下就可以了。

謝謝。下回見。

(待續)

 

沒有留言:

張貼留言