WINCE5.0增加SPI流设备驱动的步骤说明

 

WINCE5.0增加SPI流设备驱动的步骤说明

一:流驱动只是简单介绍

1、Win CE下的SPI驱动属于流驱动,流驱动是能够导出流接口函数的驱动程序。SPI驱动是一个动态链接库(DLL),可以被加载到内核空间,成为内核模式驱动。当应用程序需要读取底层的物理器件输出时,就必须通过操作系统内核来加载特定的设备驱动程序,通过驱动程序来与底层的硬件进行通信,然后将读取信息传入应用程序中。

 

2、WinCE设备驱动程序开发中最重要的是设备相关寄存器的配置。寄存器的配置包括将寄存器地址映射到内核进程的虚拟地址,在串口操作的不同阶段配置好各种寄存器。基于Win CE设备流驱动程序的开发,不管是什么设备,它们的实现框架都是相同的,只要把相关流接口实现即可。下面介绍几个常用的函数和测试操作。

 

3、DllEntry()函数

该函数是动态链接库的入口,每个动态链接库都需要输出这个函数,但它只在动态库被加载和卸载时才被调用,它是每个动态链接库最早被调用的函数,一般用它做一些全局变量的初始化。

 

4、SPI_Init()函数
   该函数是驱动程序动态库被成功装载后第一个被调用的函数。它的调用时间仅次于DllEntry()函数,驱动程序应当在这个函数中初始化硬件,如果初始化成功,就分配一个自己的内存空间,将自己的状态保存起来,并且将该内存块的地址作为一个DWORD值返回给上层。设备管理器就会在调用SPI_Open()时将该句柄传回。如果初始化失败,则返回零以通知这个驱动程序没有加载成功,先前所分配的系统资源应该全部释放,此程序的生命即告终止。初始化软件流程如图所示。

5、SPI_Open()函数和SPI_Close()函数
       当用户程序调用CreateFile()打开这个设备时,设备管理器就会讽用此驱动程序的SPI_Open()函数。当用户程序调用CloseHandle()关闭这个设备时,SPI_Close()函数就会被设备管理器调用。参数hOpenContext是SPI_Open()返回给上层的那个值。SPI_Close()函数应该做与SPI_Open()相反的事情,具体包括释放SPI_Open()分配的内存,将驱动程序被打开的计数减少等。

 

 

6、SPI_IOControl()
    几乎一个驱动程序的所有功能都可以在这个函数中实现。对于一类CE自身已经支持的设备,它们已经被定义了一套I/O操作,只需按照各类设备已经定义的内容去实现所有的I/O操作。当要实现一个自定义的设备时,就可以随心所欲定义自已的I/O操作。

 

二:静态集成流驱动的步骤

1、在目录DriverDir下建立一个新的目录SPI。

 

2、在SPI 目录下新建makefile,SPI.c,SPI.h,SPI.def,sources五个文件,SPI.c,SPI.h 为驱动的实现文件,其余各自内容如下:

Makefile:

!INCLUDE $(_MAKEENVROOT)\makefile.def

 

Sources:

TARGETNAME=S3C_SPI

TARGETTYPE=DYNLINK

RELEASETYPE=PLATFORM

DLLENTRY=DllMain

DEFFILE=SPI.def

TARGETLIBS= \

  $(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \

  $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib \

 

SOURCES= \

  SPI.c \

FILE_VIEW_INCLUDES_FOLDER= \

FILE_VIEW_ROOT_FOLDER= \

 

SPI.def

LIBRARY S3C_SPI

EXPORTS SPI_Init

       SPI_Deinit

       SPI_Open

       SPI_Close

       SPI_Read

       SPI_Write

       SPI_Seek

       SPI_IOControl

       SPI_PowerDown

       SPI_PowerUp

 

3、流驱动是由设备管理器(device.exe)来管理的。当系统启动时,设备管理器被加载到内核中,由它全程监控驱动程序的执行过程。设备管理器通过调用ActivateDeviceEx()函数来加载指定的驱动,而该函数的第一个参数是一个注册表路径,这就要求驱动程序被加载的一个必要条件是把自己的信息记录在注册表中。因此需在Platform.reg中添加如下内容:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPI]

       "Index"=dword:1

       "Prefix"="SPI"

       "Dll"="S3C_SPI.dll"

       "Order"=dword:0

 

4、在platform.bib中增加了以下内容:

S3C_SPI.dll  $(_FLATRELEASEDIR)\S3C_SPI.dll     NK  SH      

 

三:动态加载流驱动的步骤

1、单独编译该驱动程序,生成S3C_SPI.dll。

 

2、自己写一个注册表文件SPI.reg,内容如上。

 

3、将S3C_SPI.dll,SPI.reg跟DM_ARMV4I_V2.8.exe一起拷贝到设备的根目录下。

 

4、运行DM_ARMV4I_V2.8.exe,注册表->导入->选择->SPI.reg->移动光标定位到导入的SPI.reg->驱动调试->激活驱动,则将驱动程序加载成功(就是调用了ActiveDeviceEx激活驱动)。

 

5、写测试程序进行验证,确保程序已经加载成功,代码简单如下:

打开设备

hSPI1 = CreateFile(_T("SPI1:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

写入数据

DeviceIoControl(hSPI1,SPI_ICOTL_READ,NULL,0,bTemp,sizeof(bTemp),&nOutput,NULL));

读取数据

DeviceIoControl(hSPI1,SPI_ICOTL_WRITE,bTemp,sizeof(bTemp),NULL,0,&nOutput,NULL));

 

四:添加一个BSP跟OS的步骤

1、重新创建一个BSP的步骤如下:

打开Platform Builder 5.0->Platform->BSP Wizard->Clone an existring BSP->输入.cec文件名及存放目录。

2、重新创建一个PBWorkspace 与BSP对应的步骤如下:

拷贝PBWorkspaces下的目录至当前目录,修改目录名为要创建的工程,修改新创建的目录下的*.pbxml中的关键字即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值