GPIO驱动程序主要是GIOControl.docx
《GPIO驱动程序主要是GIOControl.docx》由会员分享,可在线阅读,更多相关《GPIO驱动程序主要是GIOControl.docx(13页珍藏版)》请在冰豆网上搜索。
GPIO驱动程序主要是GIOControl
GPIO驱动程序,主要是GIO_Control:
BOOLGIO_IOControl(DWORDhOpenContext,?
?
DWORDdwCode,?
?
PBYTEpBufIn,?
?
DWORDdwLenIn,?
?
PBYTEpBufOut,?
?
DWORDdwLenOut,?
?
PDWORDpdwActualOut)
{
switch(dwCode)
{
caseIO_CTL_GPIO_A_CON:
?
?
?
?
?
v_pIOPregs->GPACON=*(DWORD*)pBufIn;//GPACONSET
break;
?
?
caseIO_CTL_GPIO_A_DAT_OUTPUT:
v_pIOPregs->GPADAT=*(DWORD*)pBufIn;?
//GPADATSET(OUTPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_B_CON:
?
?
?
?
?
v_pIOPregs->GPBCON=*(DWORD*)pBufIn;//GPBCONSET
break;
caseIO_CTL_GPIO_B_DAT_INPUT:
?
?
?
?
?
*(DWORD*)pBufOut=v_pIOPregs->GPBDAT;//GPBDATSET(INPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_B_DAT_OUTPUT:
v_pIOPregs->GPBDAT=*(DWORD*)pBufIn;?
//GPBDATSET(OUTPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_B_UP:
?
v_pIOPregs->GPBUP=*(DWORD*)pBufIn;//GPBUPSET
break;
?
?
?
caseIO_CTL_GPIO_C_CON:
?
?
?
?
?
v_pIOPregs->GPCCON=*(DWORD*)pBufIn;//GPCCONSET
break;
caseIO_CTL_GPIO_C_DAT_INPUT:
?
?
?
?
?
*(DWORD*)pBufOut=v_pIOPregs->GPCDAT;//GPCDATSET(INPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_C_DAT_OUTPUT:
v_pIOPregs->GPCDAT=*(DWORD*)pBufIn;?
//GPCDATSET(OUTPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_C_UP:
?
v_pIOPregs->GPCUP=*(DWORD*)pBufIn;//GPCUPSET
break;
?
?
caseIO_CTL_GPIO_D_CON:
?
?
?
?
?
v_pIOPregs->GPDCON=*(DWORD*)pBufIn;//GPDCONSET
break;
caseIO_CTL_GPIO_D_DAT_INPUT:
?
?
?
?
?
*(DWORD*)pBufOut=v_pIOPregs->GPDDAT;//GPDDATSET(INPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_D_DAT_OUTPUT:
v_pIOPregs->GPDDAT=*(DWORD*)pBufIn;?
//GPDDATSET(OUTPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_D_UP:
?
v_pIOPregs->GPDUP=*(DWORD*)pBufIn;//GPDUPSET
break;
?
?
caseIO_CTL_GPIO_E_CON:
?
?
?
?
?
v_pIOPregs->GPECON=*(DWORD*)pBufIn;//GPECONSET
break;
caseIO_CTL_GPIO_E_DAT_INPUT:
?
?
?
?
?
*(DWORD*)pBufOut=v_pIOPregs->GPEDAT;//GPEDATSET(INPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_E_DAT_OUTPUT:
v_pIOPregs->GPEDAT=*(DWORD*)pBufIn;?
//GPEDATSET(OUTPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_E_UP:
?
v_pIOPregs->GPEUP=*(DWORD*)pBufIn;//GPEUPSET
break;
caseIO_CTL_GPIO_F_CON:
?
?
?
?
?
v_pIOPregs->GPFCON=*(DWORD*)pBufIn;//GPFCONSET
break;
caseIO_CTL_GPIO_F_DAT_INPUT:
?
?
?
?
?
*(DWORD*)pBufOut=v_pIOPregs->GPFDAT;//GPFDATSET(INPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_F_DAT_OUTPUT:
v_pIOPregs->GPFDAT=*(DWORD*)pBufIn;?
//GPFDATSET(OUTPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_F_UP:
?
v_pIOPregs->GPFUP=*(DWORD*)pBufIn;//GPFUPSET
break;
?
?
caseIO_CTL_GPIO_G_CON:
?
?
?
?
?
v_pIOPregs->GPGCON=*(DWORD*)pBufIn;//GPGCONSET
break;
caseIO_CTL_GPIO_G_DAT_INPUT:
?
?
?
?
?
*(DWORD*)pBufOut=v_pIOPregs->GPGDAT;//GPGDATSET(INPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_G_DAT_OUTPUT:
v_pIOPregs->GPGDAT=*(DWORD*)pBufIn;?
//GPGDATSET(OUTPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_G_UP:
?
v_pIOPregs->GPGUP=*(DWORD*)pBufIn;//GPGUPSET
break;
?
?
?
?
?
caseIO_CTL_GPIO_H_CON:
?
?
?
?
?
v_pIOPregs->GPHCON=*(DWORD*)pBufIn;//GPHCONSET
break;
caseIO_CTL_GPIO_H_DAT_INPUT:
?
?
?
?
?
*(DWORD*)pBufOut=v_pIOPregs->GPHDAT;//GPHDATSET(INPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_H_DAT_OUTPUT:
v_pIOPregs->GPHDAT=*(DWORD*)pBufIn;?
//GPHDATSET(OUTPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_H_UP:
?
v_pIOPregs->GPHUP=*(DWORD*)pBufIn;//GPHUPSET
break;
?
?
caseIO_CTL_GPIO_J_CON:
?
?
?
?
?
v_pIOPregs->GPJCON=*(DWORD*)pBufIn;//GPJCONSET
break;
caseIO_CTL_GPIO_J_DAT_INPUT:
?
?
?
?
?
*(DWORD*)pBufOut=v_pIOPregs->GPJDAT;//GPJDATSET(INPUT)alsoforFunctionalPin
break;
?
?
caseIO_CTL_GPIO_J_DAT_OUTPUT:
v_pIOPregs->GPJDAT=*(DWORD*)pBufIn;?
//GPJDATSET(OUTPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_J_UP:
?
v_pIOPregs->GPJUP=*(DWORD*)pBufIn;//GPJUPSET
break;
?
?
?
default:
break;
}
?
?
?
RETAILMSG(0,(TEXT("GPIO_Control:
Ioctlcode=0x%x\r\n"),dwCode));
returnTRUE;
}?
测试程序,封装了2个输入输出GPIO函数,调用十分方便:
#include"stdafx.h"
#include"Relay2.h"
#include"Relay2Dlg.h"
#include"GPIO_Driver.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
?
?
DWORDRData,BUFCON,BUFOUT,BUFIN;
?
structGPIO
?
?
?
{
?
?
?
?
?
DWORDGPIOCON;
?
?
?
?
?
DWORDGPIOIN;
DWORDGPIOOUT;
?
?
?
?
};
?
structGPIO?
GPA={gpacon,NULL,gpaout},
?
?
?
?
?
GPB={gpbcon,gpbin,gpbout},
?
GPC={gpccon,gpcin,gpcout},
?
GPD={gpdcon,gpdin,gpdout},
?
GPE={gpecon,gpein,gpeout},
?
?
?
?
?
GPF={gpfcon,gpfin,gpfout},
?
GPG={gpgcon,gpgin,gpgout},
?
GPH={gphcon,gphin,gphout},
?
GPJ={gpjcon,gpjin,gpjout};?
?
?
//defineandchooseGPIO
?
?
?
?
?
//CRelay2Dlg对话框
CRelay2Dlg:
:
CRelay2Dlg(CWnd*pParent/*=NULL*/)
:
CDialog(CRelay2Dlg:
:
IDD,pParent)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCRelay2Dlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CRelay2Dlg,CDialog)
#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!
defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1,&CRelay2Dlg:
:
OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2,&CRelay2Dlg:
:
OnBnClickedButton2)
END_MESSAGE_MAP()
//CRelay2Dlg消息处理程序
BOOLCRelay2Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//?
执行此操作
SetIcon(m_hIcon,TRUE);//设置大图标
SetIcon(m_hIcon,FALSE);//设置小图标
//TODO:
在此添加额外的初始化代码
gpiodriver=CreateFile(L"GIO1:
",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//gpiodriverinit
if(!
gpiodriver)
MessageBox(L"打开GPIO设备失败!
");
returnTRUE;?
//除非将焦点设置到控件,否则返回TRUE
}
#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!
defined(WIN32_PLATFORM_WFSP)
voidCRelay2Dlg:
:
OnSize(UINT/*nType*/,int/*cx*/,int/*cy*/)
{
if(AfxIsDRAEnabled())
{
DRA:
:
RelayoutDialog(
AfxGetResourceHandle(),?
this->m_hWnd,?
DRA:
:
GetDisplayMode()!
=DRA:
:
Portrait?
?
MAKEINTRESOURCE(IDD_RELAY2_DIALOG_WIDE):
?
MAKEINTRESOURCE(IDD_RELAY2_DIALOG));
}
}
#endif
?
DWORDCRelay2Dlg:
:
GPIOINPUT(DWORDGPIOCON,DWORDGPIOIN,DWORDBUFCON,DWORDBUFOUT)?
//thefunctionisusedforGPIOINPUT
{?
DWORDRData;
?
?
DeviceIoControl(gpiodriver,GPIOCON,&BUFCON,4,NULL,0,NULL,NULL);?
?
?
DeviceIoControl(gpiodriver,GPIOIN,NULL,0,&BUFOUT,4,NULL,NULL);?
memcpy(&RData,&BUFOUT,4);
returnRData;
}
?
DWORD?
CRelay2Dlg:
:
GPIOINPUT1(structGPIOGP,USHORTNUM)?
?
?
//thefunctionisusedforGPIOINPUTBETTER
?
{
?
?
?
BUFCON&=~(3<<(2*NUM));
?
?
DeviceIoControl(gpiodriver,GP.GPIOCON,&BUFCON,4,NULL,0,NULL,NULL);?
?
?
DeviceIoControl(gpiodriver,GP.GPIOIN,NULL,0,&BUFOUT,4,NULL,NULL);?
?
?
memcpy(&RData,&BUFOUT,4);
returnRData;
?
}
VOIDCRelay2Dlg:
:
GPIOOUTPUT(DWORDGPIOCON,DWORDGPIOOUT,DWORDBUFCON,DWORDBUFIN)?
//thefunctionisusedforGPIOOUTPUT
{?
?
?
?
DeviceIoControl(gpiodriver,GPIOCON,&BUFCON,4,NULL,0,NULL,NULL);?
?
?
DeviceIoControl(gpiodriver,GPIOOUT,&BUFIN,4,NULL,0,NULL,0);?
}
VOIDCRelay2Dlg:
:
GPIOOUTPUT1(structGPIOGP,USHORTNUM,BYTEPINSTATE)?
//thefunctionisusedforGPIOOUTPUTbetter
{
?
?
?
?
?
?
if(GP.GPIOIN!
=NULL)
?
BUFCON=(BUFCON&~(3<<(2*NUM)))|(1<<(2*NUM));
else
?
?
?
?
BUFCON&=~(1<
if(PINSTATE)
BUFIN|=(1<else?
BUFIN&=~(1<?
?
DeviceIoControl(gpiodriver,GP.GPIOCON,&BUFCON,4,NULL,0,NULL,NULL);?
?
?
DeviceIoControl(gpiodriver,GP.GPIOOUT,&BUFIN,4,NULL,0,NULL,0);?
}
voidCRelay2Dlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
?
?
?
GPIOOUTPUT1(GPB,8,1);
GPIOINPUT1(GPB,7);
GPIOOUTPUT1(GPB,6,0);
GPIOOUTPUT1(GPB,5,0);
?
?
//GPIOOUTPUT1(GPF,3,1);?
//GPF3OUTPUT1
?
?
GPIOOUTPUT1(GPF,2,0);
?
?
//GPIOOUTPUT1(GPG,5,0);
//GPIOOUTPUT1(GPG,7,1);
?
?
?
}
voidCRelay2Dlg:
:
OnBnClickedButton2()
{
//TODO:
在此添加控件通知处理程序代码
?
?
?
?
?
DWORDGetData;
?
?
GetData=GPIOINPUT1(GPF,6);?
?
//GPF4INPUT
if(GetData&=(1<<6))
?
MessageBox(_T("1"));
?
?
else
?
MessageBox(_T("0"));?
?
?
}