none
2440 IO口驱动程序 RRS feed

  • 问题

  • 各位知识高人帮帮忙, 以下是我的开发板2440的端口驱动程序的一个函数,可控制LED灯点亮和灭, 那怎样实现检测端口引脚的电平高低。请给段代码。假设在驱动
    程序中已完成端口的初始化。



    这段代码的功能是根据函数中的 dwcode 参数的值执行不同的操作

    BOOL LED_IOControl(DWORD hOpenContext,
           DWORD dwCode,
           PBYTE pBufIn,
           DWORD dwLenIn,
           PBYTE pBufOut,
           DWORD dwLenOut,
           PDWORD pdwActualOut)
    {
     switch(dwCode)
     {
     case IO_CTL_LED_1_ON:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<5);
      break;
     case IO_CTL_LED_2_ON:
       s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<6); 
     break;
     case IO_CTL_LED_3_ON:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<7);
      break;
     case IO_CTL_LED_4_ON:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<8);
      break;
     case IO_CTL_LED_ALL_ON:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0xF<<5);
      break;
     case IO_CTL_LED_1_OFF:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<5);
      break;
     case IO_CTL_LED_2_OFF:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<6);
      break;
     case IO_CTL_LED_3_OFF:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<7);
      break;
     case IO_CTL_LED_4_OFF:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<8);
      break;
     case IO_CTL_LED_ALL_OFF:
      s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0xF<<5);
      break;
     default:
      break;  
     }
       
     RETAILMSG(1,(TEXT("LED:Ioctl code = 0x%x\r\n"), dwCode));
     return TRUE;
    }
    2009年12月28日 6:39

答案

  • 定义一个IOCTRL 如IO_CONTRO_GET_PIN_LEVLE
    用pBufIn 指明PIN号
    用pBufOut 返回得到的pin的之

    case IO_CONTRO_GET_PIN_LEVLE:
    {
      BOOL *pLeve=(BOOL *)pBufOut ;
      DWORD *pPinNum=(DWORD *)pBufIn ;
      *pLeve=S2440GetPinLevel(*pPinNum);
      break;
    }
    S2440GetPinLevel 这个函数和平台相关,我就不得而知了。
    这个函数的输入参数是引脚号
    返回这个引脚的电平,1 代表高电平,0 代表低电平
    2010年1月5日 7:12