首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

关于用deviceiocontrol调用驱动无法传到底层控制~盼,该怎么解决

2012-03-01 
关于用deviceiocontrol调用驱动无法传到底层控制~急盼帮忙看下我的代码吧,编译都没错,加载都可以,但是当我

关于用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的定义吧。

热点排行