Atmel 9261 实现GPIO驱动的问题

6 views
Skip to first unread message

lyqgzce

unread,
Oct 28, 2009, 7:59:33 AM10/28/09
to gooogleman

芯片是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版本的,麻烦帮我看看大概是哪个地方出问题了,或者,给我些指导应该看些什么资料,谢谢。






看陆川杨幂新片《琴棋书画》,品网易3D国韵网游《天下贰》

阿旗

unread,
Oct 28, 2009, 8:26:53 AM10/28/09
to gooogleman嵌入式论坛, lyq...@163.com
最后,我定制了一个OS,在Third Party中加入了GPIO那一项但是,下载后测试GPIO控制失败,我认为是在加入驱动时出错了,
我是初学做wince驱动的,感觉这方面的资料很少,特别是CE6.0版本的,麻烦帮我看看大概是哪个地方出问题了,谢谢。


gooogleman

unread,
Oct 28, 2009, 8:54:27 AM10/28/09
to lyq...@163.com, gooogleman
你看有啥信息输出在dllentry 加入信息
在XXX_Init函数加入打印信息,这是加载驱动执行的
 
如果没有请检查是否打包进内核。
 
viebin nk.bin ——在命令行输入,慢慢来。

2009/10/28 lyqgzce <lyq...@163.com>



--
销售2440/6410/2450开发板,联系方式QQ:402955982,博客;http://blog.csdn.net/gooogleman
gooogleman嵌入式网店http://shop59480987.taobao.com/
技术支持论坛http://groups.google.com/group/gooogleman?hl=zh-CN
关于技术问题,请到上面论坛发帖,我邮箱会收到问题的。如果下次再有人问到相同的问题,就可以直接在论坛转发答案给他们了,好玩吧。我有信心可以把这个论坛搞好——靠大家的支持了!
关于技术问题,我会24小时之内回复(节假日除外),即使我不懂,但是我一定会看,帮顶,嘿嘿。
                                    gooogleman(wogoyixikexie@gliet)




截图1.jpg
Reply all
Reply to author
Forward
0 new messages