2021年10月10日 星期日

STM32_USB_DIY(十)---MSDC 介面系列五:SCSI Vendor 命令應用

上一篇MSDC 介面系列文章,有提到關於 SCSI 命令組的使用說明。

現在我們就來說如何利用SCSI 命令組裡的 Vendor Command 來幫我們的

USB MSDC 裝置,完成一些屬於我們系統客製化的功能,這些功能可以有效

的協助我們系統在一些後台使用條件下,達到系統開發除錯或是產品量產工具。

有些時候,產品的技術開發固然重要,但有時候,開發的系統要如何完成產品

的生產或功能維護,也是一個成功產品的重要因素,而這些相關技術其實在許多

網路搜尋或在市場產品的使用說明裡,其實都不容易觀察或了解,這些都是牽涉到

這些產品在開發過程中,系統工程師對於產品開發的許多寶貴的經驗。這些才是許多

"傳子不傳賢"的內門功夫啊。要不然啊,你看市面上那麼多產品,在技術上坦白講都

不難啊,但要你真正的把產品導入量產與後續的市場客戶服務與技術支援,這才是考驗

著你產品成功失敗之關鍵啊。(用技術搞一兩個產品,打樣貼貼文,誰不會啊!)

好吧。我們首先先看一下關於SCSI Command 命令組的內容:


在0xC0 之後,SCSI 規格就沒有硬性規定了,這就屬於大家所能發揮的地方。

這些東西也不是我發現的,我也沒那麼厲害啦,其實你不要以為在園區大公司有甚麼不好的。

我一直強調園區的這些大公司是人才濟濟,技術資源豐沛,你不要以為人家沒有拿出來講,

就你以為你最厲害了?我當然知道在搞USB 隨身碟裡,有些公司有一些特別的技術作法,

所以有一天我有這個需求時,我就 Call 我園區的老同事:


---

你看,我們問問題,是多麼切重點的問,而不是天馬行空的大哉問,有很多東西都需要

自己先做功課的,這樣子問人家,人家才會很熱心地幫助你,找人家問問題,可不能造成

別人很大的困擾啊,因為人家沒有那個必要要花很多時間陪你找問題啊,當然這也是我們

平常待人也很誠懇啊。所以關於上層 Host (PC 端)的APP  軟體的問題釐清之後,我們就

可以先進行USB 裝置端的韌體開發工作了,關於 Host 軟體端的說明,我們稍後再補充 

說明了。

首先就是關於 USB MSDC 的介面程式,因為USB MSDC 是走 BOT (Bulk Only Transfer),

所以在USB 的韌體上就只有:Mass Storage In (Bulk-In) 及 Mass Storage Out (Bulk-out):

這是關於 Mass Storage In (Bulk-In),我們在原來的標準的 SCSI_READ10 命令外,

再增加一組 SCSI_VENDOR_IAPREAD10 命令支持。


同理:關於 Mass Storage Out (Bulk-Out),我們在原來的標準的 SCSI_WRITE10 命令外,

再增加一組 SCSI_VENDOR_IAPWRITE10 命令支持。


不過:這兩個 SCSI Vendor Command 是屬於我們後要提到的,我們用來作為我們系統

智能升級(韌體更新)的韌體程式下載驗證讀取之用的,而一般簡單Vendor Command 小命令

就直接在一般USB UFI  介面裡解碼 SCSI 命令就可以了:


因為一般USB MSDC 中的 SCSI Read10/Write10  的傳輸量都是以FATFS 的一個 Sector 

(4096 Bytes) 單位來傳輸的,有些Vendor Command 真的不需要這麼長的命令內容,

而我們做韌體程式的更新,就可以還是需要以 4096 Bytes 的資料量來更新,速度比較快。

至於為什麼 Mass Storage In (Bulk-In)/Mass Storage Out (Bulk-Out) 中的程式略微不同?

那是因為Read/Write 的USB 傳輸韌體準備工作先後順序不同。

