1.12. pl08x_fill_lli_for_desc

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;1
	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]2)
					+ pd.pd->bus_bit_lli3);
	if (cctl->bits.si)
		local_txd->srcbus.addr += len;4
	if (cctl->bits.di)
		local_txd->dstbus.addr += len;

	*remainder -= len;

	return num_llis + 1;
}
        

1

填充对应的contrl,source, destination 三个寄存器对应的值

2

llis_bus[num_llis + 1]比较好理解,就是当前的LLI的next的值,应该赋值为下一个LLI 的地址

3

需要特殊说明的是bus_bit_lli,此变量,意思为你当前使用DMA的哪个Master。

因为pl080内部有两个Master主控器,你在使用DMA的时候,要制定你当前是使用哪一个DMA,详情参考datasheet:

图 1.4. LLI寄存器的含义

LLI寄存器的含义


其中32位的LLI的地址,由于是4对齐的,所以bit0和bit1肯定是0,正好利用第0位指示是master1 还是master2。

此变量不是此处pl08x DMA驱动赋值的,而是在你最开始去注册amba设备的时候赋值的。

4

如果是SI,那么源地址在一次LLI的DMA传输后,源地址就应该更新,为再加上对应的每次传输的长度