Ejemplo n.º 1
0
void  CSP_TmrIntClr (CSP_DEV_NBR tmr_nbr)
{
    CSP_TMR_REG  *p_tmr_reg;
    CSP_DEV_NBR   match_nbr;
    CPU_INT32U    reg_msk;
    CPU_INT32U    reg_stat;
    CPU_INT32U    reg_clr;
    

#if (CSP_CFG_ARG_CHK_EN == DEF_ENABLED)         
    if (tmr_nbr > CSP_TMR_NBR_03) {
        return;
    }
#endif
    
    p_tmr_reg = (CSP_TMR_REG *)CSP_TmrAddrTbl[tmr_nbr];
    reg_clr   = DEF_BIT_NONE;
    reg_msk   = p_tmr_reg->MCR;
    reg_stat  = p_tmr_reg->IR;
    
    for (match_nbr =  0; match_nbr <= CSP_TMR_MATCH_NBR_03; match_nbr++) {
        if ((DEF_BIT_IS_SET(reg_msk,  CSP_TMR_BIT_MCR_MRIx(match_nbr)) == DEF_YES) &&
            (DEF_BIT_IS_SET(reg_stat, DEF_BIT(match_nbr))              == DEF_YES)) {
            DEF_BIT_SET(reg_clr, DEF_BIT(match_nbr));
        }
    }
        
    p_tmr_reg->IR = reg_clr;
}
Ejemplo n.º 2
0
CPU_BOOLEAN  CSP_DMA_XferStartExt (CSP_DEV_NBR     ch_nbr,
                                   void           *p_dest,
                                   void           *p_src,                                   
                                   CPU_SIZE_T      xfer_size,
                                   CSP_OPT_FLAGS   opt)

