参考了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)
离线