* interrupt function
@ 2004-07-23 2:08 Maikon Bueno
2004-07-23 2:39 ` Richard B. Johnson
0 siblings, 1 reply; 2+ messages in thread
From: Maikon Bueno @ 2004-07-23 2:08 UTC (permalink / raw)
To: linux-kernel
Hi All...
I`m trying to enable the serial interrupt, but whenever it happens
some event, the interrupt function isn't called.
The follow code will be a serial mouse driver. When some event occurs,
the "interrupt_count" is incremented and its result is shown when the
module is released.
I would like to know how to enable the interrupt function and the
IRQ... I don't know what is happening.
Thanks!!!
Maikon.
--------------------------------------------------
#define MODULE
#define __KERNEL__
#include<linux/ioport.h>
#include <linux/config.h>
#include <linux/module.h>
#include<linux/sched.h>
#include<linux/poll.h>
#include<linux/interrupt.h>
#include<linux/miscdevice.h>
#include<linux/init.h>
#include <linux/kernel.h>
#include<linux/slab.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/proc_fs.h>
#include <linux/fcntl.h>
#include <linux/devfs_fs_kernel.h>
#define OURMOUSE_BASE 0x300
#define OURMOUSE_MINOR 1
#define OURMOUSE_MAJOR 56
#define MOUSE_IRQ 3
static int mouse_users = 0;
static int mouse_dx = 0;
static int mouse_dy = 0;
static int mouse_event = 0;
static int mouse_buttons = 0;
static int mouse_intr = MOUSE_IRQ;
static int interrupt_count=0;
static struct wait_queue *mouse_wait;
static spinlock_t mouse_lock = SPIN_LOCK_UNLOCKED;
static devfs_handle_t ourmouse_dir;
static devfs_handle_t ourmouse_dev;
static int ourmouse_open(struct inode *inode, struct file *file);
static int ourmouse_close(struct inode *inode,struct file *file);
static void ourmouse_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static unsigned int mouse_poll(struct file *file, poll_table *wait);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Maikon Bueno");
char ourmouse_str[] = "Hi Baby!\n ";
ssize_t ourmouse_read(struct file *filp , char *buf,
size_t count, loff_t *offp)
{
struct inode *inode = filp->f_dentry->d_inode;
int minor = MINOR(inode->i_rdev);
char *txt;
if (filp->private_data) {
txt = filp->private_data;
} else {
txt = ourmouse_str;
}
if (count > strlen(txt)) count = strlen(txt);
copy_to_user(buf, txt, count);
*offp += count;
return count;
}
struct file_operations ourmouse_fops = {
read: ourmouse_read,
open: ourmouse_open,
release: ourmouse_close,
};
int init_module(void){
printk("<1> initing\n");
if(check_region(OURMOUSE_BASE, 3))
return -ENODEV;
request_region(OURMOUSE_BASE, 3,"Ourmouse");
devfs_register_chrdev(OURMOUSE_MAJOR,"Ourmouse",&ourmouse_fops);
ourmouse_dir = devfs_mk_dir(NULL,"Ourmouse", NULL);
if(ourmouse_dir == NULL){
printk("<1> Couldn't make the Ourmouse's dir\n");
}
ourmouse_dev = devfs_register(ourmouse_dir,
"Ourmouse",DEVFS_FL_NONE,OURMOUSE_MAJOR,OURMOUSE_MINOR, S_IFCHR |
S_IRUGO,&ourmouse_fops, NULL);
if (ourmouse_dev == NULL){
printk("<1> Couldn't register Ourmouse\n");
}
return 0;
}
void cleanup_module(void){
release_region(OURMOUSE_BASE, 3);
devfs_unregister(ourmouse_dev);
printk("<1> Bye %i\n",interrupt_count);
}
static int ourmouse_open(struct inode *inode, struct file *file)
{
if(mouse_users++)
return 0;
if(request_irq(mouse_intr, ourmouse_interrupt, 0,"Ourmouse", NULL))
{
mouse_users--;
return -EBUSY;
}
mouse_dx = 0;
mouse_dy = 0;
mouse_buttons = 0;
mouse_event = 0;
MOD_INC_USE_COUNT;
return 0;
}
static int ourmouse_close(struct inode *inode,struct file *file)
{
if(--mouse_users)
return 0;
free_irq(mouse_intr, NULL);
MOD_DEC_USE_COUNT;
return 0;
}
static void ourmouse_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
interrupt_count++;
}
static unsigned int mouse_poll(struct file *file, poll_table *wait)
{
return 0;
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: interrupt function
2004-07-23 2:08 interrupt function Maikon Bueno
@ 2004-07-23 2:39 ` Richard B. Johnson
0 siblings, 0 replies; 2+ messages in thread
From: Richard B. Johnson @ 2004-07-23 2:39 UTC (permalink / raw)
To: Maikon Bueno; +Cc: Linux kernel
If the device at 0x300 was interrupting, you would get an
interrupt and it will bump the count shown in your ISR.
Whatever that device at 0x300 is, needs to be programmed
to generate hardware interrupts. They don't happen by
magic. Usually, if edge triggered, you will only get
one interrupt until you put some code in your ISR to
handle that interrpt (make the hardware happy so it will
generate another).
If the interrupt is level triggered, code such as yours
will hang the machine because there is no ISR code to
service the hardware so the interrupt will be TRUE forever.
Cheers,
Dick Johnson
Penguin : Linux version 2.4.26 on an i686 machine (5570.56 BogoMips).
Note 96.31% of all statistics are fiction.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2004-07-23 2:40 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-07-23 2:08 interrupt function Maikon Bueno
2004-07-23 2:39 ` Richard B. Johnson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®