2019年9月24日 星期二

Hinet 網頁系列 --- USB DIY 系列 (一) USB Q&A (一)

(補充說明:我在寫系列文章時,我大多著墨於 Bulk Transfer 的傳輸模式,

其實我後來也很少用 Bulk Transfer ,比較常用HID ,是屬於高速的HID,但有些觀念

還是適用的。當然啊~越要求效能,對於規格與基礎理論架構要更清楚,才能展現效能的,

這一點是無庸置疑的!!)

標題:請教移除USB裝置 ? -- 軟體與韌體的互動 !!


Q: 我想在程式上加移除USB裝置,我就不需要去右下角點選移除,
請問哪裡有資料可查?或是有哪位大哥可提供相關的function?

A:其實,我們在視窗的右下角點選移除的動作,就是下了一個 Suspend命令而已罷了

~就是希望您的Device 進入比較弱電狀態~

        然後去拔USB Device ,會較安全。至於,AP要怎麼下SUSPEND 我就不清楚了。

當然,您也可以用 Vendor Command 下一個 Suspend Command 給您的Device ~ 

但如何讓OS 收到這個訊息就不知道了。您還有更狠的作法:下一個Vendor Command 

給您的Device 叫他拔除! 怎麼作?!Device 端如何控制?在我的網站說明中有提過:

就是將D+ 那根 Pull-high 放開~再拉一下不就好了嗎?!簡單吧!有時軟體想破頭,

還不如系統作一下更快~哈~哈~ 我們是寫韌體不是寫軟體的!哈~哈~



Q:其實您說的就是斷電的作法,但是視窗會出現拔除的訊息,
我的目的就是不要看到這個訊息,直接跳過去?

A:簡單的回覆如下:

    1. 聲明一下:我所說方法不是斷電~只是把D+放開~就是RESET 狀態!

    2. 我當然也知道您是不想看到那個訊息,但是您要如何通知OS呢?!

我也真的不知道,我想,除非您去查微軟公司的相關技術文件吧~但是我的直覺是,

像這種東西是牽涉到他OS底層的東西,微軟不一定會公布,而且我是覺得您也不要

嘗試去『騙』他,否則,後續維護工作包您作不完。

    3. 這種問題就譬如好像我開發一個USB DRIVER,但又不想作WHQL ,卻不想看到

微軟那的警告視窗?!您覺得微軟會讓您有機會成功嗎?!那他WHQL 賺什麼?!

    4. 您應該回頭想:您為什麼要在AP中去做USB 裝置移除的動作?!原因是什麼?!

只是不想去點選作左下角?既然點選左下角是作業系統直接下命令給底層的

USB 驅動程式(這個也是微軟的),他已經把您作得很好了~

您又何必在程式中多此一舉,卻又想跟作業系統搶這份工作呢?!

或是您只是作一個軟插拔功能來解掉您USB Device 韌體的問題呢?!

那您應該是好好去看看USB DEVICE端的真正的問題。

