Пример #1
0
/**
 * Load UART HAL GDMA default setting
 *
 * Call this function to load the default setting for UART GDMA
 *
 *
 */
VOID
HalRuartTxGdmaInit(
    PRUART_ADAPTER pRuartAdapter
)
{
    PHAL_RUART_OP pHalRuartOp;
    PHAL_RUART_ADAPTER pHalRuartAdapter;
    PUART_DMA_CONFIG pUartGdmaConfig;
    PHAL_GDMA_ADAPTER pHalGdmaAdapter;
    
    if (NULL == pRuartAdapter) {
        return;
    }
    
    pHalRuartOp = pRuartAdapter->pHalRuartOp;
    pHalRuartAdapter = pRuartAdapter->pHalRuartAdapter;
    pUartGdmaConfig = pRuartAdapter->pHalRuartDmaCfg;

    if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter) || (NULL == pUartGdmaConfig)) {
        return;
    }

    // Load default setting
    if (pHalRuartOp->HalRuartTxGdmaLoadDef != NULL) {
        HalGdmaOpInit((VOID*) (pUartGdmaConfig->pHalGdmaOp));
        pHalRuartOp->HalRuartTxGdmaLoadDef (pHalRuartAdapter, pUartGdmaConfig);
    }
    else {
        // Initial your GDMA setting here
    }

    // Start to patch the default setting
    pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter;
    pHalGdmaAdapter->GdmaIndex   = 0;  // GDMA0 
    pHalGdmaAdapter->ChNum       = 4;   // GDMA Channel
    pHalGdmaAdapter->ChEn        = GdmaCh4;     // GDMA Channel Enable

//    pUartGdmaConfig->TxGdmaIrqHandle.Data = pHalRuartAdapter;
    pUartGdmaConfig->TxGdmaIrqHandle.IrqNum = GDMA0_CHANNEL4_IRQ;
//    pUartGdmaConfig->TxGdmaIrqHandle.IrqFun = (IRQ_FUN)_UartTxDmaIrqHandle
    pUartGdmaConfig->TxGdmaIrqHandle.Priority = 0x20;

    pHalRuartOp->HalRuartDmaInit (pHalRuartAdapter);
    InterruptRegister(&pUartGdmaConfig->TxGdmaIrqHandle);
    InterruptEn(&pUartGdmaConfig->TxGdmaIrqHandle);

}
Пример #2
0
//---------------------------------------------------------------------------------------------------
//Function Name:
//		RtkI2CInit
//
// Description:
//         According to the given I2C index, the related SAL_I2C_MNGT_ADPT pointer used 
//         for retrieving each I2C data sturcture pointer will be reversely parsed first.
//         Then, initializing I2C HAL operation, initializing I2C interrupt (if needed), 
//         initializing I2C DMA (if needed) and initializing I2C pinmux will be done.
//         User specified I2C configuration will be assigned to I2C initial data structure
//         (PHAL_I2C_INIT_DAT   pHalI2CInitDat). I2C HAL initialization is executed after
//         all the configuration data taken.
//         In the end, I2C module is enabled as a final step of the whole initialization.
//         For a slave ack General Call support, an additional step may be followed after
//         the above steps.
//		
// Arguments:
//		[in] VOID *Data -
//			I2C SAL handle
//
// Return:
//		The status of the I2C initialization process.
//          _EXIT_SUCCESS if the RtkI2CInit succeeded.
//          _EXIT_FAILURE if the RtkI2CInit failed.
//
// Note:
//		NA
//
// See Also:
//		NA
//
// Author:
// 		By Jason Deng, 2014-04-03.
//
//----------------------------------------------------------------------------------------------------
RTK_STATUS
RtkDACSend(
    IN  VOID *Data
){
    PSAL_DAC_HND        pSalDACHND          = (PSAL_DAC_HND) Data;
    PSAL_DAC_HND_PRIV   pSalDACHNDPriv      = NULL;
    PSAL_DAC_MNGT_ADPT  pSalDACMngtAdpt     = NULL;
    PHAL_GDMA_ADAPTER   pHALDACGdmaAdpt    = NULL;
    PHAL_GDMA_OP        pHALDACGdmaOp      = NULL;
    //PIRQ_HANDLE         pIrqHandleDACGdma   = NULL;
    
    /* To Get the SAL_I2C_MNGT_ADPT Pointer */
    pSalDACHNDPriv  = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv);
    pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv);
    
    pHALDACGdmaAdpt     = pSalDACMngtAdpt->pHalGdmaAdp;
    pHALDACGdmaOp       = pSalDACMngtAdpt->pHalGdmaOp;
    //pIrqHandleDACGdma   = pSalDACMngtAdpt->pIrqGdmaHnd;

	//NeoJou
	//pSalDACMngtAdpt->thread_id = osThreadGetId();
