Installing interrupts for a custom driver
Alberto Parnaso
pafbat00 at yahoo.es
Fri Apr 4 13:12:59 UTC 2014
Hi, I am newbie in RTEMS and I am trying to install an interrupt into the
interrupt controller to be capable of using an APBUART peripheral within a LEON3 based embedded processor. I configure the system so driver
manager configures at BSP Start the console and the timer. I do have two APBUART configured in the system and my intention is to use the first
one with console/termios driver and the second one with my own driver.
Here is a copy the output of "info sys" command:
<<
grmon2> info sys
cpu0 Aeroflex Gaisler LEON3 SPARC V8 Processor
AHB Master
0
ahbjtag0 Aeroflex Gaisler JTAG Debug Link
AHB Master 1
mctrl0 European Space Agency LEON2 Memory Controller
AHB: 00000000 - 20000000
AHB: 20000000 - 40000000
AHB: 40000000 - 80000000
APB: 80000000 -
80000100
32-bit prom @ 0x00000000
32-bit static ram: 2 * 512 kbyte @ 0x40000000
apbmst0 Aeroflex Gaisler AHB/APB Bridge
AHB: 80000000 - 80100000
dsu0 Aeroflex Gaisler LEON3 Debug Support Unit
AHB: 90000000 - A0000000
CPU0: win 8, hwbp 2, V8 mul/div, lddel 1, GRFPU-lite
stack pointer 0x400ffff0
icache 1 * 4 kB, 32 B/line
dcache 1 * 4 kB, 32 B/line
uart0 Aeroflex Gaisler Generic UART
APB: 80000100 - 80000200
IRQ: 2
Baudrate 38343
irqmp0 Aeroflex Gaisler Multi-processor
Interrupt Ctrl.
APB: 80000200 - 80000300
gptimer0 Aeroflex Gaisler Modular Timer Unit
APB: 80000300 - 80000400
IRQ: 8
8-bit scalar, 2 * 32-bit timers, divisor 50
uart1 Aeroflex Gaisler Generic UART
APB: 80000900 - 80000A00
IRQ: 3
Baudrate 38343
gpio0 Aeroflex Gaisler General Purpose I/O port
APB: 80000B00 - 80000C00
>>
I have wrote a testing app to check if both UARTs work and also to try to install a handler for RX on the second UART. Here is my code:
<<
#include <rtems.h>
rtems_task Init( rtems_task_argument argument); /* forward declaration needed */
/* configuration information */
#define CONFIGURE_INIT
#include <bsp.h> /* for device driver prototypes */
#define
CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define
CONFIGURE_MAXIMUM_TASKS 4
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#include <rtems/confdefs.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <apbuart.h>
// Global Variable to check if Interrupt has been signaled.
unsigned char uc_intr_flag;
// Interrupt handler for APBUART peripheral
void UARTInterruptHandler ()
{
uc_intr_flag = 1;
}
rtems_task Init (rtems_task_argument ignored)
{
int i;
rtems_status_code ret_status;
rtems_isr_entry old_handler;
volatile int *apbuart1 =
(int*)0x80000900;
volatile int aux;
// Reset Interrupt Flag
uc_intr_flag = 0;
printf("APB UART TEST with Interrupts\n");
aux = apbuart1[1];
printf("APBUART1 STATUS: 0x%08X\n", aux);
aux = apbuart1[2];
printf("APBUART1 CONTROL: 0x%08X\n", aux);
// Install UARTInterruptHandler at vector number 3
ret_status = rtems_interrupt_catch(
(rtems_isr_entry)UARTInterruptHandler,
(rtems_vector_number)3,
&old_handler);
switch (ret_status)
{
case RTEMS_SUCCESSFUL :
printf("rtems_interrupt_catch: OK. New Interrupt installed for IRQ 3 - APBUART 2.\n");
break ;
case RTEMS_INVALID_NUMBER :
printf("rtems_interrupt_catch: RTEMS_INVALID_NUMBER.\n");
break ;
case RTEMS_INVALID_ADDRESS :
printf("rtems_interrupt_catch: RTEMS_INVALID_ADDRESS.\n");
break ;
default
:
printf("rtems_interrupt_catch: Unknown error.\n");
break ;
}
// Tell uart hardware to initialize directly
/* Enable receiver (with interrupts) & Transmitter */
apbuart1[2] = APBUART_CTRL_RE | APBUART_CTRL_TE | APBUART_CTRL_RI;
aux = apbuart1[1];
printf("UART1 STATUS: 0x%02X\n", aux);
aux = apbuart1[2];
printf("UART1 CONTROL: 0x%08X\n", aux);
// Write a character though APBUART1 to test it
apbuart1[0] = 0xD8;
while (1)
{ // Perform some active wait time
for (i
= 2000000; i > 0; i--);
printf("Hello World\n");
apbuart1[0] = 0xD8;
// If interrupt received, read from APBUART
if (uc_intr_flag == 1)
{
uc_intr_flag = 0;
aux = apbuart1[0];
printf("Interrupt received from UART: data = %X\n", aux);
}
}
exit (0);
}
>>
First UART (ie. debug UART) works fine and output data through STDOUT
properly. Data sent through second UART is received also by another
external terminal, and in other test I have been capable of receiving
too. However UARTInterruptHandler is never signaled, thus I guess I am
missing something with the interrupt instalation.
Could any one see anything missing in this code? I would very much appreciate some help. Any clue on how to properly use interrupts will help me a lot!
Thanks!
Alberto.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20140404/97af62d9/attachment.html>
More information about the users
mailing list