【WinIO】說明與使用


WinIO http://www.internals.com/

【目的】

  1. 在 WinXP底下直接控制 IO Port ,如 LPT Port。

【安裝】

WinIO第三版下載之後解開,會看到下面幾個檔案,摘錄一下要注意的

  • Binaries
    • WinIo32.dll/WinIo32.sys 要和執行檔放在同一路徑
    • WinIo64.dll/WinIo64.sys 要和執行檔放在同一路徑
    • DumpPhys.exe/DumpPort.exe 作者用C#寫的範例
  • Source
    • Dll/winio.h 給SourceCode include 用的 ,要和程式放在同一路徑
    • Drv/winio_nt.h 給SourceCode include 用的 ,要和程式放在同一路徑
  • Help
    • WinIo.chm 說明文件
  • Samples
    • DumpPhys/DumpPort 作者用C#寫的範例的原始碼

【使用】

  1. 第一步先確定你要存取的 io port adress,這邊以 LPT 當例子,目前的IO range 就是 03BC - 03BE。
    image
  2. 硬體
    1. 以LPT Port 做輸出。
      image
    2. 線路圖(待補)
      基本上就是 lpt 的 data port 直接接到 LED陰極。
  3. Qt 程式
    1. Include File
      #include "winio.h"
    2. 基本程式: 使用 QLibrary
      (注意: 基本上是可以動的,但在 SetPortVal時會有緩衝區滿溢的問題需解決/研究)
        
      #include <qlibrary>
      typedef bool(*InitializeWinIoFunc)();
      typedef bool(*ShutdownWinIoFunc)();
      typedef bool(*SetPortValFunc)(WORD, DWORD, BYTE);
      
      QLibrary mylib("WinIo32");    
      if(mylib.load()){
        //QMessageBox::information(this,tr("info"),tr("WinIo32 Load OK!"));
        InitializeWinIoFunc InitializeWinIo=(InitializeWinIoFunc)mylib.resolve("InitializeWinIo");
        if (InitializeWinIo) { QMessageBox::information(this,tr("info"),tr("InitializeWinIo!"));}
        bool Result = InitializeWinIo();
        if(!Result) {QMessageBox::information(this,tr("info"),tr("InitializeWinIo fail!"));}
        }
      
      if(mylib.isLoaded()){
        SetPortValFunc SetPortVal=(SetPortValFunc)mylib.resolve("SetPortVal");
        if (SetPortVal) { QMessageBox::information(this,tr("info"),tr("SetPortVal!"));}
        bool Result = SetPortVal(0x3bc,0x00,1);
        if(!Result) {QMessageBox::information(this,tr("info"),tr("SetPortVal fail!"));}
          }
      
      if(mylib.isLoaded()){ 
        ShutdownWinIoFunc ShutdownWinIo=(ShutdownWinIoFunc)mylib.resolve("ShutdownWinIo");
        if (ShutdownWinIo) { QMessageBox::information(this,tr("info"),tr("ShutdownWinIo!"));}
        bool Result = ShutdownWinIo();
        if(!Result) {QMessageBox::information(this,tr("info"),tr("ShutdownWinIo fail!"));}
      }
      if(mylib.isLoaded()){mylib.unload();}
    3. 使用 Win32 API(程式碼還有改善空間,不過基本上動作沒問題)
      typedef bool (CALLBACK* InitializeWinIoFunc)();
      typedef bool (CALLBACK* ShutdownWinIoFunc)();
      typedef bool (CALLBACK* SetPortValFunc)(WORD, DWORD, BYTE);
      
      HINSTANCE hDLL; // Handle to DLL
      InitializeWinIoFunc lpfnInitializeWinIo; // Function pointer
      ShutdownWinIoFunc    lpfnShutdownWinIo;
      SetPortValFunc        lpfnSetPortVal;
      
      bool uReturnVal;
      
      hDLL = LoadLibrary(L"WinIo32.dll");
      if (hDLL != NULL)
      {
        lpfnInitializeWinIo = (InitializeWinIoFunc)GetProcAddress(hDLL,"InitializeWinIo");
        lpfnShutdownWinIo = (ShutdownWinIoFunc)GetProcAddress(hDLL,"ShutdownWinIo");
        lpfnSetPortVal = (SetPortValFunc)GetProcAddress(hDLL,"SetPortVal");
      
        if ((!lpfnInitializeWinIo) || (!lpfnShutdownWinIo) || (!lpfnSetPortVal))
        {
          // handle the error
          FreeLibrary(hDLL);
          QMessageBox::information(this,tr("info"),tr("Load Dll Fail!"));
        }
        else
        {
          // call the function
          uReturnVal = lpfnInitializeWinIo();    
          uReturnVal = lpfnSetPortVal(0x3BC,0x55,1);
          uReturnVal = lpfnShutdownWinIo();
      }
      FreeLibrary(hDLL);
      }

【待補】

  1. MFC程式 (用到再補)

【驗證】

  1. 在驗證你的程式之前,建議先用現成的工具來驗證你的硬體。
    1. 打開 DumpPort.exe,填入 port address/value先驗證你的硬體是否輸出正確的值。
      image
    2. value可以填 00/FF/55/AA 來交互驗證硬體。
  2. 打開先前寫好的程式,基本上就是看 LED 有無輸出所指定的值。

【備註】

  1. LPT 接腳目前用到 Data Port  http://en.wikipedia.org/wiki/LPT
  2. USB接腳目前用到 pin1(Vcc)/pin4(Gnd) 作供給電源的動作 http://zh.wikipedia.org/zh-cn/USB

【其他】

【參考】

 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com