/************************************************************************
* NAME: fnet_cpu_isr_install
*
* DESCRIPTION: 
*************************************************************************/
int fnet_cpu_isr_install(unsigned int vector_number, unsigned int priority)
{
    int result;
    unsigned long *irq_vec;
    int div;
    int irq_number; /* The irq number NOT the vector number.*/

    irq_vec = (unsigned long *)(FNET_CFG_CPU_VECTOR_TABLE) + vector_number;

    if(*irq_vec != (unsigned long) FNET_ISR_HANDLER)
    { /* It's not installed yet.*/
        *irq_vec = (unsigned long) FNET_ISR_HANDLER;
    }
        
    if(*irq_vec == (unsigned long) FNET_ISR_HANDLER)
    {        
        /* Make sure that the IRQ is an allowable number. */
        irq_number = vector_number - 16;
        div = irq_number/32;
        if((div >= 0) && (div < 3))
        {
            /* Initialize the NVIC to enable the specified IRQ.*/
            FNET_MK_NVIC_ICPR(div) |= 1 << (irq_number%32); /* Clear-pending. */
            FNET_MK_NVIC_ISER(div) |= 1 << (irq_number%32); /* Set-enable.*/
            /* Set priority.*/
            FNET_MK_NVIC_IP(irq_number) = (0x7-priority&0x7)<<4;
        }
        result = FNET_OK;
    }
    else
        result = FNET_ERR;
   
   return result;            
}
Пример #2
0
/************************************************************************
* NAME: fnet_cpu_isr_install
*
* DESCRIPTION:
*************************************************************************/
fnet_return_t fnet_cpu_isr_install(fnet_uint32_t vector_number, fnet_uint32_t priority)
{
    fnet_return_t   result;
    fnet_uint32_t   *irq_vec;
    fnet_uint32_t   divider;
    fnet_uint32_t   irq_number; /* The irq number NOT the vector number.*/

    irq_vec = (fnet_uint32_t *)(FNET_CFG_CPU_VECTOR_TABLE) + vector_number;

    fnet_bool_t isrInstalled = *irq_vec & ~(0x1) != (fnet_uint32_t) FNET_ISR_HANDLER;
    if(!isrInstalled)
    {
        /* It's not installed yet.*/
        *irq_vec = (fnet_uint32_t) FNET_ISR_HANDLER | 0x1;
    }
    isrInstalled = *irq_vec & ~(0x1) != (fnet_uint32_t) FNET_ISR_HANDLER;

    if(priority > FNET_CFG_CPU_VECTOR_PRIORITY_MAX)
    {
        priority = FNET_CFG_CPU_VECTOR_PRIORITY_MAX;
    }

    if(isrInstalled)
    {
        /* Make sure that the IRQ is an allowable number. */
        irq_number = vector_number - 16u;
        divider = irq_number / 32u;
        if(divider < 3u)
        {
            /* Initialize the NVIC to enable the specified IRQ.*/
            FNET_MK_NVIC_ICPR(divider) |= (fnet_uint32_t)(1u << (irq_number % 32u)); /* Clear-pending. */
            FNET_MK_NVIC_ISER(divider) |= (fnet_uint32_t)(1u << (irq_number % 32u)); /* Set-enable.*/
            /* Set priority.*/
            FNET_MK_NVIC_IP(irq_number) = (fnet_uint8_t)(FNET_CFG_CPU_VECTOR_PRIORITY_MAX - priority) << 4;
        }
        result = FNET_OK;
    }
    else
    {
        result = FNET_ERR;
    }

    return result;
}