Dynamic.BootConfig.Mod 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. MODULE (*Dyn*)BootConfig; (** AUTHOR "Timothée Martiel"; PURPOSE "Boot configuration from memory area"; *)
  2. IMPORT
  3. SYSTEM,
  4. Initializer(*,
  5. Commands*);
  6. CONST
  7. ConfigSize = 4096;
  8. CR = 0DX;
  9. LF = 0AX;
  10. VAR
  11. config: POINTER {UNSAFE,UNTRACED} TO ARRAY ConfigSize OF CHAR;
  12. size: LONGINT;
  13. PROCEDURE GetValue * (CONST key: ARRAY OF CHAR; VAR value: ARRAY OF CHAR);
  14. VAR
  15. i, len: LONGINT;
  16. BEGIN
  17. i := 0;
  18. len := 0;
  19. LOOP
  20. IF i = size THEN EXIT END;
  21. (* is that the key? *)
  22. IF MatchKey(config^, i, key) THEN
  23. REPEAT INC(i) UNTIL config[i] = '=';
  24. INC(i);
  25. WHILE (config[i + len] # CR) & (config[i + len] # LF) DO INC(len) END;
  26. ASSERT(len <= LEN(value), 7);
  27. SYSTEM.MOVE(ADDRESSOF(config[i]), ADDRESSOF(value[0]), len);
  28. EXIT
  29. ELSE
  30. REPEAT INC(i) UNTIL (i = size) OR (config[i] = LF);
  31. IF i = size THEN EXIT END;
  32. INC(i)
  33. END;
  34. END;
  35. value[len] := 0X;
  36. END GetValue;
  37. PROCEDURE GetIntValue * (CONST key: ARRAY OF CHAR): LONGINT;
  38. VAR
  39. str: ARRAY 128 OF CHAR;
  40. BEGIN
  41. GetValue(key, str);
  42. RETURN StrToInt(str)
  43. END GetIntValue;
  44. PROCEDURE GetBoolValue * (CONST key: ARRAY OF CHAR): BOOLEAN;
  45. VAR
  46. str: ARRAY 128 OF CHAR;
  47. BEGIN
  48. GetValue(key, str);
  49. RETURN StrToBool(str)
  50. END GetBoolValue;
  51. PROCEDURE Init *;
  52. BEGIN
  53. SYSTEM.MOVE(Initializer.configBase, 1FFFF000H, Initializer.configSize);
  54. Initializer.configBase := 1FFFF000H;
  55. config := Initializer.configBase;
  56. size := Initializer.configSize;
  57. IF size >= ConfigSize THEN size := ConfigSize-1; END;
  58. config[size] := CR;
  59. END Init;
  60. PROCEDURE StrToInt (CONST str: ARRAY OF CHAR): LONGINT;
  61. VAR
  62. i, value: LONGINT;
  63. BEGIN
  64. i := 0;
  65. value := 0;
  66. LOOP
  67. IF (i = LEN(str)) OR (str[i] = 0X) THEN RETURN value END;
  68. IF (str[i] > '9') OR (str[i] < '0') THEN RETURN 0 END;
  69. value := value * 10;
  70. INC(value, ORD(str[i]) - ORD('0'));
  71. INC(i)
  72. END
  73. END StrToInt;
  74. PROCEDURE StrToBool (CONST str: ARRAY OF CHAR): BOOLEAN;
  75. BEGIN
  76. IF str = '1' THEN RETURN TRUE END;
  77. RETURN FALSE
  78. END StrToBool;
  79. (** return TRUE if str1 from ofs1 until the first '=' (excluded) matches str2 *)
  80. PROCEDURE MatchKey (CONST str1: ARRAY OF CHAR; ofs1: LONGINT; CONST str2: ARRAY OF CHAR): BOOLEAN;
  81. VAR
  82. i: LONGINT;
  83. BEGIN
  84. i := 0;
  85. WHILE (str1[ofs1 + i] # '=') & (str2[i] # 0X) & (str1[ofs1 + i] = str2[i]) DO INC(i) END;
  86. RETURN (str1[ofs1 + i] = '=') & (str2[i] = 0X)
  87. END MatchKey;
  88. (* PROCEDURE Get * (context: Commands.Context);
  89. VAR
  90. key, val: ARRAY 128 OF CHAR;
  91. BEGIN
  92. IF ~context.arg.GetString(key) THEN RETURN END;
  93. context.out.String(key);
  94. context.out.String(": ");
  95. IF context.arg.GetString(val) THEN
  96. IF val = "int" THEN
  97. context.out.Int(GetIntValue(key), 0)
  98. ELSIF val = "bool" THEN
  99. IF GetBoolValue(key) THEN
  100. context.out.String("TRUE")
  101. ELSE
  102. context.out.String("FALSE")
  103. END
  104. ELSE
  105. GetValue(key, val);
  106. context.out.String("'");
  107. context.out.String(val);
  108. context.out.String("'");
  109. END
  110. ELSE
  111. GetValue(key, val);
  112. context.out.String("'");
  113. context.out.String(val);
  114. context.out.String("'");
  115. END;
  116. context.out.Ln
  117. END Get;
  118. PROCEDURE Print * (context: Commands.Context);
  119. VAR
  120. i: LONGINT;
  121. BEGIN
  122. FOR i := 0 TO size - 1 DO
  123. context.out.Char(config[i])
  124. END
  125. END Print;*)
  126. (*BEGIN
  127. cfg := "CpuClockHz=666666666
  128. UartInputClockHz=50000000
  129. KernelOutputUart=1
  130. PsRefClockHz=50000000
  131. KernelOutputUart=1
  132. CpuNb=2
  133. UsbPhyRstGpio0=46
  134. UsbPhyRstGpio1=-1
  135. UsbEnable0=1
  136. UsbEnable1=0
  137. UsbViewportInit=1
  138. SdClock0=50000000
  139. SdClock1=50000000
  140. SdEnable0=1
  141. SdEnable1=0
  142. CpuNb=2
  143. DDRSize=536870912
  144. ConfigSize=4096;
  145. HeapSize=469762048
  146. KernelLoadAdr=1048576
  147. StackSize=262144
  148. EnableCaching=1
  149. EnableKernelWatchdog=1
  150. EnableFreeLists=0
  151. EnableReturnBlocks=0
  152. TraceHeaps=0
  153. TraceModules=0
  154. TraceInterrupts=0
  155. ";
  156. config := ADDRESSOF(cfg[0]);
  157. size := Strings.Length(cfg)*)
  158. END (*Dyn*)BootConfig.