#if 0
    while (1)
    {
        if (!(HAL_DAC_READ32(0,REG_DAC_INTR_STS) & BIT0) )
            HAL_DAC_WRITE32(0,REG_DAC0_FIFO_WR,0xFFFF);
    }
#endif    
#if 1
    HalGdmaOpInit(pHALDACGdmaOp);

    pHALDACGdmaAdpt->GdmaCtl.BlockSize  = pSalDACHND->pTXBuf->DataLen;
    pHALDACGdmaAdpt->ChSar              =   (u32)pSalDACHND->pTXBuf->pDataBuf;
    pHALDACGdmaAdpt->ChDar              =   (u32)(DAC_REG_BASE+(pSalDACHND->DevNum*0x800));  

    //DBG_8195A("src addr:%x\n", pHALDACGdmaAdpt->ChSar);
    //DBG_8195A("dst addr:%x\n", pHALDACGdmaAdpt->ChDar);
    pHALDACGdmaOp->HalGdmaChSeting(pHALDACGdmaAdpt);

    pHALDACGdmaOp->HalGdmaChEn(pHALDACGdmaAdpt);
#endif

    return _EXIT_SUCCESS;
}
Пример #3
0
//---------------------------------------------------------------------------------------------------
//Function Name:
//		RtkI2CIrqDeInit
//
// Description:
//         I2C interrupt de-initialization function.
//         According to the given I2C device number, the I2C interrupt will be unreigster 
//         from the platform and the relative interrupt handler will be cleared.
//		
// Arguments:
//		[in] VOID *Data -
//			I2C SAL handle
//
// Return:
//		The status of the I2C interrupt de-initialization process.
//          _EXIT_SUCCESS if the RtkI2CIrqDeInit succeeded.
//          _EXIT_FAILURE if the RtkI2CIrqDeInit failed.
//
// Note:
//		NA
//
// See Also:
//		NA
//
// Author:
// 		By Jason Deng, 2014-04-03.
//
//----------------------------------------------------------------------------------------------------
static RTK_STATUS
RtkDACDMADeInit(
    IN  PSAL_DAC_HND    pSalDACHND
){
    PSAL_DAC_HND_PRIV   pSalDACHNDPriv      = NULL;
    PSAL_DAC_MNGT_ADPT  pSalDACMngtAdpt     = NULL;

    PHAL_GDMA_ADAPTER   pHALDACGdmaAdpt     = NULL;
    PHAL_GDMA_OP        pHALDACGdmaOp       = NULL;
    PIRQ_HANDLE         pIrqHandleDACGdma   = NULL;
    
    /*To Get the SAL_I2C_MNGT_ADPT Pointer*/
    pSalDACHNDPriv  = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv);
    pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv);
    
    pHALDACGdmaAdpt     = pSalDACMngtAdpt->pHalGdmaAdp;
    pHALDACGdmaOp       = pSalDACMngtAdpt->pHalGdmaOp;
    pIrqHandleDACGdma   = pSalDACMngtAdpt->pIrqGdmaHnd;

    if (RtkDACIdxChk(pSalDACHND->DevNum))
        return _EXIT_FAILURE;

    HalGdmaOpInit(pHALDACGdmaOp);
        
    pHALDACGdmaAdpt->IsrCtrl    = DISABLE;
    pHALDACGdmaOp->HalGdmaChIsrEnAndDis((VOID*)pHALDACGdmaAdpt);
    pHALDACGdmaOp->HalGdmaChIsrClean((VOID*)pHALDACGdmaAdpt);
    pHALDACGdmaOp->HalGdmaChDis((VOID*)pHALDACGdmaAdpt);
     
    InterruptUnRegister(pIrqHandleDACGdma);
#if 0
    _memset((void *)pIrqHandleDACGdma , 0, sizeof(IRQ_HANDLE));
    _memset((void *)pHALDACGdmaOp     , 0, sizeof(HAL_GDMA_OP));
    _memset((void *)pHALDACGdmaAdpt   , 0, sizeof(HAL_GDMA_ADAPTER));
#endif    
    return _EXIT_SUCCESS;
}
Пример #4
0
void serial_init(serial_t *obj, PinName tx, PinName rx) 
{
    uint32_t uart_tx, uart_rx;
    uint32_t uart_sel;
    uint8_t uart_idx;
    PHAL_RUART_OP      pHalRuartOp;
    PHAL_RUART_ADAPTER pHalRuartAdapter;
#ifdef CONFIG_GDMA_EN
    PUART_DMA_CONFIG   pHalRuartDmaCfg;
    PHAL_GDMA_OP pHalGdmaOp=&UartGdmaOp;
#endif

    // Determine the UART to use (UART0, UART1, or UART3)
    uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
    uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);

    uart_sel = pinmap_merge(uart_tx, uart_rx);
    uart_idx = RTL_GET_PERI_IDX(uart_sel);
    if (unlikely(uart_idx == (uint8_t)NC)) {
        DBG_UART_ERR("%s: Cannot find matched UART\n", __FUNCTION__);
        return;
    }
#ifdef CONFIG_MBED_ENABLED 
    else if (uart_idx == UART_3) {
        obj->index = UART_3;
        goto init_stdio;
    }
#endif

    pHalRuartOp = &(obj->hal_uart_op);
    pHalRuartAdapter = &(obj->hal_uart_adp);

    if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter)) {
        DBG_UART_ERR("%s: Allocate Adapter Failed\n", __FUNCTION__);
        return;
    }
    
    HalRuartOpInit((VOID*)pHalRuartOp);

#ifdef CONFIG_GDMA_EN
    HalGdmaOpInit((VOID*)pHalGdmaOp);
    pHalRuartDmaCfg = &obj->uart_gdma_cfg;
    pHalRuartDmaCfg->pHalGdmaOp = pHalGdmaOp;
    pHalRuartDmaCfg->pTxHalGdmaAdapter = &obj->uart_gdma_adp_tx;
    pHalRuartDmaCfg->pRxHalGdmaAdapter = &obj->uart_gdma_adp_rx;
    pHalRuartDmaCfg->pTxDmaBlkList = &obj->gdma_multiblk_list_tx;
    pHalRuartDmaCfg->pRxDmaBlkList = &obj->gdma_multiblk_list_rx;
    _memset((void*)(pHalRuartDmaCfg->pTxHalGdmaAdapter), 0, sizeof(HAL_GDMA_ADAPTER));
    _memset((void*)(pHalRuartDmaCfg->pRxHalGdmaAdapter), 0, sizeof(HAL_GDMA_ADAPTER));
    _memset((void*)(pHalRuartDmaCfg->pTxDmaBlkList), 0, sizeof(UART_DMA_MULTIBLK));
    _memset((void*)(pHalRuartDmaCfg->pRxDmaBlkList), 0, sizeof(UART_DMA_MULTIBLK));
#endif

    pHalRuartOp->HalRuartAdapterLoadDef(pHalRuartAdapter, uart_idx);
    pHalRuartAdapter->PinmuxSelect = RTL_GET_PERI_SEL(uart_sel);
    pHalRuartAdapter->BaudRate = 9600;
    pHalRuartAdapter->IrqHandle.Priority = 6;
    
    if (HalRuartInit(pHalRuartAdapter) != HAL_OK) {
        DBG_UART_ERR("serial_init Err!\n");
        return;
    }
    pHalRuartOp->HalRuartRegIrq(pHalRuartAdapter);    
    pHalRuartOp->HalRuartIntEnable(pHalRuartAdapter);

#ifdef CONFIG_MBED_ENABLED
init_stdio:
    // For stdio management
    if (uart_idx == STDIO_UART) {
        // default setting to 38400
        if (stdio_uart_inited) return;
        log_uart_init(&stdio_uart_log, 38400, 8, ParityNone, 1);
        stdio_uart_inited = 1;
        memcpy(&stdio_uart, obj, sizeof(serial_t));
    }
