Userspace IRQ: Difference between revisions

From embeddedTS Manuals
No edit summary
No edit summary
 
Line 1: Line 1:
We include a userspace IRQ patch in our 2.6 based kernels.  This allows you to receive interrupts from your applications where you would normally have to write a kernel driver.  This works by creating a file for each interrupt in '/proc/irq/<irqnum>/irq'.  The new irq file allows you to block on a read on the file until an interrupt fires.
We include a userspace IRQ patch in our kernels.  This allows you to receive interrupts from your applications where you would normally have to write a kernel driver.  This works by creating a file for each interrupt in '/proc/irq/<irqnum>/irq'.  The new irq file allows you to block on a read on the file until an interrupt fires.


The original patch is documented [http://lwn.net/Articles/127293/ here].
The original patch is documented [http://lwn.net/Articles/127293/ here].


This example below will work with any of our boards.  This opens the IRQ number specified in the first argument and prints when it detects an IRQ.
This example below will work with any of our TS-Socket boards running Linux.  This opens the IRQ number specified in the first argument and prints when it detects an IRQ.


<source lang=c>
<source lang=c>

Latest revision as of 12:42, 9 July 2012

We include a userspace IRQ patch in our kernels. This allows you to receive interrupts from your applications where you would normally have to write a kernel driver. This works by creating a file for each interrupt in '/proc/irq/<irqnum>/irq'. The new irq file allows you to block on a read on the file until an interrupt fires.

The original patch is documented here.

This example below will work with any of our TS-Socket boards running Linux. This opens the IRQ number specified in the first argument and prints when it detects an IRQ.

#include <stdio.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	char proc_irq[32];
	int ret, irqfd = 0;
	int buf; // Holds irq junk data
	fd_set fds;

	if(argc < 2) {
		printf("Usage: %s <irq number>\n", argv[0]);
		return 1;
	}

	snprintf(proc_irq, sizeof(proc_irq), "/proc/irq/%d/irq", atoi(argv[1]));
	irqfd = open(proc_irq, O_RDONLY| O_NONBLOCK, S_IREAD);

	if(irqfd == -1) {
		printf("Could not open IRQ %s\n", argv[1]);
		return 1;
	}
	
	while(1) {
		FD_SET(irqfd, &fds); //add the fd to the set
		// See if the IRQ has any data available to read
		ret = select(irqfd + 1, &fds, NULL, NULL, NULL);
		
		if(FD_ISSET(irqfd, &fds))
		{
			FD_CLR(irqfd, &fds);  //Remove the filedes from set
			printf("IRQ detected\n");
			
			// Clear the junk data in the IRQ file
			read(irqfd, &buf, sizeof(buf));
		}
		
		//Sleep, or do any other processing here
		usleep(10000);
	}
	
	return 0;
}