GPIO驱动程序及测试程序.docx
《GPIO驱动程序及测试程序.docx》由会员分享,可在线阅读,更多相关《GPIO驱动程序及测试程序.docx(13页珍藏版)》请在冰点文库上搜索。
GPIO驱动程序及测试程序
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"));
}