Exemplo n.º 1
0
/* Do a DMA transfer M2M, M2P,P2M or P2P */
void Chip_DMA_Transfer(uint8_t ChannelNum, uint32_t src, uint32_t dst, FlowControlType TransferType, uint32_t Size)
{
    GPDMA_Channel_CFG_Type GPDMACfg;
    uint8_t SrcPeripheral = 0, DstPeripheral = 0;

    GPDMACfg.ChannelNum = ChannelNum;
    GPDMACfg.TransferType = TransferType;
    GPDMACfg.TransferSize = Size;

    switch (TransferType) {
    case GPDMA_TRANSFERTYPE_M2M_CONTROLLER_DMA:
        GPDMACfg.SrcAddr = (uint32_t) src;
        GPDMACfg.DstAddr = (uint32_t) dst;
        src = 0;
        dst = 0;
        GPDMACfg.TransferWidth = GPDMA_WIDTH_BYTE;
        break;

    case GPDMA_TRANSFERTYPE_M2P_CONTROLLER_DMA:
    case GPDMA_TRANSFERTYPE_M2P_CONTROLLER_PERIPHERAL:
        GPDMACfg.SrcAddr = (uint32_t) src;
        src = 0;
        GPDMACfg.DstAddr = (uint32_t) GPDMA_LUTPerAddr[dst];
        DstPeripheral = DMAMUX_Config(dst);
        break;

    case GPDMA_TRANSFERTYPE_P2M_CONTROLLER_DMA:
    case GPDMA_TRANSFERTYPE_P2M_CONTROLLER_PERIPHERAL:
        GPDMACfg.SrcAddr = (uint32_t) GPDMA_LUTPerAddr[src];
        GPDMACfg.DstAddr = (uint32_t) dst;
        SrcPeripheral = DMAMUX_Config(src);
        dst = 0;
        break;

    case GPDMA_TRANSFERTYPE_P2P_CONTROLLER_DMA:
    case GPDMA_TRANSFERTYPE_P2P_CONTROLLER_DestPERIPHERAL:
    case GPDMA_TRANSFERTYPE_P2P_CONTROLLER_SrcPERIPHERAL:
        GPDMACfg.SrcAddr = (uint32_t) GPDMA_LUTPerAddr[src];
        GPDMACfg.DstAddr = (uint32_t) GPDMA_LUTPerAddr[dst];
        SrcPeripheral = DMAMUX_Config(src);
        DstPeripheral = DMAMUX_Config(dst);
        break;

    default:
        break;
    }

    IP_GPDMA_Setup(LPC_GPDMA, &GPDMACfg, (uint32_t) GPDMA_LUTPerBurst[src], (uint32_t) GPDMA_LUTPerBurst[dst],
                   (uint32_t) GPDMA_LUTPerWid[src], (uint32_t) GPDMA_LUTPerWid[dst], (uint32_t) GPDMA_LUTPerAddr[src],
                   (uint32_t) GPDMA_LUTPerAddr[dst], SrcPeripheral, DstPeripheral);

    /* Start the Channel */
    IP_GPDMA_ChannelCmd(LPC_GPDMA, ChannelNum, ENABLE);
}
Exemplo n.º 2
0
/* Stop a stream DMA transfer */
void Chip_DMA_Stop(uint8_t ChannelNum)
{
    IP_GPDMA_ChannelCmd(LPC_GPDMA, (ChannelNum), DISABLE);
    if (Chip_GPDMA_IntGetStatus(GPDMA_STAT_INTTC, ChannelNum)) {
        /* Clear terminate counter Interrupt pending */
        Chip_GPDMA_ClearIntPending(GPDMA_STATCLR_INTTC, ChannelNum);
    }
    if (Chip_GPDMA_IntGetStatus(GPDMA_STAT_INTERR, ChannelNum)) {
        /* Clear terminate counter Interrupt pending */
        Chip_GPDMA_ClearIntPending(GPDMA_STATCLR_INTERR, ChannelNum);
    }
    ChannelHandlerArray[ChannelNum].ChannelStatus = DISABLE;
}
Exemplo n.º 3
0
/* Do a DMA transfer M2M, M2P,P2M or P2P */
Status Chip_DMA_Transfer(LPC_GPDMA_T *pGPDMA,
						 uint8_t ChannelNum,
						 uint32_t src,
						 uint32_t dst,
						 IP_GPDMA_FLOW_CONTROL_T TransferType,
						 uint32_t Size)
{
	GPDMA_Channel_CFG_T GPDMACfg;
	uint8_t SrcPeripheral = 0, DstPeripheral = 0;
	uint32_t cwrd;
	int ret;

	ret = Chip_DMA_InitChannelCfg(pGPDMA, &GPDMACfg, ChannelNum, src, dst, Size, TransferType);
	if (ret < 0) {
		return ERROR;
	}

	/* Adjust src/dst index if they are memory */
	if (ret & 1) {
		src = 0;
	}
	else {
		SrcPeripheral = DMAMUX_Config(src);
	}

	if (ret & 2) {
		dst = 0;
	}
	else {
		DstPeripheral = DMAMUX_Config(dst);
	}

	cwrd = IP_GPDMA_MakeCtrlWord(&GPDMACfg,
								 (uint32_t) GPDMA_LUTPerBurst[src],
								 (uint32_t) GPDMA_LUTPerBurst[dst],
								 (uint32_t) GPDMA_LUTPerWid[src],
								 (uint32_t) GPDMA_LUTPerWid[dst]);
	if (IP_GPDMA_Setup(pGPDMA, &GPDMACfg, cwrd, 0, SrcPeripheral, DstPeripheral) == ERROR) {
		return ERROR;
	}

	/* Start the Channel */
	IP_GPDMA_ChannelCmd(pGPDMA, ChannelNum, ENABLE);
	return SUCCESS;
}
Exemplo n.º 4
0
/* Do a DMA scatter-gather transfer M2M, M2P,P2M or P2P using DMA descriptors */
Status Chip_DMA_SGTransfer(LPC_GPDMA_T *pGPDMA,
						   uint8_t ChannelNum,
						   const DMA_TransferDescriptor_t *DMADescriptor,
						   IP_GPDMA_FLOW_CONTROL_T TransferType)
{
	const DMA_TransferDescriptor_t *dsc = DMADescriptor;
	GPDMA_Channel_CFG_T GPDMACfg;
	uint8_t SrcPeripheral = 0, DstPeripheral = 0;
	uint32_t src = DMADescriptor->src, dst = DMADescriptor->dst;
	int ret;

	ret = Chip_DMA_InitChannelCfg(pGPDMA, &GPDMACfg, ChannelNum, src, dst, 0, TransferType);
	if (ret < 0) {
		return ERROR;
	}

	/* Adjust src/dst index if they are memory */
	if (ret & 1) {
		src = 0;
	}
	else {
		SrcPeripheral = DMAMUX_Config(src);
	}

	if (ret & 2) {
		dst = 0;
	}
	else {
		DstPeripheral = DMAMUX_Config(dst);
	}

	if (IP_GPDMA_Setup(pGPDMA, &GPDMACfg, dsc->ctrl, dsc->lli, SrcPeripheral, DstPeripheral) == ERROR) {
		return ERROR;
	}

	/* Start the Channel */
	IP_GPDMA_ChannelCmd(pGPDMA, ChannelNum, ENABLE);
	return SUCCESS;
}