AcAxiDma.Mod 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. (**
  2. AUTHOR: Alexey Morozov, HighDim GmbH, 2013-2018
  3. PURPOSE: ActiveCells AXI DMA component driver
  4. *)
  5. module AcAxiDma;
  6. import
  7. system, AcAxisIo;
  8. const
  9. CmdSetAddr = 1*2;
  10. CmdSetCount = 2*2;
  11. CmdSetBurstLen = 3*2;
  12. CmdSetWrapFlag = 4*2;
  13. CmdGetAddr = 5*2;
  14. CmdGetCount = 6*2;
  15. CmdGetPendingFlag = 7*2;
  16. type
  17. Address = longint;
  18. Controller* = record
  19. cfgCmd-: AcAxisIo.Output;
  20. cfgData-: AcAxisIo.Output;
  21. status-: AcAxisIo.Input;
  22. dataSize-: longint; (** size of one data element in bytes *)
  23. addr-: Address;
  24. count-: Address;
  25. maxBurstLen-: longint;
  26. burstLen-: longint;
  27. wrap-: boolean;
  28. transferPending: boolean;
  29. end;
  30. ReadController* = record(Controller)
  31. end;
  32. WriteController* = record(Controller)
  33. end;
  34. procedure InitController*(var ctl: Controller; cfgCmd, cfgData: AcAxisIo.Output; status: AcAxisIo.Input; dataSize, maxBurstLen: longint);
  35. begin
  36. ctl.cfgCmd := cfgCmd;
  37. ctl.cfgData := cfgData;
  38. ctl.status := status;
  39. ctl.dataSize := dataSize;
  40. ctl.maxBurstLen := maxBurstLen;
  41. Stop(ctl);
  42. SetCount(ctl,0);
  43. SetBurstLen(ctl,maxBurstLen);
  44. SetWrap(ctl,false);
  45. end InitController;
  46. procedure SetAddr*(var ctl: Controller; addr: Address);
  47. begin
  48. ctl.cfgCmd << CmdSetAddr;
  49. ctl.cfgData << addr;
  50. ctl.addr := addr;
  51. end SetAddr;
  52. procedure SetCount*(var ctl: Controller; count: Address);
  53. begin
  54. ctl.cfgCmd << CmdSetCount;
  55. ctl.cfgData << count;
  56. ctl.count := count;
  57. end SetCount;
  58. procedure SetBurstLen*(var ctl: Controller; burstLen: longint);
  59. var d: longint;
  60. begin
  61. d := (burstLen-1) + lsh(burstLen*ctl.dataSize,4);
  62. ctl.cfgCmd << CmdSetBurstLen;
  63. ctl.cfgData << d;
  64. ctl.burstLen := burstLen;
  65. end SetBurstLen;
  66. procedure SetWrap*(var ctl: Controller; wrap: boolean);
  67. begin
  68. ctl.cfgCmd << CmdSetWrapFlag;
  69. if wrap then ctl.cfgData << 1; else ctl.cfgData << 0; end;
  70. ctl.wrap := wrap;
  71. end SetWrap;
  72. procedure Start*(var ctl: Controller);
  73. begin
  74. ctl.cfgCmd << 1;
  75. ctl.cfgData << 0;
  76. ctl.transferPending := true;
  77. end Start;
  78. procedure Stop*(var ctl: Controller);
  79. begin
  80. ctl.cfgCmd << 0;
  81. ctl.cfgData << 0;
  82. ctl.transferPending := false;
  83. end Stop;
  84. procedure GetCurrentAddr*(var ctl: Controller): Address;
  85. var addr: Address;
  86. begin
  87. ctl.cfgCmd << CmdGetAddr;
  88. ctl.cfgData << 0;
  89. addr << ctl.status;
  90. return addr;
  91. end GetCurrentAddr;
  92. procedure GetCurrentCount*(var ctl: Controller): Address;
  93. var count: Address;
  94. begin
  95. ctl.cfgCmd << CmdGetCount;
  96. ctl.cfgData << 0;
  97. count << ctl.status;
  98. return count;
  99. end GetCurrentCount;
  100. procedure TransferPending*(var ctl: Controller): boolean;
  101. var d: longint;
  102. begin
  103. if ctl.transferPending then
  104. ctl.cfgCmd << CmdGetPendingFlag;
  105. ctl.cfgData << 0;
  106. d << ctl.status;
  107. ctl.transferPending := d mod 2 = 1;
  108. end;
  109. return ctl.transferPending;
  110. end TransferPending;
  111. end AcAxiDma.