wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1202回复:9

求教关于OEMInterruptxxx函数(wxl_50685330请进)

楼主#
更多 发布于:2004-12-03 16:40
我用的板子是x86架构的,我现在正在写单片驱动,有几个问题想请教大侠:

(1)如果我想在OEMInterruptxxx函数中实现对我的设备开/关中断的话,那么我是不是应该在这个c文件(好像是cfwpc.c)中定义一个全局变量来保存我设备的地址啊?(这个地址应该可由InterruptInitialize函数传递)
这几个函数是:
OEMInterruptEnable, OEMInterruptDisable,OEMInterruptDone

(2)如果我不想在我的驱动中通过调用LoadIntChainHandler来安装ISR, 而是想在OEMinit函数中利用HookInterrupt来安装我的ISR,那么这时我的ISR函数是不是可以直接定义在cfwpc.c文件里面?(或者定义在另一个文件中)。

(3)续问题(2),如果这样的话,那么我的ISR和我的驱动之间怎么进行数据通信啊?(我知道在ISR中最好不要进行数据处理,我说的是如果需要的话)


我的问题是不是很多?很罗嗦?? :mad:

[编辑 -  12/3/04 by  wwei_wang]
Come on, let us drive the world.
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-06 09:19
如果只是实现在ISR中设备的开关的话,只是设置GPIO的电平高低就行了吧,就不用写IST了,直接在ISR中就解决了,OemInterruptEnable这样的函数也不用了,只是处理个GPIO中断
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-06 09:33
谢谢楼上兄弟,不过你可能误会了。
其实我的IST中有很多事情要做的。我的问题的出发点是如何使用和实现OEMInterruptxxx以及用HookInterrupt这些函数,因为我想用这种方法来做,顺便练练手。
Come on, let us drive the world.
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-06 09:33
谢谢楼上兄弟,不过你可能误会了。
其实我的IST中有很多事情要做的。我的问题的出发点是如何使用和实现OEMInterruptxxx以及用HookInterrupt这些函数,因为我想用这种方法来做,顺便练练手。
还请多多指教! :D
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-06 13:17
1.设备地址保不保存要看你的实际需要了,如果你清楚每个设备的地址,可以直接用。

2.是

3.要交换数据可以通过一个全局的缓冲区,比如drvier_global

4.不是很
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-07 09:10
哈哈,谢谢wxl_50685330大哥的解答,问一个很菜的问题:

前面你说,我的ISR和我的驱动之间要交换数据可以通过一个全局的缓冲区,比如drvier_global,那么这个全局的缓冲区怎么定义啊?在我的驱动和ISR中分别怎么使用啊? :P
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-07 13:24
:)

可以在你的CONFIG.bib里面预留一块出来作为公共缓冲区。比如

xxx 8C020000  00001000  RESERVED

记住这个地址,在驱动中和isr中可以访问它来交换数据。不过注意访问时需要先映射(如果isr是写在kernel的可以不映射)
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-07 13:56
谢谢wxl_50685330大哥,不过我还得罗嗦一下,呵呵。
你看全局共享缓冲区是不是可以这么实现?

假设我的CONFIG.bib里面是这样设置的:
NK       80220000  009E0000  RAMIMAGE
RAM      80C00000  01000000  RAM
xxx      8C020000 00001000   RESERVED ;假设该区域没有被占用

在我驱动的yyy_Init()中
LPVOID lpAddress = 0x8C020000;
LPVOID pp = VirtualAlloc(
  lpAddress,
  0x1000,
  MEM_COMMIT,
  PAGE_READWRITE);
如果成功的话,那么我就可以利用pp直接读写那个区域中的数据。

而在OAL层的ISR里面我可以直接利用0x8C020000读写其中的数据,如
PUCHAR p=0x8C020000;
UCHAR a = *p;

大哥,我这么做对吗?请你指教,
 :P
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-07 14:01
对头,对头!!!!!!!!!!!!!!:)
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-07 14:29
非常感谢wxl_50685330大哥以及chang_nicolas兄弟的无私援助,分已给出,请两位笑纳! :P
Come on, let us drive the world.
游客

返回顶部