/* This performs a one-way transfer over AXI DMA, the direction being specified * by the user. The user determines if this is blocking or not with `wait. */ int axidma_oneway_transfer(axidma_dev_t dev, int channel, void *buf, size_t len, bool wait) { int rc; struct axidma_transaction trans; unsigned long axidma_cmd; dma_channel_t *dma_chan; assert(find_channel(dev, channel) != NULL); // Setup the argument structure to the IOCTL dma_chan = find_channel(dev, channel); trans.wait = wait; trans.channel_id = channel; trans.buf = buf; trans.buf_len = len; axidma_cmd = dir_to_ioctl(dma_chan->dir); // Perform the given transfer rc = ioctl(dev->fd, axidma_cmd, &trans); if (rc < 0) { perror("Failed to perform the AXI DMA transfer"); return rc; } return 0; }
/* This performs a one-way transfer over AXI DMA, the direction being specified * by the user. The user determines if this is blocking or not with `wait. */ int axidma_oneway_transfer(axidma_dev_t dev, enum axidma_dir dir, int channel, void *buf, size_t len, bool wait) { int rc; struct axidma_transaction trans; unsigned long axidma_cmd; assert(dir == AXIDMA_READ || dir == AXIDMA_WRITE); assert(dir != AXIDMA_READ || valid_channel(dev, channel, AXIDMA_READ)); assert(dir != AXIDMA_WRITE || valid_channel(dev, channel, AXIDMA_WRITE)); // Setup the argument structure to the IOCTL trans.wait = wait; trans.channel_id = channel; trans.buf = buf; trans.buf_len = len; axidma_cmd = dir_to_ioctl(dir); // Perform the given transfer rc = ioctl(dev->fd, axidma_cmd, &trans); if (rc < 0) { perror("Failed to perform the AXI DMA transfer"); return rc; } return 0; }