/*
* Return number of bytes to fill to boundary, or len
*/
static int pl08x_pre_boundary(int addr, int len)
{
int boundary;
if (len <= 0)
dev_err(&pd.dmac->dev, "%s - zero length\n", __func__);
boundary = ((addr >> PL08X_BOUNDARY_SHIFT
) + 1) << PL08X_BOUNDARY_SHIFT;
if (boundary < addr + len)
return boundary - addr;
else
return len;
}
|
#define PL08X_BOUNDARY_SHIFT (10) /* 1KB 0x400 */ #define PL08X_BOUNDARY_SIZE (1 << PL08X_BOUNDARY_SHIFT) 此函数,目的是为了限制每次DMA传输的字节数,要保证在PL08X_BOUNDARY_SIZE即1KB范围内。 之所以做此限制,是因为datasheet中写了:“Bursts do not cross the 1KB address boundary” 突发传输,不能跨界超过1KB 的范围。 所以,如果你上层程序调用此pl08x驱动,希望每次传输2KB,那么此驱动会自动帮你限制为每次最多1KB,然后自动帮你拆分出对应的多个LLI。 |