[openfirmware] [commit] r2746 - cpu/arm/olpc/3.0 dev/usb2/hcd/ehci
repository service
svn at openfirmware.info
Thu Dec 8 13:43:08 CET 2011
Author: wmb
Date: Thu Dec 8 13:43:07 2011
New Revision: 2746
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2746
Log:
USB EHCI driver - support low and full speed devices connected to EHCI controller, as some EHCI controllers can handle them without needing a companion controller.
Modified:
cpu/arm/olpc/3.0/usb.fth
dev/usb2/hcd/ehci/probe.fth
Modified: cpu/arm/olpc/3.0/usb.fth
==============================================================================
--- cpu/arm/olpc/3.0/usb.fth Thu Dec 8 13:43:02 2011 (r2745)
+++ cpu/arm/olpc/3.0/usb.fth Thu Dec 8 13:43:07 2011 (r2746)
@@ -16,6 +16,11 @@
: otg-set-host-mode 3 h# a8 ehci-reg! ; \ Force host mode
' otg-set-host-mode to set-host-mode
+ \ The Marvell EHCI can handle low and full speed devices directly,
+ \ without needing a UHCI or OHCI companion controller
+ ' make-port-node to handle-ls-device
+ ' make-port-node to handle-fs-device
+
: sleep ( -- ) true to first-open? ;
: wake ( -- ) ;
end-package
@@ -33,11 +38,17 @@
fload ${BP}/dev/usb2/hcd/ehci/loadpkg.fth
\ false to delay? \ No need for a polling delay on this platform
+ \ The Marvell EHCI can handle low and full speed devices directly,
+ \ without needing a UHCI or OHCI companion controller
+ ' make-port-node to handle-ls-device
+ ' make-port-node to handle-fs-device
+
: sleep ( -- ) true to first-open? ;
: wake ( -- ) ;
end-package
-\ Turn on USB power after a delay, to ensure that USB devices are reset correctly on boot
+\ usb-power-on is unnecessary on initial boot, as CForth turns on the
+\ USB power during its GPIO setup.
: usb-power-on ( -- )
d# 126 gpio-clr \ OTG 5V on
d# 127 gpio-clr \ ULPI 5V on
@@ -56,7 +67,7 @@
;
stand-init: Init USB Phy
-\ usb-power-on \ The EC now controls the USB power
+\ usb-power-on \ The USB power is turned on early, when CForth sets up GPIOs
init-usb
;
@@ -118,17 +129,24 @@
alias p2 probe-usb
0 value usb-keyboard-ih
+0 value otg-keyboard-ih
: attach-usb-keyboard ( -- )
" usb-keyboard" expand-alias if ( devspec$ )
drop " /usb" comp 0= if ( )
" usb-keyboard" open-dev to usb-keyboard-ih
usb-keyboard-ih add-input
- exit
then
else ( devspec$ )
2drop
then
+
+ " otg/keyboard" expand-alias if ( devspec$ )
+ open-dev to otg-keyboard-ih
+ otg-keyboard-ih add-input
+ else
+ 2drop
+ then
;
: detach-usb-keyboard ( -- )
Modified: dev/usb2/hcd/ehci/probe.fth
==============================================================================
--- dev/usb2/hcd/ehci/probe.fth Thu Dec 8 13:43:02 2011 (r2745)
+++ dev/usb2/hcd/ehci/probe.fth Thu Dec 8 13:43:07 2011 (r2746)
@@ -4,13 +4,15 @@
hex
headers
+0 value port-speed
+
: make-root-hub-node ( port -- )
\ Some devices (e.g. Lexar USB-to-SD) fail unless you get the cfg desc from device 0 first
0 set-target \ First address it as device 0 ( port )
- speed-high 0 di-speed! \ Use high speed for getting the device descriptor
+ port-speed 0 di-speed! \ Use high speed for getting the device descriptor
dev-desc-buf h# 40 get-cfg-desc drop ( port )
- speed-high ( port speed )
+ port-speed ( port speed )
\ hub-port and hub-dev route USB 1.1 transactions through USB 2.0 hubs
over get-hub20-port get-hub20-dev ( port speed hub-port hub-dev )
@@ -21,22 +23,31 @@
0 instance value probe-error? \ Back channel to selftest
+: make-port-node ( port -- )
+ ['] make-root-hub-node catch if
+ drop ." Failed to make root hub node for port " dup .d cr
+ true to probe-error?
+ then
+;
+defer handle-ls-device ' disown-port to handle-ls-device
+defer handle-fs-device ' disown-port to handle-fs-device
+
: probe-root-hub-port ( port -- )
false to probe-error? ( port )
dup disable-old-nodes ( port )
dup portsc@ 1 and 0= if drop exit then ( port ) \ No device detected
dup portsc@ h# c00 and h# 400 = if \ A low speed device detected
- dup disown-port \ Disown the port
+ speed-low to port-speed
+ dup handle-ls-device \ Process low-speed device
else \ Don't know what it is
dup reset-port \ Reset to find out
dup portsc@ 4 and 0= if \ A full speed device detected
- dup disown-port \ Disown the port
+ speed-full to port-speed
+ dup handle-fs-device \ Process full-speed device
else \ A high speed device detected
- dup ['] make-root-hub-node catch if \ Process high speed device
- drop ." Failed to make root hub node for port " dup .d cr
- true to probe-error?
- then
+ speed-high to port-speed
+ dup make-port-node \ Process high-speed device
then
then ( port# )
dup portsc@ swap portsc! ( ) \ Clear connection change bit
More information about the openfirmware
mailing list