Author: wmb Date: Fri May 27 04:16:25 2011 New Revision: 2233 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2233
Log: OLPC trac #10887 - added selftest support for USB hubs.
Modified: cpu/arm/olpc/1.75/usb.fth dev/usb2/device/hub/hub.fth dev/usb2/hcd/ehci/probe.fth dev/usb2/hcd/ehci/qhtd.fth dev/usb2/hcd/hcd-call.fth dev/usb2/hcd/probehub.fth dev/usb2/pkt-data.fth
Modified: cpu/arm/olpc/1.75/usb.fth ============================================================================== --- cpu/arm/olpc/1.75/usb.fth Thu May 26 23:23:22 2011 (r2232) +++ cpu/arm/olpc/1.75/usb.fth Fri May 27 04:16:25 2011 (r2233) @@ -16,6 +16,9 @@ : otg-set-host-mode 3 h# a8 ehci-reg! ; \ Force host mode ' otg-set-host-mode to set-host-mode
+ \ Port 1 on the hub (bit 0) is connected to unused pins on the + \ WLAN connector, so testing it is confusing + h# e " hub-port-mask" integer-property end-package
d# 300 config-int usb-delay \ Milliseconds to wait before probing hub ports
Modified: dev/usb2/device/hub/hub.fth ============================================================================== --- dev/usb2/device/hub/hub.fth Thu May 26 23:23:22 2011 (r2232) +++ dev/usb2/device/hub/hub.fth Fri May 27 04:16:25 2011 (r2233) @@ -53,6 +53,11 @@ reprobe-hub-xt execute then ; +: selftest ( -- ) + ['] hub-id catch 0= if + hub-selftest-xt execute + then +;
probe-hub
Modified: dev/usb2/hcd/ehci/probe.fth ============================================================================== --- dev/usb2/hcd/ehci/probe.fth Thu May 26 23:23:22 2011 (r2232) +++ dev/usb2/hcd/ehci/probe.fth Fri May 27 04:16:25 2011 (r2233) @@ -60,9 +60,10 @@ then ( #testable-ports ) ;
+: port-connected? ( port# -- flag ) portsc@ h# 2001 and ; : wait-connect ( port# -- error? ) begin ( port# ) - dup portsc@ h# 2001 and 0= ( port# unconnected? ) + dup port-connected? 0= ( port# unconnected? ) while ( port# ) key? if ( port# ) key h# 1b = if ( port# ) \ ESC aborts @@ -156,11 +157,11 @@ ehci-reg dup 0= if map-regs then
#testable-ports 0 ?do - i portsc@ h# 2001 and if \ Port owned by usb 1.1 controller (2000) or device is present (1) + i port-connected? if \ Port owned by usb 1.1 controller (2000) or device is present (1) ." USB 2.0 port " i u. ." in use" cr else diagnostic-mode? if - ." Please connect a device to USB port " i u. " !" cr + ." Please connect a device to USB port " i u. cr i wait-connect if true unloop exit then else ." Fisheye pattern out to USB 2.0 port " i u. cr
Modified: dev/usb2/hcd/ehci/qhtd.fth ============================================================================== --- dev/usb2/hcd/ehci/qhtd.fth Thu May 26 23:23:22 2011 (r2232) +++ dev/usb2/hcd/ehci/qhtd.fth Fri May 27 04:16:25 2011 (r2233) @@ -549,7 +549,7 @@ ;
true value delay? -: poll-delay ( -- ) d# 100 " us" evaluate ; +: poll-delay ( -- ) d# 300 " us" evaluate ; : done? ( qh -- usberr ) delay? if poll-delay then begin dup qh-done? 0= while ( qh )
Modified: dev/usb2/hcd/hcd-call.fth ============================================================================== --- dev/usb2/hcd/hcd-call.fth Thu May 26 23:23:22 2011 (r2232) +++ dev/usb2/hcd/hcd-call.fth Fri May 27 04:16:25 2011 (r2233) @@ -13,12 +13,15 @@ \ Probing support : set-target ( device -- ) " set-target" $call-parent - ; +; : probe-hub-xt ( -- adr ) - " probe-hub-xt" $call-parent + " probe-hub-xt" $call-parent ; : reprobe-hub-xt ( -- adr ) - " reprobe-hub-xt" $call-parent + " reprobe-hub-xt" $call-parent +; +: hub-selftest-xt ( -- adr ) + " hub-selftest-xt" $call-parent ; : set-pipe-maxpayload ( size len -- ) " set-pipe-maxpayload" $call-parent
Modified: dev/usb2/hcd/probehub.fth ============================================================================== --- dev/usb2/hcd/probehub.fth Thu May 26 23:23:22 2011 (r2232) +++ dev/usb2/hcd/probehub.fth Fri May 27 04:16:25 2011 (r2233) @@ -11,6 +11,9 @@
: power-hub-port ( port -- ) PORT_POWER DR_PORT " set-feature" $call-parent drop ; : reset-hub-port ( port -- ) PORT_RESET DR_PORT " set-feature" $call-parent drop d# 20 ms ; +\ Test modes: 1:J 2:K 3:SE0_NAK 4:Packet 5:ForceEnable +: test-hub-port ( port test-mode -- ) wljoin PORT_TEST DR_PORT " set-feature" $call-parent drop ; +: untest-hub-port ( port -- ) PORT_TEST DR_PORT " clear-feature" $call-parent drop ; : clear-status-change ( port -- ) C_PORT_CONNECTION DR_PORT " clear-feature" $call-parent drop ; : parent-set-target ( dev -- ) " set-target" $call-parent ; : hub-error? ( -- error? ) @@ -155,6 +158,77 @@
: reprobe-hub-xt ( -- adr ) ['] do-reprobe-hub ;
+: hub-port-connected? ( port# -- flag ) + get-port-status if false exit then + hub-buf c@ 1 and 0<> +; +0 value hub-dev +: wait-hub-connect ( port# -- error? ) + begin ( port# ) + dup hub-port-connected? 0= ( port# unconnected? ) + while ( port# ) + key? if ( port# ) + key h# 1b = if ( port# ) \ ESC aborts + drop true exit ( -- true ) + then ( port# ) + then ( port# ) + repeat ( port# ) + ." Device connected - probing ... " + probe-setup ( port# ) + hub-dev swap ['] probe-hub-port catch if ( x x ) + 2drop ( ) + ." Failed" cr ( ) + true ( true ) + else ( ) + ." Done" cr ( ) + false ( false ) + then ( error? ) + probe-teardown ( error? ) +; + +0 value hub-test-mask +: hub-selftest ( hub-dev -- error? ) + to hub-dev ( ) + + " hub-port-mask" get-inherited-property if ( ) + -1 ( mask ) + else ( propval$ ) + get-encoded-int ( mask ) + then ( mask ) + to hub-test-mask ( ) + + hub-#ports 1+ 1 ?do ( ) + 1 i 1- lshift hub-test-mask and if + hub-dev parent-set-target ( ) + i get-port-status if ( ) + ." Get-port-status failed for hub port " i u. cr + true unloop exit ( -- true ) + then ( ) + hub-buf c@ 8 and if \ Connected ( ) + ." Hub port " i u. ." in over current" cr + true unloop exit ( -- true ) + then ( ) + hub-buf c@ 1 and if \ Connected ( ) + ." Hub port " i u. ." in use" cr ( ) + else ( ) + diagnostic-mode? if ( ) + ." Please connect a device to USB hub port " i u. cr ( ) + i wait-hub-connect if true unloop exit then ( ) + else ( ) + ." Fisheye pattern out to USB hub port " i u. cr ( ) + i 4 test-hub-port ( ) + d# 2,000 ms ( ) + i untest-hub-port ( ) + i reset-hub-port i power-hub-port ( ) + then ( ) + then ( ) + then ( ) + loop ( ) + \ Mabye need to reset the entire hub here + false ( false ) +; +: hub-selftest-xt ( -- xt ) ['] hub-selftest ; + headers
\ LICENSE_BEGIN
Modified: dev/usb2/pkt-data.fth ============================================================================== --- dev/usb2/pkt-data.fth Thu May 26 23:23:22 2011 (r2232) +++ dev/usb2/pkt-data.fth Fri May 27 04:16:25 2011 (r2233) @@ -72,11 +72,13 @@ 04 constant PORT_RESET 08 constant PORT_POWER 09 constant PORT_LOW_SPEED -10 constant C_PORT_CONNECTION -11 constant C_PORT_ENABLE -12 constant C_PORT_SUSPEND -13 constant C_PORT_OVER_CURRENT -14 constant C_PORT_RESET +d# 16 constant C_PORT_CONNECTION +d# 17 constant C_PORT_ENABLE +d# 18 constant C_PORT_SUSPEND +d# 19 constant C_PORT_OVER_CURRENT +d# 20 constant C_PORT_RESET +d# 21 constant PORT_TEST +d# 22 constant PORT_INDICATOR
\ Use tmp-l to make sure that le-l! and le-w! are atomic writes
openfirmware@openfirmware.info