[openfirmware] r1656 - cpu/x86/build cpu/x86/pc/olpc/via dev/usb2/device/keyboard dev/usb2/hcd dev/usb2/hcd/uhci ofw/fcode

svn at openfirmware.info svn at openfirmware.info
Sat Jan 9 09:12:32 CET 2010


Author: wmb
Date: 2010-01-09 09:12:32 +0100 (Sat, 09 Jan 2010)
New Revision: 1656

Modified:
   cpu/x86/build/builder.dic
   cpu/x86/pc/olpc/via/suspend.fth
   cpu/x86/pc/olpc/via/usb.fth
   dev/usb2/device/keyboard/kbd.fth
   dev/usb2/hcd/dev-info.fth
   dev/usb2/hcd/device.fth
   dev/usb2/hcd/uhci/probe.fth
   ofw/fcode/sysprims.fth
Log:
OLPC trac 9969 - more USB suspend/resume progress.  USB 1.1 keyboards now
work across suspend/resume, both directly-connected ones and ones behind hubs.
The only missing piece is making it work with OHCI, which will have to wait.


Modified: cpu/x86/build/builder.dic
===================================================================
(Binary files differ)

Modified: cpu/x86/pc/olpc/via/suspend.fth
===================================================================
--- cpu/x86/pc/olpc/via/suspend.fth	2010-01-09 00:35:42 UTC (rev 1655)
+++ cpu/x86/pc/olpc/via/suspend.fth	2010-01-09 08:12:32 UTC (rev 1656)
@@ -45,13 +45,17 @@
       s3
    again
 ;
-: s3-suspend
+: s3-no-usb  ( -- )
    audio-ih  if  audio-ih close-dev  0 to audio-ih  then
    " video-save" screen-ih $call-method  \ Freeze display
    s3
    " video-restore" screen-ih $call-method  \ Unfreeze display
-\   " /usb at f,5" open-dev  ?dup  if  " do-resume" 2 pick $call-method  close-dev  then
 ;
+: s3-suspend
+   suspend-usb
+   s3-no-usb
+   resume-usb
+;
 alias s s3-suspend
 
 \ LICENSE_BEGIN

Modified: cpu/x86/pc/olpc/via/usb.fth
===================================================================
--- cpu/x86/pc/olpc/via/usb.fth	2010-01-09 00:35:42 UTC (rev 1655)
+++ cpu/x86/pc/olpc/via/usb.fth	2010-01-09 08:12:32 UTC (rev 1656)
@@ -61,19 +61,42 @@
 ;
 alias p2 probe-usb
 
-: ?usb-keyboard  ( -- )
+0 value usb-keyboard-ih
+
+: attach-usb-keyboard  ( -- )
    " usb-keyboard" expand-alias  if   ( devspec$ )
       drop " /usb"  comp  0=  if      ( )
-         " usb-keyboard" open-dev add-input
+         " usb-keyboard" open-dev to usb-keyboard-ih
+         usb-keyboard-ih add-input
          exit
       then
    else                               ( devspec$ )
       2drop
    then
+;
+
+: detach-usb-keyboard  ( -- )
+   usb-keyboard-ih  if
+      usb-keyboard-ih remove-input
+      usb-keyboard-ih close-dev
+      0 to usb-keyboard-ih
+   then
+;
+
+: ?usb-keyboard  ( -- )
+   attach-usb-keyboard
    " /usb/serial" open-dev  ?dup  if
       add-input
    then
 ;
+: suspend-usb  ( -- )
+   detach-usb-keyboard
+;
+: resume-usb  ( -- )
+   d# 300 ms  \ USB misses devices if you probe too soon
+   silent-probe-usb
+   attach-usb-keyboard
+;
 
 \ Unlink every node whose phys.hi component matches port
 : port-match?  ( port -- flag )

Modified: dev/usb2/device/keyboard/kbd.fth
===================================================================
--- dev/usb2/device/keyboard/kbd.fth	2010-01-09 00:35:42 UTC (rev 1655)
+++ dev/usb2/device/keyboard/kbd.fth	2010-01-09 08:12:32 UTC (rev 1656)
@@ -325,6 +325,18 @@
    true
 ;
 
