Windows下利用winio庫對 I/O 口進行操作
阿新 • • 發佈:2019-02-16
#include #include #include "winio.h" #include "winiotest.h" #include #include "stdafx.h" using namespace std; // Registers of the embedded controller #define GPIO_BASE_ADDRESS 0x500 #define EC_DATAPORT 0x0e // EC data io-port #define EC_CTRLPORT 0x0c // EC control io-port // Embedded controller status register bits #define EC_STAT_OBF 0x01 // Output buffer full #define EC_STAT_IBF 0x02 // Input buffer full #define EC_STAT_CMD 0x08 // Last write was a command write (0=data) // Embedded controller commands // (write to EC_CTRLPORT to initiate read/write operation) #define EC_CTRLPORT_READ (char)0x80 #define EC_CTRLPORT_WRITE (char)0x81 #define EC_CTRLPORT_QUERY (char)0x84 int verbosity= 0; // verbosity for the logbuf (0= nothing) char lasterrorstring[256]= "", logbuf[8192]= ""; void GetScrnEERO(LONG i) { /*switch(i) { case 0: cout << "**********"<0) sprintf(logbuf+strlen(logbuf), "waitportstatus: tick port= %02x, status= %02x => data was %02x\n", port, bits, data); if (!done) { strcpy(lasterrorstring, "waitportstatus: GetPortValue failed"); break; } // check for desired result int flagstate= (((char)data) & bits)!=0, wantedstate= onoff!=0; if (flagstate==wantedstate) { ok= true; break; } // try again after a moment ::Sleep(tick); } if (!ok && strlen(lasterrorstring)==0) { sprintf(lasterrorstring, "waitportstatus: timeout waiting for port %02x to change to status %02x/%d", port, bits, onoff); } if (!ok) { sprintf(logbuf+strlen(logbuf), "waitportstatus returns failed: ok= %d\n", ok); } return ok; } //------------------------------------------------------------------------- // write a character to an io port through WinIO device //------------------------------------------------------------------------- int writeport(int port, char data) { strcpy(lasterrorstring, ""); // write byte via WINIO.SYS int done= SetPortVal(port, data, 1); if (!done) { sprintf(lasterrorstring, "writeport: port %02x, data %02x failed\n", port, data); } if (verbosity>1) { sprintf(logbuf+strlen(logbuf), "writeport port= %02x, data= %02x, done= %d\n", port, data, done); } return done; } //------------------------------------------------------------------------- // read a character from an io port through WinIO device //------------------------------------------------------------------------- int readport(int port, char *pdata) { DWORD data= -1; // read byte via WINIO.SYS int done= GetPortVal(port, &data, 1); if (done) { *pdata= (char)data; } else { sprintf(lasterrorstring, "readport: port %02x failed\n", port, data); } if (verbosity>1) sprintf(logbuf+strlen(logbuf), "readport port= %02x, data= %02x, done= %d\n", port, (char)data, done); return done; } void main(int offset, char *pdata) { DWORD dwPortVal; DWORD rc = 0; int port; int ok; // Call InitializeWinIo to initialize the WinIo library. //宣告一個結構 DEVMODE dmScreenSettings; ; DWORD widthShao = 0,heightShao = 0; memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); dmScreenSettings.dmSize = sizeof(dmScreenSettings); //顯示圖形裝置 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dmScreenSettings); int i = 0; BOOL bRetvol; DEVMODE demove; do { bRetvol = EnumDisplaySettings(NULL,i,&demove); i++; if(bRetvol) { if ((demove.dmPelsWidth != widthShao || demove.dmPelsHeight != heightShao) &&(demove.dmPelsWidth >= 800 &&demove.dmPelsHeight >= 600)) { widthShao = demove.dmPelsWidth; heightShao= demove.dmPelsHeight; //cout<< endl<