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