続 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); }