/** * 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); }
//--------------------------------------------------------------------------------------------------- //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; }
//--------------------------------------------------------------------------------------------------- //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; }
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 }
//--------------------------------------------------------------------------------------------------- //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; }
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 }