To initiate a DMA transfer, you need to:

  1. open GPDMA device node, for example “/dev/edma0.51” (first number is the device number, and second is the channel number)
  2. query channel for it's capabilities issuing a GPDMA_IOCTL_GETCAPS ioctl passing gpdma_cdev_caps structure
  3. write() gpdma_cdev_request structure to device
  4. wait for read() gpdma_cdev_response when transfer is completed or an error occured.
  5. 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;
};
  • soc2010jakubklama/chardevice.txt
  • Last modified: 2010/08/16 12:04
  • by JakubKlama