2012年2月7日 星期二

透過 HID 控制 FRC-450 的 OSD 顯示


目前已經完成 OSD畫面的設計,但版子尚未開發完成。為了要提早驗證OSD畫面是否如預期所示,將會撰寫程式經由USB線送出指令至 SONY FRC450,以達到OSD顯示的功能。由於FRC450屬於 HID device,因此將會利用HID的方式來控制此OSD


OSD控制程式對應關係



HID控制

1.       首先需要下載WDK (Windows Driver Kit Version 7.1.0)
安裝後,若直接編譯 sample code 可能會因為SDK版本不同而出現問題。

2.       安裝Windows 7 SDK,執行Windows SDK Configuration Tool,將預設的SDK版本設定為7.1OK了(與WDK版本相同),連結時也需要設定到對應的路徑, 我的設定是 C:\WinDDK\7600.16385.1\lib\win7\i386

3.       接著選擇 C:\WinDDK\7600.16385.1\src\hid\hclient 此專案,編譯成功,就可以運行 hid client 的測試範例了。至此,可以確定開發環境已經安裝成功。

4.       接著要自行撰寫HID控制程式,可以參考另一個較簡單的例子。我是直接參考http://www.lvr.com/hidpage.htm visual c++ 6

5.       程式邏輯簡述如下:
            i.        透過HidD_GetHidGuid()取得Windows GUID

          ii.        使用 SetupDixxx函數取得一個HID device,並且利用CreateFile建立一個對應到此hid handle
Ø   SetupDiGetClassDevs()
Ø   SetupDiEnumDeviceInterfaces()
Ø   SetupDiGetDeviceInterfaceDetail()

        iii.         呼叫 HidD_GetAttributes(),比對此HID device VendorIDProductID是否如預期。

         iv.        若找到想要的HID device,則再建立供write/readhandle。然後就可以直接對 HID下指令囉。

WriteHandle=CreateFile
    (detailData->DevicePath,
    GENERIC_WRITE,
    FILE_SHARE_READ|FILE_SHARE_WRITE,
    (LPSECURITY_ATTRIBUTES)NULL,
    OPEN_EXISTING,
    0,
    NULL);
   
ReadHandle=CreateFile
    (detailData->DevicePath,
    GENERIC_READ,
    FILE_SHARE_READ|FILE_SHARE_WRITE,
    (LPSECURITY_ATTRIBUTES)NULL,
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL); 

參考資料
1.          百度的HID介紹
2.          MSDNHuman Input Devices
3.          Jan Axelson’s Lakeview Research The HID Page