?? gpio.c
字號:
/****************************************Copyright (c)**************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: gpio.c
** Last modified Date: 2006-10-09
** Last Version: V1.0
** Description: S3C2410 GPIO 驅(qū)動
**
**------------------------------------------------------------------------------------------------------
** Created By: MingYuan Zheng 鄭明遠(yuǎn)
** Created date: 2006-10-09
** Version: V1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#include <windows.h>
#include <types.h>
#include <excpt.h>
#include <tchar.h>
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#include <devload.h>
#include <diskio.h>
#include <nkintr.h>
#include <windev.h>
#include <Pkfuncs.h>
#include <s3c2410x.h>
#include "gpio.h"
#define PRIVATE static
#define PUBLIC
/* GPIO 寄存器對應(yīng)的虛擬地址 */
PRIVATE volatile S3C2410X_IOPORT_REG * v_pIOPregs;
PRIVATE g_OpenCount = 0; /* 驅(qū)動打開計數(shù)器 */
#define ADDRESS_INTERVAL_GPIO 0x04
#define GPx_GPA 0
/*******************************************************************************************
函數(shù)名稱: PIO_InitializeAddresses
描 述: 取得相關(guān)寄存器的虛擬地址
輸入?yún)?shù): 無
輸出參數(shù): 無
返 回: > 0 分配到的虛擬地址; FALSE: 失敗
*******************************************************************************************/
PRIVATE BOOL PIO_InitializeAddresses(void)
{
BOOL RetValue = TRUE;
// IO Register Allocation
v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPregs == NULL)
{
ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2410X_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2410X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
}
if (!RetValue)
{
RETAILMSG (1, (TEXT("::: PIO_InitializeAddresses - Fail!!\r\n") ));
if (v_pIOPregs)
{
VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
}
v_pIOPregs = NULL;
RetValue = FALSE;
return RetValue;
}
return(RetValue);
}
/*******************************************************************************************
函數(shù)名稱: PIO_Init
描 述: 驅(qū)動程序初始化函數(shù)
輸入?yún)?shù): DWORD dwContext: 設(shè)備管理器傳遞給本驅(qū)動的參數(shù), 通常為流接口驅(qū)動在注冊表內(nèi)的位置
輸出參數(shù): 無
返 回: 驅(qū)動程序句柄
*******************************************************************************************/
PUBLIC DWORD PIO_Init(DWORD dwContext)
{
PIO_InitializeAddresses();
g_OpenCount = 0;
return (DWORD)1;
}
/*******************************************************************************************
函數(shù)名稱: DllEntry
描 述: 驅(qū)動程序動態(tài)庫入口
輸入?yún)?shù):
輸出參數(shù):
返 回:
*******************************************************************************************/
PUBLIC BOOL WINAPI
DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch ( dwReason )
{
case DLL_PROCESS_ATTACH:
RETAILMSG(1, (TEXT("PIO: DLL_PROCESS_ATTACH\r\n")));
DisableThreadLibraryCalls((HMODULE) hInstDll);
break;
case DLL_PROCESS_DETACH:
RETAILMSG(1, (TEXT("PIO: DLL_PROCESS_DETACH\r\n")));
break;
}
return (TRUE);
}
/*******************************************************************************************
函數(shù)名稱: PIO_Close
描 述: 驅(qū)動程序關(guān)閉函數(shù)
輸入?yún)?shù): DWORD Handle:驅(qū)動程序引用事例句柄
輸出參數(shù): 無
返 回: FALSE: 失敗 TRUE: 成功
*******************************************************************************************/
BOOL PIO_Close(DWORD Handle)
{
g_OpenCount = 0;
return TRUE;
}
/*******************************************************************************************
函數(shù)名稱: PIO_Deinit
描 述: 驅(qū)動程序卸載函數(shù)
輸入?yún)?shù): DWORD dwContext: 驅(qū)動程序句柄
輸出參數(shù): 無
返 回: FALSE: 失敗 TRUE: 成功
*******************************************************************************************/
BOOL PIO_Deinit(DWORD dwContext)
{
g_OpenCount = 0;
if (v_pIOPregs)
VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE); /* 釋放申請的虛擬空間 */
return TRUE;
}
/*******************************************************************************************
函數(shù)名稱: PIO_Open
描 述: 打開驅(qū)動程序
輸入?yún)?shù): DWORD dwData : 設(shè)備驅(qū)動程序句柄
DWORD dwAccess : 訪問請求代碼,是讀和寫的組合
DWORD dwShareMode: 共享模式
輸出參數(shù):
返 回: 驅(qū)動程序引用事例句柄
*******************************************************************************************/
DWORD PIO_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
if (g_OpenCount > 0)
return 0;
g_OpenCount++;
return g_OpenCount; /* 返回一個不為零的數(shù) */
}
// 定義 S3C2410 GPA ~ GPH 引腳個數(shù)
// A B C D E F G H
const BYTE PinNumTbl[8] = {23, 11, 16, 16, 16, 8, 16, 11};
/*******************************************************************************************
函數(shù)名稱: GPIO_SetPinOut
描 述: 設(shè)置某個引腳為輸出引腳
輸入?yún)?shù): DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號, 如 GPB1, 則值為 1
輸出參數(shù):
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_SetPinOut(DWORD dwIoControlCode, BYTE PinNum)
{
DWORD GPx;
volatile DWORD *pRegCON; // GPxCON's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
if (PinNum >= PinNumTbl[GPx]) return FALSE;
pRegCON = (DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO;
if (GPx != GPx_GPA)
{
*pRegCON &= ~(0x03 << (PinNum * 2));
*pRegCON |= (0x01 << (PinNum * 2));
}
else
*pRegCON &= ~(0x01 << PinNum);
return TRUE;
}
/*******************************************************************************************
函數(shù)名稱: GPIO_SetMultiPinOut
描 述: 設(shè)置多個引腳為輸出引腳
輸入?yún)?shù): DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號掩碼, 如操作 GPB1,GPB3, 則值為: (0x01 << 1) + (0x01 << 3)
輸出參數(shù):
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_SetMultiPinOut(DWORD dwIoControlCode, DWORD PinMask)
{
DWORD GPx, i;
volatile DWORD *pRegCON; // GPXCON's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
pRegCON = (DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO;
for (i = 0; i < PinNumTbl[GPx]; i++)
{
if (PinMask & (0x01 << i))
{
if (GPx != GPx_GPA)
{
*pRegCON &= ~(0x03 << (i * 2));
*pRegCON |= (0x01 << (i * 2));
}
else
*pRegCON &= ~(0x01 << i);
}
}
return TRUE;
}
/*******************************************************************************************
函數(shù)名稱: GPIO_SetPinIn
描 述: 設(shè)置某個引腳為輸入引腳
輸入?yún)?shù): DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號, 如 GPB1, 則值為 1
輸出參數(shù):
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_SetPinIn(DWORD dwIoControlCode, BYTE PinNum)
{
DWORD GPx;
volatile DWORD *pRegCON; // GPXCON's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
if (GPx == GPx_GPA) return FALSE; // GPA output only
if (PinNum >= PinNumTbl[GPx]) return FALSE;
pRegCON = (DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO;
PinNum = PinNum * 2;
*pRegCON &= ~(0x03 << PinNum);
return TRUE;
}
/*******************************************************************************************
函數(shù)名稱: GPIO_SetMultiPinIn
描 述: 設(shè)置多個引腳為輸入引腳
輸入?yún)?shù): DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號掩碼, 如操作 GPB1,GPB3, 則值為: (0x01 << 1) + (0x01 << 3)
輸出參數(shù):
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_SetMultiPinIn(DWORD dwIoControlCode, DWORD PinMask)
{
DWORD GPx, i;
volatile DWORD *pRegCON; // GPXCON's address
GPx = dwIoControlCode & IOCTL_GPX_MASK;
if (GPx == GPx_GPA) return FALSE; // GPA output only
pRegCON = (DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO;
for (i = 0; i < PinNumTbl[GPx]; i++)
{
if (PinMask & (0x01 << i))
*pRegCON &= ~(0x03 << (i * 2));
}
return TRUE;
}
/*******************************************************************************************
函數(shù)名稱: GPIO_SetPin
描 述: 設(shè)置某個引腳輸出高電平
輸入?yún)?shù): DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號, 如 GPB1, 則值為 1
輸出參數(shù):
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_SetPin(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);
*pRegDAT |= (0x01 << PinNum);
return TRUE;
}
/*******************************************************************************************
函數(shù)名稱: GPIO_SetAllPin
描 述: 設(shè)置多個引腳輸出高電平
輸入?yún)?shù): DWORD dwIoControlCode : I/O control code, 指出操作的GPIO組, 如GPA, GPB
BYTE PinNum : 引腳編號掩碼, 如操作 GPB1,GPB3, 則值為: (0x01 << 1) + (0x01 << 3)
輸出參數(shù):
返 回: TRUE: 操作成功 FALSE: 操作失敗
*******************************************************************************************/
BOOL GPIO_SetAllPin(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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -