続 zaudio(4)

Bad address になるのは pxa2x0_i2s.c よりも pxa2x0_dmac.c の方が境界条件が厳しいのが理由だった。
とりあえず pxa2x0_i2s.c の方を pxa2x0_dmac.c に合わせて試してみたら、エラーは出なくなったものの正常に再生されなかった。最初のバッファを延々と繰り返している様な感じ。

/* src/sys/arch/arm/xscale/pxa2x0_i2s.c */
int
pxa2x0_i2s_round_blocksize(void *hdl, int bs, int mode,
    const struct audio_params *param)
{

	/* Enforce individual DMA block size limit */
	if (bs > DCMD_LENGTH_MASK)
		return (DCMD_LENGTH_MASK & ~0x03);

	return (bs + 0x03) & ~0x03;	/* 32-bit multiples */
}
/* src/sys/arch/arm/xscale/pxa2x0_dmac.c */
static inline int
dmac_validate_desc(struct dmac_xfer_desc *xd, size_t *psize)
{
	size_t size;
	int i;

	/*
	 * Make sure the transfer parameters are acceptable.
	 */

	if (xd->xd_addr_hold &&
	    (xd->xd_nsegs != 1 || xd->xd_dma_segs[0].ds_len == 0))
		return (EINVAL);

	for (i = 0, size = 0; i < xd->xd_nsegs; i++) {
		if (xd->xd_dma_segs[i].ds_addr & 0x7)
			return (EFAULT);
		size += xd->xd_dma_segs[i].ds_len;
	}

	*psize = size;
	return (0);
}