xiaodai78
驱动牛犊
驱动牛犊
  • 注册日期2002-09-30
  • 最后登录2002-11-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2952回复:18

驱动开发,赶快进来

楼主#
更多 发布于:2002-10-30 22:57
一个简单的问题:
本人用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()进行调用我的驱动程序。

不知以上两中方法哪一种正确?

不过,以上两中方法我都试了,都没有正确结果,不知为什么?

虽然写的有点长,但还是希望大家指点?

谢谢,一定给分!

最新喜欢:

sea1102sea110...
努力努力再努力!
yiduz
驱动小牛
驱动小牛
  • 注册日期2001-04-28
  • 最后登录2003-10-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-11 09:45
我使用的是第一种方法。
ydzhang
rainmanzhang
驱动牛犊
驱动牛犊
  • 注册日期2002-11-12
  • 最后登录2003-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-15 10:24
能否解释一下第一种成功的方法?
y9387
驱动牛犊
驱动牛犊
  • 注册日期2002-07-19
  • 最后登录2007-09-20
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-15 15:03
第一种方法我试成功过。
先生成一个DLL,然后用CEC EDIT中的New driver from dll.cec
模板做自己的驱动,然后在Manage Catalog Features中调用你的
driver.cec,在你的平台里加入driver.dll,编译后就可以使用!
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-01 20:10
继续讨论!
努力!
snakelzh
驱动牛犊
驱动牛犊
  • 注册日期2002-12-02
  • 最后登录2002-12-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-02 11:01
如何调用驱动?
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
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]
www.cnemb.com
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-03 17:19
to joyfly :
   谢谢你的解答,我明白了好多.以后还请多多指点.
   我还要问一个问题:
   驱动里想用中断,需要怎么配置呀?我看好象是要做一个中断服务程序,却不知怎么关联这个服务程序和中断号,在那里关联,注册表里需要怎么配置?
   另外,我的驱动里用了一段物理内存,D0000-DFFFF共4K,是不是也要在注册表里配置一下呢?是直接将这段地址设置为 reserver吗?
   谢谢,请到 嵌入式系统开发  里去领分!
 
努力!
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
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]
www.cnemb.com
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
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里找到相关的例子,第一步就找不到了,不知需要在哪里进行一些修改?
努力!
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-09 11:20
OAL层的代码在<bsp path>\\kernel\\HAL\\ 底下,你搜索一下你要找的就可以找到了。X86的OAL是在\\WINCE410\\PUBLIC\\COMMON\\OAK\\CSP\\I486\\OAL\\ 底下
www.cnemb.com
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-09 17:20
X86的OAL是在\\WINCE410\\PUBLIC\\COMMON\\OAK\\CSP\\I486\\OAL\\ 底下
有好多文件,是 oeminit.asm 吗,但我看那是用汇编写的呀。
我搜索 OEMInit() 和 HookInterrupt(),都没有发现!
  谢谢指点!
谢谢,请到 嵌入式系统开发 里去领分,200专家分!
努力!
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-09 17:37
是fwpc.c等几个C文件里
我再研究一下吧,再给你个详细的说明。

分数就不用了,能用来做什么呢?
再说,我也就这个问题了解一些,也称不上专家啊
大家讨论,一起进步就好
www.cnemb.com
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-10 12:46
我到是在 cfwpc.c里找到了 oeminit() 函数,却搞不清楚要怎么修改?
ISR 我暂时用的是 \\WINCE410\\PUBLIC\\COMMON\\OAK\\drivers\\ti1250\\
下 ti1250isr 生成的一个 ti1250isr.dll。
能找到一个 例子最好不过了!
谢谢!
努力!
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-11 21:34
大家请帮忙呀!
努力!
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-18 16:42
继续讨论!!!
努力!
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-31 14:54
我等的花都谢了 !!!
努力!
zheng2002
驱动中牛
驱动中牛
  • 注册日期2002-04-17
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-01-05 19:54
haha
把你的问题再精简描述一下吧
现在想问什么?!
qq:14459938 email:zheng2002@21cn.com RH9 kernel 2.4.20
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
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函数。


www.cnemb.com
游客

返回顶部