app_uplat7d.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 1,435 行 · 第 1/4 页

C
1,435
字号
        return rtnVal;
    }

    /* Set DMAC-A for device type. */
    dmac_param.device = DMAC_A;

    /* selecting channel */
    dmac_param.channel[DMAC_A_CHANNEL_0] = DMAC_A_CHANNEL_USED;
    dmac_param.channel[DMAC_A_CHANNEL_1] = DMAC_A_CHANNEL_USED;
    dmac_param.channel[DMAC_A_CHANNEL_2] = DMAC_A_CHANNEL_USED;
    dmac_param.channel[DMAC_A_CHANNEL_3] = DMAC_A_CHANNEL_USED;

    /* priority of channel */
    dmac_param.channel_priority = DMAMODA_PRI_APP;

    /* DMA request mode */
    dmac_param.dma_req_mode[DMAC_A_CHANNEL_0] = DMACTMODA0_ARQ_APP;
    dmac_param.dma_req_mode[DMAC_A_CHANNEL_1] = DMACTMODA1_ARQ_APP;
    dmac_param.dma_req_mode[DMAC_A_CHANNEL_2] = DMACTMODA2_ARQ_APP;
    dmac_param.dma_req_mode[DMAC_A_CHANNEL_3] = DMACTMODA3_ARQ_APP;

    /* data transmitting size */
    dmac_param.data_size[DMAC_A_CHANNEL_0] = DMACTMODA0_TSIZ_APP;
    dmac_param.data_size[DMAC_A_CHANNEL_1] = DMACTMODA1_TSIZ_APP;
    dmac_param.data_size[DMAC_A_CHANNEL_2] = DMACTMODA2_TSIZ_APP;
    dmac_param.data_size[DMAC_A_CHANNEL_3] = DMACTMODA3_TSIZ_APP;

    /* source address */
    dmac_param.src_address[DMAC_A_CHANNEL_0] = DMACSADA0_0;
    dmac_param.src_address[DMAC_A_CHANNEL_1] = DMACSADA1_1;
    dmac_param.src_address[DMAC_A_CHANNEL_2] = DMACSADA2_2;
    dmac_param.src_address[DMAC_A_CHANNEL_3] = DMACSADA3_3;

    /* source device type */
    dmac_param.src_dev_type[DMAC_A_CHANNEL_0] = DMACTMODA0_SDP_APP;
    dmac_param.src_dev_type[DMAC_A_CHANNEL_1] = DMACTMODA1_SDP_APP;
    dmac_param.src_dev_type[DMAC_A_CHANNEL_2] = DMACTMODA2_SDP_APP;
    dmac_param.src_dev_type[DMAC_A_CHANNEL_3] = DMACTMODA3_SDP_APP;

    /* destination address */
    dmac_param.dst_address[DMAC_A_CHANNEL_0] = DMACDADA0_0;
    dmac_param.dst_address[DMAC_A_CHANNEL_1] = DMACDADA1_1;
    dmac_param.dst_address[DMAC_A_CHANNEL_2] = DMACDADA2_2;
    dmac_param.dst_address[DMAC_A_CHANNEL_3] = DMACDADA3_3;

    /* destination device type */
    dmac_param.dst_dev_type[DMAC_A_CHANNEL_0] = DMACTMODA0_DDP_APP;
    dmac_param.dst_dev_type[DMAC_A_CHANNEL_1] = DMACTMODA1_DDP_APP;
    dmac_param.dst_dev_type[DMAC_A_CHANNEL_2] = DMACTMODA2_DDP_APP;
    dmac_param.dst_dev_type[DMAC_A_CHANNEL_3] = DMACTMODA3_DDP_APP;

    /* transmit times */
    dmac_param.trans_times[DMAC_A_CHANNEL_0] = DMACSIZA0_0;
    dmac_param.trans_times[DMAC_A_CHANNEL_1] = DMACSIZA1_1;
    dmac_param.trans_times[DMAC_A_CHANNEL_2] = DMACSIZA2_2;
    dmac_param.trans_times[DMAC_A_CHANNEL_3] = DMACSIZA3_3;

    /* bus request mode */
    dmac_param.bus_req_mode[DMAC_A_CHANNEL_0] = DMACTMODA0_BRQ_APP;
    dmac_param.bus_req_mode[DMAC_A_CHANNEL_1] = DMACTMODA1_BRQ_APP;
    dmac_param.bus_req_mode[DMAC_A_CHANNEL_2] = DMACTMODA2_BRQ_APP;
    dmac_param.bus_req_mode[DMAC_A_CHANNEL_3] = DMACTMODA3_BRQ_APP;

    /* mask  */
    dmac_param.channel_msk[DMAC_A_CHANNEL_0] = DMACMSKA0_MSK;
    dmac_param.channel_msk[DMAC_A_CHANNEL_1] = DMACMSKA1_MSK;
    dmac_param.channel_msk[DMAC_A_CHANNEL_2] = DMACMSKA2_MSK;
    dmac_param.channel_msk[DMAC_A_CHANNEL_3] = DMACMSKA3_MSK;

    /* Initailize DMAC. */
    handle_dmac = smpDrv_open(DRVNO_DMAC, (uint32_t)(&dmac_param));
    if (handle_dmac == HANDLE_ID_1) {

        /* Start DMAC. */
        rtnVal = smpDrv_ioctl(DRVNO_DMAC,
                              UPLAT_7D_HAL_DMAC_FOWARD,
                              (uint32_t)(&dmac_param), handle_dmac);
        if (rtnVal == OK) {

            /* Read DMAC status. */
            rtnVal = smpDrv_ioctl(DRVNO_DMAC,
                                  UPLAT_7D_HAL_DMAC_STATUS,
                                  (uint32_t)(&dmac_status), handle_dmac);
            if (rtnVal == OK) {
                /* Get DMAC-A error status. */
                if (error == NO_ERR) {
                    /* Channel 0 error. */
                    if ((dmac_status & DMAINTA_ISTA0) == DMAINTA_ISTA0) {
                        /* Write cycle error. */
                        if ((dmac_status & DMAINTA_ISTP0) == DMAINTA_ISTP0) {
                            error = WRITE_ERR;
                        }
                        /* Read cycle error. */
                        else {
                            error = READ_ERR;
                        }
                    }
                }
                if (error == NO_ERR) {
                    /* Channel 1 error. */
                    if ((dmac_status & DMAINTA_ISTA1) == DMAINTA_ISTA1) {
                        /* Write cycle error. */
                        if ((dmac_status & DMAINTA_ISTP1) == DMAINTA_ISTP1) {
                            error = WRITE_ERR;
                        }
                        /* Read cycle error. */
                        else {
                            error = READ_ERR;
                        }
                    }
                }
                if (error == NO_ERR) {
                    /* Channel 2 error. */
                    if ((dmac_status & DMAINTA_ISTA2) == DMAINTA_ISTA2) {
                        /* Write cycle error. */
                        if ((dmac_status & DMAINTA_ISTP2) == DMAINTA_ISTP2) {
                            error = WRITE_ERR;
                        }
                        /* Read cycle error. */
                        else {
                            error = READ_ERR;
                        }
                    }
                }
                if (error == NO_ERR) {
                    /* Channel 3 error. */
                    if ((dmac_status & DMAINTA_ISTA3) == DMAINTA_ISTA3) {
                        /* Write cycle error. */
                        if ((dmac_status & DMAINTA_ISTP3) == DMAINTA_ISTP3) {
                            error = WRITE_ERR;
                        }
                        /* Read cycle error. */
                        else {
                            error = READ_ERR;
                        }
                    }
                }
                switch (error) {
                case NO_ERR:     /* No Error */
                    debug_msg(_7_LED1_NUM_0, NULL);
                    break;
                case READ_ERR:   /* Read cycle error */
                    debug_msg(_7_LED1_NUM_1, NULL);
                    break;
                case WRITE_ERR:  /* Erite cycle error */
                    debug_msg(_7_LED1_NUM_2, NULL);
                    break;
                default:
                    break;
                }
            }
        }
    }

    return rtnVal;
}