{   
    CSP_DMA_REG     *p_dma_reg;
    CSP_DMA_CH_REG  *p_dma_ch_reg;
    CPU_INT32U       reg_ctrl;    
    CPU_SR_ALLOC();

                                                                /* ------------------ ARGUMENTS CHECKING -------------- */
#if (CSP_CFG_ARG_CHK_EN == DEF_ENABLED)             
    if (ch_nbr > CSP_DMA_CH_MAX_NBR - 1u) {                     /* Invalid channel number?                              */
        return (DEF_FAIL);
    }
                                                                /* Channel not available?                               */
    if (CSP_DMA_ChTbl[ch_nbr].State != CSP_DMA_CH_STATE_ALLOC) {
        return (DEF_FAIL);
    }

    if ((p_dest == (void *)0) ||                                /* Null pointers?                                        */
        (p_src  == (void *)0)) {
        return (DEF_FAIL);
    }    
#endif    

    p_dma_reg    = (CSP_DMA_REG *)CSP_ADDR_DMA_REG;                  
    p_dma_ch_reg = &(p_dma_reg->CHx[ch_nbr]);
    reg_ctrl     = p_dma_ch_reg->Ctrl;

    DEF_BIT_CLR(reg_ctrl, CSP_DMA_MSK_CH_CTRL_XFER_SIZE |
                          CSP_DMA_BIT_CH_CTRL_SI        |
                          CSP_DMA_BIT_CH_CTRL_DI        |
                          CSP_DMA_BIT_CH_CTRL_I);

    DEF_BIT_SET(reg_ctrl, (xfer_size & CSP_DMA_MSK_CH_CTRL_XFER_SIZE));

    if (DEF_BIT_IS_SET(opt, CSP_DMA_OPT_FLAG_XFER_SRC_INC)) {
        DEF_BIT_SET(reg_ctrl, CSP_DMA_BIT_CH_CTRL_SI);
    }
    
    if (DEF_BIT_IS_SET(opt, CSP_DMA_OPT_FLAG_XFER_DEST_INC)) {
        DEF_BIT_SET(reg_ctrl, CSP_DMA_BIT_CH_CTRL_DI);        
    }        
    
    
    CPU_CRITICAL_ENTER();
    p_dma_ch_reg->SrcAddr     = (CPU_INT32U )p_src;
    p_dma_ch_reg->DestAddr    = (CPU_INT32U )p_dest;       
    p_dma_ch_reg->Ctrl        = reg_ctrl;
    DEF_BIT_CLR(p_dma_ch_reg->Cfg, CSP_DMA_BIT_CH_CFG_ITC   | 
                                   CSP_DMA_BIT_CH_CFG_IE);
    DEF_BIT_SET(p_dma_ch_reg->Cfg, CSP_DMA_BIT_CH_CFG_CH_EN); 
    CPU_CRITICAL_EXIT();

    return (DEF_OK);
}
Ejemplo n.º 3
0
static  void  BSP_PLL_Init (void)
{
    CPU_REG32   reg_val;
    CPU_SR_ALLOC();


    CPU_CRITICAL_ENTER();

                                                                /* System clock divider configuration.                  */
    BSP_REG_SIM_CLKDIV1 = (BSP_SIM_CLKDIV1_OUTDIV1_DIV2 |       /* Clock 1 divide by 2.                                 */
                           BSP_SIM_CLKDIV1_OUTDIV4_DIV2);       /* Clock 4 divide by 2.                                 */

                                                                /* Multipurpose clock generator configuration.          */
    BSP_REG_MCG_C2 = (BSP_MCG_C2_LOCRE0          |              /* Generate a reset request on a loss of ext ref clk.   */
                      BSP_MCG_C2_RANGE_HIGH_FREQ |              /* Select high freq range for the crystal oscillator.   */
                      BSP_MCG_C2_EREFS0);                       /* Select oscillator as the source for the ext ref clk. */

    BSP_REG_MCG_C1 = (BSP_MCG_C1_CLKS_EXT_CLK    |              /* Selects the ext ref clk as the clk source for MCG.   */
                      BSP_MCG_C1_FRDIV_8);                      /* Divide the ext ref clk by 256 for the FLL.           */

    while (DEF_BIT_IS_SET(BSP_REG_MCG_S, BSP_MCG_S_IREFST)) {   /* Wait for Reference clock Status bit to clear.        */
        ;
    }

    do {                                                        /* Wait for clock status bits to show clock.            */
        reg_val = (BSP_REG_MCG_S & BSP_MCG_S_CLKST_MASK) >> 2u; /* source is ext ref clk.                               */
    } while (reg_val != 0x2);


                                                                /* --------------------- PLL0 CFG --------------------- */
    BSP_REG_MCG_C5  = BSP_MCG_C5_PRDIV0_4;                      /* Select PLL0 external reference divider.              */

    BSP_REG_MCG_C6 = (BSP_MCG_C6_PLLS    |                      /* Select the PLL output.                               */
                      BSP_MCG_C6_CME0    |                      /* Enable the loss of clock monitoring circuit.         */
                      BSP_MCG_C6_VDIV0_MUL_48);


    while (DEF_BIT_IS_CLR(BSP_REG_MCG_S, BSP_MCG_S_PLLST)) {    /* Wait for PLL status bit to set.                      */
        ;
    }

    while (DEF_BIT_IS_CLR(BSP_REG_MCG_S, BSP_MCG_S_LOCK0)) {    /* Wait for LOCK bit to set.                            */
        ;
    }

    DEF_BIT_CLR(BSP_REG_MCG_C1, BSP_MCG_C1_CLKS_MASK);          /* Clear CLKS to switch CLKS mux to PLL as MCG_OUT.     */

    do {
        reg_val = (BSP_REG_MCG_S & BSP_MCG_S_CLKST_MASK) >> 2u;
    } while (reg_val != 0x3);                                   /* Wait for clock status bits to update.                */


    SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK;                      /* Set PLLFLLSEL to select the PLL for this clk src.    */

    CPU_CRITICAL_EXIT();
}
Ejemplo n.º 4
0
CPU_SIZE_T  BSP_SerWr (CPU_DATA     port_id,
                       void        *p_src,
                       CPU_SIZE_T   size)
{
    LM3SXXXX_STRUCT_UART  *uart;
    CPU_INT08U            *p_src_08;
    CPU_SIZE_T             cnt;
    CPU_INT08U             datum;
    CPU_INT32U             fr;


    if (port_id > BSP_SER_PORT_NBR_MAX) {
        return (DEF_NO);
    }

    switch (port_id) {
        case BSP_SER_ID_UART0:
             uart = (LM3SXXXX_STRUCT_UART *)LM3SXXXX_BASE_UART0;
             break;

#if (BSP_SER_PORT_NBR_MAX >= BSP_SER_ID_UART1)
        case BSP_SER_ID_UART1:
             uart = (LM3SXXXX_STRUCT_UART *)LM3SXXXX_BASE_UART1;
             break;
#endif

#if (BSP_SER_PORT_NBR_MAX >= BSP_SER_ID_UART2)
        case BSP_SER_ID_UART2:
             uart = (LM3SXXXX_STRUCT_UART *)LM3SXXXX_BASE_UART2;
             break;
#endif

        default:
             return (0u);
    }


    p_src_08 = (CPU_INT08U *)p_src;
    cnt      =  0u;
    while (cnt < size) {
        fr = uart->FR;
        while (DEF_BIT_IS_SET(fr, LM3SXXXX_BIT_UARTFR_TXFF) == DEF_YES) {
            BSP_OS_Dly_ms(1u);
            fr = uart->FR;
        }
        datum     = *p_src_08;
        uart->DR  =  datum;
        p_src_08++;
        cnt++;
    }
    return (cnt);
}
Ejemplo n.º 5
0
CPU_SIZE_T  BSP_SerRdLine(CPU_DATA     port_id,
                          void        *p_dest,
                          CPU_SIZE_T   size)
{
    LM3SXXXX_STRUCT_UART  *uart;
    CPU_INT08U            *p_dest_08;
    CPU_SIZE_T             cnt;
    CPU_INT08U             datum;
    CPU_INT32U             fr;
    CPU_BOOLEAN            print;


    if (port_id > BSP_SER_PORT_NBR_MAX) {
        return (DEF_NO);
    }

    switch (port_id) {
        case BSP_SER_ID_UART0:
             uart = (LM3SXXXX_STRUCT_UART *)LM3SXXXX_BASE_UART0;
             break;

#if (BSP_SER_PORT_NBR_MAX >= BSP_SER_ID_UART1)
        case BSP_SER_ID_UART1:
             uart = (LM3SXXXX_STRUCT_UART *)LM3SXXXX_BASE_UART1;
             break;
#endif

#if (BSP_SER_PORT_NBR_MAX >= BSP_SER_ID_UART2)
        case BSP_SER_ID_UART2:
             uart = (LM3SXXXX_STRUCT_UART *)LM3SXXXX_BASE_UART2;
             break;
#endif

        default:
             return (0u);
    }


    p_dest_08 = (CPU_INT08U *)p_dest;
    cnt       =  0u;
    while (cnt < size - 1u) {
        fr = uart->FR;
        while (DEF_BIT_IS_SET(fr, LM3SXXXX_BIT_UARTFR_RXFE) == DEF_YES) {
            BSP_OS_Dly_ms(1u);
            fr = uart->FR;
        }
        datum = (CPU_INT08U)uart->DR;

        print =  ASCII_IS_PRINT(datum);
        if (print == DEF_YES) {
           *p_dest_08 =  datum;
            p_dest_08++;
            BSP_SerWr(port_id, (void *)&datum, 1);
        } else {
            if (datum == ASCII_CHAR_BACKSPACE) {
                if (cnt > 0u) {
                    BSP_SerWr(port_id, (void *)"\b \b", 3);
                    cnt--;
                }
            } else if (datum == ASCII_CHAR_CARRIAGE_RETURN) {
               *p_dest_08 = (CPU_CHAR)ASCII_CHAR_NULL;
                return (cnt);
            }
        }
        cnt++;
    }
   *p_dest_08 = (CPU_CHAR)ASCII_CHAR_NULL;
    return (cnt);
}
Ejemplo n.º 6
0
void  BSP_Init (void)
{
    CPU_INT16U    reg_to;
    CPU_INT32U    reg_val;
    CPU_SR_ALLOC();

                                                                /* ---------------- CLOCK INITIALIZATION -------------- */
    BSP_REG_FLASHCFG = BSP_MSK_FLASHCFG_CLK_6                   /* Set 6 cycles to acces the Flash memory.              */
                     | BSP_MSK_FLASHCFG_RST_VAL;
                                                                /* ----------- MAIN OSCILLATOR INITIALIZATION --------- */
    DEF_BIT_CLR(BSP_REG_SCS, BSP_BIT_SCS_OSCRANGE);             /* Set the main oscillator range                        */


    reg_to = BSP_VAL_MAX_TO;

    DEF_BIT_SET(BSP_REG_SCS, BSP_BIT_SCS_OSCEN);                /* Enable the Main Oscillator                           */

                                                                /* Wait until the main oscillator is enabled.           */
    while (DEF_BIT_IS_CLR(BSP_REG_SCS, BSP_BIT_SCS_OSCSTAT) &&
          (reg_to > 0u)) {
        reg_to--;
    }

    if (reg_to == 0u) {                                         /* Configuration fail                                   */
        return;
    }

    BSP_REG_PCLKSEL0 = DEF_BIT_NONE;                            /* All peripheral clock runrs at CPU_Clk / 4 = 25 Mhz   */
    BSP_REG_PCLKSEL1 = DEF_BIT_NONE;

                                                                /* ------------------ PLL0 CONFIGURATION -------------- */

    reg_val  = (((25u - 1u) <<  0u) & BSP_MSK_PLLCFG0_MSEL)     /* PLL0 values M = 25 & N = 2 (see note #6)             */
             | ((( 2u - 1u) << 16u) & BSP_MSK_PLLCFG0_NSEL);
                                                                /* 1. Disconnect PLL0 with one feed sequence if PLL ... */
                                                                /* ... already connected.                               */
    if (DEF_BIT_IS_SET(BSP_REG_PLLSTAT(0u), BSP_BIT_PLLSTAT_PLLC0_STAT)) {
        DEF_BIT_CLR(BSP_REG_PLLCTRL(0u), BSP_BIT_PLLCTRL_PLLC);
        BSP_PLL_FEED_SEQ(0u);
    }

    DEF_BIT_CLR(BSP_REG_PLLCTRL(0u), BSP_BIT_PLLCTRL_PLLE);     /* 2. Disable PLL0 with one feed sequence               */
    BSP_PLL_FEED_SEQ(0u);

    BSP_REG_CCLKCFG   = (1u - 1u);                              /* 3. Change the CPU clock divider setting to speed ... */
                                                                /* ... operation without PLL0                           */

    BSP_REG_CLKSRCSEL = BSP_BIT_CLKSRCSEL_MAIN;                 /* 4. Select the main osc. as the PLL0 clock source     */

    BSP_REG_PLLCFG(0u) = reg_val;                               /* 5. Write to the PLLCFG and make it effective with... */
    BSP_PLL_FEED_SEQ(0u)                                        /* ... one one feed sequence                            */

    DEF_BIT_SET(BSP_REG_PLLCTRL(0u), BSP_BIT_PLLCTRL_PLLE);     /* 6. Enable PLL0 with one feed sequence                */
    BSP_PLL_FEED_SEQ(0u);

    BSP_REG_CCLKCFG   = (3u - 1u);                              /* 7. Change the CPU clock divider setting for ...      */
                                                                /* ... operation with PLL0                              */

    reg_to = BSP_VAL_MAX_TO;                                    /* 8. Wait for PLL0 to achieve lock by monitoring ...   */
                                                                /* ... the PLOCK0 bit in the PLL0STAT                   */
    while (DEF_BIT_IS_CLR(BSP_REG_PLLSTAT(0u), BSP_BIT_PLLSTAT_PLOCK0) &&
          (reg_to > 0u)) {
        reg_to--;
    }

    if (reg_to == 0u) {
        return;
    }

    DEF_BIT_SET(BSP_REG_PLLCTRL(0u), BSP_BIT_PLLCTRL_PLLC);     /* 9. Connect PLL0 with one feed sequence               */
    BSP_PLL_FEED_SEQ(0u);
                                                                /* ------------------ PLL1 CONFIGURATION -------------- */
    reg_val  = (((4u - 1u)  <<  0u) & BSP_MSK_PLLCFG1_MSEL)     /* PLL1 values M = 4; P = 2 coded as '01' (see note #6) */
             | (((0x01u   ) <<  5u) & BSP_MSK_PLLCFG1_NSEL);

    DEF_BIT_CLR(BSP_REG_PLLCTRL(1u), BSP_BIT_PLLCTRL_PLLC);     /* 1. Disconnect PLL1 with one feed sequence            */
    BSP_PLL_FEED_SEQ(1u);

    DEF_BIT_CLR(BSP_REG_PLLCTRL(1u), BSP_BIT_PLLCTRL_PLLE);     /* 2. Disable PLL1 with one feed sequence               */
    BSP_PLL_FEED_SEQ(1u);

    BSP_REG_PLLCFG(1u) = reg_val;                               /* 3. Write to the PLLCFG and make it effective with... */
    BSP_PLL_FEED_SEQ(1u);                                       /* ... one one feed sequence                            */

    DEF_BIT_SET(BSP_REG_PLLCTRL(1u), BSP_BIT_PLLCTRL_PLLE);     /* 4. Enable PLL1 with one feed sequence                */
    BSP_PLL_FEED_SEQ(1u);

    reg_to = BSP_VAL_MAX_TO;                                    /* 5. Wait for PLL1 to achieve lock by monitoring ...   */
                                                                /* ... the PLOCK1 bit in the PLL1STAT                   */
    while (DEF_BIT_IS_CLR(BSP_REG_PLLSTAT(1u), BSP_BIT_PLLSTAT_PLOCK1) &&
          (reg_to > 0u)) {
        reg_to--;
    }

    if (reg_to == 0u) {
        return;
    }

    DEF_BIT_SET(BSP_REG_PLLCTRL(1u), BSP_BIT_PLLCTRL_PLLC);     /* 6. Connect PLL1 with one feed sequence               */
    BSP_PLL_FEED_SEQ(1u);


    BSP_REG_FLASHCFG = BSP_MSK_FLASHCFG_CLK_5                   /* Set 5 cycles to acces the Flash memory.              */
                     | BSP_MSK_FLASHCFG_RST_VAL;

    CSP_GPIO_Cfg(CSP_GPIO_PORT_NBR_00,
                 BSP_GPIO0_LED2,
                 CSP_GPIO_DIR_OUT,
                 CSP_GPIO_FLAG_MODE_NONE,
                 DEF_NO,
                 0u,
                 CSP_GPIO_FNCT_00);

    CSP_GPIO_Cfg(CSP_GPIO_PORT_NBR_01,
                 BSP_GPIO1_LED1,
                 CSP_GPIO_DIR_OUT,
                 CSP_GPIO_FLAG_MODE_NONE,
                 DEF_NO,
                 0u,
                 CSP_GPIO_FNCT_00);

    CSP_GPIO_Cfg(CSP_GPIO_PORT_NBR_00,
                 BSP_GPIO0_BUT1,
                 CSP_GPIO_DIR_IN,
                 CSP_GPIO_FLAG_MODE_NONE,
                 DEF_NO,
                 0u,
                 CSP_GPIO_FNCT_00);

    CSP_GPIO_Cfg(CSP_GPIO_PORT_NBR_02,
                 BSP_GPIO2_BUT2,
                 CSP_GPIO_DIR_IN,
                 CSP_GPIO_FLAG_MODE_NONE,
                 DEF_NO,
                 0u,
                 CSP_GPIO_FNCT_00);

    BSP_LED_Off(0);

    CSP_GPIO_Cfg( CSP_GPIO_PORT_NBR_02,
                 (BSP_GPIO2_JOY_RIGHT |
                  BSP_GPIO2_JOY_DOWN  |
                  BSP_GPIO2_JOY_LEFT  |
                  BSP_GPIO2_JOY_RIGHT),
                  CSP_GPIO_DIR_IN,
                  CSP_GPIO_FLAG_MODE_NONE,
                  DEF_NO,
                  0u,
                  CSP_GPIO_FNCT_00);

    CSP_GPIO_Cfg( CSP_GPIO_PORT_NBR_00,
                  BSP_GPIO0_JOY_CENTER,
                  CSP_GPIO_DIR_IN,
                  CSP_GPIO_FLAG_MODE_NONE,
                  DEF_NO,
                  0u,
                  CSP_GPIO_FNCT_00);

    CSP_IntInit();
    CSP_IntDisAll(CSP_INT_CTRL_NBR_MAIN);
}
void  OSTimeDlyHMSM (CPU_INT16U   hours,
                     CPU_INT16U   minutes,
                     CPU_INT16U   seconds,
                     CPU_INT32U   milli,
                     OS_OPT       opt,
                     OS_ERR      *p_err)
{
#if OS_CFG_ARG_CHK_EN > 0u
    CPU_BOOLEAN  opt_invalid;
    CPU_BOOLEAN  opt_non_strict;
#endif
    OS_OPT       opt_time;
    OS_RATE_HZ   tick_rate;
    OS_TICK      ticks;
    CPU_SR_ALLOC();



#ifdef OS_SAFETY_CRITICAL
    if (p_err == (OS_ERR *)0) {
        OS_SAFETY_CRITICAL_EXCEPTION();
        return;
    }
#endif

#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
    if (OSIntNestingCtr > (OS_NESTING_CTR)0u) {             /* Not allowed to call from an ISR                        */
       *p_err = OS_ERR_TIME_DLY_ISR;
        return;
    }
#endif

    if (OSSchedLockNestingCtr > (OS_NESTING_CTR)0u) {       /* Can't delay when the scheduler is locked               */
       *p_err = OS_ERR_SCHED_LOCKED;
        return;
    }

    opt_time = opt & OS_OPT_TIME_MASK;                      /* Retrieve time options only.                            */
    switch (opt_time) {
        case OS_OPT_TIME_DLY:
        case OS_OPT_TIME_TIMEOUT:
        case OS_OPT_TIME_PERIODIC:
             if (milli == (CPU_INT32U)0u) {                 /* Make sure we didn't specify a 0 delay                  */
                 if (seconds == (CPU_INT16U)0u) {
                     if (minutes == (CPU_INT16U)0u) {
                         if (hours == (CPU_INT16U)0u) {
                            *p_err = OS_ERR_TIME_ZERO_DLY;
                             return;
                         }
                     }
                 }
             }
             break;

        case OS_OPT_TIME_MATCH:
             break;

        default:
            *p_err = OS_ERR_OPT_INVALID;
             return;
    }

#if OS_CFG_ARG_CHK_EN > 0u                                  /* Validate arguments to be within range                  */
    opt_invalid = DEF_BIT_IS_SET_ANY(opt, ~OS_OPT_TIME_OPTS_MASK);
    if (opt_invalid == DEF_YES) {
       *p_err = OS_ERR_OPT_INVALID;
        return;
    }

    opt_non_strict = DEF_BIT_IS_SET(opt, OS_OPT_TIME_HMSM_NON_STRICT);
    if (opt_non_strict != DEF_YES) {
         if (milli   > (CPU_INT32U)999u) {
            *p_err = OS_ERR_TIME_INVALID_MILLISECONDS;
             return;
         }
         if (seconds > (CPU_INT16U)59u) {
            *p_err = OS_ERR_TIME_INVALID_SECONDS;
             return;
         }
         if (minutes > (CPU_INT16U)59u) {
            *p_err = OS_ERR_TIME_INVALID_MINUTES;
             return;
         }
         if (hours   > (CPU_INT16U)99u) {
            *p_err = OS_ERR_TIME_INVALID_HOURS;
             return;
         }
    } else {
         if (minutes > (CPU_INT16U)9999u) {
            *p_err = OS_ERR_TIME_INVALID_MINUTES;
             return;
         }
         if (hours   > (CPU_INT16U)999u) {
            *p_err = OS_ERR_TIME_INVALID_HOURS;
             return;
         }
    }
#endif

                                                            /* Compute the total number of clock ticks required..     */
                                                            /* .. (rounded to the nearest tick)                       */
    tick_rate = OSCfg_TickRate_Hz;
    ticks     = ((OS_TICK)hours * (OS_TICK)3600u + (OS_TICK)minutes * (OS_TICK)60u + (OS_TICK)seconds) * tick_rate
              + (tick_rate * ((OS_TICK)milli + (OS_TICK)500u / tick_rate)) / (OS_TICK)1000u;

    if (ticks > (OS_TICK)0u) {
        OS_CRITICAL_ENTER();
        OSTCBCurPtr->TaskState = OS_TASK_STATE_DLY;
        OS_TickListInsert(OSTCBCurPtr,
                          ticks,
                          opt_time,
                          p_err);
        if (*p_err != OS_ERR_NONE) {
             OS_CRITICAL_EXIT_NO_SCHED();
             return;
        }
        OS_RdyListRemove(OSTCBCurPtr);                      /* Remove current task from ready list                    */
        OS_CRITICAL_EXIT_NO_SCHED();
        OSSched();                                          /* Find next task to run!                                 */
       *p_err = OS_ERR_NONE;
    } else {
       *p_err = OS_ERR_TIME_ZERO_DLY;
    }
}
Ejemplo n.º 8
0
static  void  CSP_DMA_IntHandler (void *p_arg)
{    
    CSP_DMA_REG           *p_dma_reg;
    CSP_DMA_CH_REG        *p_dma_ch_reg; 
    CSP_DMA_CH            *p_dma_ch;
    void                  *p_callback_arg;
    CSP_DMA_CALLBACK_PTR   callback_fnct;
    CSP_DEV_NBR            ch_nbr;
    CPU_INT32U             int_tc_stat;
    CPU_INT32U             int_err_stat;
    CPU_BOOLEAN            status;
    CPU_INT16U             xfer_size_rem;

    
    p_dma_reg    = (CSP_DMA_REG *)CSP_ADDR_DMA_REG;    
    int_tc_stat  = p_dma_reg->IntTCStat  & DEF_BIT_FIELD(8u, 0u);
    int_err_stat = p_dma_reg->IntErrStat & DEF_BIT_FIELD(8u, 0u);
    
                                                                /* --------- INTERRUPT TERMINAL COUNT HANDLING -------- */
    while (int_tc_stat != DEF_BIT_NONE) {                       
                                                                /* Get current DMA channel number                       */
        ch_nbr               = 31u - CPU_CntLeadZeros(int_tc_stat);
        p_dma_ch_reg         = &(p_dma_reg->CHx[ch_nbr]);
        p_dma_ch             = &(CSP_DMA_ChTbl[ch_nbr]);

        callback_fnct        = p_dma_ch->CallBackFnctPtr;       /* Get the callback function                            */
        p_callback_arg       = p_dma_ch->CallBackArgPtr;        /* Get the callback argument pointer.                   */        
                                                                /* Get the remaining transfer size.                     */
        xfer_size_rem        = p_dma_ch_reg->Ctrl & DEF_BIT_FIELD(12u, 0u);
        p_dma_reg->IntTCClr  = DEF_BIT(ch_nbr);                 /* Clear the terminal count interrupt.                  */
        
        if (DEF_BIT_IS_SET(int_err_stat, DEF_BIT(ch_nbr))) {    /* If an error occured in the channel...                */
            status                = DEF_FAIL;                   /* ... set the status, and clear the error interrupt.   */
            p_dma_reg->IntErrClr = DEF_BIT(ch_nbr);
        } else {
            status                = DEF_OK;                     
        }
            
        callback_fnct(ch_nbr,                                   /* Call the callback function.                           */
                      xfer_size_rem,
                      p_callback_arg,
                      status);
                                                                /* Read the terminal count and error interrupts status   */
        int_tc_stat  = p_dma_reg->IntTCStat  & DEF_BIT_FIELD(8u, 0u);
        int_err_stat = p_dma_reg->IntErrStat & DEF_BIT_FIELD(8u, 0u);                            
    }
                                                                /* --------------- ERROR INTERRUPT HANDLING ------------ */
    int_err_stat = p_dma_reg->IntErrStat & DEF_BIT_FIELD(8u, 0u);
    
    while (int_err_stat != DEF_BIT_NONE) {
        ch_nbr               = 31u - CPU_CntLeadZeros(int_err_stat);
        p_dma_ch_reg         = &(p_dma_reg->CHx[ch_nbr]);
        p_dma_ch             = &(CSP_DMA_ChTbl[ch_nbr]);
        callback_fnct        = p_dma_ch->CallBackFnctPtr;
        p_callback_arg       = p_dma_ch->CallBackArgPtr;
        p_dma_ch->State      = CSP_DMA_CH_STATE_ALLOC;          /* Set the channel state = 'ALLOC'                      */
        xfer_size_rem        = p_dma_ch_reg->Ctrl & DEF_BIT_FIELD(12u, 0u);        
        status               = DEF_FAIL;
        p_dma_reg->IntErrClr = DEF_BIT(ch_nbr);
            
        callback_fnct(ch_nbr,
                      xfer_size_rem,
                      p_callback_arg,
                      status);
        
        int_err_stat = p_dma_reg->IntErrStat & DEF_BIT_FIELD(8u, 0u);                            
    }
}
Ejemplo n.º 9
0
CPU_BOOLEAN  CSP_DMA_XferAsyncStartExt (CSP_DEV_NBR            ch_nbr, 
                                        void                  *p_dest,                                       
                                        void                  *p_src,
                                        CPU_SIZE_T             xfer_size,
                                        CSP_DMA_CALLBACK_PTR   callback,
                                        void                  *p_arg,
                                        CSP_OPT_FLAGS          opt)
{
    CSP_DMA_REG     *p_dma_reg;
    CSP_DMA_CH_REG  *p_dma_ch_reg; 
    CSP_DMA_CH      *p_dma_ch;
    CPU_INT32U       reg_ctrl;
    CPU_SR_ALLOC();
    
#if (CSP_CFG_ARG_CHK_EN == DEF_ENABLED)             
    if (ch_nbr > CSP_DMA_CH_MAX_NBR - 1u) {                     /* Invalid channel number?                              */
        return (DEF_FAIL);
    }
                                                                /* Channel not available?                               */
    if (CSP_DMA_ChTbl[ch_nbr].State != CSP_DMA_CH_STATE_ALLOC) {
        return (DEF_FAIL);
    }
    
    if (callback == (CSP_DMA_CALLBACK_PTR )0) {
        return (DEF_FAIL);
    }
    
    if ((p_dest  == (void *)0) ||
        (p_src   == (void *)0)) {
        return (DEF_FAIL);
    }
#endif    

    p_dma_reg    = (CSP_DMA_REG *)CSP_ADDR_DMA_REG;                  
    p_dma_ch_reg = &(p_dma_reg->CHx[ch_nbr]);
    p_dma_ch     = &(CSP_DMA_ChTbl[ch_nbr]);    
    reg_ctrl     = p_dma_ch_reg->Ctrl;
    
    DEF_BIT_CLR(reg_ctrl, CSP_DMA_MSK_CH_CTRL_XFER_SIZE |       /* Clears the xfer size mask.                           */
                          CSP_DMA_BIT_CH_CTRL_SI        |       /* Clears the source increment flag.                    */
                          CSP_DMA_BIT_CH_CTRL_DI);              /* Clears the destination increment flag.               */

    DEF_BIT_SET(reg_ctrl, xfer_size & CSP_DMA_MSK_CH_CTRL_XFER_SIZE);
    DEF_BIT_SET(reg_ctrl, CSP_DMA_BIT_CH_CTRL_I);

    if (DEF_BIT_IS_SET(opt, CSP_DMA_OPT_FLAG_XFER_SRC_INC)) {
        DEF_BIT_SET(reg_ctrl, CSP_DMA_BIT_CH_CTRL_SI);
    }
    
    if (DEF_BIT_IS_SET(opt, CSP_DMA_OPT_FLAG_XFER_DEST_INC)) {
        DEF_BIT_SET(reg_ctrl, CSP_DMA_BIT_CH_CTRL_DI);        
    }        
        
    CPU_CRITICAL_ENTER();    
    p_dma_ch_reg->SrcAddr     = (CPU_INT32U )p_src;
    p_dma_ch_reg->DestAddr    = (CPU_INT32U )p_dest;       
    p_dma_ch->CallBackFnctPtr = callback;
    p_dma_ch->CallBackArgPtr  = p_arg;    
    p_dma_ch_reg->Ctrl        = reg_ctrl;

    DEF_BIT_SET(p_dma_ch_reg->Cfg, CSP_DMA_BIT_CH_CFG_ITC   | 
                                   CSP_DMA_BIT_CH_CFG_IE);     
    DEF_BIT_SET(p_dma_ch_reg->Cfg, CSP_DMA_BIT_CH_CFG_CH_EN);
    
    CPU_CRITICAL_EXIT();
        
    return (DEF_OK);
}
void  HTTPsConn_Process (HTTPs_INSTANCE  *p_instance)
{
    const  HTTPs_CFG    *p_cfg;
           HTTPs_CONN   *p_conn;
           HTTPs_CONN   *p_conn_next;
           CPU_BOOLEAN   done;
           CPU_BOOLEAN   hook_def;
           CPU_BOOLEAN   process;
           CPU_BOOLEAN   rdy_rd;
           CPU_BOOLEAN   rdy_wr;
           CPU_BOOLEAN   rdy_err;
#if (HTTPs_CFG_PERSISTENT_CONN_EN == DEF_ENABLED)
           CPU_BOOLEAN   persistent;
#endif


    p_cfg  = p_instance->CfgPtr;
    p_conn = p_instance->ConnFirstPtr;



    while (p_conn != DEF_NULL) {                                /* For each accepted conn.                              */

        rdy_rd  = DEF_BIT_IS_SET(p_conn->SockFlags, HTTPs_FLAG_SOCK_RDY_RD);
        rdy_wr  = DEF_BIT_IS_SET(p_conn->SockFlags, HTTPs_FLAG_SOCK_RDY_WR);
        rdy_err = DEF_BIT_IS_SET(p_conn->SockFlags, HTTPs_FLAG_SOCK_RDY_ERR);

        p_conn_next = p_conn->ConnNextPtr;                      /* Req'd since cur conn can be closed.                  */

        if ((rdy_rd  == DEF_YES) ||                             /* If conn sock rdy.                                    */
            (rdy_wr  == DEF_YES) ||
            (rdy_err == DEF_YES)) {


                                                                /* ---------------- CONN SOCK PROCESS ----------------- */
            switch (p_conn->SockState) {
                case HTTPs_SOCK_STATE_NONE:                     /* No data to rx or tx.                                 */
                     process = DEF_YES;
                     break;


                case HTTPs_SOCK_STATE_RX:                       /* Rx data.                                             */
                     process = HTTPsSock_ConnDataRx(p_instance, p_conn);
                     break;


                case HTTPs_SOCK_STATE_TX:                       /* Tx data from buf.                                    */
                     process = HTTPsSock_ConnDataTx(p_instance, p_conn);
                     break;


                case HTTPs_SOCK_STATE_ERR:                      /* Fatal err.                                           */
                case HTTPs_SOCK_STATE_CLOSE:                    /* Transaction completed.                               */
                default:
                     HTTPsConn_Close(p_instance, p_conn);
                     process = DEF_NO;
                     break;
            }


                                                                /* ------------ UPDATE CONN & PREPARE DATA ------------ */
            if (process == DEF_YES) {
                switch (p_conn->State) {
                    case HTTPs_CONN_STATE_REQ_INIT:             /* Receive and parse request.                           */
                    case HTTPs_CONN_STATE_REQ_PARSE_METHOD:
                    case HTTPs_CONN_STATE_REQ_PARSE_URI:
                    case HTTPs_CONN_STATE_REQ_PARSE_QUERY_STRING:
                    case HTTPs_CONN_STATE_REQ_PARSE_PROTOCOL_VERSION:
                    case HTTPs_CONN_STATE_REQ_PARSE_HDR:
                    case HTTPs_CONN_STATE_REQ_LINE_HDR_HOOK:
                         HTTPsReq_Handle(p_instance, p_conn);
                         break;


                    case HTTPs_CONN_STATE_REQ_BODY_INIT:        /* Process request body.                                */
                    case HTTPs_CONN_STATE_REQ_BODY_DATA:
                    case HTTPs_CONN_STATE_REQ_BODY_FLUSH_DATA:
                    case HTTPs_CONN_STATE_REQ_BODY_FORM_APP_PARSE:
                    case HTTPs_CONN_STATE_REQ_BODY_FORM_MULTIPART_INIT:
                    case HTTPs_CONN_STATE_REQ_BODY_FORM_MULTIPART_PARSE:
                    case HTTPs_CONN_STATE_REQ_BODY_FORM_MULTIPART_FILE_OPEN:
                    case HTTPs_CONN_STATE_REQ_BODY_FORM_MULTIPART_FILE_WR:
                         HTTPsReq_Body(p_instance, p_conn);
                         break;

                                                                /* Prepare response.                                    */
                    case HTTPs_CONN_STATE_REQ_READY_SIGNAL:
                    case HTTPs_CONN_STATE_REQ_READY_POLL:
                         done = HTTPsReq_RdySignal(p_instance, p_conn);
                         if (done == DEF_YES) {
                             p_conn->State = HTTPs_CONN_STATE_RESP_PREPARE;
                         }
                         break;


                    case HTTPs_CONN_STATE_RESP_PREPARE:
                         done = HTTPsResp_Prepare(p_instance, p_conn);
                         if (done == DEF_YES) {
                             p_conn->State = HTTPs_CONN_STATE_RESP_INIT;
                         }
                         break;


                    case HTTPs_CONN_STATE_RESP_INIT:            /* Build and transmit response.                         */
                    case HTTPs_CONN_STATE_RESP_TOKEN:
                    case HTTPs_CONN_STATE_RESP_STATUS_LINE:
                    case HTTPs_CONN_STATE_RESP_HDR:
                    case HTTPs_CONN_STATE_RESP_HDR_CONTENT_TYPE:
                    case HTTPs_CONN_STATE_RESP_HDR_FILE_TRANSFER:
                    case HTTPs_CONN_STATE_RESP_HDR_LOCATION:
                    case HTTPs_CONN_STATE_RESP_HDR_CONN:
                    case HTTPs_CONN_STATE_RESP_HDR_LIST:
                    case HTTPs_CONN_STATE_RESP_HDR_TX:
                    case HTTPs_CONN_STATE_RESP_HDR_END:
                    case HTTPs_CONN_STATE_RESP_FILE_STD:
                    case HTTPs_CONN_STATE_RESP_DATA_CHUNCKED:
                    case HTTPs_CONN_STATE_RESP_DATA_CHUNCKED_TX_TOKEN:
                    case HTTPs_CONN_STATE_RESP_DATA_CHUNCKED_TX_LAST_CHUNK:
                    case HTTPs_CONN_STATE_RESP_DATA_CHUNCKED_HOOK:
                    case HTTPs_CONN_STATE_RESP_DATA_CHUNCKED_FINALIZE:
                    case HTTPs_CONN_STATE_RESP_COMPLETED:
                         done = HTTPsResp_Handle(p_instance, p_conn);
                         if (done == DEF_YES) {
                             p_conn->State = HTTPs_CONN_STATE_COMPLETED;
                         }
                         break;


                    case HTTPs_CONN_STATE_COMPLETED:            /* Transaction completed.                               */
#if (HTTPs_CFG_PERSISTENT_CONN_EN == DEF_ENABLED)
                         persistent = DEF_BIT_IS_SET(p_conn->Flags, HTTPs_FLAG_CONN_PERSISTENT);
                         if ((p_cfg->ConnPersistentEn == DEF_ENABLED) &&
                             (persistent              == DEF_YES)    ) {
                              HTTPsMem_ConnClr(p_instance, p_conn);
                              p_conn->SockState = HTTPs_SOCK_STATE_RX;
                              p_conn->State     = HTTPs_CONN_STATE_REQ_INIT;
                         } else {
                              p_conn->SockState = HTTPs_SOCK_STATE_CLOSE;
                         }
#else
                         p_conn->SockState = HTTPs_SOCK_STATE_CLOSE;
#endif
                         hook_def = HTTPs_HOOK_DEFINED(p_cfg->HooksPtr, OnTransCompleteHook);
                         if (hook_def == DEF_YES) {
                             p_cfg->HooksPtr->OnTransCompleteHook(p_instance, p_conn, p_cfg->Hooks_CfgPtr);
                         }
                         break;


                    case HTTPs_CONN_STATE_ERR_INTERNAL:
                         HTTPsConn_ErrInternal(p_instance, p_conn);
                         p_conn->SockState = HTTPs_SOCK_STATE_CLOSE;
                         break;


                    case HTTPs_CONN_STATE_UNKNOWN:
                         p_conn->State   = HTTPs_CONN_STATE_ERR_FATAL;
                         p_conn->ErrCode = HTTPs_ERR_STATE_UNKNOWN;
                         break;


                    case HTTPs_CONN_STATE_ERR_FATAL:            /* Fatal err.                                           */
                    default:
                         p_conn->SockState = HTTPs_SOCK_STATE_CLOSE;
                         break;
                }
            }
        }

        p_conn = p_conn_next;                                   /* Move to next accepted conn.                          */
    }
}
Ejemplo n.º 11
0
static  CPU_BOOLEAN  BSP_CPU_Init (void)
{
    CPU_INT16U    reg_to;
    CPU_INT32U    reg_val;
    CPU_SR_ALLOC();


    BSP_REG_FLASHCFG = (CPU_INT32U)BSP_MSK_FLASHCFG_CLK_6;      /* Set 6 cycles to acces the Flash memory (Safe setting)*/

                                                                /* ----------- MAIN OSCILLATOR INITIALIZATION --------- */
    DEF_BIT_CLR(BSP_REG_SCS, BSP_BIT_SCS_OSCRANGE);             /* Set the main oscillator range                        */


    reg_to = BSP_VAL_MAX_TO;

    DEF_BIT_SET(BSP_REG_SCS, BSP_BIT_SCS_OSCEN);                /* Enable the Main Oscillator                           */

                                                                /* Wait until the main oscillator is enabled.           */
    while (DEF_BIT_IS_CLR(BSP_REG_SCS, BSP_BIT_SCS_OSCSTAT) &&
          (reg_to > 0u)) {
        reg_to--;
    }

    if (reg_to == 0u) {                                         /* Configuration fail                                   */
        return (DEF_FAIL);
    }

    BSP_REG_PCLKSEL0 = DEF_BIT_NONE;                            /* All peripheral clock runs at CPU_Clk / 4 = 25 Mhz.   */
    BSP_REG_PCLKSEL1 = DEF_BIT_NONE;

                                                                /* ------------------ PLL0 CONFIGURATION -------------- */

    reg_val  = (((25u - 1u) <<  0u) & BSP_MSK_PLLCFG0_MSEL)     /* PLL0 values M = 25 & N = 2 (see note #6)             */
             | ((( 2u - 1u) << 16u) & BSP_MSK_PLLCFG0_NSEL);
                                                                /* 1. Disconnect PLL0 with one feed sequence if PLL ... */
                                                                /* ... already connected.                               */
    if (DEF_BIT_IS_SET(BSP_REG_PLLSTAT(0u), BSP_BIT_PLLSTAT_PLLC0_STAT)) {
        DEF_BIT_CLR(BSP_REG_PLLCTRL(0u), BSP_BIT_PLLCTRL_PLLC);
        BSP_PLL_FEED_SEQ(0u);
    }

    DEF_BIT_CLR(BSP_REG_PLLCTRL(0u), BSP_BIT_PLLCTRL_PLLE);     /* 2. Disable PLL0 with one feed sequence               */
    BSP_PLL_FEED_SEQ(0u);

    BSP_REG_CCLKCFG   = (1u - 1u);                              /* 3. Change the CPU clock divider setting to speed ... */
                                                                /* ... operation without PLL0                           */

    BSP_REG_CLKSRCSEL = BSP_BIT_CLKSRCSEL_MAIN;                 /* 4. Select the main osc. as the PLL0 clock source     */

    BSP_REG_PLLCFG(0u) = reg_val;                               /* 5. Write to the PLLCFG and make it effective with... */
    BSP_PLL_FEED_SEQ(0u)                                        /* ... one one feed sequence                            */

    DEF_BIT_SET(BSP_REG_PLLCTRL(0u), BSP_BIT_PLLCTRL_PLLE);     /* 6. Enable PLL0 with one feed sequence                */
    BSP_PLL_FEED_SEQ(0u);

    BSP_REG_CCLKCFG   = (3u - 1u);                              /* 7. Change the CPU clock divider setting for ...      */
                                                                /* ... operation with PLL0                              */

    reg_to = BSP_VAL_MAX_TO;                                    /* 8. Wait for PLL0 to achieve lock by monitoring ...   */
                                                                /* ... the PLOCK0 bit in the PLL0STAT                   */
    while (DEF_BIT_IS_CLR(BSP_REG_PLLSTAT(0u), BSP_BIT_PLLSTAT_PLOCK0) &&
          (reg_to > 0u)) {
        reg_to--;
    }

    if (reg_to == 0u) {
        return (DEF_FAIL);
    }

    DEF_BIT_SET(BSP_REG_PLLCTRL(0u), BSP_BIT_PLLCTRL_PLLC);     /* 9. Connect PLL0 with one feed sequence.              */
    BSP_PLL_FEED_SEQ(0u);
                                                                /* ------------------ PLL1 CONFIGURATION -------------- */
    reg_val  = (((4u - 1u)  <<  0u) & BSP_MSK_PLLCFG1_MSEL)     /* PLL1 values M = 4; P = 2 coded as '01' (see note #6) */
             | (((0x01u   ) <<  5u) & BSP_MSK_PLLCFG1_NSEL);

    DEF_BIT_CLR(BSP_REG_PLLCTRL(1u), BSP_BIT_PLLCTRL_PLLC);     /* 1. Disconnect PLL1 with one feed sequence            */
    BSP_PLL_FEED_SEQ(1u);

    DEF_BIT_CLR(BSP_REG_PLLCTRL(1u), BSP_BIT_PLLCTRL_PLLE);     /* 2. Disable PLL1 with one feed sequence               */
    BSP_PLL_FEED_SEQ(1u);

    BSP_REG_PLLCFG(1u) = reg_val;                               /* 3. Write to the PLLCFG and make it effective with... */
    BSP_PLL_FEED_SEQ(1u);                                       /* ... one one feed sequence                            */

    DEF_BIT_SET(BSP_REG_PLLCTRL(1u), BSP_BIT_PLLCTRL_PLLE);     /* 4. Enable PLL1 with one feed sequence                */
    BSP_PLL_FEED_SEQ(1u);

    reg_to = BSP_VAL_MAX_TO;                                    /* 5. Wait for PLL1 to achieve lock by monitoring ...   */
                                                                /* ... the PLOCK1 bit in the PLL1STAT                   */
    while (DEF_BIT_IS_CLR(BSP_REG_PLLSTAT(1u), BSP_BIT_PLLSTAT_PLOCK1) &&
          (reg_to > 0u)) {
        reg_to--;
    }

    if (reg_to == 0u) {
        return (DEF_FAIL);
    }


    DEF_BIT_SET(BSP_REG_PLLCTRL(1u), BSP_BIT_PLLCTRL_PLLC);     /* 6. Connect PLL1 with one feed sequence               */
    BSP_PLL_FEED_SEQ(1u);

    BSP_REG_FLASHCFG = BSP_MSK_FLASHCFG_CLK_5                   /* Set 5 cycles to access the Flash memory.             */
                     | BSP_BIT_FLASHCFG_FETCHCFG_ALL
                     | BSP_BIT_FLASHCFG_DATACFG_ALL
                     | BSP_BIT_FLASHCFG_ACCEL_EN
                     | BSP_BIT_FLASHCFG_PREFETCH_ALL;

    return (DEF_OK);
}
Ejemplo n.º 12
0
void   BSP_GPIO_Cfg (CPU_INT08U   gpio_port,
                     CPU_INT32U   gpio_pins,     
                     CPU_INT16U   gpio_opt)
{
    BSP_GPIO_FAST_REG  *p_gpio_fast_reg;    
    CPU_REG32          *p_gpio_pinsel;
    CPU_REG32          *p_gpio_pinmode;  
    CPU_REG32          *p_gpio_pinmode_od;  
    
    CPU_INT32U          pinsel_opt;
    CPU_INT32U          pinmode_opt;
    CPU_INT32U          pin_nbr;
    
    
    switch (gpio_port) {
        case BSP_GPIO_PORT0_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT0_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x00);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x00);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD0_BASE_ADDR);
             break;

        case BSP_GPIO_PORT1_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT1_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x08);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x08);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD1_BASE_ADDR);
             break;

        case BSP_GPIO_PORT2_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT2_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x10);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x10);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD2_BASE_ADDR);
             
             break;

        case BSP_GPIO_PORT3_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT3_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x18);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x18);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD3_BASE_ADDR);
             
             break;

        case BSP_GPIO_PORT4_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT4_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x20);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x20);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD4_BASE_ADDR);
             break;

        case BSP_GPIO_PORT0:
        case BSP_GPIO_PORT1:             
        default:
             return;
    }

                                                                /* ------------ I/O DIRECTION CONFIGURATION ----------- */
    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_OUT_EN)) {
        DEF_BIT_SET(p_gpio_fast_reg->FIODIR, gpio_pins);
    }
    
    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_IN_EN)) {
        DEF_BIT_CLR(p_gpio_fast_reg->FIODIR, gpio_pins);
    }            
        
    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_RD_WR_EN)) {
        DEF_BIT_CLR(p_gpio_fast_reg->FIOMASK, gpio_pins);
    }            
    
    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_RD_WR_DIS)) {
        DEF_BIT_SET(p_gpio_fast_reg->FIOMASK, gpio_pins);
    }            

                
                                                                /* ---- I/O MODE/PERIPHERAL FUNCTION CONFIGURATION ---- */
    pinsel_opt  = BSP_GPIO_OPT_FNCT_INVALID;                   
    pinmode_opt = BSP_GPIO_OPT_MODE_INVALID;
                                                                /* Set PINSELxx based on BSP_GPIO_OPT_FNCT_xxx          */
    if (DEF_BIT_IS_SET_ANY(gpio_opt, BSP_GPIO_OPT_FNCT_ANY)) {
        if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_FNCT_1)) {
            pinsel_opt = 0x00;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_FNCT_2)) {
            pinsel_opt = 0x01;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_FNCT_3)) {
            pinsel_opt = 0x02;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_FNCT_4)) {
            pinsel_opt = 0x03;
        } else {
            return;
        }
    }

                                                                /* Set PMODExx based on BSP_GPIO_OPT_MDOE_xxx         */
    if (DEF_BIT_IS_SET_ANY(gpio_opt, BSP_GPIO_OPT_MODE_ANY)) {
        if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_PULLUP)) {
            pinmode_opt = 0x00;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_REPEATER)) {
            pinmode_opt = 0x01;            
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_NONE)) {
            pinmode_opt = 0x02;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_PULLDOWN)) {
            pinmode_opt = 0x03;
        }
    }
    
    if ((pinsel_opt != BSP_GPIO_OPT_FNCT_INVALID) ||
        (pinmode_opt  != BSP_GPIO_OPT_MODE_INVALID)) {
        for (pin_nbr = 0; pin_nbr < 32; pin_nbr++) {
            if (DEF_BIT_IS_SET(gpio_pins, DEF_BIT(pin_nbr))) {
                
                if (pinsel_opt != BSP_GPIO_OPT_FNCT_INVALID) {
                    if (pin_nbr < 16) {
                        DEF_BIT_CLR(*p_gpio_pinsel, DEF_BIT_FIELD(2, pin_nbr * 2));
                        DEF_BIT_SET(*p_gpio_pinsel, DEF_BIT_MASK(pinsel_opt, pin_nbr * 2));
                    } else {
                        DEF_BIT_CLR(*((CPU_REG32 *)((CPU_INT32U)p_gpio_pinsel + 0x04)), DEF_BIT_FIELD(2, (pin_nbr - 16) * 2));
                        DEF_BIT_SET(*((CPU_REG32 *)((CPU_INT32U)p_gpio_pinsel + 0x04)), DEF_BIT_MASK(pinsel_opt, (pin_nbr - 16) * 2));
                    }
                }
        
                if (DEF_BIT_IS_SET(gpio_pins, DEF_BIT(pin_nbr))) {
                    if (pinmode_opt != BSP_GPIO_OPT_MODE_INVALID) {
                        if (pin_nbr < 16) {                        
                            DEF_BIT_CLR(*p_gpio_pinmode, DEF_BIT_FIELD(2, pin_nbr * 2));
                            DEF_BIT_SET(*p_gpio_pinmode, DEF_BIT_MASK(pinmode_opt, pin_nbr * 2));
                        } else {
                            DEF_BIT_CLR(*((CPU_REG32 *)((CPU_INT32U)p_gpio_pinmode + 0x04)), DEF_BIT_FIELD(2, (pin_nbr - 16) * 2));
                            DEF_BIT_SET(*((CPU_REG32 *)((CPU_INT32U)p_gpio_pinmode + 0x04)), DEF_BIT_MASK(pinmode_opt, (pin_nbr - 16) * 2));
                        }
                    }
                }
            }
        }
    }

    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_OPEN_DRAIN)) {
        *p_gpio_pinmode_od = gpio_pins;
    }
}
Ejemplo n.º 13
0
void  OSMonOp (OS_MON               *p_mon,
               OS_TICK               timeout,
               void                 *p_arg,
               OS_MON_ON_ENTER_PTR   p_on_enter,
               OS_MON_ON_EVAL_PTR    p_on_eval,
               OS_OPT                opt,
               OS_ERR               *p_err)
{
    CPU_INT32U     op_res;
    CPU_INT32U     mon_res;
    OS_PEND_LIST  *p_pend_list;
    OS_TCB        *p_tcb;
    OS_TCB        *p_tcb_next;
    void          *p_eval_data;
    CPU_BOOLEAN    sched;
    CPU_SR_ALLOC();


#ifdef OS_SAFETY_CRITICAL
    if (p_err == DEF_NULL) {
        OS_SAFETY_CRITICAL_EXCEPTION();
        return;
    }
#endif

#if (OS_CFG_INVALID_OS_CALLS_CHK_EN == DEF_ENABLED)             /* Is the kernel running?                               */
    if (OSRunning != OS_STATE_OS_RUNNING) {
       *p_err = OS_ERR_OS_NOT_RUNNING;
        return;
    }
#endif

#if (OS_CFG_ARG_CHK_EN == DEF_ENABLED)
    if (p_mon == DEF_NULL) {                                    /* Validate 'p_mon'                                     */
       *p_err  = OS_ERR_OBJ_PTR_NULL;
        return;
    }
#endif

    sched = DEF_NO;

    CPU_CRITICAL_ENTER();

    if (p_on_enter != DEF_NULL) {
        op_res = (*p_on_enter)(p_mon, p_arg);
    } else {
        op_res = OS_MON_RES_BLOCK | OS_MON_RES_STOP_EVAL;
    }

    if (DEF_BIT_IS_SET(op_res, OS_MON_RES_BLOCK) == DEF_YES) {
        OS_Pend((OS_PEND_OBJ *)(p_mon),                         /* Block task pending on Condition Variable             */
                OS_TASK_PEND_ON_COND_VAR,
                timeout);

        sched = DEF_YES;
    }

    OSTCBCurPtr->MonData.p_eval_data = p_arg;
    OSTCBCurPtr->MonData.p_on_eval   = p_on_eval;

    if (DEF_BIT_IS_CLR(op_res, OS_MON_RES_STOP_EVAL) == DEF_YES) {
        p_pend_list = &p_mon->PendList;
        if (p_pend_list->HeadPtr != DEF_NULL) {
            p_tcb = p_pend_list->HeadPtr;
            while (p_tcb != DEF_NULL) {
                p_tcb_next = p_tcb->PendNextPtr;

                p_on_eval   = p_tcb->MonData.p_on_eval;
                p_eval_data = p_tcb->MonData.p_eval_data;

                if (p_on_eval != DEF_NULL) {
                    mon_res = (*p_on_eval)(p_mon, p_eval_data, p_arg);
                } else {
                    mon_res = OS_MON_RES_STOP_EVAL;
                }

                if (DEF_BIT_IS_CLR(mon_res, OS_MON_RES_BLOCK) == DEF_YES) {
                    OS_Post((OS_PEND_OBJ *)(p_mon), p_tcb, DEF_NULL, 0u, 0u);
                    if (DEF_BIT_IS_CLR(opt, OS_OPT_POST_NO_SCHED) == DEF_YES) {
                        sched = DEF_YES;
                    }
                }

                if (DEF_BIT_IS_SET(mon_res, OS_MON_RES_STOP_EVAL) == DEF_YES) {
                    break;
                }

                p_tcb = p_tcb_next;
            }
        }
    }

    CPU_CRITICAL_EXIT();

    if (sched == DEF_YES) {
        OSSched();                                              /* Find the next highest priority task ready to run     */
    }

    if (DEF_BIT_IS_SET(op_res, OS_MON_RES_BLOCK) == DEF_YES) {
        CPU_CRITICAL_ENTER();
        switch (OSTCBCurPtr->PendStatus) {
            case OS_STATUS_PEND_OK:                             /* We got the monitor                                   */
                *p_err = OS_ERR_NONE;
                 break;

            case OS_STATUS_PEND_ABORT:                          /* Indicate that we aborted                             */
                *p_err = OS_ERR_PEND_ABORT;
                 break;

            case OS_STATUS_PEND_TIMEOUT:                        /* Indicate that we didn't get monitor within timeout   */
                *p_err = OS_ERR_TIMEOUT;
                 break;

            case OS_STATUS_PEND_DEL:                            /* Indicate that object pended on has been deleted      */
                *p_err = OS_ERR_OBJ_DEL;
                 break;

            default:
                *p_err = OS_ERR_STATUS_INVALID;
        }
        CPU_CRITICAL_EXIT();
    } else {
       *p_err = OS_ERR_NONE;
    }
}