TestDMA.Mod 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. MODULE TestDMA;
  2. IMPORT Trace, Machine, Random, DMA;
  3. VAR
  4. g: Random.Generator;
  5. w: DMA.Writer;
  6. r: DMA.Reader;
  7. src, dst: POINTER TO ARRAY 2048 + 16 OF CHAR;
  8. len, size, burst, i, srcOfs, dstOfs: LONGINT;
  9. errors, ovf1, ovf2: BOOLEAN;
  10. PROCEDURE Align (address: ADDRESS; align: LONGINT): LONGINT;
  11. VAR
  12. BEGIN
  13. IF align = 8 THEN
  14. RETURN 8 - address MOD 8
  15. ELSE
  16. RETURN 8 - address MOD 8 + align
  17. END
  18. END Align;
  19. BEGIN
  20. size := 1024;
  21. burst := 64;
  22. NEW(g);
  23. NEW(src);
  24. NEW(dst);
  25. srcOfs := Align(ADDRESSOF(src[0]), 8);
  26. (*dstOfs := Align(ADDRESSOF(dst[0]), 8);*)
  27. (*FOR srcOfs := 0 TO 7 DO*)
  28. FOR dstOfs := 0 TO 7 DO
  29. Trace.String(":: Transfer: "); Trace.Address(ADDRESSOF(src[srcOfs]));
  30. Trace.String(" => "); Trace.Address(ADDRESSOF(dst[dstOfs])); Trace.Ln;
  31. Trace.String(" => src ofs: "); Trace.Int(srcOfs, 0); Trace.Ln;
  32. Trace.String(" => dst ofs: "); Trace.Int(dstOfs, 0); Trace.Ln;
  33. FOR i := 0 TO LEN(src) - 1 DO src[i] := CHR(g.Dice(100H)) END;
  34. FOR i := 0 TO LEN(dst) - 1 DO dst[i] := 0X END;
  35. Machine.FlushDCacheRange(ADDRESSOF(src[0]), LEN(src));
  36. Machine.FlushDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  37. (*DMA.OpenWriter(w, size, burst, ADDRESSOF(dst[dstOfs]), TRUE);
  38. w.Bytes(src^, srcOfs, size);*)
  39. DMA.OpenReader(r, size, burst, ADDRESSOF(src[srcOfs]), TRUE);
  40. r.Bytes(dst^, dstOfs, size, len);
  41. (*DMA.controller.channels[0].Await;*)
  42. Machine.InvalidateDCacheRange(ADDRESSOF(dst[0]), LEN(dst));
  43. errors := FALSE;
  44. FOR i := 0 TO size - 1 DO
  45. IF src[i + srcOfs] # dst[i + dstOfs] THEN
  46. IF ~errors THEN
  47. errors:= TRUE;
  48. Trace.StringLn(" -> FOUND TRANSFER ERROR:");
  49. END;
  50. Trace.String(" Difference: "); Trace.Int(i, 3); Trace.String(" "); Trace.Hex(ORD(src[i + srcOfs]), -2); Trace.String(" "); Trace.Hex(ORD(dst[i + dstOfs]), -2); Trace.Ln
  51. END
  52. END;
  53. ovf1 := FALSE;
  54. FOR i := 0 TO dstOfs - 1 DO
  55. IF dst[i] # 0X THEN
  56. IF ~ovf1 THEN
  57. ovf1 := TRUE;
  58. Trace.StringLn(" -> FOUND TRANSFER OVERFLOW:")
  59. END;
  60. Trace.String(" pos, val: "); Trace.Int(i, 3); Trace.String(" "); Trace.Hex(ORD(dst[i]), -2); Trace.Ln
  61. END
  62. END;
  63. ovf2 := FALSE;
  64. FOR i := dstOfs + size TO LEN(dst) - 1 DO
  65. IF dst[i] # 0X THEN
  66. IF ~ovf2 THEN
  67. ovf2 := TRUE;
  68. Trace.StringLn(" -> FOUND TRANSFER OVERFLOW:")
  69. END;
  70. Trace.String(" pos, val: "); Trace.Int(i, 3); Trace.String(" "); Trace.Hex(ORD(dst[i]), -2); Trace.Ln
  71. END
  72. END;
  73. IF ~(errors OR ovf1 OR ovf2) THEN
  74. Trace.StringLn(" -> NO ERROR FOUND")
  75. END;
  76. Trace.Ln
  77. END
  78. (*END*)
  79. END TestDMA.
  80. Compiler.Compile -b=ARM --traceModule=Trace --initLocals
  81. Timothee/ARM.A2/ARM.Streams.Mod
  82. Timothee/ARM.A2/ARM.Math.Mod
  83. Random.Mod
  84. Timothee/ARM.A2/DMA330.Mod
  85. Timothee/ARM.A2/Zynq.DMA.Mod
  86. Timothee/ARM.A2/TestDMA.Mod
  87. ~
  88. StaticLinker.Link --fileName=Test.Bin --displacement=100000H -a
  89. Initializer Runtime Platform FPE64 ARMRuntime Trace Uart Machine
  90. Heaps Modules Objects Kernel
  91. Streams
  92. Math Random
  93. DMA330 DMA
  94. TestDMA
  95. ~