zoukankan      html  css  js  c++  java
  • 另一种linux下的powerpc中断注册的方法

    下面这种中断的配置方法比较畸形,不过和后面的配合起来,也是成功的。

    static int ZwFPGA_irq_init(void)
    {
    int ret;

    irq2 = irq_create_mapping(NULL,FPGA_IRQ2);
    printk(KERN_ERR"irq2=0x%08x\n",irq2);
    irq3 = irq_create_mapping(NULL,DSP_IRQ3);
    printk(KERN_ERR"irq3=0x%08x\n",irq3);
    mask_irq(irq3);
    mask_irq(irq2);

    /* select irq2,set SICRH BIT 18 = 0 */
    *(volatile unsigned int *)(immr_base_addr + SICRH_ADDR) &= (~0x00002000);

    /* set irq2 edge sensitive */
    *(volatile unsigned int *)(immr_base_addr + SECNR_ADDR) |= (0x00002000);

    /* Clear SEPNR bit */
    *(volatile unsigned int *)(immr_base_addr + SEPNR_ADDR) |= (0x20000000);

    /*open the mask bit 2 to close the inttrupt*/
    *(volatile unsigned int *)(immr_base_addr + SEMSR_ADDR ) &= (~0x20000000);
    //*(volatile unsigned int *)(immr_base_addr + SEMSR_ADDR ) |= 0x20000000;


    ret = request_irq(irq2,fpga_irq_handler,SA_INTERRUPT,"fpga_driver",NULL);
    //perror(ret);
    if(ret < 0){
    printk(KERN_ERR"Request irq2 failed.\n");
    free_irq(irq2,NULL);
    return ret;
    }


    /* select irq3,set SICRH BIT 19 = 0 */
    *(volatile unsigned int *)(immr_base_addr + SICRH_ADDR) &= (~0x00001000);

    /* set irq3 edge sensitive */
    *(volatile unsigned int *)(immr_base_addr + SECNR_ADDR) |= (0x00001000);

    /* Clear SEPNR bit */
    *(volatile unsigned int *)(immr_base_addr + SEPNR_ADDR) |= (0x10000000);

    /*open the mask bit 3 to close the inttrupt*/
    *(volatile unsigned int *)(immr_base_addr + SEMSR_ADDR ) &= (~0x10000000);
    //*(volatile unsigned int *)(immr_base_addr + SEMSR_ADDR ) |= (0x10000000);


    ret = request_irq(irq3,fpga_irq_handler,SA_INTERRUPT,"dpram_driver",NULL);
    //perror(ret);
    if(ret < 0){
    printk(KERN_ERR"Request irq3 failed.\n");
    free_irq(irq3,NULL);
    return ret;
    }

    disable_irq(irq3);
    disable_irq(irq2);

    unmask_irq(irq3);
    unmask_irq(irq2);

    return 0;
    }

    下面是对中断的打开函数
    static int fpga_open(struct inode *inode, struct file *filp)
    {
    /*close MASK bit of irq2 irq3*/
    *(volatile unsigned int *)(immr_base_addr + SEMSR_ADDR ) |= (0x30000000);

    printk(KERN_ERR"irq2=0x%08x\n",irq2);
    enable_irq(irq2);
    printk(KERN_ERR"irq3=0x%08x\n",irq3);
    enable_irq(irq3);

    return 0;
    }

    卸载函数如下:
    static void irq_cleanup(void)
    {
    mask_irq(irq3);
    mask_irq(irq2);
    free_irq(irq3,NULL);
    free_irq(irq2,NULL);
    }

    可以看到,这里面很多mask了,disable了,而平常中断基本上都不用的,所以,这些可用不可用,在这里面用了,就要用到底,要照应着。
  • 相关阅读:
    IDEA常用快捷键和常用插件集成,持续更新......
    【转】javascript日期操作详解(脚本之家整理)
    学习AngularJs:Directive指令用法
    Angular过滤器 自定义及使用方法
    【转】AngularJS 日期格式化 字典
    【转】AngularJs $location获取url参数
    【转】JavaScript对Json节点的增删改
    Asp.Net Mvc后台数据验证自测小Demo
    你必须先行上路
    【转】俞敏洪:我和马云差了8个字,结果财富相差2200亿美金
  • 原文地址:https://www.cnblogs.com/fishoneseaatblog/p/2340952.html
Copyright © 2011-2022 走看看