GPIO驱动函数
函数名称:BOOL GPIO_Close(DWORD Handle)
功能描述:驱动程序关闭函数
函数参数:DWORD Handle:驱动程序句柄
函数返回值:FALSE: 失败 TRUE: 成功
调用程序:CloseHandle(hFile);
函数名称:DWORD GPIO_Open (
DWORD dwData,
DWORD dwAccess,
DWORD dwShareMode
)
功能描述:打开驱动程序
函数参数:DWORD dwData : 设备驱动程序句柄
DWORD dwAccess : 访问请求代码,是读和写的组合
DWORD dwShareMode: 共享模式
函数返回值:驱动程序引用事例句柄
调用程序:
CreateFile(TEXT("PIO1:"), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
函数名称:BOOL PIO_IOControl(
DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned
)
功能描述:驱动程序 I/O 请求
函数参数:Handle:设备驱动的句柄
dwIoControlCode:操作码 设备指定的WORD型标识,用于描述这个IOControl操作的定义,该值定义:
//设置GPIO口为输出口
#define IOCTL_GPx_SET_PIN_OUT 0x0000010
//设置多个GPIO口为输出口
#define IOCTL_GPx_SET_MULTI_PIN_OUT 0x0000020
//设置GPIO口为输入口
#define IOCTL_GPx_SET_PIN_IN 0x0000030
//设置多个GPIO口为输入口
#define IOCTL_GPx_SET_MULTI_PIN_IN 0x0000040
//设置GPIO口输出高电平
#define IOCTL_GPx_SET_PIN 0x0000050
//设置多个GPIO口输出高电平
#define IOCTL_GPx_SET_MULTI_PIN 0x0000060
//设置GPIO口输出低电平
#define IOCTL_GPx_CLR_PIN 0x0000070
//设置多个GPIO口输出低电平
#define IOCTL_GPx_CLR_MULTI_PIN 0x0000080
//读取引脚电平状态
#define IOCTL_GPx_READ_PIN 0x0000090
//读取多个引脚电平状态
#define IOCTL_GPx_READ_ALL_PIN 0x00000A0
//使能GPIO口内部上拉
#define IOCTL_GPx_EN_PULLUP 0x00000B0
//使能多个GPIO口内部上拉
#define IOCTL_GPx_EN_MULTI_PIN_PULLUP 0x00000C0
//禁止GPIO口内部上拉
#define IOCTL_GPx_DIS_PULLUP 0x00000D0
//禁止多个GPIO口内部上拉
#define IOCTL_GPx_DIS_MULTI_PIN_PULLUP 0x00000E0
pInBuf:输入Buffer 缓冲区指针,指向需要传给驱动程序使用的数据
nInBufSize:输入Buffer的size 要传给驱动程序使用的数据长度
pOutBuf:输出Buffer 缓冲区指针 指向驱动程序传给应用程序使用的数据
nOutBufSize:输出Buffer的size 要传送给应用程序使用的数据长度
pBytesReturned:实际处理数据长度
功能 | DwIoControlCode(x取值为A-----H) | pInBuf | nInBufSize |
设置GPIO口为输出口 | IOCTL_GPx_SET_PIN_OUT | GPIO的编号 | 1 |
设置多个GPIO口为输出口 | IOCTL_GPx_SET_MULTI_PIN_OUT | GPIO的编号 | 1 |
设置GPIO口为输入口 | IOCTL_GPx_SET_PIN_IN | GPIO的编号 | 1 |
设置多个GPIO口为输入口 | IOCTL_GPx_SET_MULTI_PIN_IN | GPIO的编号 | 1 |
设置GPIO口输出高电平 | IOCTL_GPx_SET_PIN | GPIO的编号 | 1 |
设置多个GPIO口输出高电平 | IOCTL_GPx_SET_MULTI_PIN | GPIO的编号 | 1 |
设置GPIO口输出低电平 | IOCTL_GPx_CLR_PIN | GPIO的编号 | 1 |
设置多个GPIO口输出低电平 | IOCTL_GPx_CLR_MULTI_PIN | GPIO的编号 | 1 |
读取引脚电平状态 | IOCTL_GPx_READ_PIN | GPIO的编号 | 1 |
读取多个引脚电平状态 | IOCTL_GPx_READ_ALL_PIN | GPIO的编号 | 1 |
使能GPIO口内部上拉 | IOCTL_GPx_EN_PULLUP | GPIO的编号 | 1 |
使能多个GPIO口内部上拉 | IOCTL_GPx_EN_MULTI_PIN_PULLUP | GPIO的编号 | 1 |
禁止GPIO口内部上拉 | IOCTL_GPx_DIS_PULLUP | GPIO的编号 | 1 |
禁止多个GPIO口内部上拉 | IOCTL_GPx_DIS_MULTI_PIN_PULLUP | GPIO的编号 | 1 |
函数返回值:TRUE: 成功 FALSE: 失败
调用程序:
//设置GPG9管脚输出口
BYTE pinnum1=9;
::DeviceIoControl(hFile,IOCTL_GPG_SET_PIN_OUT,&pinnum1,1,NULL,0,NULL,NULL);
//禁止GPG9内部上拉
::DeviceIoControl(hFile,IOCTL_GPG_DIS_PULLUP,&pinnum1,1,NULL,0,NULL,NULL);
//输出低电平
::DeviceIoControl(hFile,IOCTL_GPG_CLR_PIN,&pinnum,1,NULL,0,NULL,NULL);
//输出高电平
::DeviceIoControl(hFile,IOCTL_GPG_SET_PIN,&pinnum,1,NULL,0,NULL,NULL);
#define MOTOA 5
#define MOTOB 6
#define MOTOC 7
#define MOTOD 0
DWORD pinmask = (1 << MOTOA) + (1 << MOTOB) + (1 << MOTOC) + (1 << MOTOD);
//设置管脚GPE12,GPE13,GPE14,GPE15输出
::DeviceIoControl(hFile,IOCTL_GPC_SET_MULTI_PIN_OUT,&pinmask,1,NULL,0,NULL,NULL);
//设置多个GPIO口为高电平
// ::DeviceIoControl(hFile, IOCTL_GPC_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
/**************************************************
作者:宇帆 cfanlwn
时间:2009-12-06 20:58:15