hi,

  I have written a parallel port driver of linux x86 and i am not able
to generate the interrupt.could some one help me with this code please

I am enabling the interrupt in parallel_init() and the handler is in
parallel_hand.

pls help!!!I am trying to get this work

#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/cdev.h>
#include<linux/slab.h>
#include<linux/device.h>
#include<linux/ioport.h>
#include<asm/io.h>
#include<asm/uaccess.h>
#include<linux/delay.h>

#include<linux/interrupt.h>

#define  DRIVER_NAME "PARALLEL_PORT_DRIVER"
#define DEVICE_NAME "PARALLEL_PORT"
#define CLASS_NAME "PARALLEL_CLASS"

MODULE_LICENSE("GPL");

static ssize_t  parallel_read(struct file *,char __user
*,size_t,loff_t *);
static ssize_t parallel_write(struct file *,const char __user
*,size_t,loff_t *);
static int parallel_open(struct inode *,struct file *);


struct class *device_class=NULL;
//static dev_t dev;
static LIST_HEAD(char_dev_list);

struct file_operations fops =
{
                .owner=THIS_MODULE,
                .read=parallel_read,
                .write=parallel_write,
                .open=parallel_open
};

irqreturn_t parallel_hand(int irq_no,void * dev)
{
        printk(KERN_ALERT"interrupt received\n");
        return 0;
}

struct paralleldriver
{
        u8 data;
        unsigned long addr;
        void * paddr;
        struct list_head list;
        struct cdev parallel_cdev;
        dev_t dev;
};

static ssize_t parallel_read(struct file * flip,char __user *
buff,size_t length,loff_t * off_t)

{
        return 0;
}


static ssize_t parallel_write(struct file * flip,const char __user*
buff,size_t length,loff_t * off_t)

{
        printk(KERN_ALERT "in write");
        struct paralleldriver *driver;
        driver=flip->private_data;
        copy_from_user((void*)&driver->data,(const void __user *)buff,1);
        printk(KERN_ALERT "%c",*buff);
        printk(KERN_ALERT "%c",driver->data);
        outb(driver->data,driver->addr);
        mdelay(1);
        return 1;
}

static int parallel_open (struct  inode * inode,struct file * flip)
{
        printk(KERN_ALERT "in open\n");
        struct paralleldriver * driver=NULL;
        driver=container_of(inode->i_cdev,struct
paralleldriver,parallel_cdev);
        flip->private_data=driver;
        driver->addr=0x0378;
        return 0;
}


static int parallel_init (void);
static void parallel_exit (void);

static int parallel_init(void)
{
        struct paralleldriver *driver=NULL;
        struct device *device=NULL;
        unsigned long addr=0x0378;

        driver=kmalloc(sizeof(struct paralleldriver),GFP_KERNEL);
        driver->addr=addr;
//driver register
        alloc_chrdev_region(&driver->dev,0,5,DRIVER_NAME);

        list_add_tail(&driver->list,&char_dev_list);

//device register
        cdev_init(&(driver->parallel_cdev),&fops);

        driver->parallel_cdev.owner=THIS_MODULE;
        if(cdev_add(&(driver->parallel_cdev),driver->dev,5) < 0)
        {
                printk(KERN_ALERT "FAILED TO INSERT");
                return 1;
        }

//creating a device
        device_class=class_create(THIS_MODULE,CLASS_NAME);
        device=device_create(device_class,NULL,driver-
>dev,NULL,DEVICE_NAME);



//allocating memory regions
        request_mem_region((unsigned long)driver->addr,
1,"PARALLEL_PORT_REGION");


request_irq(7,parallel_hand,0,"start_motor_handler",(void *)driver);
//enabling interuppt
        addr=0x0378;
        outb(16,addr+2);


//pin4 of parallel port is directly connected to pin 10 through a wire
//enabling pin4 high to enable interrupt

        outb(255,addr);
        mdelay(1);
        outb(0,addr);
        mdelay(1);
        outb(255,addr);
        mdelay(1);
        printk(KERN_ALERT "inserted");

return 0;


}

static void parallel_exit(void)
{
        struct paralleldriver *first,*next;
        list_for_each_entry_safe(first,next,&char_dev_list,list)
        {
                release_mem_region(first->addr,1);
                device_destroy(device_class,first->dev);
                class_destroy(device_class);
                unregister_chrdev_region(0,5);
                kfree(first);
                printk(KERN_INFO "EXITED");
        }
}


module_init(parallel_init);
module_exit(parallel_exit);


regards,
ajay

-- 
unsubscribe: [email protected]
website: http://groups.google.com/group/android-kernel

Reply via email to