免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6029 | 回复: 10
打印 上一主题 下一主题

在uboot的运行状态下,如何响应外部硬件的中断? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-17 21:19 |只看该作者 |倒序浏览
如何在uboot的运行状态下(此时linux kernel还未运行),响应外部按键产生的gpio中断,使uboot重启或做其他工作?在linux kernel运行状态下我已实现此功能,只要调用request_irq()注册一个中断就行了。但在uboot里似乎没有这样的函数和机制,该怎样把gpio产生的中断和我自己定义的中断服务程序关联起来?我的uboot版本是1.1.4,系统是AR9130 SoC,MIPS 24K 32-bit cpu 400MHz。
联系信箱:wb51job@163.com。多谢!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-01-18 00:06 |只看该作者
裸机下的编程,uboot只是一个bootloader,并非OS。
硬件的中断如果LZ了解的话,那么看datasheet应该足够搞定这个了。

论坛徽章:
0
3 [报告]
发表于 2008-01-18 09:33 |只看该作者

回复 #2 cjaizss 的帖子

datasheet我看过的,貌似没有讲这个问题——可能是我没看懂。兄台能否讲得再详细一点?

论坛徽章:
0
4 [报告]
发表于 2008-01-18 19:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2008-01-18 21:23 |只看该作者
很简单,自己写。可以参考杜春雷《arm体系结构与编程》第九章第五节

论坛徽章:
0
6 [报告]
发表于 2008-01-24 20:51 |只看该作者
直接写中断向量表就可以了

论坛徽章:
0
7 [报告]
发表于 2008-01-25 16:10 |只看该作者
谢谢楼上几位朋友的回复。书和文章都看了不少,但还是没搞定。我也试图写中断向量表,但是改了之后没反应。技穷了。

论坛徽章:
0
8 [报告]
发表于 2008-01-26 17:45 |只看该作者
我用的PPC的CPU,uboot提供这个功能的。

我看了一下mips的start.S
不是有注册中断服务程序的吗?
        RVECENT(romReserved,4)
        RVECENT(romReserved,5)

论坛徽章:
0
9 [报告]
发表于 2008-01-28 09:36 |只看该作者

回复 #8 jameszxj 的帖子

你说的对!我也是在这改的。因为我手头资料不全,不知道gpio21脚对应哪个中断号,我就把所有的都改了,可是都没反应。我又把所有的romReserved改成了reset,结果也没一点反应。郁闷。我看其他地方也没重新修改这个表的嘛,还有哪不对吗?

在uboot的start.s文件中,关于中断向量表的代码是这样的:

#define RVECENT(f,n) \
  b f; nop

#define XVECENT(f,bev) \
  b f    ;          \
  li k0,bev

    .set noreorder

    .globl _start
    .text
_start:
    RVECENT(reset,0)    /* U-boot entry point */
    RVECENT(reset,1)    /* software reboot */
    RVECENT(romReserved,2)
    RVECENT(romReserved,3)
                    ....
    RVECENT(romReserved,63)
    XVECENT(romExcHandle,0x200)    /* bfc00200: R4000 tlbmiss vector */
    RVECENT(romReserved,65)
    RVECENT(romReserved,66)
                    ....
    RVECENT(romReserved,79)
    XVECENT(romExcHandle,0x280)    /* bfc00280: R4000 xtlbmiss vector */
    RVECENT(romReserved,81)
                    ....
    RVECENT(romReserved,95)
    XVECENT(romExcHandle,0x300)    /* bfc00300: R4000 cache vector */
    RVECENT(romReserved,97)
                    ....
    RVECENT(romReserved,111)
    XVECENT(romExcHandle,0x380)    /* bfc00380: R4000 general vector */
    RVECENT(romReserved,113)
                    ....
    RVECENT(romReserved,127)

    /* We hope there are no more reserved vectors!
     * 128 * 8 == 1024 == 0x400
     * so this is address R_VEC+0x400 == 0xbfc00400
     */

reset:
    /*
     * Clearing CP0 registers - WAR for the Linux hang issue
     */
    mtc0    zero, $0
                    ....


    /* Exception handlers.
     */
romReserved:
    b romReserved

romExcHandle:
    b romExcHandle

我对上面定义的128个中断没看懂是怎么调用的。我尝试过把所有的RVECENT(romReserved, X) 都改成RVECENT(reset, X),结果都没一点反应。

[ 本帖最后由 wbybyb 于 2008-1-29 14:27 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-01-31 14:49 |只看该作者
中断会由CPU自动调用

我觉得你应该确认一下是否已经产生了中断以及中断是否开放了

mips的CPU我不懂,看一下CPU手册中关于中断的描述应该会有帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP