int pl08x_fill_lli_for_desc(struct pl08x_txd *local_txd, int num_llis, int len, union _cctl *cctl, int *remainder) { struct _lli *llis_va = (struct _lli *)(local_txd->llis_va); struct _lli *llis_bus = (struct _lli *)(local_txd->llis_bus); llis_va[num_llis].cctl.val = cctl->val; llis_va[num_llis].src = local_txd->srcbus.addr; llis_va[num_llis].dst = local_txd->dstbus.addr; /* * The bus bit is added to the next lli's address */ llis_va[num_llis].next = (dma_addr_t)((unsigned int)&(llis_bus[num_llis + 1]) + pd.pd->bus_bit_lli); if (cctl->bits.si) local_txd->srcbus.addr += len; if (cctl->bits.di) local_txd->dstbus.addr += len; *remainder -= len; return num_llis + 1; }
填充对应的contrl,source, destination 三个寄存器对应的值 | |
llis_bus[num_llis + 1]比较好理解,就是当前的LLI的next的值,应该赋值为下一个LLI 的地址 | |
需要特殊说明的是bus_bit_lli,此变量,意思为你当前使用DMA的哪个Master。 因为pl080内部有两个Master主控器,你在使用DMA的时候,要制定你当前是使用哪一个DMA,详情参考datasheet: 其中32位的LLI的地址,由于是4对齐的,所以bit0和bit1肯定是0,正好利用第0位指示是master1 还是master2。 此变量不是此处pl08x DMA驱动赋值的,而是在你最开始去注册amba设备的时候赋值的。 | |
如果是SI,那么源地址在一次LLI的DMA传输后,源地址就应该更新,为再加上对应的每次传输的长度 |