?? gpio.c
字號:
/*******************************************************************************************
函數名稱: GPIO_ClrPin
描 述: 設置某個引腳輸出低電平
輸入參數: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號, 如 GPB1, 則值為 1
輸出參數:
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_ClrPin(DWORD dwIoControlCode, BYTE PinNum)
{
DWORD GPx;
volatile DWORD *pRegDAT; // GPxDAT's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
if (PinNum >= PinNumTbl[GPx]) return FALSE;
pRegDAT = ((DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO + 1); // 1 is a DWORD pointer
*pRegDAT &= ~(0x01 << PinNum);
return TRUE;
}
/*******************************************************************************************
函數名稱: GPIO_ClrAllPin
描 述: 設置多個引腳輸出低電平
輸入參數: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號掩碼, 如操作 GPB1,GPB3, 則值為: (0x01 << 1) + (0x01 << 3)
輸出參數:
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_ClrAllPin(DWORD dwIoControlCode, DWORD PinMask)
{
DWORD GPx, i;
volatile DWORD *pRegDAT; // GPxDAT's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
pRegDAT = (DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO + 1;
for (i = 0; i < PinNumTbl[GPx]; i++)
{
if (PinMask & (0x01 << i))
*pRegDAT &= ~(0x01 << i);
}
return TRUE;
}
/*******************************************************************************************
函數名稱: GPIO_ReadPin
描 述: 讀取某個引腳的電平狀態
輸入參數: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號, 如 GPB1, 則值為 1
輸出參數: YTE *pValue : 1: 引腳電平為高; 0: 引腳電平為低
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_ReadPin(DWORD dwIoControlCode, BYTE PinNum, BYTE *pValue)
{
DWORD GPx;
volatile DWORD *pRegDAT; // GPxDAT's address
if (pValue == NULL) return FALSE;
GPx = dwIoControlCode & IOCTL_GPX_MASK;
if (GPx == GPx_GPA) return FALSE; // GPA output only
pRegDAT = ((DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO + 1); // 1 is a DWORD pointer
if (*pRegDAT & (0x01 << PinNum))
*pValue = 1;
else
*pValue = 0;
return TRUE;
}
/*******************************************************************************************
函數名稱: GPIO_ReadAllPin
描 述: 讀出一組引腳的狀態
輸入參數: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
DWORD nOutBufSize : pOutBuf 大小, 取值為1, 因為 GPA 不可讀, 其它組最多超不過16個引腳
輸出參數: ushort *pOutBuf : 整組引腳電平狀態
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_ReadAllPin(DWORD dwIoControlCode, ushort *pOutBuf, DWORD nOutBufSize)
{
DWORD GPx;
volatile DWORD *pRegDAT; // GPxDAT's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
if (nOutBufSize < 1) return FALSE;
if (GPx == GPx_GPA) return FALSE; // GPA output only
pRegDAT = (DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO + 1;
*pOutBuf = (ushort)*pRegDAT;
return TRUE;
}
/*******************************************************************************************
函數名稱: GPIO_ConfigPullUp
描 述: 設置某個引腳是否內部上拉
輸入參數: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號, 如 GPB1, 則值為 1
BOOL bPullup : 是否上拉, TRUE: 上拉; FALSE: 不上拉.
輸出參數:
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_ConfigPullUp(DWORD dwIoControlCode, BYTE PinNum, BOOL bPullup)
{
DWORD GPx;
volatile DWORD *pRegUp; // GPxUP's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
if (GPx == GPx_GPA) return FALSE; // GPA output only
pRegUp = ((DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO + 2); // 2 is a DWORD pointer
if (bPullup)
*pRegUp &= ~(0x01 << PinNum); // Pull up is enable
else
*pRegUp |= (0x01 << PinNum); // Pull up is disable
return TRUE;
}
/*******************************************************************************************
函數名稱: GPIO_ConfigMultiPinPullup
描 述: 設置多個引腳是否內部上拉
輸入參數: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號掩碼, 如操作 GPB1,GPB3, 則值為: (0x01 << 1) + (0x01 << 3)
BOOL bPullup : 是否上拉, TRUE: 上拉; FALSE: 不上拉.
輸出參數:
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_ConfigMultiPinPullup(DWORD dwIoControlCode, DWORD PinMask, BOOL bPullup)
{
DWORD GPx;
volatile DWORD *pRegUp; // GPxUP's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
if (GPx == GPx_GPA) return FALSE; // GPA output only
pRegUp = ((DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO + 2); // 2 is a DWORD pointer
if (bPullup)
*pRegUp &= ~(PinMask); // Pull up is enable
else
*pRegUp |= (PinMask); // Pull up is disable
return TRUE;
}
/*******************************************************************************************
函數名稱: PIO_IOControl
描 述: 驅動程序 I/O 請求
輸入參數: DWORD dwIoControlCode: 見本文件的頭文件
輸出參數:
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL
PIO_IOControl(
DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned
)
{
BOOL bErr = FALSE;
switch(dwIoControlCode & IOCTL_GPIO_FUN_MASK)
{
/*
* 設置引腳為輸出
*/
case IOCTL_GPIO_SET_PIN_OUT:
if (nInBufSize > 0)
bErr = GPIO_SetPinOut(dwIoControlCode, *pInBuf);
break;
case IOCTL_GPIO_SET_MULTI_PIN_OUT: /* pInBuf 必須為4字節 */
if (nInBufSize > 0)
bErr = GPIO_SetMultiPinOut(dwIoControlCode, *(DWORD *)pInBuf);
//RETAILMSG(TRUE, (TEXT("*(DWORD *)pInBuf is 0x%x).\r\n"), *(DWORD *)pInBuf));
break;
/*
* 設置引腳為輸入
*/
case IOCTL_GPIO_SET_PIN_IN:
if (nInBufSize > 0)
bErr = GPIO_SetPinIn(dwIoControlCode, *pInBuf);
break;
case IOCTL_GPIO_SET_MULTI_PIN_IN: /* pInBuf 必須為4字節 */
if (nInBufSize > 0)
bErr = GPIO_SetMultiPinIn(dwIoControlCode, *(DWORD *)pInBuf);
//RETAILMSG(TRUE, (TEXT("*(DWORD *)pInBuf is 0x%x).\r\n"), *(DWORD *)pInBuf));
break;
/*
* 設置引腳輸出高電平
*/
case IOCTL_GPIO_SET_PIN:
if (nInBufSize > 0)
bErr = GPIO_SetPin(dwIoControlCode, *pInBuf);
break;
case IOCTL_GPIO_SET_MULTI_PIN: /* pInBuf 必須為4字節 */
if (nInBufSize >= 0)
bErr = GPIO_SetAllPin(dwIoControlCode, *(DWORD *)pInBuf);
//RETAILMSG(TRUE, (TEXT("*(DWORD *)pInBuf is 0x%x).\r\n"), *(DWORD *)pInBuf));
break;
/*
* 設置引腳輸出低電平
*/
case IOCTL_GPIO_CLR_PIN:
if (nInBufSize > 0)
bErr = GPIO_ClrPin(dwIoControlCode, *pInBuf);
break;
case IOCTL_GPIO_CLR_MULTI_PIN: /* pInBuf 必須為4字節 */
if (nInBufSize > 0)
bErr = GPIO_ClrAllPin(dwIoControlCode, *(DWORD *)pInBuf);
//RETAILMSG(TRUE, (TEXT("*(DWORD *)pInBuf is 0x%x).\r\n"), *(DWORD *)pInBuf));
break;
/*
* 讀取引腳電平狀態
*/
case IOCTL_GPIO_READ_PIN:
if ((nOutBufSize > 0) && (nInBufSize > 0))
{
bErr = GPIO_ReadPin(dwIoControlCode, *pInBuf, pOutBuf);
*pBytesReturned = 1;
}
break;
case IOCTL_GPIO_READ_ALL_PIN: /* pOutBuf 必須為2字節 */
if (nOutBufSize > 0)
{
bErr = GPIO_ReadAllPin(dwIoControlCode, (ushort *)pOutBuf, 1);
*pBytesReturned = 1;
}
break;
/*
* 使能引腳內部上拉
*/
case IOCTL_GPIO_EN_PULLUP: /* *pInBuf 為1字節 */
if (nInBufSize > 0)
bErr = GPIO_ConfigPullUp(dwIoControlCode, *pInBuf, TRUE);
break;
case IOCTL_GPIO_EN_MULTI_PIN_PULLUP: /* pInBuf 必須為4字節 */
if (nInBufSize > 0)
bErr = GPIO_ConfigMultiPinPullup(dwIoControlCode, *(DWORD *)pInBuf, TRUE);
break;
/*
* 禁止引腳內部上拉
*/
case IOCTL_GPIO_DIS_PULLUP:
if (nInBufSize > 0) /* *pInBuf 為1字節 */
bErr = GPIO_ConfigPullUp(dwIoControlCode, *pInBuf, FALSE);
break;
case IOCTL_GPIO_DIS_MULTI_PIN_PULLUP: /* pInBuf 必須為4字節 */
if (nInBufSize > 0)
bErr = GPIO_ConfigMultiPinPullup(dwIoControlCode, *(DWORD *)pInBuf, FALSE);
break;
default:
break;
}
} // PIO_IOControl
/*******************************************************************************************
函數名稱: PIO_Read
描 述: 讀取按鍵狀態
輸入參數: DWORD Handle : 驅動程序引用事例句柄
LPVOID pBuffer : 接收緩沖區
DWORD dwNumBytes: 要讀的字節數
輸出參數: 無
返 回: 實際讀到字節數
*******************************************************************************************/
DWORD PIO_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
return 0;
}
/*******************************************************************************************
函數名稱: PIO_Write
描 述: 寫函數,本驅動不支持
輸入參數:
輸出參數:
返 回:
*******************************************************************************************/
DWORD PIO_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
return 0;
}
/*******************************************************************************************
函數名稱: PIO_Seek
描 述: 對設備的數據指針進行操作,本驅動不支持該函數
輸入參數:
輸出參數:
返 回:
*******************************************************************************************/
DWORD PIO_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
return 0;
}
/*******************************************************************************************
函數名稱: PIO_PowerUp
描 述: 電源上電驅動處理函數
輸入參數:
輸出參數:
返 回: 無
*******************************************************************************************/
void PIO_PowerUp(void)
{
return;
}
/*******************************************************************************************
函數名稱: PIO_PowerDown
描 述: 電源下電驅動處理函數
輸入參數:
輸出參數:
返 回: 無
*******************************************************************************************/
void PIO_PowerDown(void)
{
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -