上一篇MSDC 介面系列文章,有提到關於 SCSI 命令組的使用說明。
現在我們就來說如何利用SCSI 命令組裡的 Vendor Command 來幫我們的
USB MSDC 裝置,完成一些屬於我們系統客製化的功能,這些功能可以有效
的協助我們系統在一些後台使用條件下,達到系統開發除錯或是產品量產工具。
有些時候,產品的技術開發固然重要,但有時候,開發的系統要如何完成產品
的生產或功能維護,也是一個成功產品的重要因素,而這些相關技術其實在許多
網路搜尋或在市場產品的使用說明裡,其實都不容易觀察或了解,這些都是牽涉到
這些產品在開發過程中,系統工程師對於產品開發的許多寶貴的經驗。這些才是許多
"傳子不傳賢"的內門功夫啊。要不然啊,你看市面上那麼多產品,在技術上坦白講都
不難啊,但要你真正的把產品導入量產與後續的市場客戶服務與技術支援,這才是考驗
著你產品成功失敗之關鍵啊。(用技術搞一兩個產品,打樣貼貼文,誰不會啊!)
好吧。我們首先先看一下關於SCSI Command 命令組的內容:
這些東西也不是我發現的,我也沒那麼厲害啦,其實你不要以為在園區大公司有甚麼不好的。
我一直強調園區的這些大公司是人才濟濟,技術資源豐沛,你不要以為人家沒有拿出來講,
就你以為你最厲害了?我當然知道在搞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 標準命令先玩玩。做做實驗,測試一下軟體功能。然後可以往下
進行相關應用軟體開發了,最後我們的應用軟體介面如下說明:
包括:USB PID/VID 及 Serial Number。而圖片中右上方橙色所示,就是我們USB 裝置的硬體
與韌體版本號碼,其實這裝置兩個版本序號,就是透過一般 SCSI Vendor Command 所讀取的,
因為一般USB MSDC 中的 UFI 或相關 SCSI 命令也都沒有支援這樣子的介面功能。
當我們完成我們的 SCSI Vendor Command 之後,作業系統的USB MSDC 就會馬上重新接手
接下來就是一個簡單的示範演示影片,我們就是利用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 標準命令了。
這個就是一般我們拿 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)
一路跑到:
所以大概就是 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 相關技術內容分享給各位。
敬啟期待。(待續)
沒有留言:
張貼留言