blob: a35dbff4b66260623f262d1bfbf5624d4fc168bc [file] [log] [blame]
\ *****************************************************************************
\ * Copyright (c) 2004, 2011 IBM Corporation
\ * All rights reserved.
\ * This program and the accompanying materials
\ * are made available under the terms of the BSD License
\ * which accompanies this distribution, and is available at
\ * http://www.opensource.org/licenses/bsd-license.php
\ *
\ * Contributors:
\ * IBM Corporation - initial implementation
\ ****************************************************************************/
\ Set usb-debug flag to TRUE for debugging output:
0 VALUE usb-debug-flag
false VALUE scan-time?
VARIABLE ihandle-bulk-tran
\ Print a debug message when usb-debug-flag is set
: usb-debug-print ( str len -- )
usb-debug-flag IF type cr ELSE 2drop THEN
;
\ Print a debug message with corresponding value when usb-debug-flag is set
: usb-debug-print-val ( str len val -- )
usb-debug-flag IF -ROT type . cr ELSE drop 2drop THEN
;
\ show proceeding propeller only during scan process.
\ As soon USB-keyboard can be used, this must be suppressed.
0 VALUE proceed-char
: show-proceed ( -- )
scan-time? \ are we on usb-scan ?
IF
proceed-char
CASE
0 OF 2d ENDOF \ show '-'
1 OF 5c ENDOF \ show '\'
2 OF 7c ENDOF \ show '|'
dup OF 2f ENDOF \ show '/'
ENDCASE
emit 8 emit
proceed-char 1 + 3 AND to proceed-char
THEN
;
\ delay with proceeding signs
: wait-proceed ( nl -- )
show-proceed
BEGIN
dup d# 100 > ( nl true|false )
WHILE
100 - show-proceed
100 ms \ do it in steps of 100ms
REPEAT
ms \ rest delay
;
\ register device alias
: do-alias-setting ( num name-str name-len )
rot $cathex strdup \ create alias name
get-node node>path \ get path string
set-alias \ and set the alias
;
0 VALUE ohci-alias-num
\ create a new ohci device alias for the current node:
: set-ohci-alias ( -- )
ohci-alias-num dup 1+ TO ohci-alias-num ( num )
s" ohci"
do-alias-setting
;
0 VALUE cdrom-alias-num
0 VALUE disk-alias-num \ shall start with: pci-disk-num
FALSE VALUE ext-disk-alias \ first external disk: not yet assigned
\ create a new ohci device alias for the current node:
: set-drive-alias ( -- )
space 5b emit
s" cdrom" drop ( name-str )
get-node node>name comp 0= ( true|false )
IF \ is this a cdrom ?
cdrom-alias-num dup 1+ TO cdrom-alias-num ( num )
s" cdrom" \ yes, alias = cdrom
ELSE
s" sbc-dev" drop \ is this a scsi-block-device?
get-node node>name comp 0= ( true|false )
IF
disk-alias-num dup 1 + to disk-alias-num
s" disk" \ all block devices will be named "disk"
ext-disk-alias not \ flag for first ext. disk already assigned
IF
TRUE to ext-disk-alias
2 s" hdd" \ add extra alias hdd2 for first USB disk
2dup type 2 pick .
8 emit 2f emit
do-alias-setting
THEN
ELSE
0 s" ??? " \ unknown device
THEN
THEN ( num name-str name-len )
2dup type 2 pick .
8 emit 5d emit cr
do-alias-setting
;
: usb-create-alias-name ( num -- str len )
>r s" ohciX" 2dup + 1- ( str len last-char-ptr R: num )
r> [char] 0 + swap c! ( str len R: )
;
: ohci-scan-node ( str len -- )
2dup find-node ?dup IF
( str len phandle )
dup set-node
dup child ?dup IF
delete-node s" Deleting node" usb-debug-print
THEN
\ Check whether usb-ohci.fs has already been included:
s" enumerate" rot find-method IF
drop
\ Create instance for enumeration:
open-dev dup to my-self
s" enumerate" 2 pick $call-method \ Scan host controller
close-dev 0 to my-self
0 set-node
ELSE
2drop get-node
dup parent node>path select-dev \ Open parent
extend-device
s" usb-ohci.fs" included
s" open" $call-my-method 0= ABORT" OHCI open failed"
s" enumerate" $call-my-method
s" close" $call-my-method
finish-device
unselect-dev
THEN ( str len R: num )
ELSE
2drop
THEN
;
\ Scan all USB OHCI host controllers for attached devices:
: ohci-scan
\ Scan all OHCI chips:
space ." Scan USB... " cr
true to scan-time? \ show proceeding signs
0 to disk-alias-num \ start with disk0
s" pci-disk-num" $find \ previously detected disks ?
IF
execute to disk-alias-num \ overwrite start number
ELSE
2drop
THEN
0 >r \ Counter for alias
BEGIN
r@ usb-create-alias-name
find-alias ?dup ( false | str len len R: num )
WHILE
( str len R: num )
usb-debug-flag IF
." * Scanning hub " 2dup type ." ..." cr
THEN
ohci-scan-node ( R: num )
r> 1+ >r ( R: num+1 )
REPEAT
r> drop
0 TO ohci-alias-num
0 TO cdrom-alias-num
s" cdrom0" find-alias ( false | dev-path len )
dup IF
s" cdrom" 2swap ( alias-name len' dev-path len )
set-alias ( -- )
\ cdrom-alias-num 1 + TO cdrom-alias-num
ELSE
drop ( -- )
THEN
false to scan-time? \ suppress proceeding signs
;
: usb-scan
s" ohci0" find-alias IF
drop
ohci-scan
THEN
;