Changeset a7e6bc96 in rtems


Ignore:
Timestamp:
Feb 4, 2005, 3:37:04 PM (16 years ago)
Author:
Eric Norum <WENorum@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
b1e04829
Parents:
f7d4f0a
Message:

Clean up INTC0 initialization. EPORT1-7 sources are fixed level/priority.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c

    rf7d4f0a ra7e6bc96  
    317317 * VME interrupt support
    318318 */
     319#define NVECTOR 256
     320
    319321static struct handlerTab {
    320322    BSP_VME_ISR_t func;
    321323    void         *arg;
    322 } handlerTab[256];
     324} handlerTab[NVECTOR];
    323325
    324326BSP_VME_ISR_t
    325327BSP_getVME_isr(unsigned long vector, void **pusrArg)
    326328{
    327     if (vector > 255)
     329    if (vector >= NVECTOR)
    328330        return (BSP_VME_ISR_t)NULL;
    329331    if (pusrArg)
     
    333335
    334336static rtems_isr
    335 trampoline (int v)
    336 {
    337     if (*handlerTab[v].func)
     337trampoline (rtems_vector_number v)
     338{
     339    if (handlerTab[v].func)
    338340        (*handlerTab[v].func)(handlerTab[v].arg, (unsigned long)v);
    339341}
     
    344346    rtems_isr_entry old_handler;
    345347
    346     if (vector > 255)
     348    if (vector >= NVECTOR)
    347349        return -1;
    348350    handlerTab[vector].func = handler;
     
    351353
    352354    /*
    353      * Find an unused level/priority
     355     * Find an unused level/priority if this is an on-chip (INTC0)
     356     * source and this is the first time the source is being used.
     357     * Interrupt sources 1 through 7 are fixed level/priority
    354358     */
    355359    if ((vector >= 65) && (vector <= 127)) {
    356360        int l, p;
    357         int voffset = vector - 64;
     361        int source = vector - 64;
    358362        rtems_interrupt_level level;
    359 
     363        static unsigned char installed[8];
     364
     365        if (installed[source/8] & (1 << (source % 8)))
     366            return 0;
     367        installed[source/8] |= (1 << (source % 8));
    360368        for (l = 1 ; l < 7 ; l++) {
    361369            for (p = 0 ; p < 7 ; p++) {
    362                 if (bsp_allocate_interrupt(l,p) == RTEMS_SUCCESSFUL) {
    363                     *(&MCF5282_INTC0_ICR1 + (vector - 65)) =
     370                if ((source < 8)
     371                 || (bsp_allocate_interrupt(l,p) == RTEMS_SUCCESSFUL)) {
     372                    if (source < 8)
     373                        *(&MCF5282_INTC0_ICR1 + (source - 1)) =
    364374                                                       MCF5282_INTC_ICR_IL(l) |
    365375                                                       MCF5282_INTC_ICR_IP(p);
    366376                    rtems_interrupt_disable(level);
    367                     if (voffset >= 32)
    368                         MCF5282_INTC0_IMRH &= ~(1 << (voffset - 32));
     377                    if (source >= 32)
     378                        MCF5282_INTC0_IMRH &= ~(1 << (source - 32));
    369379                    else
    370                         MCF5282_INTC0_IMRL &= ~((1 << voffset) |
     380                        MCF5282_INTC0_IMRL &= ~((1 << source) |
    371381                                                MCF5282_INTC_IMRL_MASKALL);
    372382                    rtems_interrupt_enable(level);
     
    375385            }
    376386        }
     387        return -1;
    377388    }
    378     return -1;
     389    return 0;
    379390}
    380391
     
    382393BSP_removeVME_isr(unsigned long vector, BSP_VME_ISR_t handler, void *usrArg)
    383394{
    384     if (vector > 255)
     395    if (vector >= NVECTOR)
    385396        return -1;
    386397    if ((handlerTab[vector].func != handler)
Note: See TracChangeset for help on using the changeset viewer.