Author: wmb
Date: 2009-08-05 22:43:13 +0200 (Wed, 05 Aug 2009)
New Revision: 1278
Modified:
dev/pckbd.fth
Log:
PC keyboard driver - improved retry logic for keyboard commands.
Modified: dev/pckbd.fth
===================================================================
--- dev/pckbd.fth 2009-08-05 20:39:38 UTC (rev 1277)
+++ dev/pckbd.fth 2009-08-05 20:43:13 UTC (rev 1278)
@@ -110,13 +110,48 @@
true
;
-: ?ack ( response -- )
- begin h# fa <> while \ Consume stuff …
[View More]while waiting for ack
- d# 10 timed-read if exit then
- repeat
+0 value kbd-debug?
+
+\ This is fairly complicated to handle several possibilities.
+\ In the usual case, where the response is ACK (fa), we return true on the top
+\ Another case is a RETRY (fe) response - then we return "false false" so the
+\ caller will continue to retry as long as we keep seeing RETRY.
+\ Bytes that are neither fa nor fe are silently discarded.
+\ If we timeout without seeing either fa or fe, we return "true false" so the
+\ caller will retry a limited number of times before giving up.
+
+: got-ack? ( -- true | timeout? false )
+ begin
+ \ No response - retry once
+ d# 10 timed-read if true false exit then ( data )
+ case
+ h# fa of true exit endof \ ACK - exit without retry
+ h# fe of false false exit endof \ RETRY - retry as long as we keep getting fe
+ \ discard other characters
+ endcase
+ again
;
-: cmd ( cmd -- ) put-get-data ?ack ;
+: cmd ( cmd -- )
+ 1 begin ( cmd #retries )
+ over " put-data" $call-parent ( cmd #retries )
+ got-ack? if 2drop exit then ( cmd #retries timeout? )
+
+ \ Decrease the retry count if got-ack? timed out
+ \ Otherwise got-ack? saw a RETRY response, in which case
+ \ we retry without decrementing the count
+ if 1- then ( cmd #retries )
+
+ dup 0< until ( cmd #retries )
+
+ drop ( cmd )
+ kbd-debug? if ( cmd )
+ ." Keyboard cmd " . ." failed" cr ( )
+ else ( cmd )
+ drop ( )
+ then ( )
+;
+
headers
\ Despite the manual's claim that this command can be executed at any time,
[View Less]