/****************************************Copyright (c)**************************************************
** design: xdj 2008.5.30 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 驱动
**
**------------------------------------------------------------------------------------------------------
** Created By: MingYuan Zheng 郑明远
** 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 <memory.h>
////#include <excpt.h>
////#include <clocks.h>
//#include <s3c2410x.h> xdj delet
#include "gpio.h"
#define PRIVATE static
#define PUBLIC
//XDJ ADD
//#define PHYSADDR 0X80840000
//#define PHYSADDR ((PVOID)0X80840000) //xdj add (PVOID)
#define SIZE (4*1024)
//XDJ DEL
//#define ADDRESS_INTERVAL_GPIO 0x04
//XDJ ADD
#define ADDRESS_INTERVAL_GPIO 0x02
#define GPx_GPA 0
/* GPIO 寄存器对应的虚拟地址 */
//xdj del 6.14
PRIVATE volatile IOPreg *v_pIOPregs;
//xdj add 6.14
//PVOID v_pIOPregs;
PRIVATE g_OpenCount = 0; /* 驱动打开计数器 */
/*******************************************************************************************
函数名称: PIO_InitializeAddresses
描 述: 取得相关寄存器的虚拟地址
输入参数: 无
输出参数: 无
返 回: > 0 分配到的虚拟地址; FALSE: 失败
*******************************************************************************************/
PRIVATE BOOL PIO_InitializeAddresses(void)
{
BOOL RetValue = TRUE;
// IO Register Allocation 6.14
//xdj del
v_pIOPregs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
//xdj add 6.14
//v_pIOPregs = VirtualAlloc(0, SIZE, MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPregs == NULL)
{
ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
RetValue = FALSE;
}
else
{
ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc success!\r\n")));// xdj add
// xdj del 6.14
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE >> 8), sizeof(IOPreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
//xdj add
// if (!VirtualCopy(v_pIOPregs, (PVOID)(PHYSADDR>>8), SIZE, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
else
ERRORMSG(1,(TEXT("For IOPregs : VirtualCopy success!\r\n")));// xdj add
}
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;
}
else
RETAILMSG (1, (TEXT("::: PIO_InitializeAddresses - Success!!\r\n") )); //xdj ad RetValue = TRUE;
return(RetValue);
}
/*******************************************************************************************
函数名称: PIO_Init
描 述: 驱动程序初始化函数
输入参数: DWORD dwContext: 设备管理器传递给本驱动的参数, 通常为流接口驱动在注册表内的位置
输出参数: 无
返 回: 驱动程序句柄
*******************************************************************************************/
PUBLIC DWORD PIO_Init(DWORD dwContext)
{
RETAILMSG (1, (TEXT("::: PIO_Init.\r\n") )); //XDJ ADD
PIO_InitializeAddresses();
g_OpenCount = 0;
return (DWORD)1;
}
/*******************************************************************************************
函数名称: DllEntry
描 述: 驱动程序动态库入口
输入参数:
输出参数:
返 回:
*******************************************************************************************/
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);
}
/*******************************************************************************************
函数名称: PIO_Close
描 述: 驱动程序关闭函数
输入参数: DWORD Handle:驱动程序引用事例句柄
输出参数: 无
返 回: FALSE: 失败 TRUE: 成功
*******************************************************************************************/
BOOL PIO_Close(DWORD Handle)
{
RETAILMSG (1, (TEXT("::: PIO_close.\r\n") )); //XDJ ADD
g_OpenCount = 0;
return TRUE;
}
/*******************************************************************************************
函数名称: PIO_Deinit
描 述: 驱动程序卸载函数
输入参数: DWORD dwContext: 驱动程序句柄
输出参数: 无
返 回: FALSE: 失败 TRUE: 成功
*******************************************************************************************/
BOOL PIO_Deinit(DWORD dwContext)
{
RETAILMSG (1, (TEXT("::: PIO_Deinit.\r\n") )); //XDJ ADD
g_OpenCount = 0;
if (v_pIOPregs)
VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE); /* 释放申请的虚拟空间 */
return TRUE;
}
/*******************************************************************************************
函数名称: PIO_Open
描 述: 打开驱动程序
输入参数: DWORD dwData : 设备驱动程序句柄
DWORD dwAccess : 访问请求代码,是读和写的组合
DWORD dwShareMode: 共享模式
输出参数:
返 回: 驱动程序引用事例句柄
*******************************************************************************************/
DWORD PIO_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
RETAILMSG (1, (TEXT("::: PIO_open.\r\n") )); //XDJ ADD
if (g_OpenCount > 0)
return 0;
g_OpenCount++;
return g_OpenCount; /* 返回一个不为零的数 */
}
// 定义 S3C2410 GPA ~ GPH 引脚个数
// A B C D E F G H
const BYTE PinNumTbl[8] = {23, 11, 16, 16, 16, 8, 16, 11};
/*******************************************************************************************
函数名称: GPIO_SetPinOut
描 述: 设置某个引脚为输出引脚
输入参数: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO组, 如GPA, GPB
BYTE PinNum : 引脚编号, 如 GPB1, 则值为 1
输出参数:
返 回: 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;
//}
//xdj add
/*******************************************************************************************
函数名称: GPIO_SetPinOut
描 述: 设置某个引脚为输出引脚
输入参数: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO组, 如GPA, GPB
BYTE PinNum : 引脚