1. 程式人生 > >Windows下利用winio庫對 I/O 口進行操作

Windows下利用winio庫對 I/O 口進行操作

#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<