static void omap3_setup_tx_edma(omap3_ext_t *omap3, paddr_t addr, int len) { dra446_param *param; int chnl = omap3->dma_treq; /* * In case there is a pending event */ omap3_edma_bit(omap3, DRA446_EDMA_ECR, chnl); /* * Initialize Tx DMA channel */ param = (dra446_param *)(omap3->dma_base + DRA446_PARAM(chnl)); param->opt = (0<< 23) /* ITCCHEN = 0 */ | (0 << 22) /* TCCHEN = 0 */ | (0 << 21) /* */ | (0 << 20) /* */ | (chnl << 12) /* TCC */ | (0 << 11) /* Normal completion */ | (0 << 3) /* PaRAM set is not static */ | (1 << 2) /* AB-synchronizad */ | (0 << 1) /* Destination address increment mode */ | (0 << 0); /* Source address increment mode */ param->src = addr; param->abcnt = (128 << 16) | 4; param->dst = omap3->mmc_pbase + OMAP3_MMCHS_DATA; param->srcdstbidx = (0 << 16) | 4; param->linkbcntrld = 0xFFFF; param->srcdstcidx = (0 << 16) | 512; param->ccnt = len / 512; /* * Enable event */ omap3_edma_bit(omap3, DRA446_EDMA_EESR, chnl); }
static void omap3_edma_done(omap3_ext_t *omap3, int channel) { uintptr_t base = omap3->dma_base + DRA446_SHADOW0_OFF; dra446_param *param = (dra446_param *)(omap3->dma_base + DRA446_PARAM(channel)); if (channel > 31) { base += 4; channel -= 32; } if (in32(base + DRA446_EDMA_ER) & in32(base + DRA446_EDMA_EER)) { int i=100; while (param->ccnt != 0 && i--){ printf("%s(%d): %d %x \n", __func__, __LINE__, channel, param->ccnt); delay(1); } } /* Disable this EDMA event */ omap3_edma_bit(omap3, DRA446_EDMA_EECR, channel); }