免费注册 查看新帖 |

Chinaunix

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

[Linux资讯] 请教一个共享中断的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-23 14:34 |只看该作者 |倒序浏览
这是关于共享串中断的,caijize在http://bbs.csdn.net/topics/80441025给出了Linux 驱动测试调试程序,我在内核2.6.33.7下成功加载了这个模块。
但是怎么才能触发串口中断呢?使得中断服务例程得到响应呢?


为了方便,这里再列出这段程序:
////////////////////////Linux 驱动测试调试////////////////////////
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <linux/interrupt.h>


#define DP_MAJOR 50
#define DP_MINOR 0
static int char_read(struct file *filp,char __user *buffer,size_t,loff_t *);
static int char_open(struct inode *,struct file *);
static int char_write(struct file *filp,const char __user *buffer,size_t ,loff_t*);
static int char_release(struct inode *,struct file *);
static char *arr,*p;
static int chropen;
struct cdev *my_cdev;
static int len;
struct file_operations Fops = {
    .read = char_read,
    .write = char_write,
    .open = char_open,
    .release = char_release,    /* a.k.a. close */
};

static int irq=4;
static char *interface="test";
/*
MODULE_PARM(interface, "s");
MODULE_PARM_DESC(interface, "A network interface");
MODULE_PARM(irq, "i");
MODULE_PARM_DESC(irq, "The IRQ of the network interface");
*/
static irqreturn_t myinterrupt(int irq, void *dev_id, struct pt_regs *regs)
{
    static int mycount = 0;

    if (mycount < 10) {
        printk("Interrupt!\n");
        mycount++;
    }

    return IRQ_NONE;
}

static int __init char_init(void)
{
    printk(KERN_ALERT"Initing......\n");
    dev_t dev;
    dev=MKDEV(DP_MAJOR,DP_MINOR);
    my_cdev = cdev_alloc( );
    arr=kmalloc(1024,GFP_KERNEL);
   
    if(arr==NULL){
        printk(KERN_ALERT"kmalloc error\n");
    }
   
    sprintf(arr,"Hello,Pid=%d\n",current->pid);
    if(my_cdev==NULL){
        return -1;
    }
   
    if(register_chrdev_region(dev,10,interface)<0){
        printk(KERN_ALERT"Register char dev error\n");
        return -1;
    }
   
    if (request_irq(irq, &myinterrupt, SA_SHIRQ, interface, &irq)) {
        printk(KERN_ERR "myirqtest: cannot register IRQ %d\n", irq);
        return -EIO;
    }
   
    printk("Request on IRQ %d succeeded\n", irq);
   
    chropen=0;
    len=0;
    my_cdev->ops = &Fops;
    cdev_init(my_cdev,&Fops);
    cdev_add(my_cdev,dev,1);

    return 0;
}

static int char_open(struct inode *inode,struct file *file)
{
    if(chropen==0)
        chropen++;
    else{
        printk(KERN_ALERT"Another process open the char device\n");
        return -1;
    }
    p=arr;
    try_module_get(THIS_MODULE);
    return 0;
}

static int char_release(struct inode *inode,struct file *file)
{
    chropen--;
    module_put(THIS_MODULE);
    return 0;
}

static int char_read(struct file *filp,char __user *buffer,size_t length,loff_t *offset)
{
    int i=0;
    if(*p=='\0')
        return 0;
    while(length&&*p){
        put_user(*(p++),buffer++);
        length--;
        i++;
    }
    return i;
}

static int char_write(struct file *filp,const char __user  *buffer,size_t length,loff_t *offset)
{

    int i;
    for(i=0;i<length&&i<1024;i++)
        get_user(p,buffer+i);

    p=0;
    len=i;
    return i;
}




static void module_close()
{
    len=0;
    printk(KERN_ALERT"Unloading..........\n");
    kfree(arr);
    free_irq(irq, &irq);
    unregister_chrdev_region(MKDEV(DP_MAJOR,DP_MINOR),10);
    cdev_del(my_cdev);
}

module_init(char_init);
module_exit(module_close);
//////////////////////////////////
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP