Parallel Port Interrupt Generation.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear All,

I am practicing the Chapter-9, Interrupt Handling of the Linux Device
Drivers 2nd Edition book.

As mentioned in the book, I prepared the parallel port to generate the
interrupt by inserting a piece of wire into 9 and 10 pins.

I was registered the interrupt during the module initialization.

In the dev_write() function (which is called when application issues
write call), I am simply writing 0xFF value to the Data Port using
simple outb() function.

My intention here is to enable the most significant bit of the Data
Port, so that this will result in voltage difference to generate the
interrupt.

But the Interrupt Handler is not getting invoked when I issue write call
in the application.

The point here is that when I insert just one end of the wire in the
10th pin and the other is given a metallic contact, my Interrupt Handler
gets invoked because of the voltage difference.

Can any one provide a pointer for this situation about Interrupt Handler
being not called even though, I enabled MSB of Data Port by writing 0xFF
to it.

Here is the sample code:
------------------------

#define HW_LEN 80
#define IRQ_7 7

#define SPP_IOBASE        0x378
#define SPP_NR_PORTS      0x8
#define SPP_INT_ENABLE    0x10 
#define SPP_DATA_PORT     SPP_IOBASE + 0 
#define SPP_STATUS_PORT   SPP_IOBASE + 1 
#define SPP_CONTROL_PORT  SPP_IOBASE + 2 

static struct file_operations mydev_ops =
{
  read:mydev_read,
  write:mydev_write,
  open:mydev_open,
  release:mydev_close,
};

wait_queue_head_t mywq;

static int mydev_open(struct inode *inode, struct file * file) {
  MOD_INC_USE_COUNT;
  printk("<1>" "device opened\n");
  return 0;	
}


static ssize_t mydev_read(struct file *file, char * buf,
                          size_t count,  loff_t * offset)
{
  printk("<1>" "read invoked\n");
}

/***********************************************************************
****
* Name:mydev_write
* Description:
************************************************************************
***/
static int mydev_write(struct file * file, const char * buf,
                       size_t count,loff_t * offset)
{
  printk ("%s called ...\n", __FUNCTION__);
  outb(0xFF,SPP_DATA_PORT);
  wake_up_interruptible(&mywq); 
}

/***********************************************************************
****
* Name:myIntHandler
* Description:
************************************************************************
***/
void myIntHandler(int irq, void *dev_id, struct pt_regs *regs) {
  printk ("%s invoked ...\n", __FUNCTION__);
}

static int __init init_myKeyDev(void)
{
  int rv;

  rv = check_region(SPP_IOBASE, SPP_NR_PORTS);
  if (rv) 
  {
    printk(KERN_INFO "can't get I/O port address 0x%lx\n",SPP_IOBASE);
    return rv;
  }
  request_region(SPP_IOBASE, SPP_NR_PORTS, TEST_DEV);

  init_waitqueue_head(&mywq);

  rv = register_chrdev(MYDEV_MAJOR_NUM, MYDEV_NAME, &mydev_ops);
  if(rv<0)
  {
    printk("<1>" "Registration Error %d\n",rv);
    return rv;
  }
  else
  {
    printk("<1>" "Registration success %d\n",rv);
  }

  /*** Register interrupt handler ***/
  rv = request_irq(IRQ_7, myIntHandler, SA_INTERRUPT, TEST_DEV,NULL);
  if(rv)
  {
    printk("<1>Can't get interrupt %d\n",IRQ_7);
  }
  /*** Enable parallel port interrupt reporting ***/
  outb(SPP_INT_ENABLE, SPP_CONTROL_PORT);

  printk("<1>%s %s initialized\n",MODULE_NAME, MODULE_VERSION);
  return 0;
}

static void __exit cleanup_myKeyDev(void)
{
  /*** disable parallel port interrupt reporting ***/
  outb(0x00, SPP_CONTROL_PORT);

  /*** Free the ioports ***/
  release_region(SPP_IOBASE,SPP_NR_PORTS);

  /*** Free the interrupt ***/
  free_irq(IRQ_7,NULL);

  unregister_chrdev(MYDEV_MAJOR_NUM, MYDEV_NAME);
  printk("<1>%s %s removed\n",MODULE_NAME, MODULE_VERSION);
}

module_init(init_myKeyDev);
module_exit(cleanup_myKeyDev);

EXPORT_NO_SYMBOLS;

Thanks and Regards.
Srinivas G


--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux