6437|24

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请Paul_Chao 大侠帮忙看看!!急!还是关于2416的中断!!!!! [复制链接]

1. 印象中, 中断与 DeviceArrayIndex 无关.
2. "COM4:", 则请 LZ 加入 Index=dword:4(not DeviceArrayIndex=dword:4),
    不然它有可能会变成 "COM1:"    or "COM2:"...
3. "SysIntr"=dword:XYZ-0x10, 须请 LZ 在 oal 中的 BSPIntrInit 加入
   类似OALIntrStaticTranslate(SYSINTR_UART4, IRQ_EINT3);
   的指令, 并在 bsp_cfg.h 中加入 #define SYSINTR_UART4 (SYSINTR_FIRMWARE+XYZ)
4. EINT3 的 GPIO 设定, 请自行设好.

To Paul_Chao:
   您在我的上个帖子中回复如上,现在小弟还是有些疑问:
   1、我的串口驱动芯片16550需要用到一个外部中断EINT3
      我参照BSP中的PowerButton驱动(该驱动用到EINT0)来看BSP中驱动的用法
      发现:在PowerButtonHW_Init中先初始化了一下中断用到的GPIO0
      然后
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_PwrButtonIrq, sizeof(UINT32), &g_PwrButtonSysIntr, sizeof(UINT32), NULL))
得到了一个系统中断号(这个号是不是随机的?)g_PwrButtonSysIntr
并跟事件绑定InterruptInitialize(g_PwrButtonSysIntr, pPWR->ISTEvent, 0, 0)以后就是做了IST处理
而物理中断号g_PwrButtonIrq在PowerButton驱动中是直接赋值为IRQ_EINT0
IRQ_EINT0在s3c2450_intr.h中#define IRQ_EINT0           0
也就是说驱动程序通过KernelIoControl直接把物理中断号0传进去得到了一个(随机)系统中断号
并在SMDK2416\Src\Common\Intr\intr.c中的ISR程序中做了相应处理 if (irq <= IRQ_ADC))...  
其中(IRQ_ADC == 31),在这个过程中并没有通过OALIntrStaticTranslate函数转换一个中断号
那么我按照powerbutton的做法做可以吗??
2、在com16550的驱动中,我在注册表中:"IRQ"=dword:3   ,通过
regError = RegQueryValueEx(hKey, PC_REG_IRQ_VAL_NAME, NULL, NULL,(LPBYTE)(&pHWHead->dwSysIntr),&dwDataSize);
读到一个IRQ的ID(3)并传给pHWHead->dwSysIntr
这个IRD = 3 对应的是s3c2450_intr.h中#define IRQ_EINT3           3
对IRQ程序的处理依然在SMDK2416\Src\Common\Intr\intr.c中的if (irq <= IRQ_ADC))...
但是我看com16550的驱动中用到许多kernelIoControl并没有把这个物理中断号转换成一个系统中断号
用法:
KernelIoControl(IOCTL_HAL_DISABLE_WAKE, &pHWHead->dwSysIntr, sizeof(pHWHead->dwSysIntr), NULL, 0, NULL);
KernelIoControl(IOCTL_HAL_ENABLE_WAKE, &pHWHead->dwSysIntr,  sizeof(pHWHead->dwSysIntr), NULL, 0, NULL);
同时,在驱动的其他地方赋值如下
pHWHead->pIsrInfoVirt->SysIntr=pHWHead->dwSysIntr;
pHWHead->pHWObj->dwIntID = pHWHead->dwSysIntr;
请问,我这里传进来一个物理中断号是不是不对啊???
在这个传口驱动中我应该怎么操作这个外部中断???

最新回复

marking  详情 回复 发表于 2009-10-20 10:18
点赞 关注

回复
举报

61

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我做了如下修改:
1、在powerbutton驱动中将GPIO3初始化为中断(因为那里面原来就有初始化EINT3的代码)
2、在C:\WINCE500\PLATFORM\SMDK2416\Src\Kernel\Oal\intr.c中BSPIntrInit函数
   加入:OALIntrStaticTranslate(SYSINTR_UART4, IRQ_EINT3);
3、C:\WINCE500\PLATFORM\SMDK2416\Src\Inc\bsp_cfg.h中
   加入#define SYSINTR_UART4           (SYSINTR_FIRMWARE+2)
4、在注册表中"IRQ"=dword:12       ;(SYSINTR_FIRMWARE+2)
请问:
1、我在POWERBUTTON中初始化中断3可以吗?
*2、我先定义了SYSINTR_UART4 = 12 ,又在注册表中IRQ = 12
    又通过OALIntrStaticTranslate 把 12 跟IRQ_EINT3 关联到一起
     这样就能通过查注册表读取系统中断号,关联物理中断号
     最后进入ISR处理中断??
