Author: wmb Date: 2009-12-18 17:26:09 +0100 (Fri, 18 Dec 2009) New Revision: 1633
Modified: cpu/x86/pc/olpc/via/usb.fth dev/usb2/hcd/ehci/ehci.fth dev/usb2/hcd/ehci/probe.fth Log: OLPC trac 9902 - USB selftest in diagnostic mode now waits for a device to be connected to each port.
Modified: cpu/x86/pc/olpc/via/usb.fth =================================================================== --- cpu/x86/pc/olpc/via/usb.fth 2009-12-18 06:54:56 UTC (rev 1632) +++ cpu/x86/pc/olpc/via/usb.fth 2009-12-18 16:26:09 UTC (rev 1633) @@ -13,7 +13,7 @@ ;
\ Restrict selftest to external USB ports 1,2,3 -dev / 2 " usb-max-test-port" integer-property dend +dev / 3 " usb-test-ports" integer-property dend
: (probe-usb2) ( -- ) " device_type" get-property if exit then
Modified: dev/usb2/hcd/ehci/ehci.fth =================================================================== --- dev/usb2/hcd/ehci/ehci.fth 2009-12-18 06:54:56 UTC (rev 1632) +++ dev/usb2/hcd/ehci/ehci.fth 2009-12-18 16:26:09 UTC (rev 1633) @@ -196,39 +196,6 @@ then ;
-external - -: selftest ( -- error? ) - ehci-reg dup 0= if map-regs then - - " usb-max-test-port" get-inherited-property if - h# 7fffffff - else ( adr len ) - decode-int nip nip - then - - hcsparams@ h# f and min 0 ?do - i portsc@ h# 2001 and if \ Port owned by usb 1.1 controller or device - \ is present. - ." USB 2.0 port " i u. ." in use" cr - else - diagnostic-mode? if - ." Nothing connected to USB port " i u. " !" cr - true unloop exit - then - ." Fisheye pattern out to USB 2.0 port " i u. cr - i test-port-begin - d# 2,000 ms - i test-port-end - 0 i portsc! i reset-port i power-port - then - loop - 0= if unmap-regs then - false -; - -headers - \ LICENSE_BEGIN \ Copyright (c) 2006 FirmWorks \
Modified: dev/usb2/hcd/ehci/probe.fth =================================================================== --- dev/usb2/hcd/ehci/probe.fth 2009-12-18 06:54:56 UTC (rev 1632) +++ dev/usb2/hcd/ehci/probe.fth 2009-12-18 16:26:09 UTC (rev 1633) @@ -30,7 +30,10 @@ make-device-node ( ) ;
+0 instance value probe-error? \ Back channel to selftest + : probe-root-hub-port ( port -- ) + false to probe-error? dup portsc@ 1 and 0= if drop exit then \ No device detected dup portsc@ h# c00 and h# 400 = if \ A low speed device detected dup disown-port \ Disown the port @@ -41,9 +44,11 @@ else \ A high speed device detected dup ['] make-root-hub-node catch if \ Process high speed device drop ." Failed to probe root port " dup .d cr + true to probe-error? then then - then drop + then ( port# ) + dup portsc@ swap portsc! ( ) \ Clear connection change bit ;
: grab-controller ( -- error? ) @@ -69,7 +74,44 @@ false ;
+: probe-setup ( -- ) + \ Set active-package so device nodes can be added and removed + my-self ihandle>phandle push-package + + alloc-pkt-buf +; +: probe-teardown ( -- ) + free-pkt-buf + pop-package +; + +: #testable-ports ( -- n ) + #ports ( #hardware-ports ) + " usb-test-ports" get-inherited-property 0= if ( #hardware-ports adr len ) + decode-int nip nip min ( #testable-ports ) + then ( #testable-ports ) +; + +: wait-connect ( port# -- error? ) + begin ( port# ) + dup portsc@ h# 2001 and 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# ) + dup probe-root-hub-port ( port# ) + probe-teardown ( port# ) + probe-error? ( error? ) + dup if ." Failed" else ." Done" then cr ( error? ) +; + external + : power-usb-ports ( -- ) ;
: ports-changed? ( -- flag ) @@ -80,20 +122,16 @@ ;
: probe-root-hub ( -- ) - \ Set active-package so device nodes can be added and removed - my-self ihandle>phandle push-package + probe-setup
- alloc-pkt-buf #ports 0 ?do \ For each port i portsc@ 2 and if \ Connection changed i rm-obsolete-children \ Remove obsolete device nodes i probe-root-hub-port \ Probe it - i portsc@ i portsc! \ Clear connection change bit then loop - free-pkt-buf
- pop-package + probe-teardown ;
: open ( -- flag ) @@ -135,6 +173,29 @@ open-count 0= if free-dma-buf unmap-regs then ;
+: selftest ( -- error? ) + 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) + ." USB 2.0 port " i u. ." in use" cr + else + diagnostic-mode? if + ." 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 + i test-port-begin + d# 2,000 ms + i test-port-end + 0 i portsc! i reset-port i power-port + then + then + loop + 0= if unmap-regs then + false +; + headers
\ LICENSE_BEGIN
openfirmware@openfirmware.info