[openfirmware] [commit] r3568 - in cpu: arm/olpc x86/pc/olpc
repository service
svn at openfirmware.info
Fri Feb 22 07:11:28 CET 2013
Author: quozl
Date: Fri Feb 22 07:11:28 2013
New Revision: 3568
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3568
Log:
OLPC - add serial terminal, for built-in UART or for USB serial adapter
Added:
cpu/x86/pc/olpc/terminal.fth
Modified:
cpu/arm/olpc/build-fw.fth
Modified: cpu/arm/olpc/build-fw.fth
==============================================================================
--- cpu/arm/olpc/build-fw.fth Fri Feb 22 03:54:13 2013 (r3567)
+++ cpu/arm/olpc/build-fw.fth Fri Feb 22 07:11:28 2013 (r3568)
@@ -942,6 +942,7 @@
;
: enable-serial ;
+fload ${BP}/cpu/x86/pc/olpc/terminal.fth \ Serial terminal emulator
fload ${BP}/cpu/x86/pc/olpc/apt.fth \ Common developer utilities
\ LICENSE_BEGIN
Added: cpu/x86/pc/olpc/terminal.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/x86/pc/olpc/terminal.fth Fri Feb 22 07:11:28 2013 (r3568)
@@ -0,0 +1,353 @@
+purpose: Serial terminal emulator
+\ See license at end of file
+
+vocabulary serial-terminal
+also serial-terminal definitions
+
+d# 1 value break-ms
+
+d# 80 constant /buf
+/buf buffer: buf
+
+
+\ queue implementation (adapted from dev/16550pkg/16550.fth)
+
+\ size of queues, approx 10 seconds at 115200 baud
+d# 144000 constant /q
+
+struct
+ /n field >head
+ /n field >tail
+ /q field >qdata
+constant /qstruct
+
+/qstruct buffer: read-q \ for reading from serial
+/qstruct buffer: emit-q \ for showing to display
+
+: init-q ( q -- ) 0 over >head ! 0 swap >tail ! ;
+: inc-q-ptr ( pointer-addr -- )
+ dup @ ca1+ dup /q = if drop 0 then swap !
+;
+
+: enque ( new-entry q -- )
+ >r
+ r@ >tail @ r@ >head @ 2dup > if - /q then 1- ( entry tail head )
+ <> if r@ >qdata r@ >tail @ ca+ c! r@ >tail inc-q-ptr else drop then
+ r> drop
+;
+
+: deque? ( q -- false | entry true )
+ >r
+ r@ >head @ r@ >tail @ <> if
+ r@ >qdata r@ >head @ ca+ c@ r@ >head inc-q-ptr true
+ else
+ false
+ then
+ r> drop
+;
+
+\ end of queue implementation
+
+
+\ queued screen output
+
+: >q ( adr len )
+ bounds do i c@ emit-q enque loop
+;
+
+: q> ( -- )
+ emit-q deque? if emit then
+;
+
+\ end of queued screen output
+
+
+\ serial device independent interface
+
+defer serial-open ( -- )
+defer serial-close ( -- )
+defer serial-emit ( key -- )
+defer serial-read ( -- adr len )
+defer serial-break ( -- )
+
+\ end of serial device independent interface
+
+
+\ internal serial device implementation
+
+\ interrupt enable register UART_IER, table 1993, page 1547
+: ier@ ( -- b ) h# 1 uart@ ;
+: ier! ( b -- ) h# 1 uart! ;
+
+\ receiver data available interrupt enable
+: ravie-on ( -- ) ier@ h# 1 or ier! ;
+: ravie-off ( -- ) ier@ h# 1 invert and ier! ;
+
+\ line control register UART_LCR, table 1998, page 1554
+: ulcr@ ( -- b ) h# 3 uart@ ;
+: ulcr! ( b -- ) h# 3 uart! ;
+
+\ set break
+: sb-on ( -- ) ulcr@ h# 40 or ulcr! ;
+: sb-off ( -- ) ulcr@ h# 40 invert and ulcr! ;
+
+\ modem control register UART_MCR, table 1999, page 1555
+: mcr@ ( -- b ) h# 4 uart@ ;
+: mcr! ( b -- ) h# 4 uart! ;
+
+\ OUT2 signal control, enable UART interrupts
+: out2-on ( -- ) mcr@ h# 8 or mcr! ;
+: out2-off ( -- ) mcr@ h# 8 invert and mcr! ;
+
+: uart-break
+ begin uemit? until
+ sb-on
+ break-ms ms
+ sb-off
+;
+
+\ IRQ number of console UART varies by platform
+\ FIXME: find a better way to store or find these
+[ifdef] olpc-cl1
+ d# 4 value irq#
+[then]
+[ifdef] mmp2
+ d# 24 value irq#
+[then]
+[ifdef] mmp3
+ d# 28 value irq#
+[then]
+
+\ serial interrupt handler for received data
+: si ( -- ) ukey read-q enque ;
+
+\ enable serial interrupt
+: esi
+ ['] si irq# interrupt-handler!
+ irq# enable-interrupt
+ ravie-on
+ out2-on
+;
+
+\ disable serial interrupt
+: dsi
+ out2-off
+ ravie-off
+ irq# disable-interrupt
+;
+
+\ on XO-1.5, enable-serial disables the camera and adds the serial
+\ instance handles to the multiplexor. on other models it is absent.
+[ifndef] enable-serial \ present on XO-1.5
+: enable-serial ;
+[then]
+
+false value uart-console-off? \ did we turn our uart console off?
+
+\ stop using the uart as console
+\ (necessary to avoid noise from interconnected hosts)
+: uart-console-off
+ fallback-out-ih remove-output
+ fallback-in-ih remove-input
+ true to uart-console-off?
+;
+
+\ resume using the uart as console
+: uart-console-on
+ uart-console-off? if
+ fallback-out-ih add-output
+ fallback-in-ih add-input
+ false to uart-console-off?
+ then
+;
+
+: uart-open
+ enable-serial
+ uart-console-off
+ read-q init-q
+ esi
+;
+
+: uart-close
+ dsi
+;
+
+: uart-read ( -- adr len )
+ buf 0 ( adr len )
+ read-q deque? 0= if exit then ( adr len char )
+ begin ( adr len char )
+ >r 2dup + r> swap c! 1+ ( adr len' )
+ dup /buf = if exit then ( adr len' )
+ read-q deque? 0=
+ until ( adr len' )
+;
+
+: use-uart
+ uart-console-off
+ ['] uart-open to serial-open
+ ['] uart-close to serial-close
+ ['] uemit to serial-emit
+ ['] uart-read to serial-read
+ ['] uart-break to serial-break
+;
+
+\ end of internal serial device implementation
+
+
+\ USB serial device implementation
+
+0 value serial-ih
+
+: usb-open ( -- )
+ " /usb/serial" open-dev dup 0= abort" can't open USB serial adapter"
+ to serial-ih
+;
+
+: usb-close ( -- )
+ serial-ih close-dev
+ 0 to serial-ih
+;
+
+: usb-emit ( key -- )
+ buf c! buf 1 " write" serial-ih $call-method drop
+;
+
+: usb-read ( -- adr len )
+ buf /buf " read" serial-ih $call-method ( len )
+ dup -2 = if drop buf 0 exit then ( len )
+ buf swap ( adr len )
+;
+
+: usb-break
+ " ftdi-break-on" serial-ih $call-method
+ 1 ms
+ " ftdi-8n1" serial-ih $call-method
+;
+
+: use-usb
+ uart-console-on
+ ['] usb-open to serial-open
+ ['] usb-close to serial-close
+ ['] usb-emit to serial-emit
+ ['] usb-read to serial-read
+ ['] usb-break to serial-break
+;
+
+use-usb
+
+\ end of USB serial device implementation
+
+
+\ key bindings
+\ (match the screen(1) defaults)
+defer key-state ( key -- )
+defer key-state-default ( key -- )
+
+: reset-key-state ['] key-state-default >data token@ to key-state ;
+
+: key-state-exit ( key -- ) serial-emit ; \ is not called
+
+: key-state-exit? ( -- exit? )
+ ['] key-state >data token@ ['] key-state-exit =
+;
+
+: key-state-c-a ( key -- ) \ list of recognised c-a sequences
+ case
+ 1 ( c-a ) of 1 serial-emit reset-key-state endof
+ 2 ( c-b ) of serial-break reset-key-state endof
+ [char] b of serial-break reset-key-state endof
+ [char] C of page reset-key-state endof
+ 4 ( c-d ) of ['] key-state-exit to key-state endof
+ [char] k of ['] key-state-exit to key-state endof
+ [char] K of ['] key-state-exit to key-state endof
+ ( default ) reset-key-state
+ endcase
+;
+
+: key-state-run ( key -- )
+ dup 1 = if ['] key-state-c-a to key-state drop exit then \ c-a
+ serial-emit ( )
+;
+
+' key-state-run to key-state-default
+
+\ end of key bindings
+
+
+\ main program
+
+: serial-help-0 ( -- )
+ green-letters
+ ." serial terminal:" cr
+ ." use c-a k to exit," cr
+ ." use c-a c-b to send break," cr
+ ." use c-a c-a to send a c-a." cr
+ cancel cr
+;
+
+: serial-help-1 ( -- )
+ cr green-letters ." serial terminal: stopped." cancel cr
+;
+
+: outgoing ( -- ) \ data leaving this host
+ key? if key key-state then
+;
+
+: incoming ( -- ) \ data arriving at this host
+ serial-read dup if >q else 2drop q> then
+;
+
+: serial{
+ emit-q init-q serial-open reset-key-state serial-help-0
+;
+
+: {serial}
+ begin outgoing incoming key-state-exit? until
+;
+
+: }serial
+ serial-close serial-help-1
+;
+
+previous definitions also serial-terminal
+
+: serial serial{ {serial} }serial ;
+
+: serial-log ( "filename" -- )
+ serial{
+ safe-parse-word $create-file to log-ih
+ log-ih add-output
+ {serial}
+ log-ih remove-output
+ log-ih close-dev
+ }serial
+;
+
+: use-uart use-uart ;
+: use-usb use-usb ;
+
+previous
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2013 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
More information about the openfirmware
mailing list