Advertisement
Wh0Els3

driverVDMA

Aug 8th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.07 KB | None | 0 0
  1. /*
  2.  */
  3.  
  4. #include "xil_printf.h"
  5. //#include "sleep.h"
  6.  
  7.  
  8. #include "vdma.h"
  9.  
  10. XAxiVdma OutVdma;
  11. XAxiVdma InVdma;
  12. XAxiVdma FilterVdma;
  13.  
  14.  
  15. XAxiVdma_DmaSetup VDMAOutCfg;
  16. XAxiVdma_DmaSetup VDMAInCfg;
  17. XAxiVdma_DmaSetup VDMAFilterInCfg;
  18. XAxiVdma_DmaSetup VDMAFilterOutCfg;
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. u32 vdma_version() {
  26.     return XAxiVdma_GetVersion(&OutVdma);
  27. }
  28.  
  29. int vdma_out_start() {
  30.        int Status;
  31.  
  32.        // MM2S Startup
  33.        Status = XAxiVdma_DmaStart(&OutVdma, XAXIVDMA_READ);
  34.        if (Status != XST_SUCCESS)
  35.        {
  36.           xil_printf("Start read transfer failed %d\n\r", Status);
  37.           return XST_FAILURE;
  38.        }
  39.  
  40.        return XST_SUCCESS;
  41. }
  42.  
  43. int vdma_in_start() {
  44.        int Status;
  45.  
  46.        // MM2S Startup
  47.        Status = XAxiVdma_DmaStart(&InVdma, XAXIVDMA_WRITE);
  48.        if (Status != XST_SUCCESS)
  49.        {
  50.           xil_printf("Start read transfer failed %d\n\r", Status);
  51.           return XST_FAILURE;
  52.        }
  53.  
  54.        return XST_SUCCESS;
  55. }
  56.  
  57.  
  58.  
  59. int vdma_stop() {
  60.        XAxiVdma_DmaStop(&OutVdma, XAXIVDMA_READ);
  61.        return XST_SUCCESS;
  62. }
  63.  
  64.  
  65. int vdma_out_init(short DeviceID, int base_address, int h_width, int v_width, int bpp)
  66. {
  67.     XAxiVdma_Config *Config;
  68.     int Status;
  69.  
  70.  
  71.     Config = XAxiVdma_LookupConfig(DeviceID);
  72.     if (NULL == Config) {
  73.         xil_printf("XAxiVdma_LookupConfig failure\r\n");
  74.         return XST_FAILURE;
  75.     }
  76.  
  77.     Status = XAxiVdma_CfgInitialize(&OutVdma, Config, Config->BaseAddress);
  78.     if (Status != XST_SUCCESS) {
  79.         xil_printf("XAxiVdma_CfgInitialize failure\r\n");
  80.         return XST_FAILURE;
  81.     }
  82.  
  83.     VDMAOutCfg.EnableCircularBuf = 1;
  84.     VDMAOutCfg.EnableFrameCounter = 0;
  85.     VDMAOutCfg.FixedFrameStoreAddr = 0;
  86.  
  87.     VDMAOutCfg.EnableSync = 1;
  88.     VDMAOutCfg.PointNum = 1;
  89.  
  90.     VDMAOutCfg.FrameDelay = 0;
  91.  
  92.     VDMAOutCfg.VertSizeInput = v_width;
  93.     VDMAOutCfg.HoriSizeInput = h_width * bpp;
  94.     VDMAOutCfg.Stride = VDMAOutCfg.HoriSizeInput;
  95.  
  96.     Status = XAxiVdma_DmaConfig(&OutVdma, XAXIVDMA_READ, &VDMAOutCfg);
  97.     if (Status != XST_SUCCESS) {
  98.             xdbg_printf(XDBG_DEBUG_ERROR,
  99.                 "Read channel config failed %d\r\n", Status);
  100.  
  101.             return XST_FAILURE;
  102.     }
  103.  
  104.     VDMAOutCfg.FrameStoreStartAddr[0] = base_address;
  105.  
  106.     Status = XAxiVdma_DmaSetBufferAddr(&OutVdma, XAXIVDMA_READ, VDMAOutCfg.FrameStoreStartAddr);
  107.     if (Status != XST_SUCCESS) {
  108.             xdbg_printf(XDBG_DEBUG_ERROR,"Read channel set buffer address failed %d\r\n", Status);
  109.             return XST_FAILURE;
  110.     }
  111.  
  112.  
  113.     Status = vdma_out_start();
  114.     if (Status != XST_SUCCESS) {
  115.            xil_printf("error starting VDMA..!");
  116.            return Status;
  117.     }
  118.     return XST_SUCCESS;
  119. }
  120.  
  121.  
  122. int vdma_in_init(short DeviceID, int base_address, int h_width, int v_width, int bpp)
  123. {
  124.     XAxiVdma_Config *Config;
  125.     int Status;
  126.  
  127.     Config = XAxiVdma_LookupConfig(DeviceID);
  128.     if (NULL == Config) {
  129.         xil_printf("XAxiVdma_LookupConfig failure\r\n");
  130.         return XST_FAILURE;
  131.     }
  132.  
  133.     Status = XAxiVdma_CfgInitialize(&InVdma, Config, Config->BaseAddress);
  134.     if (Status != XST_SUCCESS) {
  135.         xil_printf("XAxiVdma_CfgInitialize failure\r\n");
  136.         return XST_FAILURE;
  137.     }
  138.  
  139.     VDMAInCfg.EnableCircularBuf = 1;
  140.     VDMAInCfg.EnableFrameCounter = 0;
  141.     VDMAInCfg.FixedFrameStoreAddr = 0;
  142.  
  143.     VDMAInCfg.EnableSync = 1;
  144.     VDMAInCfg.PointNum = 1;
  145.  
  146.     VDMAInCfg.FrameDelay = 0;
  147.  
  148.     VDMAInCfg.VertSizeInput = v_width;
  149.     VDMAInCfg.HoriSizeInput = h_width * bpp;
  150.     VDMAInCfg.Stride = VDMAInCfg.HoriSizeInput;
  151.  
  152.     Status = XAxiVdma_DmaConfig(&InVdma, XAXIVDMA_WRITE, &VDMAInCfg);
  153.     if (Status != XST_SUCCESS) {
  154.             xdbg_printf(XDBG_DEBUG_ERROR,
  155.                 "Read channel config failed %d\r\n", Status);
  156.  
  157.             return XST_FAILURE;
  158.     }
  159.  
  160.     VDMAInCfg.FrameStoreStartAddr[0] = base_address;
  161.  
  162.     Status = XAxiVdma_DmaSetBufferAddr(&InVdma, XAXIVDMA_WRITE, VDMAInCfg.FrameStoreStartAddr);
  163.     if (Status != XST_SUCCESS) {
  164.             xdbg_printf(XDBG_DEBUG_ERROR,"Write channel set buffer address failed %d\r\n", Status);
  165.             return XST_FAILURE;
  166.     }
  167.  
  168.  
  169.     Status = vdma_in_start();
  170.     if (Status != XST_SUCCESS) {
  171.            xil_printf("error starting VDMA..!");
  172.            return Status;
  173.     }
  174.  
  175.     return XST_SUCCESS;
  176.  
  177. }
  178.  
  179.  
  180.  
  181.  
  182.  
  183. int vdma_filter_start() {
  184.        int Status;
  185.  
  186.        // START WRITE CHANNEL
  187.        Status = XAxiVdma_DmaStart(&FilterVdma, XAXIVDMA_WRITE);
  188.        if (Status != XST_SUCCESS) {
  189.            xil_printf("Start read transfer failed %d\n\r", Status);
  190.            return XST_FAILURE;
  191.        }
  192.  
  193.        // START READ CHANNEL
  194.        Status = XAxiVdma_DmaStart(&FilterVdma, XAXIVDMA_READ);
  195.        if (Status != XST_SUCCESS) {
  196.            xil_printf("Start read transfer failed %d\n\r", Status);
  197.            return XST_FAILURE;
  198.        }
  199.  
  200.        return XST_SUCCESS;
  201. }
  202.  
  203.  
  204.  
  205.  
  206.  
  207. int vdma_filter_init(short DeviceID, int base_address_input, int base_address_output, int h_width, int v_width, int bppOutput32, int bppInput24)
  208. {
  209.     XAxiVdma_Config *Config;
  210.     int Status;
  211.  
  212.     Config = XAxiVdma_LookupConfig(DeviceID);
  213.     if (NULL == Config) {
  214.         xil_printf("XAxiVdma_LookupConfig failure\r\n");
  215.         return XST_FAILURE;
  216.     }
  217.  
  218.     Status = XAxiVdma_CfgInitialize(&FilterVdma, Config, Config->BaseAddress);
  219.     if (Status != XST_SUCCESS) {
  220.         xil_printf("XAxiVdma_CfgInitialize failure\r\n");
  221.         return XST_FAILURE;
  222.     }
  223.     //INIT WRITE CHANNEL
  224.     VDMAFilterInCfg.EnableCircularBuf = 1;
  225.     VDMAFilterInCfg.EnableFrameCounter = 0;
  226.     VDMAFilterInCfg.FixedFrameStoreAddr = 0;
  227.  
  228.     VDMAFilterInCfg.EnableSync = 1;
  229.     VDMAFilterInCfg.PointNum = 1; //oder 1, keine Ahnung
  230.  
  231.     VDMAFilterInCfg.FrameDelay = 0;
  232.  
  233.     VDMAFilterInCfg.VertSizeInput = v_width;
  234.     VDMAFilterInCfg.HoriSizeInput = h_width * bppInput24;
  235.     VDMAFilterInCfg.Stride = VDMAFilterInCfg.HoriSizeInput;
  236.  
  237.     Status = XAxiVdma_DmaConfig(&FilterVdma, XAXIVDMA_WRITE, &VDMAFilterInCfg);
  238.     if (Status != XST_SUCCESS) {
  239.             xdbg_printf(XDBG_DEBUG_ERROR,
  240.                 "Read channel config failed %d\r\n", Status);
  241.  
  242.             return XST_FAILURE;
  243.     }
  244.  
  245.     VDMAFilterInCfg.FrameStoreStartAddr[0] = base_address_output;
  246.  
  247.     Status = XAxiVdma_DmaSetBufferAddr(&FilterVdma, XAXIVDMA_WRITE, VDMAFilterInCfg.FrameStoreStartAddr);
  248.     if (Status != XST_SUCCESS) {
  249.         xdbg_printf(XDBG_DEBUG_ERROR,"Write channel set buffer address failed %d\r\n", Status);
  250.         return XST_FAILURE;
  251.     }
  252.     //END INIT WRITE
  253.  
  254.     //INIT READ CHANNEL
  255.  
  256.     VDMAFilterOutCfg.EnableCircularBuf = 1;
  257.     VDMAFilterOutCfg.EnableFrameCounter = 0;
  258.     VDMAFilterOutCfg.FixedFrameStoreAddr = 0;
  259.  
  260.     VDMAFilterOutCfg.EnableSync = 1;
  261.     VDMAFilterOutCfg.PointNum = 1; //oder 1, keine Ahnung
  262.  
  263.     VDMAFilterOutCfg.FrameDelay = 0;
  264.  
  265.     VDMAFilterOutCfg.VertSizeInput = v_width;
  266.     VDMAFilterOutCfg.HoriSizeInput = h_width * bppOutput32;
  267.     VDMAFilterOutCfg.Stride = VDMAFilterOutCfg.HoriSizeInput;
  268.  
  269.     Status = XAxiVdma_DmaConfig(&FilterVdma, XAXIVDMA_READ, &VDMAFilterOutCfg);
  270.     if (Status != XST_SUCCESS) {
  271.                 xdbg_printf(XDBG_DEBUG_ERROR,
  272.                     "Read channel config failed %d\r\n", Status);
  273.  
  274.                 return XST_FAILURE;
  275.     }
  276.     VDMAFilterOutCfg.FrameStoreStartAddr[0] = base_address_input;
  277.  
  278.     Status = XAxiVdma_DmaSetBufferAddr(&FilterVdma, XAXIVDMA_READ, VDMAFilterOutCfg.FrameStoreStartAddr);
  279.     if (Status != XST_SUCCESS) {
  280.         xdbg_printf(XDBG_DEBUG_ERROR,"Write channel set buffer address failed %d\r\n", Status);
  281.         return XST_FAILURE;
  282.     }
  283.     //END INIT READ
  284.  
  285.     Status = vdma_filter_start();
  286.     if (Status != XST_SUCCESS) {
  287.            xil_printf("error starting VDMA..!");
  288.            return Status;
  289.     }
  290.  
  291.     return XST_SUCCESS;
  292.  
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement