123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- MODULE UartMin;
- (*
- DO NOT use DIV, MOD or Real in this module as the floting point emulation might not yet be installed!!!
- *)
- IMPORT SYSTEM, Platform, Board, Trace;
- CONST
- BaseUART0 = LONGINT( 0E0000000H );
- BaseUART1 = LONGINT( 0E0001000H );
- CONTROLREG0 = LONGINT( 00H );
- MODEREG0 = LONGINT( 04H );
- INTRPENREG0 = LONGINT( 08H );
- INTERDISREG0 = LONGINT( 0CH );
- INTERMASKREG0 = LONGINT( 10H ); (* read only *)
- CHNLINTSTSREG0 = LONGINT( 14H );
- BAUDRATEGENREG0 = LONGINT( 18H );
- RCVRTIMEOUTREG0 = LONGINT( 1CH );
- RCVRFIFOTRIGLEV0 = LONGINT( 20H );
- MODEMCTRLREG0 = LONGINT( 24H );
- MODEMSTATUSREG0 = LONGINT( 28H );
- CHANNELSTATUSREG0 = LONGINT( 2CH );
- TXRXFIFO0 = LONGINT( 30H );
- BAUDRATEDIVREG0 = LONGINT( 34H );
- FLOWDELAYREG0 = LONGINT( 38H );
- TXFIFOTRIGLEV0 = LONGINT( 44H );
- VAR
- base : LONGINT;
- lnk : PROCEDURE;
- PROCEDURE Flush*;
- VAR
- s: SET;
- BEGIN
- REPEAT
- SYSTEM.GET( CHANNELSTATUSREG0 + base, s );
- UNTIL 3 IN s;
- END Flush;
- PROCEDURE WriteChar (ch: CHAR);
- VAR
- i : LONGINT;
- BEGIN
- SYSTEM.PUT( TXRXFIFO0 + base, ch); Flush;
- END WriteChar;
- PROCEDURE OpenComPort*( baudrate, parity, databits (* fof *) : LONGINT; flowControl: BOOLEAN );
- VAR b, reg: LONGINT; s: SET;
- BEGIN
- (*
- SYSTEM.PUT8( UARTIER + Base, 0 ); (* disable UART *)
- FOR b := 0 TO 10000H DO END;
-
- SYSTEM.PUT8( UARTLCR + Base, 80H ); (* DLAB = 1 *)
- b := 921600 DIV baudrate;
- SYSTEM.PUT8( UARTDLL + Base, b MOD 100H );
-
- (* See PXA27x Errata Nr. 75: Uart baud rate may not be programmed correctly on back to back writes *)
- REPEAT SYSTEM.GET(UARTDLL + Base, reg) UNTIL (b MOD 100H) = (reg MOD 100H);
- SYSTEM.PUT8( UARTDLH + Base, b DIV 100H );
- IF (databits <= 8) & (databits >= 5) THEN
- parity := parity + databits - 5;
- ELSE
- INC( databits, 3H ) (* 8 Bit default *)
- END;
- SYSTEM.PUT8( UARTLCR + Base, (* 3H +*) parity ); (* DLAB = 0, 8 data/1 stop *)
- SYSTEM.PUT8( UARTMCR + Base, 0H ); (* disable UART interrupts *)
- SYSTEM.PUT8( UARTFCR + Base, 1H ); (* enable FIFO *)
- SYSTEM.PUT8( UARTIER + Base, 40H ); (* Enable UART, no interrupts *)
-
- FOR b := 0 TO 10000H DO END;
- *)
- END OpenComPort;
-
- PROCEDURE Init*;
- VAR
- i: LONGINT;
- reg, tempSet: SET;
- BEGIN
-
- IF Board.KernelOutputUart = 0 THEN
- base:=BaseUART0
- ELSE
- base:=BaseUART1
- END;
- Trace.Char := Ch;
- (*Trace.StringLn("Trace connected to UART min.");*)
- END Init;
- PROCEDURE Ln*;
- BEGIN
- WriteChar (0DX); WriteChar (0AX)
- END Ln;
-
- PROCEDURE Ch* (c: CHAR);
- BEGIN
- WriteChar (c);
- END Ch;
-
- PROCEDURE Str* (CONST text: ARRAY OF CHAR);
- VAR i: LONGINT;
- BEGIN
- i := 0; WHILE (i # LEN (text)) & (text[i] # 0X) DO WriteChar (text[i]); INC (i) END;
- END Str;
-
- PROCEDURE StrLn* (CONST text: ARRAY OF CHAR);
- BEGIN
- Str (text); Ln;
- END StrLn;
-
- PROCEDURE HexValue*( val: LONGINT);
- VAR
- i, j: LONGINT;
- digits: ARRAY 36 OF LONGINT;
- str: ARRAY 36 OF CHAR;
- BEGIN
- i := 0; j := 0;
- REPEAT
- (* digits[i] := val MOD 10H; INC( i ); val := val DIV 10H; UNTIL val = 0; *)
- digits[i] := val MOD 10H; INC( i ); val := LSH(val, -4); UNTIL val = 0;
- DEC( i );
- WHILE i >= 0 DO
- IF digits[i] > 9 THEN
- str[j] := CHR( digits[i] - 10 + ORD( 'A' ) );
- ELSE
- str[j] := CHR( digits[i] + ORD( '0' ) );
- END;
- INC( j ); DEC( i )
- END;
- str[j] := 0X;
- Str(str);
- END HexValue;
- PROCEDURE Hex* (val: LONGINT);
- BEGIN
- HexValue (val)
- END Hex;
- (* PROCEDURE Int* (val: LONGINT);
- BEGIN Value (val, 10)
- END Int;
- PROCEDURE Bits* (val: SET);
- BEGIN HexValue (SYSTEM.VAL (LONGINT, val), 2);
- END Bits;
- *)
- PROCEDURE Bool* (bol: BOOLEAN);
- BEGIN IF bol THEN Str ("TRUE") ELSE Str ("FALSE") END
- END Bool;
-
- PROCEDURE Mem* (adr, size: LONGINT);
- VAR b: CHAR; byte, val, i: LONGINT;
- BEGIN
- WHILE size # 0 DO
- Hex (adr); Ch (20X);
- IF size > 8 THEN i := 8 ELSE i := size END;
- REPEAT
- SYSTEM.GET (adr, b);
- HexValue(ORD(b) DIV 10H);
- HexValue (ORD (b) MOD 10H);
- Ch (20X); INC (adr); DEC (i); DEC (size);
- UNTIL i = 0;
- Ln;
- END;
- END Mem;
- PROCEDURE Set* (val: SET);
- VAR i: LONGINT; comma: BOOLEAN;
- BEGIN
- Ch ('{'); i := 0; comma := FALSE;
- WHILE i # 32 DO
- IF i IN val THEN
- IF comma THEN Str (", ") ELSE comma := TRUE END;
- IF i >= 10H THEN HexValue(i DIV 10H) END;
- HexValue (i MOD 10H);
- END;
- INC (i)
- END;
- Ch ('}');
- END Set;
- PROCEDURE PrintComPortSettings;
- VAR
- s: SET;
- BEGIN
- (*
- SYSTEM.GET( GPDR0, s);
- Str("GPDR0: "); Set(s); Ln;
- SYSTEM.GET( GPDR1, s);
- Str("GPDR1: "); Set(s); Ln;
- SYSTEM.GET( GPDR2, s);
- Str("GPDR2: "); Set(s); Ln;
- SYSTEM.GET( GPDR3, s);
- Str("GPDR2: "); Set(s); Ln;
-
- SYSTEM.GET( UARTIER + Base, s );
- Str("UARTIER: "); Set(s); Ln;
- SYSTEM.GET( UARTLCR + Base, s );
- Str("UARTLCR: "); Set(s); Ln;
- SYSTEM.GET( UARTMCR + Base, s );
- Str("UARTMCR: "); Set(s); Ln;
- SYSTEM.GET( UARTFCR + Base, s );
- Str("UARTFCR: "); Set(s); Ln;
- *)
- END PrintComPortSettings;
-
- PROCEDURE IsAvailable*() : BOOLEAN;
- VAR tmp : LONGINT;
- ret : BOOLEAN;
- BEGIN
- ret := FALSE;
- (* SYSTEM.GET( UARTLSR+Base, tmp ); *)
- RETURN ODD(tmp)
- (*
- IF Bit.AND( tmp, 1 ) = 1 THEN
- ret := TRUE;
- END;
- RETURN ret
- *)
- END IsAvailable;
-
- PROCEDURE GetChar*() : LONGINT;
- VAR tmp : LONGINT;
- BEGIN
- SYSTEM.GET( TXRXFIFO0+base, tmp );
- RETURN tmp
- END GetChar;
- PROCEDURE Done*;
- BEGIN StrLn ("DONE"); REPEAT UNTIL FALSE
- END Done;
- BEGIN
- END UartMin.
|