关于用deviceiocontrol调用驱动无法传到底层控制~急盼
帮忙看下我的代码吧,编译都没错,加载都可以,但是当我调用IOCTL的时候,串口打印的信息只打出了一部分
#include "stdafx.h"
#include "pkfuncs.h"
#include "s2440.h"
#include <commctrl.h>
#include <nkintr.h>
#include <windev.h>
#include <winbase.h>
#include <windows.h>
#include "IOControl.h"
#define GPF6_out (1<<(6*2))
#define GPF7_out (1<<(7*2))
#define GPG3_out (1<<(3*2))
#define GPG5_out (1<<(5*2))
#define GPG6_out (1<<(6*2))
volatile IOPreg *v_pIOPregs;
/********************************************************************************************/
BOOL GPIOInit()
{
RETAILMSG(1,(TEXT("GPIO::::**********GPIOInt_Setting***********\r\n")));
//GPIO set output
v_pIOPregs->rGPFCON &= ~(0xf000);
v_pIOPregs->rGPFCON |= GPF7_out | GPF6_out;
v_pIOPregs->rGPFUP &= 0x3F;
v_pIOPregs->rGPGCON &= ~(0x3cc0);
v_pIOPregs->rGPGCON |= GPG3_out | GPG5_out | GPG6_out;
v_pIOPregs->rGPGUP &= 0xff97;
return TRUE;
}
/********************************************************************************************/
void Virtual_Alloc() // Virtual allocation
{
// GPIO Virtual alloc
v_pIOPregs = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
if(v_pIOPregs == NULL)
{
RETAILMSG(1, (TEXT("For v_pIOPregs: VirtualAlloc fail!\r\n")));
}
else
{
if(!VirtualCopy((PVOID)v_pIOPregs,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE ))
{
RETAILMSG(1, (TEXT("For v_pIOPregs: VirtualCopy failed!\r\n")));
VirtualFree((void*)v_pIOPregs, sizeof(IOPreg), MEM_RELEASE);
}
}
}
/********************************************************************************************/
DWORD PIO_Init(DWORD dwContext)
{
Virtual_Alloc();
GPIOInit();
//HarddevicInit();
RETAILMSG(1,(TEXT("MYSTRINGS:PIO_Init\n")));
return TRUE;
}
/*******************************************************************************************/
BOOL Change_energy(short value)
{
int i;
for(i=0;i<value;i++)
{
//RETAILMSG(1,(TEXT("A cap x9312 initialize times==%d\r\n"),i));
v_pIOPregs->rGPGDAT|= 0x40; //M置位(X9312 INC)
udelay(180);
RETAILMSG(1,(TEXT("A cap x9312 after delay\n")));
v_pIOPregs->rGPGDAT &= 0xffbf; //M清零(X9312 INC)
udelay(180);
}
return TRUE;
}
/*******************************************************************************************/
BOOL PIO_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut
)
{
BOOL bErr = TRUE;
RETAILMSG(1,(TEXT("MYSTRINGS:PIO_IOControl\n")));
RETAILMSG(1,(TEXT("MYSTRINGS:dwCode = %d \n"),dwCode));
switch (dwCode)
{
case IOCTL_SET_ENERGY:
RETAILMSG(1,(TEXT("MYSTRINGS:in IOControl\n")));
Change_energy(*(short *)pBufIn);
RETAILMSG(1,(TEXT("*(int *)pBufIn is %d\n"),*(short *)pBufIn));
break;
case IOCTL_GPF6_SET_PIN:
v_pIOPregs->rGPFDAT|= 0x40; //TR1置位
RETAILMSG(1,(TEXT("set GPF6 successful\n")));
break;
case IOCTL_GPF7_SET_PIN:
v_pIOPregs->rGPFDAT|= 0x80; //TR2置位
RETAILMSG(1,(TEXT("set GPF7 successful\n")));
break;
case IOCTL_GPG3_SET_PIN:
v_pIOPregs->rGPGDAT|= 0x8; //CS置位
break;
case IOCTL_GPG5_SET_PIN:
v_pIOPregs->rGPGDAT|= 0x20; //H置位(X9312 U/D)
break;
case IOCTL_GPG6_SET_PIN:
v_pIOPregs->rGPGDAT|= 0x40; //M置位(X9312 INC)
break;
case IOCTL_GPF6_CLR_PIN:
v_pIOPregs->rGPFDAT &= ~(0x40); //TR1清零
RETAILMSG(1,(TEXT("clr GPF6 successful\n")));
break;
case IOCTL_GPF7_CLR_PIN:
v_pIOPregs->rGPFDAT &= ~(0x80); //TR2清零
RETAILMSG(1,(TEXT("clr GPF7 successful\n")));
break;
case IOCTL_GPG3_CLR_PIN:
v_pIOPregs->rGPGDAT &= ~(0x8); //CS清零
break;
case IOCTL_GPG5_CLR_PIN:
v_pIOPregs->rGPGDAT &= ~(0x20); //H清零(X9312 U/D)
break;
case IOCTL_GPG6_CLR_PIN:
v_pIOPregs->rGPGDAT &= ~(0x40); //M清零(X9312 INC)
break;
}
return bErr;
}
********************************************************************
只贴出来要用的部分,程序里红色的部分打印出来了,但是端口并没有有电平变化,要高也没高要低也没低,特别是第一个
IOCTL_SET_ENERGY调用的时候,case下的都没显示,求高手帮我看看吧~~
[解决办法]
看看你那些 IOCTL CODE的定义吧。