S3C6410+WinCE+GPIO+流驱动+详细过程

本帖旨在列出编写6410+WinCE+GPIO+流驱动的详细过程。
参考了LED的源代码和几篇网贴,希望对有需要的有所帮助。
以GPP8-GPP13端口为例,此6个端口在OK6410B的USERIO INTERFACE均有引出,便于验证。
愿此贴出,众困休矣。


1. 添加GPIO新流驱动项
在drivers文件夹上点击右键
选择add->New Source Subproject->WCE Dynamic-Link Library在name框中输入XXX,下一步。
选择A simple Windows Embedded CE DLL subproject
完成。
2. 检查新建的GPIO流驱动是否添加成功
打开PLATFORM/SMDK6410/src/drivers/XXX文件夹
确认如下文件已存在makefile,source,StdAfx.cpp,StdAfx.h,XXX.cpp,XXX.def
打开PLATFORM/SMDK6410/src/drivers目录下的dirs文件,确认其中包括XXX
3. 修改makefile文件(PLATFORM/SMDK6410/src/drivers/XXX下)
右键文本方式打开
添加以下一行
!INCLUDE $(_MAKEENVROOT)/makefile.def
4. 修改sources文件(PLATFORM/SMDK6410/src/drivers/XXX下)
右键文本方式打开
在TARGETLIBS=添加以下内容
(_WINCEROOT)\PLATFORM\SMDK6410\lib\ARMV4I\retail\DriverLib.lib \
5. 修改XXX.def文件(PLATFORM/SMDK6410/src/drivers/XXX下)
右键文本方式打开
添加以下内容
LIBRARY XXX_DRV
EXPORTS XXX_Init
XXX_Deinit
XXX_Open
XXX_Close
XXX_Read
XXX_Write
XXX_Seek
XXX_PowerDown
XXX_PowerUp
XXX_IOControl
6. 编写GPIO流驱动头文件
如果操作的I/O端口较多,则需要定义较多的DWORD型变量dwIoControlCode
在PLATFORM/SMDK6410/src/drivers/XXX下新建XXX.h
在其中添加自定义的控制码,如下

#define	IOCTL_GIO_GPP8_ON	0x67707081
#define	IOCTL_GIO_GPP8_OFF	0x67707080
#define	IOCTL_GIO_GPP9_ON	0x67707091
#define	IOCTL_GIO_GPP9_OFF	0x67707090
#define	IOCTL_GIO_GPP10_ON	0x677070A1
#define	IOCTL_GIO_GPP10_OFF	0x677070A0
#define	IOCTL_GIO_GPP11_ON	0x677070B1
#define	IOCTL_GIO_GPP11_OFF	0x677070B0
#define	IOCTL_GIO_GPP12_ON	0x677070C1
#define	IOCTL_GIO_GPP12_OFF	0x677070C0
#define	IOCTL_GIO_GPP13_ON	0x677070D1
#define	IOCTL_GIO_GPP13_OFF	0x677070D0

7. 编写XXX.cpp
定义映射地址
static volatile S3C6410_GPIO_REG  *v_pIOPregs  ;
在初始化函数DWORD XXX_Init (LPCTSTR pContext, LPCVOID lpvBusContext)中建立映射关系

DWORD GIO_Init(LPCTSTR pContext, LPCVOID lpvBusContext) {
//Virtual address mapping
v_pIOPregs = (volatile S3C6410_GPIO_REG*)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_GPIO,
sizeof(S3C6410_GPIO_REG),
FALSE);
return 1;
}

在BOOL XXX_Deinit(DWORD hDeviceContext)函数中释放资源

BOOL GIO_Deinit(DWORD hDeviceContext) { 
	VirtualFree((PVOID)v_pIOPregs, 0, MEM_RELEASE);
	v_pIOPregs = NULL;
	return TRUE; 
}

在BOOL XXX_IOControl函数中添加操作方法

