2
0

Zynq.SdControllers.Mod 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. MODULE SdControllers;
  2. (**
  3. AUTHOR Timothée Martiel, 12/2015
  4. PURPOSE SD Host Controller Initialization for Zynq SoC.
  5. *)
  6. IMPORT
  7. Platform,
  8. Sd, SdDisks, SdEnvironment;
  9. CONST
  10. Trace = FALSE;
  11. VAR
  12. hc0, hc1: Sd.HostController;
  13. PROCEDURE HandleInterruptSd0;
  14. BEGIN
  15. Sd.HandleInterrupt(hc0);
  16. END HandleInterruptSd0;
  17. PROCEDURE HandleInterruptSd1;
  18. BEGIN
  19. Sd.HandleInterrupt(hc1)
  20. END HandleInterruptSd1;
  21. PROCEDURE Init;
  22. VAR
  23. i, result: LONGINT;
  24. BEGIN
  25. Platform.slcr.SDIO_CLK_CTRL := 0;
  26. FOR i := 0 TO Platform.SdNb - 1 DO
  27. IF SdEnvironment.Enable(i) THEN
  28. IF Trace THEN
  29. SdEnvironment.String("[SD] Enabling controller "); SdEnvironment.Int(i, 0); SdEnvironment.Ln;
  30. SdEnvironment.String("[SD] clock = "); SdEnvironment.Int(SdEnvironment.HcClock(i), 0); SdEnvironment.String(" Hz"); SdEnvironment.Ln;
  31. SdEnvironment.String("[SD] regs = "); SdEnvironment.Address(Platform.SdBase[0]); SdEnvironment.Ln;
  32. SdEnvironment.String("[SD] irq = "); SdEnvironment.Int(Platform.SdIrq[0], 0); SdEnvironment.Ln
  33. END;
  34. INC(Platform.slcr.SDIO_CLK_CTRL, LSH(LONGINT(1), i));
  35. CASE i OF
  36. 0:
  37. NEW(hc0);
  38. Sd.InitHostController(hc0, Platform.SdBase[0]);
  39. IF Sd.SetExternalClock(hc0, SdEnvironment.HcClock(i), SdEnvironment.HcClock(i), result) THEN
  40. Sd.SetEventHandler(hc0, SdDisks.HandleSdEvent, NIL);
  41. SdEnvironment.InstallHandler(HandleInterruptSd0, Platform.SdIrq[0])
  42. ELSE
  43. SdEnvironment.String("[SD] Failed to enable controller 0: error code ");
  44. SdEnvironment.Int(result, 0);
  45. SdEnvironment.Ln
  46. END
  47. |1:
  48. NEW(hc1);
  49. Sd.InitHostController(hc1, Platform.SdBase[1]);
  50. IF Sd.SetExternalClock(hc1, SdEnvironment.HcClock(i), SdEnvironment.HcClock(i), result) THEN
  51. Sd.SetEventHandler(hc1, SdDisks.HandleSdEvent, NIL);
  52. SdEnvironment.InstallHandler(HandleInterruptSd1, Platform.SdIrq[1])
  53. ELSE
  54. SdEnvironment.String("[SD] Failed to enable controller 0: error code ");
  55. SdEnvironment.Int(result, 0);
  56. SdEnvironment.Ln
  57. END
  58. END
  59. ELSE
  60. IF Trace THEN
  61. SdEnvironment.String("[SD] Not Enabling controller "); SdEnvironment.Int(i, 0); SdEnvironment.Ln
  62. END
  63. END
  64. END
  65. END Init;
  66. BEGIN
  67. Init
  68. END SdControllers.