3588|1

46

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求救linux系统下 fpga 的中断驱动程序 多谢 [复制链接]

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

static int f2h_int_open(struct inode *inode, struct file *file);
static int f2h_int_release(struct inode *inode, struct file *file);
static int f2h_int_init(void);
static void f2h_int_exit(void);

static int g_iMajor = 0;
static struct device *g_pDev;
static struct class *g_pClass;

// 字符设备结构
static struct file_operations g_f2h_int_fileops =
{
        .owner   = THIS_MODULE,
        .open    = f2h_int_open,
        .release = f2h_int_release,
};

void __iomem * virt;

irqreturn_t xxx_interrupt (int irq,void*dev_id)
{
        static unsigned int uiCnt = 0;
        iowrite32(1, virt + 0xC);
        printk("xxx_interrupt %d\n", uiCnt++);
        return (IRQ_HANDLED);
}

static int f2h_int_open( struct inode *inode, struct file *file )
{
        return 0;
}

static int f2h_int_release( struct inode *inode, struct file *file )
{
        return 0;
}

static int f2h_int_init( void )
{
        int irq = 0;
        int err = 0;
        unsigned int uiData = 0;

        printk("f2h_int_init\n" );

        g_iMajor = register_chrdev(0, "f2h_simple", &g_f2h_int_fileops);
        g_pClass = class_create(THIS_MODULE, "f2h_simple");
        g_pDev = device_create(g_pClass, NULL, MKDEV(g_iMajor, 0), NULL, "f2h_simple");

        err = request_irq(75, xxx_interrupt, 0, "f2h_int", NULL);
        enable_irq(irq);
        printk("irq = %d\n", irq);
        printk("err = %d\n", err);

        virt = ioremap(0xFF280000, 0x10);
        printk("virt = %x\n", (unsigned int)virt);
       
        uiData = ioread32(virt);
        printk("uiData = %x\n", uiData);
       
        printk("dir = %x\n", ioread32(virt + 4));
        printk("int = %x\n", ioread32(virt + 8));
        printk("edge = %x\n", ioread32(virt + 0xC));
        iowrite32(1, virt + 8);
        printk("int = %x\n", ioread32(virt + 8));

        return 0;
}

static void f2h_int_exit( void )
{
        printk("f2h_int_exit\n");

        iounmap(virt);
        free_irq(75, NULL);

        device_destroy(g_pClass, MKDEV(g_iMajor, 0));
        class_destroy(g_pClass);
        unregister_chrdev(g_iMajor, "f2h_simple");
}

module_init(f2h_int_init);
module_exit(f2h_int_exit);
MODULE_DESCRIPTION("C5 Linux driver");
MODULE_LICENSE("GPL");






root@socfpga:/home/debug# insmod drv_debug.ko
f2h_int_init
irq = 0
err = 0
virt = c091c000
uiData = 0
dir = 0
int = 0
edge = 1
int = 1
xxx_interrupt 0
root@socfpga:/home/debug# xxx_interrupt 1
xxx_interrupt 2
xxx_interrupt 3
xxx_interrupt 4
xxx_interrupt 5
xxx_interrupt 6
xxx_interrupt 7
xxx_interrupt 8
xxx_interrupt 9
xxx_interrupt 10
rmmod drv_debug
f2h_int_exit
root@socfpga:/home/debug# cat /proc/interrupts
           CPU0       CPU1      
29:      49240      49708       GIC  29  twd
75:         11          0       GIC  75
136:          0          0       GIC 136  dma-pl330
137:          0          0       GIC 137  dma-pl330
138:          0          0       GIC 138  dma-pl330
139:          0          0       GIC 139  dma-pl330
140:          0          0       GIC 140  dma-pl330
141:          0          0       GIC 141  dma-pl330
142:          0          0       GIC 142  dma-pl330
143:          0          0       GIC 143  dma-pl330
144:          0          0       GIC 144  dma-pl330
152:        268          0       GIC 152  eth0
171:       7947          0       GIC 171  dw-mci
183:          0          0       GIC 183  ff705000.spi
187:          0          0       GIC 187  dw_spi1
190:          0          0       GIC 190  ffc04000.i2c
191:          0          0       GIC 191  ffc05000.i2c
194:         85          0       GIC 194  serial
199:          0          0       GIC 199  timer0
207:          0          0       GIC 207  fpga-mgr
256:          0          0  combiner  dma-pl330
IPI0:          0          0  CPU wakeup interrupts
IPI1:          0          0  Timer broadcast interrupts
IPI2:        328       1118  Rescheduling interrupts
IPI3:          0          0  Function call interrupts
IPI4:          3          4  Single function call interrupts
IPI5:          0          0  CPU stop interrupts
Err:          0




