/* * 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。 |