主题 : 求教wince的gpio16位数据读取问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 67628
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2012-04-13
最后登录: 2013-06-30
楼主  发表于: 2012-04-13 18:19

 求教wince的gpio16位数据读取问题

小弟目前做毕设,读取gpio口数据,我将GPK的15-8位和GPL的7-0位从高到低组合成16位数据,但在编写驱动时报错,可能是XXX_read函数有问题,代码如下:
驱动部分代码:
DWORD GIO_Init(LPCTSTR PContext, LPCVOID lpvBuscontext
{
BOOL bResult = TRUE;
PGIO_PUBLIC_CONTEXT pPublicGIO = NULL;
PHYSICAL_ADDRESS    ioPhysicalBase = {0,0};
ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_GPIO;
    // 申请GIO的CONTEXT
if ( !(pPublicGIO = (PGIO_PUBLIC_CONTEXT)LocalAlloc( LPTR, sizeof(GIO_PUBLIC_CONTEXT) )) )//申请空间
{
  RETAILMSG(TEXT("[GIO] Can't not allocate for GIO Context\n"));
  bResult = FALSE;
  goto CleanUp;
}
// 得到GPIO寄存器的地址
pPublicGIO->v_pIOPregs = (volatile S3C6410_GPIO_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_GPIO_REG), FALSE);
if (pPublicGIO->v_pIOPregs == NULL)
{
  RETAILMSG(TEXT("[GIO] For pGPIOregs: MmMapIoSpace failed!\r\n"));
  bResult = FALSE;
  goto CleanUp;
}
    //GPK
pPublicGIO->v_pIOPregs->GPKCON1 = pPublicGIO->v_pIOPregs->GPKCON1 & ~(0xffffffff);//GPK8...GPK15=0000=输入
pPublicGIO->v_pIOPregs->GPKPUD =  pPublicGIO->v_pIOPregs->GPKPUD & ~(0xffffffff) | 0xaaaaffff;//GPK[8]...GPK[15]=10=上拉使能
pPublicGIO->v_pIOPregs->GPKDAT =  pPublicGIO->v_pIOPregs->GPKDAT & 0x000000ff;//GPK8...GPK15置零
    //GPL
pPublicGIO->v_pIOPregs->GPLCON0 = pPublicGIO->v_pIOPregs->GPLCON0 & ~(0xffffffff);//GPL0...GPL7=0000=输入
pPublicGIO->v_pIOPregs->GPLPUD =  pPublicGIO->v_pIOPregs->GPLPUD & ~(0xffffffff) | 0xffffaaaa;//GPL[0]...GPL[7]=10=上拉使能
pPublicGIO->v_pIOPregs->GPLDAT =  pPublicGIO->v_pIOPregs->GPLDAT & 0x0000ff00;//GPL0...GPL7置零

DWORD GIO_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{                  
PGIO_PUBLIC_CONTEXT pReadGIOPublic = (PGIO_PUBLIC_CONTEXT)hOpenContext;
    WORD *rd;
    (WORD *)rd = (WORD *)pBuffer;
WORD KDAT = WORD((pReadGIOPublic->v_pIOPregs->GPKDAT) & 0xffff);
WORD LDAT = WORD((pReadGIOPublic->v_pIOPregs->GPLDAT) & 0xffff);
    *(rd) = (KDAT & 0xff00) | (LDAT & 0x00ff);
RETAILMSG(1,(TEXT("GIO_Read: Read Success!\r\n"),*rd));
return 1;
}

应用程序代码:创建你一个工程后,使用一个button触发事件来读数据,用static text将16位显示成十进制:
void CgpioDlg::OnBnClickedButton1()
{
     DWORD actlen;
     BOOL ret;
     WORD dt = 0;
     m_hLed = CreateFile(L"GIO1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
  ret=ReadFile(m_hLed,&dt,2,&actlen,NULL);
        CString str;
        str.Format(_T("%d"),dt);
        CWnd *pWnd=GetDlgItem(IDC_STATIC);
        pWnd->SetWindowText(str);
}

运行时当点击button时开发板界面弹出错误信息:“an invalid argument was encountered”
驱动调试窗口信息为:
+OEMSetAlarmTime(11/4/2012 2:0:0.000)
GIO_Read: Read Success!
Exception 'Raised Exception' (-1): Thread-Id=082f0002(pth=846b4c80), Proc-Id=082e0002(pprc=846b4b60) 'gpio.exe', VM-active=082e0002(pprc=846b4b60) 'gpio.exe'
PC=4006bdfc(coredll.dll+0x0005bdfc) RA=8011a4c8(kernel.dll+0x000064c8) SP=0004f5b8, BVA=0004f5ec

小弟实在不懂哪里出了问题,望各位大侠相助,先谢谢了!!!