/*
 * memcpy_dma.c
 *
 *  Created on: Oct 1, 2019
 *      Author: abody
 */
#include <f4ll_cpp/dmahelper.h>
#include <f4ll_cpp/memcpydma.h>

namespace f4ll_cpp {

MemcpyDma::MemcpyDma(DMA_TypeDef *dma, uint32_t stream) :
	DmaHelper(dma, stream),
	m_busy(false)
{
	LL_DMA_EnableIT_TC(dma, stream);
}

void* MemcpyDma::Copy(void *dst, void const *src, size_t length)
{
	while(m_busy);
	LL_DMA_SetM2MSrcAddress(GetDma(), GetStream(), (uint32_t)src);
	LL_DMA_SetM2MDstAddress(GetDma(), GetStream(), (uint32_t)dst);
	LL_DMA_SetDataLength(GetDma(), GetStream(), (length+3)/4 );
	m_busy = true;
	LL_DMA_EnableStream(GetDma(), GetStream());
	return dst;
}

void MemcpyDma::HandleDmaIrq(void)
{
	if(*GetIsReg() & GetTcMask()) {	// DMA transfer complete
		*GetIfcReg() = GetTcMask();
		LL_DMA_DisableStream(GetDma(), GetStream());
		m_busy = false;
	}
}

}	//	f4ll_cpp