/************************************************************************/
/*                                                                      */
/*  Function Name   : uPLATsmpAP_PM                                     */
/*  Input           : Noting                                            */
/*  Output          : OK(1)                                             */
/*                    ERROR(-1)                                         */
/*                                                                      */
/*  Note : Sample program of Power Managiment.                          */
/*                                                                      */
/************************************************************************/
int16_t uPLATsmpAP_PM( void )
{
    int16_t rtnVal = OK;
    int16_t handle_sio = HANDLE_ID_INIT;
    int16_t handle_fiq = HANDLE_ID_INIT;
    int16_t handle_irq = HANDLE_ID_INIT;
    int16_t handle_pm = HANDLE_ID_INIT;
    uint32_t div_clock = AP_DIV_CLK1;    /* DIV Clock 1/1 */
    uint32_t apb_clock = AP_AHB_CLK2;    /* APB Clock 1/2 */
    uPLAT_InterruptParam int_param;
    struct uPLAT_SioParam sio_trans_param;
    int8_t rev_data[128];
    smpDrvInitPeripheral init_peripheral;

    /* Initialize peripheral. */
    init_peripheral.init_xbus.rombw = BWC_ROMBW_16;
    init_peripheral.init_xbus.srambw = BWC_SRAMBW_16;
    init_peripheral.init_xbus.iobw = BWC_IOBW_16;

    init_peripheral.init_xbus.romtype = ROMAC_ROMTYPE_0;
    init_peripheral.init_xbus.rombrst = ROMAC_ROMBRST_off;

    init_peripheral.init_xbus.sramtype = RAMAC_RAMTYPE_1;
    init_peripheral.init_xbus.srambrst = RAMAC_RAMBRST_off;

    init_peripheral.init_xbus.iotype = IOAC_IOTYPE_2;

    init_peripheral.init_xbus.sdrambw = DBWC_DBDRAM16;

    init_peripheral.init_xbus.standby = FALSE;

    init_peripheral.cache_mode = CACHE_WRITE_BACK;

    init_peripheral.init_port.port_sel1 = PORT_CR1_INIT_VALUE;
    init_peripheral.init_port.port_sel2 = PORT_CR2_INIT_VALUE;
    init_peripheral.init_port.port_sel3 = PORT_CR3_INIT_VALUE;
    init_peripheral.init_port.port_sel4 = PORT_CR4_INIT_VALUE;
    rtnVal = smpDrv_reset(&init_peripheral);
    if (rtnVal == OK) {
        /* Used SIO */
        sio_trans_param.baudrate = BPS_115200;      /* 115200bps */
        sio_trans_param.parity = NON_PARITY;        /* Non parity */
        sio_trans_param.data_len = LENGTH_8BIT;     /* 8bit */
        sio_trans_param.stop_bit = STOP_1BIT;       /* 1 stop bit */
        handle_sio = smpDrv_open(DRVNO_SIO, (uint32_t)(&sio_trans_param));
    
        /* Used FIQ */
        if (handle_sio == HANDLE_ID_1) {
            int_param.primary = INT_FIQ;
            int_param.callback = AP_FIQ_handler;
            handle_fiq = smpDrv_open(DRVNO_INTFIQ, (uint32_t)(&int_param));
        }

        /* Used EXINT1 */
        if (handle_sio == HANDLE_ID_1) {
            int_param.primary = INT_EXINT1;
            int_param.callback = AP_EXINT1_handler;
            int_param.level = EXILCB_ILC34 & INT_LV1;
            handle_irq = smpDrv_open(DRVNO_INTEXINT, (uint32_t)(&int_param));
        }
    
        /* Used PM */
        if (handle_sio == HANDLE_ID_1) {
            handle_pm = smpDrv_open(DRVNO_PM, (uint32_t)(&int_param));
        }
    }
    
    PM_DIV_APB_CLK_LED_DISPLY((int32_t)div_clock, (int32_t)apb_clock);
    
    AP_FIQ_Flag = 0;
    while(AP_FIQ_Flag == 0){
        rtnVal = smpDrv_read(DRVNO_SIO, &rev_data[0], 1, handle_sio);
        if(rtnVal == OK){
            rtnVal = smpDrv_write(DRVNO_SIO, &rev_data[0], 1, handle_sio);
        }
        if(rtnVal == OK){
            switch(rev_data[0]){
            case 'H':
            case 'h':
                debug_msg(_7_LED1_L1|_7_LED1_L2|_7_LED1_L4|_7_LED1_L5|_7_LED1_L6, NULL);   /* 7 segment LED : "H" */
                rtnVal = smpDrv_ioctl(DRVNO_PM, UPLAT_7D_HAL_PM_SET_HALT_CPUGROUP, NULL, handle_pm);
                break;
            case 'S':
            case 's':
                debug_msg(_7_LED1_L0|_7_LED1_L2|_7_LED1_L3|_7_LED1_L5|_7_LED1_L6, NULL);   /* 7 segment LED : "S" */
                rtnVal = smpDrv_ioctl(DRVNO_PM, UPLAT_7D_HAL_PM_SET_STOP, NULL, handle_pm);
                break;
            case '+':
                if(div_clock != AP_DIV_CLK1){
                    div_clock--;
                    rtnVal = smpDrv_ioctl(DRVNO_PM, UPLAT_7D_HAL_PM_CHANGE_DIVCLK, div_clock, handle_pm);
                }
                break;
            case '-':
                if(div_clock < AP_DIV_CLK32){
                    div_clock++;
                    rtnVal = smpDrv_ioctl(DRVNO_PM, UPLAT_7D_HAL_PM_CHANGE_DIVCLK, div_clock, handle_pm);
                }
                break;
            case '[':
                if(apb_clock != AP_AHB_CLK2){
                    apb_clock--;
                    rtnVal = smpDrv_ioctl(DRVNO_PM, UPLAT_7D_HAL_PM_CHANGE_APBCLK, apb_clock, handle_pm);
                }
                break;
            case ']':
                if(apb_clock < AP_AHB_CLK8){
                    apb_clock++;
                    rtnVal = smpDrv_ioctl(DRVNO_PM, UPLAT_7D_HAL_PM_CHANGE_APBCLK, apb_clock, handle_pm);
                }
                break;
            default:
                break;
            }
            PM_DIV_APB_CLK_LED_DISPLY((int32_t)div_clock, (int32_t)apb_clock);
        }
    }
    smpDrv_close(DRVNO_PM, handle_pm);          /* PM Close */
    smpDrv_close(DRVNO_INTFIQ, handle_fiq);     /* FIQ Close */
    smpDrv_close(DRVNO_INTEXINT, handle_irq);   /* EXINT1 Close */
    smpDrv_close(DRVNO_SIO, handle_sio);        /* SIO Close */
    debug_msg(_7_LED1_OFF, NULL);   /* 7 segment LED : ALL OFF  */
    
    return rtnVal;
}