當你上層完成這些命令的基本支持之後,底下的那些 Vendor Command 就跟一般 USB UFI 

命令組的副程式就差不多了,譬如那些甚麼SCSI_TEST_UNIT_READY/SCSI_INQUIRY等

都是一樣的,只要依樣畫葫蘆就可以了。所以韌體修改就比較簡單多了。

而搞這些系統最麻煩的還是在於上層的 PC 應用程式了啦。你可能認為:我只要寫韌體,

那些搞APP 應用軟體就不關我的事了,那我也沒意見。反正對我來說:我都是提供

"一站購足"的技術服務,也就造就我目前年紀一大把,而可以在系統應用市場存活的原因。

關於上述我老同事所提供SCSI 軟體的網路資料連結如下:

人家聰明的人,都認為你只要看這個內容,你應該就會懂了。所以我才說:園區的科技

公司真的人才濟濟,聰明才智或搞技術絕對不是你一般所能理解的那般而已。

你也不要以為人家回答問題的態度怎麼會是如此呢?因為他們就都是如此啊。

所以我們也只好硬是給他吞下來的把功能搞出來:在一般PC 軟體程式就是這麼簡單:


(為什麼不貼程式碼就好了呢?一來:在部落格哩,我真的也不知道怎麼貼成一個

獨立程式碼小視窗,二來,我也想跟你說:我PC 的C 語言的開發環境是甚麼?

代表我沒有呼嚨你啊。)

你可以先用一般SCSI  標準命令先玩玩。做做實驗,測試一下軟體功能。然後可以往下

進行相關應用軟體開發了,最後我們的應用軟體介面如下說明:


從上圖我們的應用軟體可以看到:我們可以正確讀取我們隨身碟 UDisk 的相關資訊,

包括:USB PID/VID 及 Serial Number。而圖片中右上方橙色所示,就是我們USB 裝置的硬體

與韌體版本號碼,其實這裝置兩個版本序號,就是透過一般 SCSI Vendor Command 所讀取的,

因為一般USB MSDC 中的 UFI 或相關 SCSI 命令也都沒有支援這樣子的介面功能。

接下來就是一個簡單的示範演示影片,我們就是利用SCSI Vendor Command 幫我們調整

我們STM32 系統中RTC (Real-time clock) 時鐘時間。這個實際系統應用上,會常常碰到的。

因為一般系統裝置的 RTC 時間並不一定可以跑得很準,但如果當我們的系統透過 USB 與

PC 系統連結之後,我們就可以利用PC 系統時間,進行時間同步調整對時了。


這是一個很簡單的系統操作,但對於許多產品最後生產來說,也都蠻方便的。


 基本上,就是很簡單:系統一開機,其實時間是不對的。但我們只要利用我們應用軟體,

透過SCSI Vendor Command 命令組,就可以達到系統時間的同步與對時了。

像這種命令長度其實不用很長,我們就可以用一個比較簡單的SCSI Vendor Command

就可以完成了。我們就以USB 分析儀內容來解說:


我們只要下一個簡單的 SCSI Vendor Command : Set RTC,只要 64 Bytes 就夠了。

然後,再利用另一個 SCSI Vendor Command: Read RTC 來確保RTC 調整正確。

只是因為USB 的命令傳輸都非常快速,當然PC 速度也很快,而實際上USB 裝置韌體的

執行時間沒有那麼快,所以當我們馬上 Read RTC 時,系統會回復 Command Busy。

這部分也是我們USB 裝置(STM32 系統)所提供的,這也是我們在寫USB 程式時,需要

建立的基本觀念:

當我們完成我們的 SCSI Vendor Command 之後,作業系統的USB MSDC 就會馬上重新接手

一般隨身碟的SCSI 標準命令了。

這個就是一般我們拿 SCSI Vendor Command 來完成我們 USB MSDC 系統專屬命令功能。
---------------------------------
那到了這時候:你就會想說:那我是不是也可以利用這樣子的命令介面來進行我們

