To initiate a DMA transfer, you need to:
- open GPDMA device node, for example “/dev/edma0.51” (first number is the device number, and second is the channel number)
- query channel for it's capabilities issuing a GPDMA_IOCTL_GETCAPS ioctl passing gpdma_cdev_caps structure
- write() gpdma_cdev_request structure to device
- wait for read() gpdma_cdev_response when transfer is completed or an error occured.
- repeat step 3 as needed.
enum gpdma_cdev_buftype { GPDMA_CDEVBUF_BLOCK = 0x1, GPDMA_CDEVBUF_FRAME = 0x2, }; enum gpdma_cdev_op { GPDMA_FILL = 0x1, GPDMA_COPY = 0x2, GPDMA_XOR = 0x4, }; struct gpdma_cdev_buffer { int dcb_type; struct iovec dcb_iov; size_t dcb_stride_width; size_t dcb_stride_spacing; }; struct gpdma_cdev_request { int dcr_op; struct gpdma_cdev_buffer dcr_buffers[8]; #define dcr_dst dcr_buffers[0] #define dcr_src dcr_buffers[1] }; struct gpdma_cdev_response { int drp_status; # errno number }; struct gpdma_cdev_caps { uint32_t dcc_ops; uint32_t dcc_buffers; };