您尚未登录。

楼主 # 2022-04-11 22:15:36

secret
会员
注册时间: 2021-12-27
已发帖子: 4
积分: 14

D1 DMA的使用

参考了xboot大佬相关代码。问题是  我在将DMA的描述符写入描述符地址寄存器后,想去读源地址寄存器等看看有没有获取到,但是最后结果是一直读取不到。
这是大佬源码

static void dma_d1_start(struct dmachip_t * chip, int offset)
{
	struct dma_d1_pdata_t * pdat = (struct dma_d1_pdata_t *)chip->priv;
	struct dma_d1_desc_t * desc;
	struct dma_channel_t * ch;

	if(offset >= chip->ndma)
		return;

	desc = &pdat->desc[offset];
	ch = &chip->channel[offset];
	desc->config = get_d1_config(ch);
	desc->src = (u64_t)(ch->src);
	desc->dst = (u64_t)(ch->dst);
	desc->count = (u32_t)(ch->size);
	desc->para = get_d1_para(ch);
	desc->link = 0xfffff800;
	smp_mb();
	write32(pdat->virt + DMA_CH_DST(offset), (u64_t)desc);
	smp_mb();
	write32(pdat->virt + DMA_CH_EN(offset), 1);
	write32(pdat->virt + DMA_CH_PAUSE(offset), 0);
	smp_mb();
}
/* SMP read and write memory barrier */
#define smp_mb()	__asm__ __volatile__ ("fence rw, rw" : : : "memory");

这里的汇编代码不是很懂什么意思。
然后这里是我的代码

DMA_DESCRIPTION.config = DMA_SET_CONFIG();//设置描述符中的config
	DMA_DESCRIPTION.src = (uint32_t)sourceaddress;       //设置描述符中的源地址为要发送的数据数组地址
	DMA_DESCRIPTION.dst = (uint32_t)UART0_BASE+UART_THR; //设置描述符中的目标地址为Uart0的数据发送寄存器地址
	DMA_DESCRIPTION.count = length;            //设置描述符中的发送数据的长度
	DMA_DESCRIPTION.para = DMA_SET_PARA();    //设置描述符中的参数
	DMA_DESCRIPTION.link = 0xfffff800;         //设置描述符中的连接地址
	

	
	smp_mb();
	write32(DMA_BASE + DMA_DESC_ADDR_REGN(dmaNo), (uint32_t)&DMA_DESCRIPTION);  //将描述符地址写入描述符地址寄存器

还望大佬们不吝赐教。谢谢!!!

最近编辑记录 secret (2022-04-11 22:16:14)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn