[openfirmware] [commit] r3470 - dev/usb2/device/serial
repository service
svn at openfirmware.info
Wed Dec 5 04:44:53 CET 2012
Author: wmb
Date: Wed Dec 5 04:44:52 2012
New Revision: 3470
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3470
Log:
Start of a driver for FTDI serial chips. Needs fleshing out.
Added:
dev/usb2/device/serial/ftdi.fth
Added: dev/usb2/device/serial/ftdi.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/usb2/device/serial/ftdi.fth Wed Dec 5 04:44:52 2012 (r3470)
@@ -0,0 +1,72 @@
+purpose: Driver for FTDI USB serial chips
+
+8 buffer: ftdi-buf
+
+0 value ftdi-port \ 0 for single-interface devices and SIOA, 1 for SIOB, 2 for parallel port
+
+\ Helper function
+: ftdi-set ( value request -- )
+ >r >r 0 0 ftdi-port r> h# 40 r> control-set drop
+;
+
+\ Read internal registers
+: ftdi@ ( index -- w )
+ >r ftdi-buf 2 r> 0 h# c0 h# 90 control-get 2drop
+ ftdi-buf c@ ftdi-buf 1+ c@ bwjoin
+;
+
+\ Various resets
+: ftdi-reset ( -- ) 0 0 ftdi-set ;
+: ftdi-flush-rx ( -- ) 0 1 ftdi-set ;
+: ftdi-flush-tx ( -- ) 0 2 ftdi-set ;
+
+: ftdi-baud ( baud -- )
+ \ There are some high bits for fractional divisors that we don't use
+ d# 48000000 swap rounded-/ ( divisor )
+ 0 swap 3 ftdi-set
+;
+
+: ftdi-modem-ctl ( code -- ) 1 ftdi-set ;
+: ftdi-rts-on ( -- ) h# 202 ftdi-modem-ctl ;
+: ftdi-rts-off ( -- ) h# 200 ftdi-modem-ctl ;
+: ftdi-dtr-on ( -- ) h# 101 ftdi-modem-ctl ;
+: ftdi-dtr-off ( -- ) h# 100 ftdi-modem-ctl ;
+
+: ftdi-flow-ctl ( code -- ) 2 ftdi-set ;
+: ftdi-flow-none ( -- ) 0 ftdi-flow-ctl ;
+: ftdi-flow-rts-cts ( -- ) h# 100 ftdi-flow-ctl ;
+: ftdi-flow-dtr-dsr ( -- ) h# 200 ftdi-flow-ctl ;
+: ftdi-flow-xon-xoff ( -- ) h# 400 ftdi-flow-ctl ;
+
+\ h# 800 for 1.5 stop bits, h# 1000 for 2 stop bits
+\ h# 300 for mark parity, h# 400 for space parity
+: ftdi-data ( code -- ) 4 ftdi-set ;
+: ftdi-8n1 ( -- ) 8 ftdi-data ;
+\ : ftdi-8o1 ( -- ) h# 18 ftdi-data ;
+\ : ftdi-8e1 ( -- ) h# 28 ftdi-data ;
+\ : ftdi-7e1 ( -- ) h# 27 ftdi-data ;
+\ : ftdi-7o1 ( -- ) h# 17 ftdi-data ;
+
+: ftdi-break-on ( -- ) h# 4000 ftdi-data ;
+\ To send a break, I suppose that you do ftdi-break-on, delay awhile,
+\ then ftdi-8n1 or whatever your data format is.
+
+\ Commands that we're unlikely to need
+\ : ftdi-set-event-char ( char -- ) 6 ftdi-set ;
+\ : ftdi-set-error-char ( char -- ) 7 ftdi-set ;
+\ : ftdi-set-latency ( ms -- ) 9 ftdi-set ;
+
+\ CTS: 10 DSR: 20 RI: 40 CD: 80
+\ DR: 100 OR: 200 PE: 400 FE: 800 Break: 1000 THRE: 2000 TE: 4000 RXERR: 8000
+: ftdi-modem@ ( -- status )
+ ftdi-buf 2 ftdi-port 0 h# c0 5 control-get 2drop
+ ftdi-buf c@ ftdi-buf 1+ c@ bwjoin
+;
+
+\ Data is received on bulk endpoint 1
+\ Byte 0 is modem status (CTS - CD as above)
+\ Byte 1 is line status (DR - RXERR as above)
+\ If there is any real data, it will be returned in bytes 2, ...
+\ If there is no data, 2-byte status messages are sent every 40 ms.
+
+\ Data is transmitted on bulk endpoint 2, verbatim.
More information about the openfirmware
mailing list