#endif
}
Пример #5
0
//---------------------------------------------------------------------------------------------------
//Function Name:
//		RtkI2CIrqInit
//
// Description:
//         I2C interrupt initialization function.
//         For I2C interrupt operation mode, I2C module MUST register itself to the platform
//         by providing the interrupt handler which contains interrupt input data (arguments),
//         interrupt service routine, interrupt number, interrupt priority. And then the interrupt
//         should be enabled.
//		
// Arguments:
//		[in] VOID *Data -
//			I2C SAL handle
//
// Return:
//		The status of the I2C interrupt initialization process.
//          _EXIT_SUCCESS if the RtkI2CIrqInit succeeded.
//          _EXIT_FAILURE if the RtkI2CIrqInit failed.
//
// Note:
//		NA
//
// See Also:
//		NA
//
// Author:
// 		By Jason Deng, 2014-04-03.
//
//----------------------------------------------------------------------------------------------------
static RTK_STATUS
RtkDACDMAInit(
    IN  PSAL_DAC_HND    pSalDACHND
){
    PSAL_DAC_HND_PRIV   pSalDACHNDPriv      = NULL;
    PSAL_DAC_MNGT_ADPT  pSalDACMngtAdpt     = NULL;
    PHAL_GDMA_ADAPTER   pHALDACGdmaAdpt    = NULL;
    PHAL_GDMA_OP        pHALDACGdmaOp      = NULL;
    PIRQ_HANDLE         pIrqHandleDACGdma   = NULL;
    
    /* To Get the SAL_I2C_MNGT_ADPT Pointer */
    pSalDACHNDPriv  = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv);
    pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv);
    
    pHALDACGdmaAdpt     = pSalDACMngtAdpt->pHalGdmaAdp;
    pHALDACGdmaOp       = pSalDACMngtAdpt->pHalGdmaOp;
    pIrqHandleDACGdma   = pSalDACMngtAdpt->pIrqGdmaHnd;
    
    if (RtkDACIdxChk(pSalDACHND->DevNum))
        return _EXIT_FAILURE;

    HalGdmaOpInit(pHALDACGdmaOp);
    
    _memset((void *)pHALDACGdmaAdpt, 0, sizeof(HAL_GDMA_ADAPTER));
    
    pHALDACGdmaAdpt->GdmaCtl.IntEn = 1;

    //DAC TX DMA
    pHALDACGdmaAdpt->GdmaCtl.SrcTrWidth = TrWidthFourBytes;
    pHALDACGdmaAdpt->GdmaCtl.DstTrWidth = TrWidthFourBytes;
    pHALDACGdmaAdpt->GdmaCtl.SrcMsize   = MsizeFour;
    pHALDACGdmaAdpt->GdmaCtl.DestMsize  = MsizeFour;

    pHALDACGdmaAdpt->GdmaCtl.Sinc       = IncType;
    pHALDACGdmaAdpt->GdmaCtl.Dinc       = NoChange;	

    pHALDACGdmaAdpt->GdmaCtl.Done       = 1;
    pHALDACGdmaAdpt->GdmaCtl.TtFc       = (GDMA_CTL_TT_FC_TYPE)0x01;
    
    pHALDACGdmaAdpt->GdmaCfg.DestPer    = 13;
    pHALDACGdmaAdpt->GdmaCfg.ReloadSrc  = 1;

    pHALDACGdmaAdpt->MuliBlockCunt      = 1;
    pHALDACGdmaAdpt->MaxMuliBlock       = 50000;//MaxLlp;
    
    pHALDACGdmaAdpt->GdmaIsrType        = (BlockType|TransferType|ErrType);
    pHALDACGdmaAdpt->IsrCtrl            = ENABLE;
    pHALDACGdmaAdpt->GdmaOnOff          = ON;

    pHALDACGdmaAdpt->ChNum              = 4;
    pHALDACGdmaAdpt->ChEn               = GdmaCh4;

    
    pHALDACGdmaAdpt->TestItem = 3;
    //DBG_8195A("pSalDACHND->DevNum:%x\n",pSalDACHND->DevNum);
    switch (pSalDACHND->DevNum){
#if DAC0_USED
        case DAC0_SEL:
        {   
            pHALDACGdmaAdpt->GdmaIndex          = 0;
            
            pIrqHandleDACGdma->IrqNum   = GDMA0_CHANNEL4_IRQ;
            break;
        }
#endif
#if DAC1_USED
        case DAC1_SEL:
        {
            pHALDACGdmaAdpt->GdmaIndex          = 1;
            
            pIrqHandleDACGdma->IrqNum   = GDMA1_CHANNEL4_IRQ;
            break;
        }
#endif
        default:
            return _EXIT_FAILURE;
    }

    /* GDMA interrupt register */
    pIrqHandleDACGdma->Data     = (u32) (pSalDACMngtAdpt);  
    pIrqHandleDACGdma->IrqFun   = (IRQ_FUN) DACGDMAISRHandle;
    pIrqHandleDACGdma->Priority = 2;
    InterruptRegister(pIrqHandleDACGdma);
    InterruptEn(pIrqHandleDACGdma);

    /* GDMA initialization */
    /* Enable the whole GDMA module first */
    if (pHALDACGdmaAdpt->GdmaIndex == 0) {        
        ACTCK_GDMA0_CCTRL(ON);
        SLPCK_GDMA0_CCTRL(ON);
        GDMA0_FCTRL(ON);
    }
    else {        
        ACTCK_GDMA1_CCTRL(ON);
        SLPCK_GDMA1_CCTRL(ON);
        GDMA1_FCTRL(ON);
    }

    pHALDACGdmaOp->HalGdmaOnOff((VOID*)pHALDACGdmaAdpt);
    pHALDACGdmaOp->HalGdmaChIsrEnAndDis((VOID*)pHALDACGdmaAdpt);
    pHALDACGdmaOp->HalGdmaChSeting((VOID*)pHALDACGdmaAdpt);
      
    return _EXIT_SUCCESS;
}
Пример #6
0
void serial_init(serial_t *obj, PinName tx, PinName rx) 
{
    uint32_t uart_tx, uart_rx;
    uint32_t uart_sel;
    uint8_t uart_idx;
    PHAL_RUART_OP      pHalRuartOp;
    PHAL_RUART_ADAPTER pHalRuartAdapter;
#ifdef CONFIG_GDMA_EN
    PUART_DMA_CONFIG   pHalRuartDmaCfg;
    PHAL_GDMA_OP pHalGdmaOp=&UartGdmaOp;
#endif

    // Determine the UART to use (UART0, UART1, or UART3)
    uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
    uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);

    uart_sel = pinmap_merge(uart_tx, uart_rx);
    uart_idx = RTL_GET_PERI_IDX(uart_sel);
    if (unlikely(uart_idx == (uint8_t)NC)) {
        DBG_UART_ERR("%s: Cannot find matched UART\n", __FUNCTION__);
        return;
    }

    pHalRuartOp = &(obj->hal_uart_op);
    pHalRuartAdapter = &(obj->hal_uart_adp);

    if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter)) {
        DBG_UART_ERR("%s: Allocate Adapter Failed\n", __FUNCTION__);
        return;
    }
    
    HalRuartOpInit((VOID*)pHalRuartOp);

