Demonstrating a simple device driver with Hard IRQ ISR and Tasklet.
In this experiment, we will create a simple device driver for the keyboard.
Create a kernel module that will be our driver.
Call it driver.c
On inserting this driver, an ISR will be attached to the interrupt number associated with our keyboard.
The ISR, whenever executed should schedule a tasklet to be run later on.
The ISR should print ‘Your Name: Caught the IRQ. Urgent work Muhaha’ to dmesg
The tasklet function should print ‘Your Name: Doing the hackey pending work Muhaha’ to dmesg
The end result is that when this module is loaded, from then on pressing any key on your keyboard should print the two messages in dmesg.
Steps to create the handlers inside the module.
You should have two functions that are your ‘work’ – urgent and deferred
static irqreturn_t irq_handler_isr(int, void *);
void tasklet_fn(unsigned long);
The irq_handler_isr function should print the required message and then create a tasklet_struct, init it and schedule it.
In your module’s init function you should call request_irq() and register the irq_handler_isr function as the ISR for the keyboard’s interrupt number
You can figure out the interrupt numbers that devices are using from the file /procs/interrupts
In your module’s exit function, you should call free_irq() and deregister the irq_handler_isr function.
Create a suitable Makefile, compile your module, insmod the module and enjoy!