2007年11月27日 星期二

USB韌體解析-2

HID裝置

有時我們去郵局辦事會遇到一些保險業務拿些資料讓我們填,有的人還會誤認他們是郵局的人,還真的就填了咧。



這種偷偷搭上現成官僚系統便車的做法就與今天所要探討的主題非常相似。從USB韌體解析-1我們學到:整個USB系統就是一個官僚系統,一切流程都已經被制定得非常嚴謹。既然它是經由非常週詳的考慮而制定的,那當我們想要自己搞些創新的應用時(如開場白的直銷之於郵務)就可以偷偷撘上這輛官僚便車而不用自己再重頭制定一套規則。



我們可以從USB 2.0規格書中usb_20.pdf 位於9.3的table 9-2發現一個Request Type叫做Vendor ,這就是原本USB在制定規範時保留給我們做一些還沒有變成標準的創新應用來用的。譬如說要做一種給小孩玩的音樂滑鼠,那可以利用這種Vendor Request來下載音樂到滑鼠裡。



這個部落格要是放上那麼完美的範例大家看完就不會燃起要改寫的衝動,所以今天只是稍微把之前用EasyLogger改的搖桿範例加上一個PC的小程式來啟動自動按鈕功能而已。



因為今天要寫PC平台的程式了,在開始之前我們要先下載PC的開發工具和程式庫。在這裡選用的開發工具是Dev-C++。而程式庫是libusb所以是可跨平台的,相關細節就麻煩大家自己用Google找一下吧。我今天只提供在Windows上實際執行過的壓縮檔。



另外,雖然Dev-c++跟WinAVR的核心編譯器都是GCC,但目前我還沒時間去研究如何一魚二吃。如果要研究可能要等到助手來我們公司以後了,所以這邊再打個誠徵助手的廣告。



現在就進入正題,這次的搖桿程式大致只加了下面三行而已.從新加的第一行大致就可看出Vendor Request是一片完全屬於我們自己的天地,我們自己想要如何定義就如何定義。像我就定了Request=38這個命令當做是開始自動按按鈕的命令。


else if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR){
if(rq->bRequest == 38)
Start=1;
}




再來就是在PC上寫一個會送這種Request的程式就完工了。首先參考一下libusb的usb_control_msg函式用法。看完後我們知道只要在PC端寫下下面片段這樣的程式就可以讓我們的搖桿自己亂按按鈕了。




nBytes = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 38, 0, 0, (char *)buffer, sizeof(buffer), 5000);




請再注意官僚這個詞。PC端和裝置端的命令千萬要統一,38就二邊都要38,不然只會看到二部機器在空轉而已。





今天的完整程式在這裡



usb using attiny45

1 則留言:

fatcloud 提到...

哈囉版主你好~


我在網路上搜尋用 C++ 控制 USB 的方法逛道你這裡來
研究你的文章之餘我有一些疑問想提出來~

首先在 "自製 USB HID" 那篇文章裡提到
當一個 USB 裝置插上電腦以後
會立刻提交一份表格給系統
接著就示範寫了一些程式碼


我的疑問是
那些程式碼要如何使用呢?

如果那份表格是由 USB 裝置提交給作業系統的
是不是要把程式寫在一些神奇的晶片裡給 windows 讀取@@?


我想要學從 USB 孔讀入變數傳到程式裡面 (最好是C++)
還有用程式控制 USB 的輸出電壓來操控硬體
(馬達或燈泡之類的東西^^)
最終目的是想用電腦操控一台機器(人)

應該要到哪裡找 USB 的相關資料哩!!?

張貼留言