芯片是AT9261,Wince6.0系统。
我首先在G:\WINCE600\PLATFORM\AT91SAM9261EK_BIN\SRC\DRIVERS\下建立了一个文件夹IOLyq然后在此文件夹下建立了以下几个文件
IOLyq.cpp , IOLyq.def , IOLyq.reg , sources.cmn, makefile
文件内容分别为:
1.IOLyq.cpp
#include <windows.h>
#include <types.h>
#include <ceddk.h>
#include <memory.h>
#include <nkintr.h>
#include <pegdpar.h>
#include <ddkreg.h>
#include <Winuser.h>
#include "AT91SAM9261_oal_intr.h" //
#include "atmel_spi_ioctl.h"
#include "AT91SAM9261EK_ioctl.h" //
#include "at91sam9261_gpio.h"
#define GIO_WRITE0 CTL_CODE(FILE_DEVICE_SERIAL_PORT, 2059, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define GIO_WRITE1 CTL_CODE(FILE_DEVICE_SERIAL_PORT, 2060, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define GIO_READ CTL_CODE(FILE_DEVICE_SERIAL_PORT, 2061, METHOD_BUFFERED, FILE_ANY_ACCESS)
// 0
const struct pio_desc hw_pic20out[] =
{
{"OUT", AT91C_PIN_PC(20), 0, PIO_PULLUP, PIO_OUTPUT},
};
const struct pio_desc hw_pic20in[] =
{
{"OUT", AT91C_PIN_PC(20), 0, PIO_PULLUP, PIO_INPUT},
};
// 1
const struct pio_desc hw_pic21out[] =
{
{"OUT", AT91C_PIN_PC(21), 0, PIO_PULLUP, PIO_OUTPUT},
};
const struct pio_desc hw_pic21in[] =
{
{"OUT", AT91C_PIN_PC(21), 0, PIO_PULLUP, PIO_INPUT},
};
// 2
const struct pio_desc hw_pic22out[] =
{
{"OUT", AT91C_PIN_PC(22), 0, PIO_PULLUP, PIO_OUTPUT},
};
const struct pio_desc hw_pic22in[] =
{
{"OUT", AT91C_PIN_PC(22), 0, PIO_PULLUP, PIO_INPUT},
};
// 3
const struct pio_desc hw_pic23out[] =
{
{"OUT", AT91C_PIN_PC(23), 0, PIO_PULLUP, PIO_OUTPUT},
};
const struct pio_desc hw_pic23in[] =
{
{"OUT", AT91C_PIN_PC(23), 0, PIO_PULLUP, PIO_INPUT},
};
// 4
const struct pio_desc hw_pic24out[] =
{
{"OUT", AT91C_PIN_PC(24), 0, PIO_PULLUP, PIO_OUTPUT},
};
const struct pio_desc hw_pic24in[] =
{
{"OUT", AT91C_PIN_PC(24), 0, PIO_PULLUP, PIO_INPUT},
};
// 5
const struct pio_desc hw_pie18out[] =
{
{"OUT", AT91C_PIN_PE(18), 0, PIO_PULLUP, PIO_OUTPUT},
};
const struct pio_desc hw_pie18in[] =
{
{"OUT", AT91C_PIN_PE(18), 0, PIO_PULLUP, PIO_INPUT},
};
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//RETAILMSG(0,(TEXT("GIO Process Attach\r\n")));
break;
case DLL_THREAD_ATTACH:
//RETAILMSG(0,(TEXT("GIO Thread Attach\r\n")));
break;
case DLL_THREAD_DETACH:
//RETAILMSG(0,(TEXT("GIO Thread Detach\r\n")));
break;
case DLL_PROCESS_DETACH:
//RETAILMSG(0,(TEXT("GIO Process Detach\r\n")));
break;
}
return TRUE;
}
DWORD GIO_Init(LPCTSTR pContext,LPCVOID lpBusContext)
{
RETAILMSG(1,(TEXT("+GIO_Init\r\n")));
RETAILMSG(1,(TEXT("-GIO_Init\r\n")));
return(TRUE);
}
BOOL GIO_Deinit(LPCTSTR hDeviceContext)
{
return TRUE;
}
DWORD GIO_Open(LPCTSTR hDeviceContext,DWORD AccessCode,DWORD ShareMode)
{
return (DWORD)hDeviceContext;
}
DWORD GIO_Close(LPCTSTR pOpenContext)
{
return TRUE;
}
DWORD GIO_Write(LPCTSTR pOpenContext,LPCVOID pBuffer,DWORD Count)
{
return -1;
}
DWORD GIO_Read(LPCTSTR pOpenContext,LPCVOID pBuffer,DWORD Count)
{
return -1;
}
BOOL GIO_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
BOOL bError = FALSE;
RETAILMSG(1,(TEXT("+GIO_IOControl\r\n")));
switch(dwCode)
{
case GIO_READ:
switch(*pBufIn)
{
case 0:
pio_setup(hw_pic20in, sizeof(hw_pic20in)/sizeof(struct pio_desc));
*(DWORD *)pBufOut=(DWORD)(pio_get_value(AT91C_PIN_PC(20)));
break;
case 1:
pio_setup(hw_pic21in, sizeof(hw_pic21in)/sizeof(struct pio_desc));
*(DWORD*)pBufOut=(DWORD)(pio_get_value(AT91C_PIN_PC(21)));
break;
case 2:
pio_setup(hw_pic22in, sizeof(hw_pic22in)/sizeof(struct pio_desc));
*(DWORD *)pBufOut=(DWORD)(pio_get_value(AT91C_PIN_PC(22)));
break;
case 3:
pio_setup(hw_pic23in, sizeof(hw_pic23in)/sizeof(struct pio_desc));
*(DWORD *)pBufOut=(DWORD)(pio_get_value(AT91C_PIN_PC(23)));
break;
case 4:
pio_setup(hw_pic24in, sizeof(hw_pic24in)/sizeof(struct pio_desc));
*(DWORD *)pBufOut=(DWORD)(pio_get_value(AT91C_PIN_PC(24)));
break;
case 5:
pio_setup(hw_pie18in, sizeof(hw_pie18in)/sizeof(struct pio_desc));
*(DWORD *)pBufOut=(DWORD)(pio_get_value(AT91C_PIN_PE(18)));
break;
default:
break;
}
break;
case GIO_WRITE0:
switch(*pBufIn)
{
case 0:
pio_setup(hw_pic20out, sizeof(hw_pic20out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(20), 0);
break;
case 1:
pio_setup(hw_pic21out, sizeof(hw_pic21out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(21), 0);
break;
case 2:
pio_setup(hw_pic22out, sizeof(hw_pic22out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(22), 0);
break;
case 3:
pio_setup(hw_pic23out, sizeof(hw_pic23out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(23), 0);
break;
case 4:
pio_setup(hw_pic24out, sizeof(hw_pic24out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(24), 0);
break;
case 5:
pio_setup(hw_pie18out, sizeof(hw_pie18out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PE(18), 0);
break;
}
break;
case GIO_WRITE1:
switch(*pBufIn)
{
case 0:
pio_setup(hw_pic20out, sizeof(hw_pic20out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(20), 1);
break;
case 1:
pio_setup(hw_pic21out, sizeof(hw_pic21out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(21), 1);
break;
case 2:
pio_setup(hw_pic22out, sizeof(hw_pic22out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(22), 1);
break;
case 3:
pio_setup(hw_pic23out, sizeof(hw_pic23out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(23), 1);
break;
case 4:
pio_setup(hw_pic24out, sizeof(hw_pic24out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PC(24), 1);
break;
case 5:
pio_setup(hw_pie18out, sizeof(hw_pie18out)/sizeof(struct pio_desc));
pio_set_value(AT91C_PIN_PE(18),1);
break;
}
break;
}
RETAILMSG(1,(TEXT("-GIO_IOControl\r\n")));
return bError;
}
DWORD GIO_Seek(LPCTSTR pOpenContext,LPCVOID pBuffer,DWORD Count)
{
return -1;
}
2.IOLyq.def
;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
;
; Use of this source code is subject to the terms of the Microsoft end-user
; license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
; If you did not accept the terms of the EULA, you are not authorized to use
; this source code. For a copy of the EULA, please see the LICENSE.RTF on your
; install media.
;
LIBRARY IOLyq_LIB
EXPORTS
GIO_Init
GIO_Deinit
GIO_Open
GIO_Close
GIO_Read
GIO_Write
GIO_Seek
GIO_IOControl
3.IOLyq.reg
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IO]
"Prefix"="GIO"
"Index"=dword:1
"Dll"="IOLyq.dll"
"Order"=dword:12
4.sources.cmn
!if 0
Copyright (c) 2005. Atmel Electronics, co. ltd. All rights reserved.
!endif
!if 0
Use of this source code is subject to the terms of the Microsoft end-user
license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
If you did not accept the terms of the EULA, you are not authorized to use
this source code. For a copy of the EULA, please see the LICENSE.RTF on your
install media.
!endif
RELEASETYPE=PLATFORM //发布类型,BSP包中的一个驱动
TARGETNAME=IOLyq //驱动动态库名称
TARGETTYPE=DYNLINK //目标类型:动态库
DLLENTRY=DllMain //动态库入库函数名称
SOURCES=IOLyq.cpp \
TARGETLIBS= \
$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \
SOURCELIBS= \
$(_TARGETPLATROOT)\lib\$(_CPUDEPPATH)\gpio.lib \
MSC_WARNING_LEVEL = $(MSC_WARNING_LEVEL) /W3 /WX
INCLUDES= $(_TARGETPLATROOT)\SRC\inc;$(_COMMONOAKROOT)\inc;$(INCLUDES)
5.makefile
!INCLUDE $(_MAKEENVROOT)\makefile.def
然后,我更改了以下文件:
1). 在G:\WINCE600\PLATFORM\AT91SAM9261EK_BIN\CATALOG下打开AT91SAM9261EK_BIN.pbcxml,然后添加GPIO驱动的选项,首先找到<BSP>…</BSP>并在里面添加下面一行:
<BspItemId>Item:Cirrus Logic:bsp_atmel9261_gpio_at9261_at9261</BspItemId>
然后在< CatalogFile >…</CatalogFile>中添加下面的驱动描述:
<Item Id="Item:Cirrus Logic:bsp_atmel9261_gpio_at9261_at9261">
<Title>GPIO</Title>
<Description>GPIO Driver</Description>
<Type>BspSpecific</Type>
<Variable>BSP_ATMEL9261_GPIO</Variable>
<Location>Device Drivers</Location>
<SourceCode>
<Title>$(_WINCEROOT)\PLATFORM\AT91SAM9261EK_BIN\SRC\DRIVERS\IOLyq</Title>
<Path>$(_WINCEROOT)\PLATFORM\AT91SAM9261EK_BIN\SRC\DRIVERS\IOLyq</Path>
</SourceCode>
</Item>
上面实际上添加了GPIO驱动,环境变量为BSP_ATMEL9261_GPIO,源代码位于路径”\SRC\DRIVERS\IOLyq”下面。
2)添加驱动模块到NK中
打开”files\”目录下的platform.bib文件,添加如下内容:
IF BSP_ATMEIL9261_GPIO
IOLyq.dll $(_FLATRELEASEDIR)\IOLyq.dll NK SHK
ENDIF
最后,我定制了一个OS,在Third Party中加入了GPIO那一项,(如下图,感觉此项有些不对)

但是,下载后测试GPIO控制失败,我认为是在加入驱动时出错了,另外,我点生成->open release directory in build Window 后切换至G:\WINCE600\PLATFORM\AT91SAM9261EK_BIN\SRC\DRIVERS 目录 然后 输入build 回车,结果在IOLyq目录下生成了build.log文件内容如下:
BUILD: [Thrd:Sequence:Type ] Message
BUILD: [00:0000000000:PROGC ] Build started with parameters:
BUILD: [00:0000000001:PROGC ] Build started in directory: G:\WINCE600\PLATFORM\AT91SAM9261EK_BIN\SRC\DRIVERS\IOLyq
BUILD: [00:0000000002:PROGC ] Checking for G:\WINCE600\sdk\bin\i386\srccheck.exe.
BUILD: [00:0000000003:PROGC ] Running passes WCEFILES0, MIDL, MC, ASN, THUNK, PRECOMPHEADER, COMPILE, LIB, LINK, MANAGEDRESX, MANAGEDMOD, MANAGEDDLL, MANAGEDEXE, MANAGEDWIN for ARM.
BUILD: [00:0000000004:PROGC ] Loading database "G:\WINCE600\PLATFORM\AT91SAM9261EK_BIN\SRC\DRIVERS\IOLyq\Build.dat".
BUILD: [00:0000000005:PROGC ] Done.
BUILD: [00:0000000006:PROGC ] Computing include file dependencies:
BUILD: [00:0000000007:PROGC ] Checking for SDK include directory: G:\WINCE600\sdk\CE\inc.
BUILD: [00:0000000008:PROGC ] Done.
BUILD: [00:0000000009:PROGC ] Files Warnings Errors
BUILD: [00:0000000010:PROGC ] Midl 0 0 0
BUILD: [00:0000000011:PROGC ] Message 0 0 0
BUILD: [00:0000000012:PROGC ] Precomp Header 0 0 0
BUILD: [00:0000000013:PROGC ] Resource 0 0 0
BUILD: [00:0000000014:PROGC ] MASM 0 0 0
BUILD: [00:0000000015:PROGC ] SHASM 0 0 0
BUILD: [00:0000000016:PROGC ] ARMASM 0 0 0
BUILD: [00:0000000017:PROGC ] MIPSASM 0 0 0
BUILD: [00:0000000018:PROGC ] C++ 0 0 0
BUILD: [00:0000000019:PROGC ] C 0 0 0
BUILD: [00:0000000020:PROGC ] Static Libraries 0 0 0
BUILD: [00:0000000021:PROGC ] Exe's 0 0 0
BUILD: [00:0000000022:PROGC ] Dll's 0 0 0
BUILD: [00:0000000023:PROGC ] Preprocess deffile 0 0 0
BUILD: [00:0000000024:PROGC ] Resx 0 0 0
BUILD: [00:0000000025:PROGC ] CSharp Compile 0 0 0
BUILD: [00:0000000026:PROGC ] Other 0 0 0
BUILD: [00:0000000027:PROGC ]
BUILD: [00:0000000028:PROGC ] Total 0 0 0
BUILD: [00:0000000029:PROGC ]
BUILD: [00:0000000030:PROGC ] 0 Warnings, 0 Errors
BUILD: [00:0000000031:PROGC ] GetSystemTimes (seconds): Idle: 0 Kernel: 0 User: 0
BUILD: [00:0000000032:PROGC ] Elapsed time (seconds): 0
我是初学做wince驱动的,感觉这方面的资料很少,特别是CE6.0版本的,麻烦帮我看看大概是哪个地方出问题了,或者,给我些指导应该看些什么资料,谢谢。