阅读:2952回复:18
驱动开发,赶快进来
一个简单的问题:
本人用platform builder4.0进行wince 下驱动程序开发,但不知过程怎样?比如说用pb 下 \\public\\common\\oak\\drivers\\serial\\ 下的文件为驱动程序的源代码,我要将这些源代码生成我的串口驱动程序,感觉有两种方法: 1、和pb下提供的驱动一样,将以上目录中的文件拷贝到我新建的目录中,修改 dirs和source 文件,使用cec edit工具,和pb下的cec文件一样,使用source 文件,并添入一些相关变量(不太明白这些变量什么意思)生成my.cec文件,将 my.cec 文件导入pb平台;打开pb,建立自己的平台之后,在catalog中选中自己的 feature 拖入到自己的平台中,在 platform.bib 文件中加入 my.dll 文件。编译整个平台。 2、先打开pb,建立自己的平台,(未加入任何自己的新东西)编译平台,之后使用 file 菜单下的新建工程,选 dll工程;写自己的驱动代码 ,编译自己的的 dll 工程生成 dll文件。再在 platform.bib 文件中加入 dll 文件。再重新编译整个平台。 应用程序使用 createfile()进行调用我的驱动程序。 不知以上两中方法哪一种正确? 不过,以上两中方法我都试了,都没有正确结果,不知为什么? 虽然写的有点长,但还是希望大家指点? 谢谢,一定给分! |
|
最新喜欢:sea110...
|
沙发#
发布于:2002-11-11 09:45
我使用的是第一种方法。
|
|
|
板凳#
发布于:2002-11-15 10:24
能否解释一下第一种成功的方法?
|
|
地板#
发布于:2002-11-15 15:03
第一种方法我试成功过。
先生成一个DLL,然后用CEC EDIT中的New driver from dll.cec 模板做自己的驱动,然后在Manage Catalog Features中调用你的 driver.cec,在你的平台里加入driver.dll,编译后就可以使用! |
|
地下室#
发布于:2002-12-01 20:10
继续讨论!
|
|
|
5楼#
发布于:2002-12-02 11:01
如何调用驱动?
|
|
6楼#
发布于:2002-12-03 16:58
以上讨论好象都没有讲到注册表,注册表可是驱动程序非常重要的一部分,不仅驱动程序加载需要用到,有些驱动程序更是把一些重要信息存放在此,比如中断、IOBASE等
To:xiaodai78 你所列的两种方法,只是把driver.dll编译出来和加到IMAGE里 你对注册表做过修改,以便系统启动时能够注册 并加载你的驱动程序吗?只有加载成功,才能用createfile()去打开。 你可以参考相同类型的驱动的注册表信息,在PLATFORM.REG文件里添加你的驱动的注册表信息。 To:snakelzh: 加载驱动程序有两种: 1、系统启动时自动加载,这需要把你的驱动的注册表写在[HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\]下面 2、通过应用程序加载,调用ActivateDevice(),在调用之前,也需要1中的添加注册表 在palmheart的driver版里有一个很简单的stream interface 驱动例子可以演示驱动的注册表信息和加载。 http://www.palmheart.net/bbs/showthread.php?s=&threadid=5656 [编辑 - 12/3/02 by joyfly] |
|
|
7楼#
发布于:2002-12-03 17:19
to joyfly :
谢谢你的解答,我明白了好多.以后还请多多指点. 我还要问一个问题: 驱动里想用中断,需要怎么配置呀?我看好象是要做一个中断服务程序,却不知怎么关联这个服务程序和中断号,在那里关联,注册表里需要怎么配置? 另外,我的驱动里用了一段物理内存,D0000-DFFFF共4K,是不是也要在注册表里配置一下呢?是直接将这段地址设置为 reserver吗? 谢谢,请到 嵌入式系统开发 里去领分! |
|
|
8楼#
发布于:2002-12-04 10:35
创建中断,需要两个步骤:
1、在OAL层创建和注册ISR。 在OEMInit()里调用HookInterrupt()在内核中注册ISR,把ISR的地址和物理IRQ关联起来。IRQ就是物理中断号,在BSP包带的头文件里都有定义。然后在OEMInterruptHandler()加入把IRQ翻译成逻辑中断的处理。 2、在驱动程序层创建IST,用InterruptInitialize()把IST和对应的逻辑中断关联起来,逻辑中断在oalintr.h里定义。 这是主要的步骤,实施细节你可以参考现有的OAL和驱动代码。 第2个问题,使用物理内存: 需要把物理内存0xD0000―0xDFFFF映射成内核空间的静态虚拟内存VirtualAddressBase + 0xD0000,VirtualAddressBase 在OEMAddressTable里定义,在系统引导时映射,一般RAM的VirtualAddressBase都是0x80000000。相信这一步已经做好了,你可以直接使用下面的步骤看行不行。 然后用pv =VirtualAlloc(length) length = 4k (must be pagesize*n),VirtualCopy(pv , VirtualAddressBase + 0xD000) 或者用MmMapIoSpace(VirtualAddressBase + 0xD000 , 4k) 将静态虚拟内存映射成进程空间的动态虚拟内存,才能在APPLICATION或DRIVER内访问(driver也是user-mode) 你可以搜索“OEMAddressTable”,观察代码,就能进一步理解了。 [编辑 - 12/4/02 by joyfly] |
|
|
9楼#
发布于:2002-12-06 21:32
创建中断,需要两个步骤:
1、在OAL层创建和注册ISR。 在OEMInit()里调用HookInterrupt()在内核中注册ISR,把ISR的地址和物理IRQ关联起来。IRQ就是物理中断号,在BSP包带的头文件里都有定义。然后在OEMInterruptHandler()加入把IRQ翻译成逻辑中断的处理。 2、在驱动程序层创建IST,用InterruptInitialize()把IST和对应的逻辑中断关联起来,逻辑中断在oalintr.h里定义。 这是主要的步骤,实施细节你可以参考现有的OAL和驱动代码。 ------------------------------------------------------- 能不能把第一步说清楚一点 OEMInit()在哪里可以找到呀,还是要在哪里调用这个函数? ISR是不是也有固定的格式?我看PB带的例子感觉好象是有固定模式的,对吗? 第二步我可以在PB里找到相关的例子,第一步就找不到了,不知需要在哪里进行一些修改? |
|
|
10楼#
发布于:2002-12-09 11:20
OAL层的代码在<bsp path>\\kernel\\HAL\\ 底下,你搜索一下你要找的就可以找到了。X86的OAL是在\\WINCE410\\PUBLIC\\COMMON\\OAK\\CSP\\I486\\OAL\\ 底下
|
|
|
11楼#
发布于:2002-12-09 17:20
X86的OAL是在\\WINCE410\\PUBLIC\\COMMON\\OAK\\CSP\\I486\\OAL\\ 底下
有好多文件,是 oeminit.asm 吗,但我看那是用汇编写的呀。 我搜索 OEMInit() 和 HookInterrupt(),都没有发现! 谢谢指点! 谢谢,请到 嵌入式系统开发 里去领分,200专家分! |
|
|
12楼#
发布于:2002-12-09 17:37
是fwpc.c等几个C文件里
我再研究一下吧,再给你个详细的说明。 分数就不用了,能用来做什么呢? 再说,我也就这个问题了解一些,也称不上专家啊 大家讨论,一起进步就好 |
|
|
13楼#
发布于:2002-12-10 12:46
我到是在 cfwpc.c里找到了 oeminit() 函数,却搞不清楚要怎么修改?
ISR 我暂时用的是 \\WINCE410\\PUBLIC\\COMMON\\OAK\\drivers\\ti1250\\ 下 ti1250isr 生成的一个 ti1250isr.dll。 能找到一个 例子最好不过了! 谢谢! |
|
|
14楼#
发布于:2002-12-11 21:34
大家请帮忙呀!
|
|
|
15楼#
发布于:2002-12-18 16:42
继续讨论!!!
|
|
|
16楼#
发布于:2002-12-31 14:54
我等的花都谢了 !!!
|
|
|
17楼#
发布于:2003-01-05 19:54
haha
把你的问题再精简描述一下吧 现在想问什么?! |
|
|
18楼#
发布于:2003-01-09 14:44
sorry,一直没有给你回复。
最近才有时间去看CODE。 ~~~~~~~ 1、在OAL层创建和注册ISR。 在OEMInit()里调用HookInterrupt()在内核中注册ISR,把ISR的地址和物理IRQ关联起来。IRQ就是物理中断号,在BSP包带的头文件里都有定义。然后在OEMInterruptHandler()加入把IRQ翻译成逻辑中断的处理。 ~~~~~~~~~~~~~~~~~~~~~ X86的OAL是在\\WINCE410\\PUBLIC\\COMMON\\OAK\\CSP\\I486\\OAL\\ 底下,观察fwpc.c: 在InitPics()里调用HookInterrupt(i, (void *)PeRPISR);注册ISR; PeRPISR()就是ISR函数。 |
|
|