免费注册 查看新帖 |

Chinaunix

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

求助:dma_alloc_coherent执行crash [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-11 09:16 |只看该作者 |倒序浏览
代码如下:
ssize_t fpga_wr_write(struct file * pfile, const char __user * ch_user, size_t count, loff_t * pos)
{
        u64                        addr64;

        printk(KERN_ALERT "dma write begin\n");

        // 写入数据
        dma_src = dma_alloc_coherent(&my_s_dev->dev,1024,bus_src_addr,GFP_KERNEL);//这里crash

             printk(KERN_ALERT "dma write end\n");
             return 0;
}

static int __devinit fpga_wr_probe(struct pci_dev* pdev, const struct pci_device_id* ent)
{
        int                        result;
        dev_t                dev=0;
        if((result = pci_enable_device(pdev)))
                return  result;

        /// 创建字符设备

        dev = MKDEV(FPGA_WR_CHAR_MAJOR, FPGA_WR_CHAR_MINOR);

        result = register_chrdev(0, "demo", &fpga_wr_fops);
        if(result <0)
        {
                printk(KERN_ALERT "DEMO: can't get major %d\n", FPGA_WR_CHAR_MAJOR);
                return result;
        }

        //alloct DEMO_dev
        my_fpga_wr_dev = kmalloc(sizeof(struct fpga_wr_dev), GFP_KERNEL);
        if(!my_fpga_wr_dev)
        {
                result = -ENOMEM;
                goto fail;
        }

        memset(my_fpga_wr_dev, 0, sizeof(struct fpga_wr_dev));

        //init a char driver
        cdev_init(&my_fpga_wr_dev->my_cdev, &fpga_wr_fops);
        my_fpga_wr_dev->my_cdev.owner = THIS_MODULE;
        my_fpga_wr_dev->my_cdev.ops = &fpga_wr_fops;

        //add char driver to kernel
        result = cdev_add(&my_fpga_wr_dev->my_cdev, dev, 1);
        if(result)
        {
                printk(KERN_ALERT "Error %d addint DEMO\n", result);
                goto fail;
        }

        my_s_dev = pdev;
        printk(KERN_ALERT "All True\n");
        return 0;

        //handle fail
fail:
        fpga_wr_remove(pdev);
        return result;

}

static void __devexit fpga_wr_remove(struct pci_dev* pdev)
{
        printk(KERN_ALERT "remove\n");
        if(my_fpga_wr_dev)
                kfree(my_fpga_wr_dev);
}
struct pci_driver fpga_wr_driver = {
        .name          = FPGA_WR_DRIVER_NAME,
        .id_table = fpga_wb_table_id,
        .probe          = fpga_wr_probe,
        .remove          = __devexit_p(fpga_wr_remove),
};


static int __init fpga_wr_init_module(void)
{
        b_open = 0;
        my_fpga_wr_dev = 0;
        return pci_register_driver(&fpga_wr_driver);
}

static void __exit fpga_wr_cleanup_module(void)
{
        pci_unregister_driver(&fpga_wr_driver);
}

论坛徽章:
0
2 [报告]
发表于 2012-04-12 14:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP