Zynq.SdEnvironment.Mod 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. MODULE SdEnvironment;
  2. (**
  3. AUTHOR Timothée Martiel, 2015
  4. PURPOSE Runtime Environment abstraction for SD Host Controller driver, A2 version
  5. *)
  6. IMPORT
  7. Machine, Objects, KernelLog, Strings, Locks, PsConfig, BootConfig;
  8. TYPE
  9. Time* = HUGEINT; (* Time type *)
  10. VAR
  11. InstallHandler *: PROCEDURE (handler: Objects.EventHandler; irq: LONGINT);
  12. Char *: PROCEDURE (c: CHAR);
  13. String *: PROCEDURE (CONST str: ARRAY OF CHAR);
  14. Int *: PROCEDURE (i: HUGEINT; w: LONGINT);
  15. Hex *: PROCEDURE (i: HUGEINT; w: LONGINT);
  16. Address *: PROCEDURE (a: ADDRESS);
  17. Set *: PROCEDURE (s: SET);
  18. Boolean *: PROCEDURE (b: BOOLEAN);
  19. Ln *: PROCEDURE;
  20. FlushDCacheRange *,
  21. InvalidateDCacheRange *: PROCEDURE (adr: ADDRESS; len: SIZE);
  22. GetTimeCounter-: PROCEDURE(): Time;
  23. cpuClockHz: LONGINT;
  24. PROCEDURE Enable * (sd: LONGINT): BOOLEAN;
  25. VAR
  26. key, value: ARRAY 32 OF CHAR;
  27. BEGIN
  28. key := "SdEnable";
  29. Strings.IntToStr(sd, value);
  30. Strings.Append(key, value);
  31. Machine.GetConfig(key, value);
  32. RETURN value = "1"
  33. END Enable;
  34. PROCEDURE HcClock * (sd: LONGINT): LONGINT;
  35. VAR
  36. clock, res: LONGINT;
  37. BEGIN
  38. clock := LONGINT(PsConfig.GetIoClockFrequency(PsConfig.IoSdio, res));
  39. ASSERT(res = 0);
  40. RETURN clock
  41. END HcClock;
  42. PROCEDURE GetLock * (VAR acq, rel: PROCEDURE {DELEGATE});
  43. VAR
  44. lock: Locks.Lock;
  45. BEGIN
  46. NEW(lock);
  47. acq := lock.Acquire;
  48. rel := lock.Release
  49. END GetLock;
  50. (** Convert microseconds to time counts *)
  51. PROCEDURE FromMicro*(us: Time): Time;
  52. BEGIN
  53. RETURN us * ENTIERH(0.5D0+LONGREAL(cpuClockHz)/2.0D6);
  54. END FromMicro;
  55. (** Convert time counts to microseconds *)
  56. PROCEDURE ToMicro*(time: Time): Time;
  57. BEGIN
  58. RETURN ENTIERH((0.5D0 + time) / (LONGREAL(cpuClockHz)) * 2.0D6)
  59. END ToMicro;
  60. (** Convert milliseconds to time counts *)
  61. PROCEDURE FromMilli*(ms: Time): Time;
  62. BEGIN
  63. RETURN ms * ENTIERH(0.5D0 + LONGREAL(cpuClockHz)/2.0D3);
  64. END FromMilli;
  65. (** Convert time counts to milliseconds *)
  66. PROCEDURE ToMilli*(time: Time): Time;
  67. BEGIN
  68. RETURN ENTIERH((0.5D0 + time) / (LONGREAL(cpuClockHz)) * 2.0D3)
  69. END ToMilli;
  70. PROCEDURE WaitMilli*(ms: Time);
  71. VAR t: Time;
  72. BEGIN
  73. t := GetTimeCounter() + FromMilli(ms);
  74. WHILE GetTimeCounter() <= t DO END;
  75. END WaitMilli;
  76. PROCEDURE WaitMicro*(us: Time);
  77. VAR t: Time;
  78. BEGIN
  79. t := GetTimeCounter() + FromMicro(us);
  80. WHILE GetTimeCounter() <= t DO END;
  81. END WaitMicro;
  82. BEGIN
  83. InstallHandler := Objects.InstallHandler;
  84. Char := KernelLog.Char;
  85. String := KernelLog.String;
  86. Int := KernelLog.Int;
  87. Hex := KernelLog.Hex;
  88. Address := KernelLog.Address;
  89. Set := KernelLog.Set;
  90. Boolean := KernelLog.Boolean;
  91. Ln := KernelLog.Ln;
  92. FlushDCacheRange := Machine.FlushDCacheRange;
  93. InvalidateDCacheRange := Machine.InvalidateDCacheRange;
  94. cpuClockHz := BootConfig.GetIntValue("CpuClockHz");
  95. GetTimeCounter := Machine.GetTimer;
  96. END SdEnvironment.2