/************************************************************************/
/*                                                                      */
/*  Function Name   : PM_DIV_APB_CLK_LED_DISPLY                         */
/*  Input           : div_clock                                         */
/*                  : 0: DIV_CLK1                                       */
/*                  : 1: DIV_CLK2                                       */
/*                  : 2: DIV_CLK4                                       */
/*                  : 3: DIV_CLK8                                       */
/*                  : 4: DIV_CLK16                                      */
/*                  : 5: DIV_CLK32                                      */
/*                                                                      */
/*                  : div_clock                                         */
/*                  : 0: AHB_CLK2                                       */
/*                  : 1: AHB_CLK4                                       */
/*                  : 2: AHB_CLK8                                       */
/*  Output          : Noting                                            */
/*                                                                      */
/*  Note : Display of DIV/APB Clock.                                    */
/*                                                                      */
/************************************************************************/
void PM_DIV_APB_CLK_LED_DISPLY( int32_t div_clock, int32_t apb_clock)
{
    uint16_t display_info = _7_LED1_OFF;
    
    switch(div_clock){
    case AP_DIV_CLK1:
        display_info |= _7_LED1_L5;   /* 7 segment LED : L5 ON */
        break;
    case AP_DIV_CLK2:
        display_info |= _7_LED1_L0;   /* 7 segment LED : L0 ON */
        break;
    case AP_DIV_CLK4:
        display_info |= (_7_LED1_L0|_7_LED1_L5);   /* 7 segment LED : L0,L5 ON */
        break;
    case AP_DIV_CLK8:
        display_info |= _7_LED1_L1;   /* 7 segment LED : L1 ON */
        break;
    case AP_DIV_CLK16:
        display_info |= (_7_LED1_L1|_7_LED1_L5);   /* 7 segment LED : L1,L5 ON */
        break;
    case AP_DIV_CLK32:
        display_info |= (_7_LED1_L0|_7_LED1_L1);   /* 7 segment LED : L0,L1 ON */
        break;
    default:
        display_info = _7_LED1_OFF;   /* 7 segment LED : ALL OFF  */
        break;
    }
    switch(apb_clock){
    case AP_AHB_CLK2:
        display_info |= _7_LED1_L3;   /* 7 segment LED : L3 ON */
        break;
    case AP_AHB_CLK4:
        display_info |= (_7_LED1_L3|_7_LED1_L4);   /* 7 segment LED : L3,L4 ON */
        break;
    case AP_AHB_CLK8:
        display_info |= _7_LED1_L2;   /* 7 segment LED : L2 ON */
        break;
    default:
        display_info = _7_LED1_OFF;   /* 7 segment LED : ALL OFF  */
        break;
    }
    debug_msg(display_info, NULL);   /* Display 7 segment LED  */
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?