Zynq.UartMin.Mos 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. MODULE UartMin;
  2. (*
  3. DO NOT use DIV, MOD or Real in this module as the floting point emulation might not yet be installed!!!
  4. *)
  5. IMPORT SYSTEM, Platform, Board, Trace;
  6. CONST
  7. BaseUART0 = LONGINT( 0E0000000H );
  8. BaseUART1 = LONGINT( 0E0001000H );
  9. CONTROLREG0 = LONGINT( 00H );
  10. MODEREG0 = LONGINT( 04H );
  11. INTRPENREG0 = LONGINT( 08H );
  12. INTERDISREG0 = LONGINT( 0CH );
  13. INTERMASKREG0 = LONGINT( 10H ); (* read only *)
  14. CHNLINTSTSREG0 = LONGINT( 14H );
  15. BAUDRATEGENREG0 = LONGINT( 18H );
  16. RCVRTIMEOUTREG0 = LONGINT( 1CH );
  17. RCVRFIFOTRIGLEV0 = LONGINT( 20H );
  18. MODEMCTRLREG0 = LONGINT( 24H );
  19. MODEMSTATUSREG0 = LONGINT( 28H );
  20. CHANNELSTATUSREG0 = LONGINT( 2CH );
  21. TXRXFIFO0 = LONGINT( 30H );
  22. BAUDRATEDIVREG0 = LONGINT( 34H );
  23. FLOWDELAYREG0 = LONGINT( 38H );
  24. TXFIFOTRIGLEV0 = LONGINT( 44H );
  25. VAR
  26. base : LONGINT;
  27. lnk : PROCEDURE;
  28. PROCEDURE Flush*;
  29. VAR
  30. s: SET;
  31. BEGIN
  32. REPEAT
  33. SYSTEM.GET( CHANNELSTATUSREG0 + base, s );
  34. UNTIL 3 IN s;
  35. END Flush;
  36. PROCEDURE WriteChar (ch: CHAR);
  37. VAR
  38. i : LONGINT;
  39. BEGIN
  40. SYSTEM.PUT( TXRXFIFO0 + base, ch); Flush;
  41. END WriteChar;
  42. PROCEDURE OpenComPort*( baudrate, parity, databits (* fof *) : LONGINT; flowControl: BOOLEAN );
  43. VAR b, reg: LONGINT; s: SET;
  44. BEGIN
  45. (*
  46. SYSTEM.PUT8( UARTIER + Base, 0 ); (* disable UART *)
  47. FOR b := 0 TO 10000H DO END;
  48. SYSTEM.PUT8( UARTLCR + Base, 80H ); (* DLAB = 1 *)
  49. b := 921600 DIV baudrate;
  50. SYSTEM.PUT8( UARTDLL + Base, b MOD 100H );
  51. (* See PXA27x Errata Nr. 75: Uart baud rate may not be programmed correctly on back to back writes *)
  52. REPEAT SYSTEM.GET(UARTDLL + Base, reg) UNTIL (b MOD 100H) = (reg MOD 100H);
  53. SYSTEM.PUT8( UARTDLH + Base, b DIV 100H );
  54. IF (databits <= 8) & (databits >= 5) THEN
  55. parity := parity + databits - 5;
  56. ELSE
  57. INC( databits, 3H ) (* 8 Bit default *)
  58. END;
  59. SYSTEM.PUT8( UARTLCR + Base, (* 3H +*) parity ); (* DLAB = 0, 8 data/1 stop *)
  60. SYSTEM.PUT8( UARTMCR + Base, 0H ); (* disable UART interrupts *)
  61. SYSTEM.PUT8( UARTFCR + Base, 1H ); (* enable FIFO *)
  62. SYSTEM.PUT8( UARTIER + Base, 40H ); (* Enable UART, no interrupts *)
  63. FOR b := 0 TO 10000H DO END;
  64. *)
  65. END OpenComPort;
  66. PROCEDURE Init*;
  67. VAR
  68. i: LONGINT;
  69. reg, tempSet: SET;
  70. BEGIN
  71. IF Board.KernelOutputUart = 0 THEN
  72. base:=BaseUART0
  73. ELSE
  74. base:=BaseUART1
  75. END;
  76. Trace.Char := Ch;
  77. (*Trace.StringLn("Trace connected to UART min.");*)
  78. END Init;
  79. PROCEDURE Ln*;
  80. BEGIN
  81. WriteChar (0DX); WriteChar (0AX)
  82. END Ln;
  83. PROCEDURE Ch* (c: CHAR);
  84. BEGIN
  85. WriteChar (c);
  86. END Ch;
  87. PROCEDURE Str* (CONST text: ARRAY OF CHAR);
  88. VAR i: LONGINT;
  89. BEGIN
  90. i := 0; WHILE (i # LEN (text)) & (text[i] # 0X) DO WriteChar (text[i]); INC (i) END;
  91. END Str;
  92. PROCEDURE StrLn* (CONST text: ARRAY OF CHAR);
  93. BEGIN
  94. Str (text); Ln;
  95. END StrLn;
  96. PROCEDURE HexValue*( val: LONGINT);
  97. VAR
  98. i, j: LONGINT;
  99. digits: ARRAY 36 OF LONGINT;
  100. str: ARRAY 36 OF CHAR;
  101. BEGIN
  102. i := 0; j := 0;
  103. REPEAT
  104. (* digits[i] := val MOD 10H; INC( i ); val := val DIV 10H; UNTIL val = 0; *)
  105. digits[i] := val MOD 10H; INC( i ); val := LSH(val, -4); UNTIL val = 0;
  106. DEC( i );
  107. WHILE i >= 0 DO
  108. IF digits[i] > 9 THEN
  109. str[j] := CHR( digits[i] - 10 + ORD( 'A' ) );
  110. ELSE
  111. str[j] := CHR( digits[i] + ORD( '0' ) );
  112. END;
  113. INC( j ); DEC( i )
  114. END;
  115. str[j] := 0X;
  116. Str(str);
  117. END HexValue;
  118. PROCEDURE Hex* (val: LONGINT);
  119. BEGIN
  120. HexValue (val)
  121. END Hex;
  122. (* PROCEDURE Int* (val: LONGINT);
  123. BEGIN Value (val, 10)
  124. END Int;
  125. PROCEDURE Bits* (val: SET);
  126. BEGIN HexValue (SYSTEM.VAL (LONGINT, val), 2);
  127. END Bits;
  128. *)
  129. PROCEDURE Bool* (bol: BOOLEAN);
  130. BEGIN IF bol THEN Str ("TRUE") ELSE Str ("FALSE") END
  131. END Bool;
  132. PROCEDURE Mem* (adr, size: LONGINT);
  133. VAR b: CHAR; byte, val, i: LONGINT;
  134. BEGIN
  135. WHILE size # 0 DO
  136. Hex (adr); Ch (20X);
  137. IF size > 8 THEN i := 8 ELSE i := size END;
  138. REPEAT
  139. SYSTEM.GET (adr, b);
  140. HexValue(ORD(b) DIV 10H);
  141. HexValue (ORD (b) MOD 10H);
  142. Ch (20X); INC (adr); DEC (i); DEC (size);
  143. UNTIL i = 0;
  144. Ln;
  145. END;
  146. END Mem;
  147. PROCEDURE Set* (val: SET);
  148. VAR i: LONGINT; comma: BOOLEAN;
  149. BEGIN
  150. Ch ('{'); i := 0; comma := FALSE;
  151. WHILE i # 32 DO
  152. IF i IN val THEN
  153. IF comma THEN Str (", ") ELSE comma := TRUE END;
  154. IF i >= 10H THEN HexValue(i DIV 10H) END;
  155. HexValue (i MOD 10H);
  156. END;
  157. INC (i)
  158. END;
  159. Ch ('}');
  160. END Set;
  161. PROCEDURE PrintComPortSettings;
  162. VAR
  163. s: SET;
  164. BEGIN
  165. (*
  166. SYSTEM.GET( GPDR0, s);
  167. Str("GPDR0: "); Set(s); Ln;
  168. SYSTEM.GET( GPDR1, s);
  169. Str("GPDR1: "); Set(s); Ln;
  170. SYSTEM.GET( GPDR2, s);
  171. Str("GPDR2: "); Set(s); Ln;
  172. SYSTEM.GET( GPDR3, s);
  173. Str("GPDR2: "); Set(s); Ln;
  174. SYSTEM.GET( UARTIER + Base, s );
  175. Str("UARTIER: "); Set(s); Ln;
  176. SYSTEM.GET( UARTLCR + Base, s );
  177. Str("UARTLCR: "); Set(s); Ln;
  178. SYSTEM.GET( UARTMCR + Base, s );
  179. Str("UARTMCR: "); Set(s); Ln;
  180. SYSTEM.GET( UARTFCR + Base, s );
  181. Str("UARTFCR: "); Set(s); Ln;
  182. *)
  183. END PrintComPortSettings;
  184. PROCEDURE IsAvailable*() : BOOLEAN;
  185. VAR tmp : LONGINT;
  186. ret : BOOLEAN;
  187. BEGIN
  188. ret := FALSE;
  189. (* SYSTEM.GET( UARTLSR+Base, tmp ); *)
  190. RETURN ODD(tmp)
  191. (*
  192. IF Bit.AND( tmp, 1 ) = 1 THEN
  193. ret := TRUE;
  194. END;
  195. RETURN ret
  196. *)
  197. END IsAvailable;
  198. PROCEDURE GetChar*() : LONGINT;
  199. VAR tmp : LONGINT;
  200. BEGIN
  201. SYSTEM.GET( TXRXFIFO0+base, tmp );
  202. RETURN tmp
  203. END GetChar;
  204. PROCEDURE Done*;
  205. BEGIN StrLn ("DONE"); REPEAT UNTIL FALSE
  206. END Done;
  207. BEGIN
  208. END UartMin.