#ifdef CONFIG_GDMA_EN
    HalGdmaOpInit((VOID*)pHalGdmaOp);
    pHalRuartDmaCfg = &obj->uart_gdma_cfg;
    pHalRuartDmaCfg->pHalGdmaOp = pHalGdmaOp;
    pHalRuartDmaCfg->pTxHalGdmaAdapter = &obj->uart_gdma_adp_tx;
    pHalRuartDmaCfg->pRxHalGdmaAdapter = &obj->uart_gdma_adp_rx;
    _memset((void*)(pHalRuartDmaCfg->pTxHalGdmaAdapter), 0, sizeof(HAL_GDMA_ADAPTER));
    _memset((void*)(pHalRuartDmaCfg->pRxHalGdmaAdapter), 0, sizeof(HAL_GDMA_ADAPTER));
#endif

    pHalRuartOp->HalRuartAdapterLoadDef(pHalRuartAdapter, uart_idx);
    pHalRuartAdapter->PinmuxSelect = RTL_GET_PERI_SEL(uart_sel);
    pHalRuartAdapter->BaudRate = 9600;
    pHalRuartAdapter->IrqHandle.Priority = 6;

    // Configure the UART pins
    // TODO:
//    pinmap_pinout(tx, PinMap_UART_TX);
//    pinmap_pinout(rx, PinMap_UART_RX);
//    pin_mode(tx, PullUp);
//    pin_mode(rx, PullUp);
    
    HalRuartInit(pHalRuartAdapter);
    pHalRuartOp->HalRuartRegIrq(pHalRuartAdapter);    
    pHalRuartOp->HalRuartIntEnable(pHalRuartAdapter);

#ifdef CONFIG_MBED_ENABLED
    // For stdio management
    if (uart_idx == STDIO_UART) {
        stdio_uart_inited = 1;
        memcpy(&stdio_uart, obj, sizeof(serial_t));
    }
#endif
}