[openfirmware] r1514 - dev/usb2/device/userial
svn at openfirmware.info
svn at openfirmware.info
Wed Nov 25 23:25:53 CET 2009
Author: wmb
Date: 2009-11-25 23:25:53 +0100 (Wed, 25 Nov 2009)
New Revision: 1514
Added:
dev/usb2/device/userial/userial.fth
Log:
Added USB userial.fth driver.
Added: dev/usb2/device/userial/userial.fth
===================================================================
--- dev/usb2/device/userial/userial.fth (rev 0)
+++ dev/usb2/device/userial/userial.fth 2009-11-25 22:25:53 UTC (rev 1514)
@@ -0,0 +1,63 @@
+\ See license at end of file
+purpose: userial driver - see http://www.tty1.net/userial/
+
+0 instance value inbuf
+0 instance value outbuf
+0 instance value inbuf2
+
+: alloc-buffers ( -- )
+ h# 10 dma-alloc to inbuf
+ h# 10 alloc-mem to inbuf2
+ h# 10 dma-alloc to outbuf
+;
+: free-buffers ( -- )
+ inbuf h# 10 dma-free
+ inbuf2 h# 10 free-mem
+ outbuf h# 10 dma-free
+;
+
+: open ( -- flag )
+ device set-target
+ configuration set-config if
+ ." userial: set-config failed" cr
+ false exit
+ then
+ alloc-buffers
+ inbuf h# 10 bulk-in-pipe begin-bulk-in
+ true
+;
+: received? ( -- false | adr len true )
+ bulk-in? if drop restart-bulk-in false exit then ( actual )
+ \ Workaround for a deficiency, since fixed, in UHCI get-actual
+ dup h# 800 = if ( null-data-code )
+ drop restart-bulk-in ( )
+ inbuf2 0 true ( adr 0 true )
+ exit
+ then ( actual )
+ dup if ( actual )
+ >r ( r: actual )
+ inbuf inbuf2 r@ move ( r: actual )
+ restart-bulk-in ( r: actual )
+ inbuf2 r> true ( adr len true )
+ then ( false | adr len true )
+;
+: write ( adr len -- actual )
+ tuck begin dup while ( len adr rem )
+ 2dup h# 10 min tuck ( len adr rem this adr this )
+ outbuf swap move ( len adr rem this )
+ outbuf over ( len adr rem this outbuf this )
+ bulk-out-pipe bulk-out if ( len adr rem this )
+ drop nip ( len rem )
+ - ( actual )
+ exit
+ then ( len adr rem this )
+ /string ( len adr' rem' )
+ repeat ( len adr' rem' )
+ nip - ( actual )
+;
+: cmd ( adr len -- )
+ write drop " "n" write drop
+;
+: res ( -- )
+ begin received? while type repeat
+;
More information about the openfirmware
mailing list