BOOL GIO_IOControl(DWORD Handle,
				   DWORD dwIoControlCode,
				   PBYTE pInBuf,
				   DWORD nInBufSize,
				   PBYTE pOutBuf,
				   DWORD nOutBufSize,
				   PDWORD pBytesReturned) {
					   
	switch (dwIoControlCode) {

		case IOCTL_GIO_GPP8_ON:	//GPP8 ON
			v_pIOPregs->GPPCON&=(~(0x03<<16));
			v_pIOPregs->GPPCON|=0x1<<16;
			v_pIOPregs->GPPDAT|=(0x01<<8);

			OutputDebugString(L"GPP8 On - GPIO Control\n"); 
			break;
		case IOCTL_GIO_GPP8_OFF:	//GPP8 OFF
			v_pIOPregs->GPPCON&=(~(0x03<<16));
			v_pIOPregs->GPPCON|=0x1<<16;
			v_pIOPregs->GPPDAT&=~(0x01<<8);

			OutputDebugString(L"GPP8 OFF - GPIO Control\n");
			break;

		case IOCTL_GIO_GPP9_ON:	//GPP9 ON
			v_pIOPregs->GPPCON&=(~(0x03<<18));
			v_pIOPregs->GPPCON|=0x1<<18;
			v_pIOPregs->GPPDAT|=(0x01<<9);

			OutputDebugString(L"GPP9 On - GPIO Control\n"); 
			break;
		case IOCTL_GIO_GPP9_OFF:	//GPP9 OFF
			v_pIOPregs->GPPCON&=(~(0x03<<18));
			v_pIOPregs->GPPCON|=0x1<<18;
			v_pIOPregs->GPPDAT&=~(0x01<<9);

			OutputDebugString(L"GPP9 OFF - GPIO Control\n");
			break;

		case IOCTL_GIO_GPP10_ON:	//GPP10 ON
			v_pIOPregs->GPPCON&=(~(0x03<<20));
			v_pIOPregs->GPPCON|=0x1<<20;
			v_pIOPregs->GPPDAT|=(0x01<<10);

			OutputDebugString(L"GPP10 On - GPIO Control\n"); 
			break;
		case IOCTL_GIO_GPP10_OFF:	//GPP10 OFF
			v_pIOPregs->GPPCON&=(~(0x03<<20));
			v_pIOPregs->GPPCON|=0x1<<20;
			v_pIOPregs->GPPDAT&=~(0x01<<10);

			OutputDebugString(L"GPP10 OFF - GPIO Control\n");
			break;

		case IOCTL_GIO_GPP11_ON:	//GPP11 ON
			v_pIOPregs->GPPCON&=(~(0x03<<22));
			v_pIOPregs->GPPCON|=0x1<<22;
			v_pIOPregs->GPPDAT|=(0x01<<11);

			OutputDebugString(L"GPP11 On - GPIO Control\n"); 
			break;
		case IOCTL_GIO_GPP11_OFF:	//GPP11 OFF
			v_pIOPregs->GPPCON&=(~(0x03<<22));
			v_pIOPregs->GPPCON|=0x1<<22;
			v_pIOPregs->GPPDAT&=~(0x01<<11);

			OutputDebugString(L"GPP11 OFF - GPIO Control\n");
			break;

		case IOCTL_GIO_GPP12_ON:	//GPP12 ON
			v_pIOPregs->GPPCON&=(~(0x03<<24));
			v_pIOPregs->GPPCON|=0x1<<24;
			v_pIOPregs->GPPDAT|=(0x01<<12);

			OutputDebugString(L"GPP12 On - GPIO Control\n"); 
			break;
		case IOCTL_GIO_GPP12_OFF:	//GPP12 OFF
			v_pIOPregs->GPPCON&=(~(0x03<<24));
			v_pIOPregs->GPPCON|=0x1<<24;
			v_pIOPregs->GPPDAT&=~(0x01<<12);

			OutputDebugString(L"GPP12 OFF - GPIO Control\n");
			break;

case IOCTL_GIO_GPP13_ON:	//GPP13 ON
			v_pIOPregs->GPPCON&=(~(0x03<<26));
			v_pIOPregs->GPPCON|=0x1<<26;
			v_pIOPregs->GPPDAT|=(0x01<<13);

			OutputDebugString(L"GPP13 On - GPIO Control\n"); 
			break;
		case IOCTL_GIO_GPP13_OFF:	//GPP13 OFF
			v_pIOPregs->GPPCON&=(~(0x03<<26));
			v_pIOPregs->GPPCON|=0x1<<26;
			v_pIOPregs->GPPDAT&=~(0x01<<13);

			OutputDebugString(L"GPP13 OFF - GPIO Control\n");
			break;
	}

	return TRUE;
}

8. 将新建的驱动加入编译环境中
打开\PLATFORM\SMDK6410\FILES文件夹
用文本编辑器打开platform.bib文件
加入如下语句
;------------- XXX Driver -------------------------------------------------------------
XXX.dll        $(_FLATRELEASEDIR)\XXX.dll                NK            SHK
;-------------------------------------------------------------------------------------------
用文本编辑器打开platform.reg文件
加入如下语句
;================= XXX ==================
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\XXX]
"Prefix"="XXX"
"Dll"="XXX.dll"
"Order"=dword:OO
"Index"=dword:1

9. 编译生成

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值