USB 系統裝置的智能升級(韌體更新) 啊?答案是:當然可以啊。

所以我們是先把我們 stm32 系統切成 Bootloader 跟一般系統應用程式兩塊:而這兩塊

韌體程式都支援 USB MSDC。然後就可以利用 SCSI Vendor Command,來進行韌體更新

工作了,我們一般俗稱: IAP (In-Application Programming),這是ST 官方說法,而我們

一般也稱為 ISP (In-system Programming)。道理都是一樣的啦。

USB 連線之後,首先就是讓系統利用SCSI Vendor Command 切回 Bootloader 模式,

然後再進行 IAP/ISP 工作,然後系統也會重新 Reset 回到最新版本的韌體程式。

這過程中:系統也會進行自動的USB 裝置插拔。不用動手進行USB 任何硬體操作。

演示影片如下:不過,這個系統有一部分是屬於客人的產品私人資訊,我就稍微

做了一些遮掩。當然啊,這個應用程式,你在一般市售產品上也看不到的啦。

因為它屬於公司內部與工廠生產之用的治具軟體。


怎樣,你有沒有覺得很方便,速度也很快,順便提醒一下:這棵STM32 是 256 KBytes

Flash 容量的,跟我們上面所使用的 stm32 blue pill (128 KBytes) 是不同的。

因為一般 USB MSDC 的標準 Read/Write 是以 4096 Bytes 傳輸,速度已經夠快了。

以下就是一般  Read10 (UFI  中的 SCSI command :0x28)


一路跑到:

從Packet # 1025~ 1364。約  240 Packet,但其中還包括了一些 NAK /SOF 等地Token 內容:


所以大概就是 1365-1024= 241, 再除以 3 左右,約 80, 其實就是 64Bytes 傳了 64 次。

就是 4096 Bytes。這個速度真的很快了啦,這還包括 Erase/Write/Verify 呢。

我想這應該是我以前搞過MCU 開發工具,所以搞這些對我來說:還算有點經驗啦。

其實這種程式最難的還是在於你要了解一般MCU 的HEX/Binary 檔案格式而已。

不過,這些都是一些讀書工作而已。

所以才跟你說:搞這些技術真的都不難啦。
----
------------------------ 

結語: 

好了,關於 USB MSDC 的一般應用,我就先講到這裡了,因為像這一種標準的USB

Class 介面,其實我們在系統上可以自由發揮的部分真的非常有限的,像我們這一系列

關於 USB MSDC 文章,能在這樣子的USB Class 標準介面下,進行建置這麼多屬於

我們系統開發專屬的應用開發工作,誠屬不易了。

當然,這幾個簡單的示範說明,也只是冰山一角而已,最主要的應用還是得看你們自己

實際應用時,所需要的那些工作,譬如像I/O 或系統量產或後續客戶技術支援等所需的

系統工作而定。系統開發工作永遠有做不完的事。

但最重要的還是:不是天馬行空的,今天東搞一個、明天再搞一個。搞這些技術的表面

功夫都很容易,但你自己要如何真的扎實完整的建置這一套系統,那就可不是蜻蜓點水式

玩票性質了,就像我自己:USB 基礎功力就不用說了,但我自己曾經待過園區IC 設計公司,

也參與過新MCU 系統開發平台的,有些看起來稀疏平常,信手捻來的程式或系統示範演練

對我來說:也都曾經下過許多實際功夫的。雖然不一定都可以馬上跟時下最新流行的

科技技術相媲美,但也都不失一個既實際又實用的技術底子。

當然也沒有說:這樣的功夫有甚麼值得炫耀的,只是一個經驗分享說:當有一天你搞過

那麼多技術開發,參與過那麼多產品研究... 到了最後,到底留下了甚麼?

我就努力把這些經驗給記錄下來,也分享給有機會碰到這些問題的朋友們。

USB MSDC 系列先告一段落,下回我還用其他USB 相關技術內容分享給各位。

敬啟期待。(待續)


沒有留言:

張貼留言