(我猜的啦:因為以前我們軟體工程師,都很憨直,明明USB DEVICE韌體有問題,

又不敢提~發現每次RESET 好像可以解問題,就自作主張想下RESET ~

結果問題一直沒解~是不是這樣?!

我猜的~真的不要這樣解~對USB的東西不要這樣解!!就好像您說了第一謊之後,

您就要用更多謊來圓這個謊~
------------------------------------------------------------------------------------------------------------------------------------------------
        好啦~這篇Q&A我要道出以前我們大部分作USB產品場碰到的問題:

韌體與軟體之間的協調問題。說真的,一個真正能拿到台面上的USB產品,

幾乎都需要PC 端軟體工程師,再加USB DEVICE端的韌體工程師,

當然啊~您們若是作USB IC的公司的話,還得再加上IC設計工程師。

 有時作技術不難,最難的就是溝通,然溝通最難就是語言不通,很不幸的是:

寫軟體跟寫韌體就是語言不通。尤其是寫軟體DRIVER的,更是難以理解,

連他們自己跟作業系統之間的理解也很難。

        USB 傳輸的最大特色是什麼?!說真的,您若是作HID這種低速裝置,

您可能很難理解這個特色,就是主從之間傳輸的協定,因為在低速裝置中,

走的是 Interrupt Token ,他基本上是Polling 方式,而且是以Device 端自己宣告方式

來定義Polling 時間間距及資料長度通常不大的。但對於其他傳輸方式來說,

就未必了,什麼時候HOST要資料?一次又要多少?可能都不一定,

這都得在啟動傳輸協定前就得定義清楚!!

否則,一旦啟動了,在PC端的 Driver 的IRQ 就『不到黃河心不死』!

您的軟體應用程式就當場枯等在哪!!我們當然不能說是當機,

因為底層的DRIVER 真的收不到資料或資料發不出去啊?!

那怕您一次要了 100 MBytes 資料,他卻只收 99.9999% 的資料,

底層的Driver 還是不會把控制權交還給您的應用程式。

好了,這時候,就算這是那麼一個 Bytes ,您就很難捉問題了。

尤其是作BULK傳輸的,資料是完全掉不得的。

        此時,看見寫韌體與寫軟體的爭執點了:

寫軟體應用的軟體工程師說:我真的收不到底層DRIVER 的回覆?!

而寫傳資料的韌體工程師卻說:我一切都照暫存器規劃啊~我哪知道?!

資料似乎人間蒸發般

此時,有一個最大的替死鬼出現了:微軟的作業系統!!大家都開始罵!

罵得很爽,但問題還沒解啊?!(此時,作IC的可能在旁邊偷偷的在笑~~)

因為寫軟體的哪會幫您看USB裝置的暫存器啊?!更不說,寫韌體哪看得懂軟體

那些PC程式啊!

        其實,這部分的解法,我本來要在下篇談到有關USB 傳輸的文章中,

以範例教大家如何釐清問題,但在此我先說明一些觀念問題,

這一切首先要講求的是:態度問題。都必須尊重對方的專業知識

但人非聖賢,人能無過無錯呢?!我在此說我自己的經驗法則:

雙方都只能描述現象,不可妄下結論!』,因為我們是民主社會,

誰也沒資格給對方安一個怎麼樣的罪名。

所以,以前在還沒確認資料傳輸的路徑已經正確無誤之前,不要劈里啪啦傳

一大堆資料,連要DEBUG都很難,最好是一些固定的資料格式,

譬如說:0x00, 0x01, 0x02 ...依序下去,萬一中間掉了什麼資料,很快的看出問題點。

        另外,就是要知道USB Device 一般傳輸的設計機制是:靠硬體幫您擋住所有的

資料傳輸的 Handshake!等一切資料或儲存BUFFER準備就妥,才把傳輸機制啟動。

有點像水庫閘門一樣,一旦閘門一開,其實您的韌體的工作就使不上力了。

皆下來就等另一個硬體的通知(向中斷訊號),相對的,在軟體這邊,

一次要多少資料,一定要透過命令方式事先通知韌體,這一點是很重要的 

這是一些傳統的RS232 ,您愛收不收都隨您,USB 可不行,因為USB 是資料串接的,

整個BUS上可不只有您的資料而已(譬如您是透過USB HUB,有些傳輸封包可能

是要傳給USB HUB而不是您USB裝置)。

至於,細節的作法,我會在一篇USB 資料傳輸的文章中,用實際範例來說明。

在此先說明到此。

        最後,針對這個問題,我還是強調一點,無論是作工程獲解決問題,

態度真的很重要,我說過:

硬體的問題,韌體解;韌體的問題,軟體解;軟體的問題,業務解;

業務的問題,老闆去解

但是您若是一位有擔當的工程師,您就不應該把問題留給別人解,否則,

除了工程問題難解外,您的名聲也很難解喔!

您覺得您老闆會用什麼方法解決您的問題啊?!

我舉一個我以前同事講的一句話來送給大家:

只要我XXX出門解決不了的問題,那鐵定是IC有問題

帥啊~有夠擔當的~也是出了名的機車。

我想這可以列為系統工程師的十大名言之一啊!您有這樣的信心與勇氣嗎?!

沒有留言:

張貼留言