3、com16550驱动中是读取注册表中的“IRQ”
   我不知道这个驱动中是直接用的物理中断号还是直接用系统中断号处理IST
   如果“ISR”是物理中断号
   是不是应该通过KernelIoControl申请到一个随机的系统中断号?
   但是在这个驱动中没有这样,这个驱动中通过如下方式用了注册表中读到的“IRQ”:
    pHWHead->pIsrInfoVirt->SysIntr=pHWHead->dwSysIntr; //= “IRQ”
   pHWHead->pHWObj->dwIntID = pHWHead->dwSysIntr; // = “IRQ”
    其中驱动中的InterruptDone()中的参数也是直接
    用的pHWHead->dwSysIntrpHWHead->pHWObj->dwIntID     
   另外一个函数InterruptInitialize()下用到的中断号也是
   pHWHead->pHWObj->dwIntID   即都是注册表中“IRQ”的值
   请问这样处理中断号,应该在注册表中传一个物理中断号还是系统中断号呢???
注册表信息如下:
    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SERIAL4]
   "IRQ"=dword:12       ;(SYSINTR_FIRMWARE+2)
   "IoBase"=dword:20000000
   "IoLen"=dword:8
   "DeviceArrayIndex"=dword:4
   "Prefix"="COM"
   "Dll"="com16550.Dll"
   "Order"=dword:1
   "FriendlyName"="COM4:"
   "Index"=dword:4
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
好大一坨   
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
友情帮顶
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
帮顶。期待Paul_Chao大侠的到来。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

6
 
看你的描述应该传个 静态映射后的 系统中断号
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
呵呵 你的16c550 的驱动移植到哪一步了 用串口软件可以打开了吗
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
上班了
继续顶起!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
也做个标记了!!!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
太高深了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
中断的魅力 ,深不可测啊
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

12
 
纯顶
完全不懂
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

13
 
继续帮顶
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

14
 
最近在忙别的事, 有些短的帖, 分数太低, 懒的回, 您的帖, 分数很高, 但没时间看, 所以也没回.
1. "DeviceArrayIndex" 在记忆中是用在决定是否使用 ISR16550.dll 用的.

2. EINT3 在 POWERBUTTON 中设定, 不是不行, 但非常不好, 增加 driver 间的不必要 couple, 并请注意设定 "Order", 让 PowerButton 先载.

3. 我查了一下 c:\wince500\public\common\oak\drivers\serial 中, 似乎没有用到 KernelIoControl 去 配置一个 SYSINTR_XXX 的值, 它是直接使用 registry 中的 "SysIntr" 值, 故最简单的方式, 还是请您照 http://topic.eeworld.net/u/20090927/13/65a20f94-c694-4bcc-bb35-07ce663240ef.html 的做法, 在 kernel 中加入
OALIntrStaticTranslate(SYSINTR_UART4, IRQ_EINT3);
#define SYSINTR_UART4 (SYSINTR_FIRMWARE+8)  // SYSINTR_FIRMWARE(0x10)+8=0x18
Registry 中将 "Irq"移除, 并加入
"SysIntr"=dword:18  ; (Hex value=0x18)
应即可.

4. 我看您另一封 http://topic.eeworld.net/u/20091010/10/5e658e91-936c-41f3-9e56-1156995722af.html, xqhrs232 非常地热心帮您解惑, 让我自叹弗如, 您还是请他来把这的分数给他吧.

Paul, Chao @ Techware
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
Paul_Chao 大侠过奖了!!!我只是正好也在看这方面的代码就把代码的层次顺了一下.
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

16
 
Paul_Chao 大侠有没搞过虚拟串口驱动?虚拟出来的串口跟真的串口一样,对所有的串口API都完全并完整地支持,我现在做个了,但觉得还是有缺陷只能对部分串口的API支持,特别是READFILE对缓冲指针的移动,多个AP怎么去达到一致好难做到.
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
TO paul_chao大侠:
thank U!
我现在的做法是
/********************OAL层关联*******************/
在Kernel中加入
  #define SYSINTR_UART4           (SYSINTR_FIRMWARE+2)
  OALIntrStaticTranslate(SYSINTR_UART4, IRQ_EINT3);
这样可以关联到IRQ_EINT3
/**********************ISR***********************/
#define IRQ_EINT3           3
  if (irq <= IRQ_ADC)
  {...}这样可以处理外部中断EINT3
/**********************IST************************/
GetIsrInfo 函数 读取注册表中的 "SysIntr"=dword:12    ;(SYSINTR_FIRMWARE+2)
m_dwSysIntr = ddi.dwSysintr;
ThreadRun中  InterruptDone(m_dwSysIntr);(这里是已经把中断处理完了,重新打开中断吧??)
GetWindowInfo函数读注册表中的"IoBase"=dword:20000000
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

18
 
帮顶!
UP
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

19
 
是, 請問這樣還不會動嗎??

Paul, Chao @ Techware
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

20
 
现在是能打开串口不能发送数据!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表