+\ kbd-buf and led-buf must have been allocated
+: setup-hardware  ( -- )
+   device set-target
+   configuration set-config  if  ." Failed to set USB keyboard configuration" cr  then
+   set-boot-protocol         if  ." Failed to set USB keyboard boot protocol" cr  then
+   \ Some USB keyboards don't implement set-idle properly, and it's not critical,
+   \ so we suppress the message to avoid confusing the user
+   idle-rate set-idle   drop  \  if  ." Failed to set USB keyboard idle" cr  then
+   0 set-leds
+;
+
+
 external
 
 : install-abort  ( -- )  true to check-abort?   ;   \ Check for break
@@ -346,10 +358,11 @@
    dup  0=  if  drop -2  then                 ( #read | -2 )
 ;
 
+
 : open  ( -- flag )
    kbd-refcount @  if  1 +refcnt true exit  then
-   device set-target
    init-kbd-buf
+   setup-hardware
    noop					\ Add noop so I can patch it before open
    normal-op?  if
       unlock
@@ -375,17 +388,8 @@
 
 : init  ( -- )
    init
-   init-kbd-buf
    null-entry /qe erase
    key-state /key-state erase
-   device set-target
-   configuration set-config  if  ." Failed to set USB keyboard configuration" cr  then
-   set-boot-protocol         if  ." Failed to set USB keyboard boot protocol" cr  then
-   \ Some USB keyboards don't implement set-idle properly, and it's not critical,
-   \ so we suppress the message to avoid confusing the user
-   idle-rate set-idle   drop  \  if  ." Failed to set USB keyboard idle" cr  then
-   0 set-leds
-   free-kbd-buf
 ;
 
 headers

Modified: dev/usb2/hcd/dev-info.fth
===================================================================
--- dev/usb2/hcd/dev-info.fth	2010-01-09 00:35:42 UTC (rev 1655)
+++ dev/usb2/hcd/dev-info.fth	2010-01-09 08:12:32 UTC (rev 1656)
@@ -22,7 +22,7 @@
    1 field >di-speed			\ Device speed
    1 field >di-hub			\ Hub address (EHCI only)
    1 field >di-port			\ Port number (EHCI only)
-   1 field >di-reset			\ rest flag - 0 initially or after a resume, then 1
+   1 field >di-reset			\ reset flag - 0 initially or after a resume, then 1
    /di-ep-struct #max-endpoint * field >di-ep
 					\ Endpoint structure
 constant /di-entry

Modified: dev/usb2/hcd/device.fth
===================================================================
--- dev/usb2/hcd/device.fth	2010-01-09 00:35:42 UTC (rev 1655)
+++ dev/usb2/hcd/device.fth	2010-01-09 08:12:32 UTC (rev 1656)
@@ -158,7 +158,7 @@
 ;
 
 : make-ctrl-pipe-property  ( pipe size interval -- )
-   drop 2dup register-pipe		( pipe size )
+   drop					( pipe size )
    over h# f and rot h# 80 and  if	( size pipe )
       " control-in-pipe"  int-property
       " control-in-size"
@@ -168,7 +168,7 @@
    then  int-property
 ;
 : make-iso-pipe-property  ( pipe size interval -- )
-   drop 2dup register-pipe		( pipe size )
+   drop					( pipe size )
    over h# 0f and rot h# 80 and  if	( size pipe )
       " iso-in-pipe"  int-property
       " iso-in-size"
@@ -178,7 +178,7 @@
    then  int-property
 ;
 : make-bulk-pipe-property  ( pipe size interval -- )
-   drop 2dup register-pipe		( pipe size )
+   drop 				( pipe size )
    over h# f and rot h# 80 and  if	( size pipe )
       " bulk-in-pipe"  int-property
       " bulk-in-size"
@@ -188,7 +188,6 @@
    then  int-property
 ;
 : make-intr-pipe-property  ( pipe size interval -- )
-   -rot 2dup register-pipe rot	( pipe size interval )
    rot dup h# f and swap h# 80 and  if	( size interval pipe )
       " intr-in-pipe"      int-property
       " intr-in-interval"  int-property
@@ -204,6 +203,7 @@
    swap ENDPOINT find-desc swap 0  ?do	( adr' )
       dup 2 + c@			( adr pipe )
       over 4 + le-w@			( adr pipe size )
+      2dup register-pipe		( adr pipe size )
       2 pick 6 + c@			( adr pipe size interval )
       3 pick 3 + c@ 3 and  case		( adr pipe size interval type )
          0  of  make-ctrl-pipe-property  endof
@@ -238,28 +238,48 @@
    0 0 2swap str-property
 ;
 
+\ Sets the di-maxpayload fields in the dev-info endpoint descriptor array
+: reregister-pipes  ( dev intf -- )
+   cfg-desc-buf swap find-intf-desc	( dev adr )
+   dup c@  over +  swap 4 + c@ 		( dev adr' #endpoints )
+   swap  ENDPOINT find-desc		( dev #endpoints adr' )
+   swap 0  ?do				( dev adr' )
+      dup 4 + le-w@			( dev adr size )
+      over 2 + c@  h# f and		( dev adr size pipe )
+      3 pick di-maxpayload!		( dev adr )
+      dup c@ +				( dev adr' )
+   loop  2drop				( )
+;
+
 : be-l!  ( n adr -- )
    >r lbsplit r@ c!  r@ 1+ c!  r@ 2+ c!  r> 3 + c!
 ;
 
 : reuse-node  ( dev intf port phandle -- )
-   nip nip                        ( dev phandle )
-[ifdef] notdef
-   \ This is the kosher way to do it ...
-   push-package                   ( dev )
-   2drop                          ( dev )
-   encode-int                     ( adr len )
-   " assigned-address" property   ( )
-   pop-package                    ( )
-[else]                            ( dev phandle )
-   \ But this way doesn't leak memory
-   " assigned-address" rot  get-package-property  if  ( dev )
-      drop                                            ( )
-   else                                               ( dev adr len )
-      drop be-l!                                      ( )
-   then                                               ( )
-[then]
+   >r drop			  ( dev intf r: phandle )
+
+   2dup reregister-pipes	  ( dev intf r: phandle )
+   drop                           ( dev      r: phandle )
+
+   \ Change the assigned-address property without leaking memory
+   " assigned-address" r@ get-package-property  if  ( dev r: phandle )
+      drop                                  ( r: phandle )
+   else                                     ( dev adr len r: phandle )
+      drop be-l!                            ( r: phandle )
+   then                                     ( r: phandle )
+
+   " probe-hub" r@ find-method  if          ( xt r: phandle )
+      r@ push-package                       ( xt r: phandle )
+      " " new-instance                      ( xt r: phandle )
+      set-default-unit                      ( xt r: phandle )
+      execute                               ( r: phandle )
+      destroy-instance                      ( r: phandle )
+      pop-package                           ( r: phandle )
+   then                                     ( r: phandle )
+
+   r> drop
 ;
+
 : reuse-old-node?  ( dev intf port -- reused? )
    my-self ihandle>phandle child                 ( dev intf port phandle )
    begin  ?dup  while                            ( dev intf port phandle )

Modified: dev/usb2/hcd/uhci/probe.fth
===================================================================
--- dev/usb2/hcd/uhci/probe.fth	2010-01-09 00:35:42 UTC (rev 1655)
+++ dev/usb2/hcd/uhci/probe.fth	2010-01-09 08:12:32 UTC (rev 1656)
@@ -53,6 +53,14 @@
    pop-package
 ;
 
+: do-resume  ( -- )
+   init-struct
+   start-usb
+;
+
+\ This is a sneaky way to determine if the hardware has been turned off without the software's knowledge
+: suspended?  ( -- flag )  flbaseadd@ 0=  framelist-phys 0<>  and  ;
+
 : open  ( -- flag )
    parse-my-args
    open-count 0=  if
@@ -61,10 +69,12 @@
          false to first-open?
          ?disable-smis
          reset-usb
-         init-struct
          init-lists
-         start-usb
+         do-resume
       then
+
+      suspended?  if  do-resume  then
+
       alloc-dma-buf
 
       probe-root-hub

Modified: ofw/fcode/sysprims.fth
===================================================================
--- ofw/fcode/sysprims.fth	2010-01-09 00:35:42 UTC (rev 1655)
+++ ofw/fcode/sysprims.fth	2010-01-09 08:12:32 UTC (rev 1656)
@@ -370,4 +370,8 @@
 \ --- parsing argument strings
 v2    040 2 byte-code: left-parse-string ( adr len char -- adrR lenR adrL lenL )
 
+\ --- New FirmWorks stuff
 v3    041 2 byte-code: debug-me
+v3    042 2 byte-code: new-instance      ( args-adr args-len -- )
+v3    043 2 byte-code: destroy-instance  ( -- )
+v3    044 2 byte-code: set-default-unit  ( -- )




More information about the openfirmware mailing list