void InitTxSPIDMA(void) { unsigned channel; int priority; struct sigevent sdmaevent; dma_attach_flags attach_flags; txDmaInfo.SpiDmaSize = 64; if(get_dmafuncs(&txDmaInfo.dmaFuncs,sizeof(dma_functions_t)) != 0) { printf("Get dma failed\n"); } //////////////////// // init library // //////////////////// if (txDmaInfo.dmaFuncs.init(NULL) !=0 ) { printf("DMA INIT FAILED !!! \n"); } txDmaInfo.vaddr_ptr = mmap(NULL, sizeof(Buffer_adt) * (1024/*(txDmaInfo.SpiDmaSize) + 1*/),PROT_READ | PROT_WRITE | PROT_NOCACHE, MAP_ANON | MAP_PHYS, NOFD, 0); mem_offset64(txDmaInfo.vaddr_ptr, NOFD, 1, &txDmaInfo.paddr_off, 0); msync(txDmaInfo.vaddr_ptr, sizeof(Buffer_adt) * (txDmaInfo.SpiDmaSize + 1), MS_INVALIDATE); //////////////////// // create channel // //////////////////// channel=1; // valid range 1-7... Everyone should be nice and use lowest priority (1). // only use higher priority if your performance is suffering. Improved performace may/will be // at the expense of another driver's performance. priority = 1; attach_flags=DMA_ATTACH_EVENT_ON_COMPLETE; //dma lib will throw an event after all segments have been processed // setup an event txDmaInfo.chid = ChannelCreate(_NTO_CHF_UNBLOCK | _NTO_CHF_DISCONNECT); txDmaInfo.coid = ConnectAttach(0, 0, txDmaInfo.chid, _NTO_SIDE_CHANNEL, 0); sdmaevent.sigev_notify = SIGEV_PULSE; sdmaevent.sigev_coid = txDmaInfo.coid; sdmaevent.sigev_code = 64; sdmaevent.sigev_priority = 21; txDmaInfo.handle = txDmaInfo.dmaFuncs.channel_attach("eventnum=6,watermark=64,fifopaddr=0x0200C004",&sdmaevent,&channel,priority,attach_flags); if (txDmaInfo.handle == NULL) { printf("Error in Handle\n"); } } //--------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------- uint32_t DMAtoTxFifo(const Spi_Buf_adt *const wrBuf_ptr) { uint32_t tmp=0; uint32_t *ptr = (uint32_t*)wrBuf_ptr->buf_ptr; memcpy(txDmaInfo.vaddr_ptr,ptr,wrBuf_ptr->bufSz*sizeof(uint32_t)); txDmaInfo.DmaSrcAddr.paddr = txDmaInfo.paddr_off ; txDmaInfo.DmaSrcAddr.len = wrBuf_ptr->bufSz; txDmaInfo.DmaSrcAddr.vaddr = txDmaInfo.vaddr_ptr; txDmaInfo.DmaDstAddr.paddr = 0x0200C004; txDmaInfo.DmaDstAddr.len = 0x40; txDmaInfo.DmaDstAddr.vaddr = dev.spiHWAddr; txDmaInfo.spiTransfer.xfer_unit_size = 8; // valid values are 8,16,32 txDmaInfo.spiTransfer.src_addrs = &txDmaInfo.DmaSrcAddr; txDmaInfo.spiTransfer.dst_addrs = &txDmaInfo.DmaDstAddr; txDmaInfo.spiTransfer.src_fragments = 1; txDmaInfo.spiTransfer.dst_fragments = 1; //txDmaInfo.spiTransfer.xfer_bytes = wrBuf_ptr->bufSz; txDmaInfo.spiTransfer.xfer_bytes = 64; out32(dev.spiHWAddr + MX6X_ECSPI_DMAREG,0); if (txDmaInfo.dmaFuncs.setup_xfer(txDmaInfo.handle,&txDmaInfo.spiTransfer) !=0) { printf("DMA TXFR SETUP FAILED !!! \n"); } if (txDmaInfo.dmaFuncs.xfer_start(txDmaInfo.handle) !=0) { printf("DMA TXFR START FAILED !!! \n"); } tmp = (1 << DMAREG_TEDEN_OFFS) | (0 << DMAREG_RXDEN_OFFS) |(0 << DMAREG_RX_TRESHOLD_OFFS) | (1 << DMAREG_TX_TRESHOLD_OFFS); out32(dev.spiHWAddr + MX6X_ECSPI_DMAREG, tmp); printf("TEST DATA %x\n",in32(dev.spiHWAddr + MX6X_ECSPI_TESTREG)& 0x7F); txDmaInfo.dmaFuncs.channel_release(txDmaInfo.handle); return 0; }