TS-7600 Interrupts: Difference between revisions

From embeddedTS Manuals
(Created page with "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 wo...")
 
m (Reverted edits by Mpeters (talk) to last revision by Kris)
 
(3 intermediate revisions by 2 users not shown)
Line 3: Line 3:
The original patch is documented [http://lwn.net/Articles/127293/ here].
The original patch is documented [http://lwn.net/Articles/127293/ here].


The Linux kernel supports 3 IRQs from the FPGA.  Because of the nature of the NBUS, this requires three separate lines from the FPGA to the CPU.  Currently only two IRQs are used from the CPU, one for [[#XUARTS|XUARTS]] and one for [[#Event Driven GPIO|EVGPIO]].  The third IRQ is not hooked up by default.  Any of the IRQs can be repurposed by customization of the [[#FPGA|FPGA]].  At any time, the FPGA can toggle the interrupt line, however in order for the kernel to respond to it, the IRQ must be opened first.
The Linux kernel supports 3 IRQs from the FPGA.  Because of the nature of the NBUS, this requires three separate lines from the FPGA to the CPU.  Currently only two IRQs are used from the CPU, one for [[#XUARTS|XUARTS]] and one for [[#EVGPIO|EVGPIO]].  The third IRQ is not hooked up by default.  Any of the IRQs can be repurposed by customization of the [[#FPGA|FPGA]].  At any time, the FPGA can toggle the interrupt line, however in order for the kernel to respond to it, the IRQ must be opened first.




Line 11: Line 11:
! Name
! Name
|-
|-
| 145
| 155
| [[#XUARTS|XUART]] IRQ (not used by xuartctl --server by default)
| [[#XUARTS|XUART]] IRQ (not used by xuartctl --server by default)
|-
|-
| 155
| 145
| [[#Event Driven GPIO|EVGPIO]] IRQ
| [[#EVGPIO|EVGPIO]] IRQ
|-
|-
| 228
| 228

Latest revision as of 12:14, 8 November 2016

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.

The Linux kernel supports 3 IRQs from the FPGA. Because of the nature of the NBUS, this requires three separate lines from the FPGA to the CPU. Currently only two IRQs are used from the CPU, one for XUARTS and one for EVGPIO. The third IRQ is not hooked up by default. Any of the IRQs can be repurposed by customization of the FPGA. At any time, the FPGA can toggle the interrupt line, however in order for the kernel to respond to it, the IRQ must be opened first.


CPU IRQ # Name
155 XUART IRQ (not used by xuartctl --server by default)
145 EVGPIO IRQ
228 Unused

This example below will work with any of our products that support userspace IRQs. It 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;
}