GPIO驱动程序及测试程序.docx
《GPIO驱动程序及测试程序.docx》由会员分享,可在线阅读,更多相关《GPIO驱动程序及测试程序.docx(9页珍藏版)》请在冰豆网上搜索。
![GPIO驱动程序及测试程序.docx](https://file1.bdocx.com/fileroot1/2022-10/8/df8a06b0-079b-4b47-be69-eddb9b6cd75b/df8a06b0-079b-4b47-be69-eddb9b6cd75b1.gif)
GPIO驱动程序及测试程序
GPIO驱动程序,主要是GIO_Cont⑹:
BOOLGIO_IOControl(DWORDhOpenContext,
DWORDdwCode,
PBYTEpBufIn,
DWORDdwLenIn,
PBYTEpBufOut,
DWORDdwLenOut,
PDWORDpdwActualOut)
{
switch(dwCode)
{
caseIO_CTL_GPIO_A_CON:
v_plOPregs->GPACON=*(DWORD*)pBufln;//GPACONSET
break;
caseIO_CTL_GPIO_A_DAT_OUTPUT:
v_pIOPregs->GPADAT=*(DWORD*)pBufln;//GPADATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_B_CON:
v_pIOPregs->GPBCON=*(DWORD*)pBufln;//GPBCONSET
break;
caseIO_CTL_GPIO_B_DAT_INPUT:
*(DWORD*)pBufOut=v_plOPregs->GPBDAT;//GPBDATSET(INPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_B_DAT_OUTPUT:
v_pIOPregs->GPBDAT=*(DWORD*)pBufln;//GPBDATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_B_UP:
v_pIOPregs->GPBUP=*(DWORD*)pBufln;//GPBUPSET
break;
caseIO_CTL_GPIO_C_CON:
v_pIOPregs->GPCCON=*(DWORD*)pBufln;//GPCCONSET
caseIO_CTL_GPIO_C_DAT_INPUT:
*(DWORD*)pBufOut=v_plOPregs->GPCDAT;//GPCDATSET(INPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_C_DAT_OUTPUT:
v_pIOPregs->GPCDAT=*(DWORD*)pBufln;//GPCDATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_C_UP:
v_pIOPregs->GPCUP=*(DWORD*)pBufln;//GPCUPSET
break;
caseIO_CTL_GPIO_D_CON:
v_plOPregs->GPDCON=*(DWORD*)pBufln;//GPDCONSET
break;
caseIO_CTL_GPIO_D_DAT_INPUT:
*(DWORD*)pBufOut=v_plOPregs->GPDDAT;//GPDDATSET(INPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_D_DAT_OUTPUT:
v_pIOPregs->GPDDAT=*(DWORD*)pBufln;//GPDDATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_D_UP:
v_pIOPregs->GPDUP=*(DWORD*)pBufln;//GPDUPSET
break;
caseIO_CTL_GPIO_E_CON:
v_plOPregs->GPECON=*(DWORD*)pBufln;//GPECONSET
break;
caseIO_CTL_GPIO_E_DAT_INPUT:
*(DWORD*)pBufOut=v_plOPregs->GPEDAT;//GPEDATSET(INPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_E_DAT_OUTPUT:
v_pIOPregs->GPEDAT=*(DWORD*)pBufln;//GPEDATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_E_UP:
v_pIOPregs->GPEUP=*(DWORD*)pBufln;//GPEUPSET
caseIO_CTL_GPIO_F_CON:
v_plOPregs->GPFCON=*(DWORD*)pBufln;//GPFCONSET
break;
caseIO_CTL_GPIO_F_DAT_INPUT:
*(DWORD*)pBufOut=v_plOPregs->GPFDAT;//GPFDATSET(INPUT)alsoforFunctionalPin
break;
caseIO_CTL_GPIO_F_DAT_OUTPUT:
v_plOPregs->GPFDAT=*(DWORD*)pBufln;//GPFDATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_F_UP:
v_pIOPregs->GPFUP=*(DWORD*)pBufln;//GPFUPSET
break;
caseIO_CTL_GPIO_G_CON:
v_pIOPregs->GPGCON=*(DWORD*)pBufln;//GPGCONSET
break;
caseIO_CTL_GPIO_G_DAT_INPUT:
*(DWORD*)pBufOut=v_plOPregs->GPGDAT;//GPGDATSET(INPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_G_DAT_OUTPUT:
v_pIOPregs->GPGDAT=*(DWORD*)pBufln;//GPGDATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_G_UP:
v_pIOPregs->GPGUP=*(DWORD*)pBufln;//GPGUPSET
break;
caseIO_CTL_GPIO_H_CON:
v_plOPregs->GPHCON=*(DWORD*)pBufln;//GPHCONSET
break;
caseIO_CTL_GPIO_H_DAT_INPUT:
*(DWORD*)pBufOut=v_plOPregs->GPHDAT;//GPHDATSET(INPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_H_DAT_OUTPUT:
v_pIOPregs->GPHDAT=*(DWORD*)pBufln;//GPHDATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_H_UP:
v_pIOPregs->GPHUP=*(DWORD*)pBufln;//GPHUPSET
break;
caseIO_CTL_GPIO_J_CON:
v_plOPregs->GPJCON=*(DWORD*)pBufln;//GPJCONSET
break;
caseIO_CTL_GPIO_J_DAT_INPUT:
*(DWORD*)pBufOut=v_plOPregs->GPJDAT;//GPJDATSET(INPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_J_DAT_OUTPUT:
v_pIOPregs->GPJDAT=*(DWORD*)pBufln;//GPJDATSET(OUTPUT)alsoforFunctionalPinbreak;
caseIO_CTL_GPIO_J_UP:
v_pIOPregs->GPJUP=*(DWORD*)pBufln;//GPJUPSET
break;
default:
break;
}
RETAILMSG(O,(TEXT("GPIO_Control:
Ioctlcode=Ox%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;
};
structGPIOGPA={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_hlcon=AfxGetApp()->Loadlcon(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
0N_BN_CLICKED(IDC_BUTT0N1,&CRelay2Dlg:
:
OnBnClickedButton1)
0N_BN_CLICKED(IDC_BUTT0N2,&CRelay2Dlg:
:
OnBnClickedButton2)
END_MESSAGE_MAP()
//CRelay2Dlg消息处理程序
BOOLCRelay2Dlg:
:
OnlnitDialog()
{
CDialog:
:
OnlnitDialog();
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
Setlcon(