从/proc/interrupts 中看,中断为何rmmod后无法卸载干净,导致第二次insmod时系统崩溃
请问各位大神指点,多谢

此帖出自Linux开发论坛
点赞 关注

回复
举报

46

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
本帖最后由 vlah 于 2017-4-10 10:11 编辑

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

static int f2h_int_open(struct inode *inode, struct file *file);
static int f2h_int_release(struct inode *inode, struct file *file);
static int f2h_int_init(void);
static void f2h_int_exit(void);

static int g_iMajor = 0;
static struct device *g_pDev;
static struct class *g_pClass;

#define PHY_ADDR (0xff280000)
#define PHY_ADDR_LEN (0x10)

// 字符设备结构
static struct file_operations g_f2h_int_fileops =
{
        .owner   = THIS_MODULE,
        .open    = f2h_int_open,
        .release = f2h_int_release,
};

void __iomem * virt;

irqreturn_t xxx_interrupt (int irq,void*dev_id)
{
        static unsigned int uiCnt = 0;
        iowrite32(1, virt + 0xC);
        printk("xxx_interrupt %d\n", uiCnt++);
        return (IRQ_HANDLED);
}

static int f2h_int_open( struct inode *inode, struct file *file )
{
        return 0;
}

static int f2h_int_release( struct inode *inode, struct file *file )
{
        return 0;
}

static int f2h_int_init( void )
{
        int irq = 0;
        int err = 0;
        unsigned int uiData = 0;

        printk("f2h_int_init\n" );

        g_iMajor = register_chrdev(0, "FPGA_IRQ3", &g_f2h_int_fileops);
        g_pClass = class_create(THIS_MODULE, "FPGA_IRQ3");
        g_pDev = device_create(g_pClass, NULL, MKDEV(g_iMajor, 0), NULL, "FPGA_IRQ3");

        printk("flag 1\n" );

        if(!request_mem_region(PHY_ADDR, PHY_ADDR_LEN, "FPGA_IRQ3"))
        {
                printk("request_mem_region fail\n");
        }

        virt = ioremap(PHY_ADDR, PHY_ADDR_LEN);
        printk("virt = %x\n", (unsigned int)virt);
       
        uiData = ioread32(virt);
        printk("uiData = %x\n", uiData);
       
        printk("dir = %x\n", ioread32(virt + 4));
        printk("int = %x\n", ioread32(virt + 8));
        printk("edge = %x\n", ioread32(virt + 0xC));
        iowrite32(1, virt + 8);
        printk("int = %x\n", ioread32(virt + 8));

        release_mem_region(PHY_ADDR, PHY_ADDR_LEN);

        printk("flag 2\n" );

        err = request_irq(75, xxx_interrupt, IRQF_DISABLED, "FPGA_IRQ3", NULL);
        // enable_irq(irq);
        printk("irq = %d\n", irq);
        printk("err = %d\n", err);

        return 0;
}

static void f2h_int_exit( void )
{
        printk("f2h_int_exit\n");

        iounmap(virt);
        free_irq(75, NULL);
        // disable_irq_nosync(75);

        device_destroy(g_pClass, MKDEV(g_iMajor, 0));
        class_destroy(g_pClass);
        unregister_chrdev(g_iMajor, "FPGA_IRQ3");
}

module_init(f2h_int_init);
module_exit(f2h_int_exit);
MODULE_DESCRIPTION("C5 Linux driver");
MODULE_LICENSE("GPL");

函数顺序的问题,已破

此帖出自Linux开发论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/10 下一条
ADI 中国30周年,与你一起走过的那些精彩瞬间!
即日起-4月30日,阅读资料,您可以参与ADI真爱粉大考验,同时为ADI中国30周年送上祝福!我们将从参与者中随机抽取精美礼品送出!

查看 »

 
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
快速回复 返回顶部 返回列表