Annotation of qemu/roms/SLOF/slof/fs/usb/usb-static.fs, revision 1.1.1.1

1.1       root        1: \ *****************************************************************************
                      2: \ * Copyright (c) 2004, 2008 IBM Corporation
                      3: \ * All rights reserved.
                      4: \ * This program and the accompanying materials
                      5: \ * are made available under the terms of the BSD License
                      6: \ * which accompanies this distribution, and is available at
                      7: \ * http://www.opensource.org/licenses/bsd-license.php
                      8: \ *
                      9: \ * Contributors:
                     10: \ *     IBM Corporation - initial implementation
                     11: \ ****************************************************************************/
                     12: 
                     13: \ #include "scsi-support.fs"
                     14: 
                     15: \ Set usb-debug flag to TRUE for debugging output:
                     16: 0 VALUE usb-debug-flag
                     17: false VALUE scan-time?
                     18: 
                     19: VARIABLE ihandle-bulk-tran
                     20: \ -scsi-supp-  VARIABLE ihandle-scsi-tran
                     21: 
                     22: \ uDOC (Micro-Disk-On-Chip) is a FLASH-device
                     23: \ normally connected to usb-port 5 on ELBA
                     24: \
                     25: 0 VALUE uDOC-present       \ device present and working?
                     26: 
                     27: \ Print a debug message when usb-debug-flag is set
                     28: : usb-debug-print  ( str len -- )
                     29:    usb-debug-flag  IF type cr ELSE 2drop THEN
                     30: ;
                     31: 
                     32: \ Print a debug message with corresponding value when usb-debug-flag is set
                     33: : usb-debug-print-val  ( str len val -- )
                     34:    usb-debug-flag  IF -ROT type . cr ELSE drop 2drop THEN
                     35: ;
                     36: 
                     37: \ show proceeding propeller only during scan process.
                     38: \ As soon USB-keyboard can be used, this must be suppressed.
                     39: 0 VALUE proceed-char
                     40: : show-proceed ( -- )
                     41:    scan-time?              \ are we on usb-scan ?
                     42:    IF
                     43:       proceed-char
                     44:       CASE
                     45:          0   OF 2d ENDOF   \ show '-'
                     46:          1   OF 5c ENDOF   \ show '\'
                     47:          2   OF 7c ENDOF   \ show '|'
                     48:          dup OF 2f ENDOF   \ show '/'
                     49:       ENDCASE
                     50:       emit 8 emit
                     51:       proceed-char 1 + 3 AND to proceed-char
                     52:    THEN
                     53: ;
                     54: 
                     55: \ delay with proceeding signs
                     56: : wait-proceed ( nl -- )
                     57:    show-proceed
                     58:    BEGIN
                     59:       dup d# 100 >         ( nl true|false )
                     60:       WHILE
                     61:       100 - show-proceed
                     62:       100 ms               \ do it in steps of 100ms
                     63:    REPEAT
                     64:    ms                      \ rest delay
                     65: ;
                     66: 
                     67: \ register device alias
                     68: : do-alias-setting ( num name-str name-len )
                     69:    rot $cathex strdup            \ create alias name
                     70:    get-node node>path            \ get path string
                     71:    set-alias                     \ and set the alias
                     72: ;
                     73: 
                     74: 
                     75: 0 VALUE ohci-alias-num
                     76: 
                     77: \ create a new ohci device alias for the current node:
                     78: : set-ohci-alias  ( -- )
                     79:    ohci-alias-num dup 1+ TO ohci-alias-num    ( num )
                     80:    s" ohci"
                     81:    do-alias-setting
                     82: ;
                     83: 
                     84: 0 VALUE cdrom-alias-num
                     85: 0 VALUE disk-alias-num        \ shall start with: pci-disk-num
                     86: FALSE VALUE ext-disk-alias    \ first external disk: not yet assigned
                     87: 
                     88: \ create a new ohci device alias for the current node:
                     89: : set-drive-alias  ( --  )
                     90:    space 5b emit
                     91:    s" cdrom" drop                ( name-str )
                     92:    get-node node>name comp 0=    ( true|false )
                     93:    IF                            \ is this a cdrom ?
                     94:       cdrom-alias-num dup 1+ TO cdrom-alias-num    ( num )
                     95:       s" cdrom"                  \ yes, alias = cdrom
                     96:    ELSE
                     97:       s" sbc-dev" drop           \ is this a scsi-block-device?
                     98:       get-node node>name comp 0= ( true|false )
                     99:       IF
                    100:          disk-alias-num dup 1 + to disk-alias-num
                    101:          s" disk"                \ all block devices will be named "disk"
                    102: 
                    103:          \ this is a block-device.
                    104:          \ check if parent is 'usb' and not 'hub'
                    105:          \ if so this block-device is directly connected
                    106:          \ to root-hub and must be the uDOC-device in Elba
                    107:          s" usb" drop            \ parent = usb controller ? (not hub)
                    108:          get-node node>parent @ node>name
                    109:          comp 0=                 \ parent node starts with 'usb' ?
                    110:          IF                      ( true|false )
                    111:             1 s" hdd"            \ add extra alias hdd1 for IntFlash
                    112:             2dup type 2 pick .
                    113:             8 emit 2f emit
                    114:             do-alias-setting
                    115:             uDOC-present 1 and
                    116:             IF
                    117:                uDOC-present 2 or to uDOC-present \ present and ready
                    118:             THEN
                    119:          ELSE
                    120:             ext-disk-alias not   \ flag for first ext. disk already assigned
                    121:             IF
                    122:                TRUE to ext-disk-alias
                    123:                2 s" hdd"         \ add extra alias hdd2 for first USB disk
                    124:                2dup type 2 pick .
                    125:                8 emit 2f emit
                    126:                do-alias-setting
                    127:             THEN
                    128:          THEN
                    129:       ELSE
                    130:          0 s" ??? "              \ unknown device
                    131:       THEN
                    132:    THEN     ( num name-str name-len )
                    133:    2dup type 2 pick .
                    134:    8 emit 5d emit cr
                    135:    do-alias-setting
                    136: ;
                    137: 
                    138: : usb-create-alias-name ( num -- str len )
                    139:     >r s" ohciX" 2dup + 1-           ( str len last-char-ptr  R: num )
                    140:     r> [char] 0 + swap c!            ( str len  R: )
                    141: ;
                    142: 
                    143: 
                    144: \ *****************************************************
                    145: \ This is a final check to see, if a uDOC-device
                    146: \ is ready for booting
                    147: \ If physically present, but not working, an
                    148: \ Error-LED must be activated (on ELBA only!)
                    149: \ *****************************************************
                    150: \ uDOC is now replaced by ModFD (Modular-Flash-Drive)
                    151: \ due to right properties
                    152: \ 'sys-signal-modfd-fault' sends an IPMI-Message to
                    153: \ aMM for generating a log entry and to switch on
                    154: \ an error LED (call to libsystem->libipmi)
                    155: \ *****************************************************
                    156: \ although there are IPMI-warnings defined concerning
                    157: \ detected media errors, it doesn't make sense to send
                    158: \ a warning when booting from this device is impossible.
                    159: \ The decision was made to send an error call in this
                    160: \ case as well
                    161: \ *****************************************************
                    162: \ uDOC-present bits:
                    163: \ *****************************************************
                    164: \ D0: any device is connected on port 3 of root-hub
                    165: \ D1: device on port 3 is directly connected (no hub)
                    166: \ D2: warnings were received (scancodes)
                    167: \ D3: OverCurrentIndicator on USB-Port was set
                    168: \ D7: flag, set while ModFD is beeing processed
                    169: 
                    170: : uDOC-check   ( -- )
                    171: #ifdef ELBA
                    172:    uDOC-present 7 and               \ flags concerning ModFD device
                    173:    CASE
                    174:       0  OF                         \ not present not detected
                    175:          uDOC-present 8 and 0<>     \ not detected due to OverCurrent?
                    176:          IF
                    177:             0d emit ."   * OverCurrent on ModFD *" cr
                    178:             sys-signal-modfd-fault     ( -- )      \ send IPMI-call to BMC
                    179:          ELSE
                    180:             0d emit ."   ModFD not present" cr
                    181:          THEN
                    182:       ENDOF
                    183: 
                    184:       1  OF       \ present but not detected by USB
                    185:          0d emit ."   * ModFD not accessible *" cr
                    186:          sys-signal-modfd-fault     ( -- )      \ send IPMI-call to BMC
                    187:       ENDOF
                    188: 
                    189:       3  OF       \ present and detected
                    190: \        0d emit ."   ModFD OK" cr
                    191:       ENDOF
                    192: 
                    193:       7  OF       \ present and detected but with warnings
                    194:          0d emit ."   * ModFD Warnings *" cr
                    195:          sys-signal-modfd-fault     ( -- )      \ send IPMI-call to BMC
                    196:       ENDOF
                    197: 
                    198:       dup OF      \ we have a fault in our firmware !
                    199:          s"   *** ModFD detection error ***" usb-debug-print
                    200:       ENDOF
                    201:    ENDCASE
                    202: #endif
                    203: ;
                    204: 
                    205: \ *****************************************************
                    206: \ check if actual processed device is ModFD and
                    207: \ then sets its warning bit
                    208: \ *****************************************************
                    209: : uDOC-failure?   ( -- )
                    210:    uDOC-present 80 and 0<>                \ is ModFD actual beeing processed?
                    211:    IF
                    212:       uDOC-present 04 or to uDOC-present  \ set Warning flag
                    213:    THEN
                    214: ;
                    215: 
                    216: \ Scan all USB host controllers for attached devices:
                    217: : usb-scan
                    218:    \ Scan all OHCI chips:
                    219:    space ." Scan USB... " cr
                    220:    true to scan-time?            \ show proceeding signs
                    221:    0 to uDOC-present             \ mark as not present
                    222:    0 to disk-alias-num           \ start with disk0
                    223:    s" pci-disk-num" $find        \ previously detected disks ?
                    224:    IF
                    225:       execute to disk-alias-num  \ overwrite start number
                    226:    ELSE
                    227:       2drop
                    228:    THEN
                    229: 
                    230:    0 >r                             \ Counter for alias
                    231:    BEGIN
                    232:       r@ usb-create-alias-name
                    233:       find-alias ?dup               ( false | str len len  R: num )
                    234:    WHILE
                    235:       usb-debug-flag IF
                    236:          ." * Scanning hub " 2dup type ." ..." cr
                    237:       THEN
                    238:       open-dev ?dup IF              ( ihandle  R: num )
                    239:          dup to my-self
                    240:          dup ihandle>phandle dup set-node
                    241:           child ?dup IF
                    242:               delete-node s" Deleting node" usb-debug-print
                    243:           THEN
                    244:          >r s" enumerate" r@ $call-method   \ Scan host controller
                    245:          r> close-dev  0 set-node 0 to my-self
                    246:       THEN                          ( R: num )
                    247:       r> 1+ >r                      ( R: num+1 )
                    248:    REPEAT   r> drop
                    249:    0 TO ohci-alias-num
                    250:    0 TO cdrom-alias-num
                    251:    s" cdrom0" find-alias            ( false | dev-path len )
                    252:    dup IF
                    253:        s" cdrom" 2swap              ( alias-name len' dev-path len )
                    254:        set-alias                    ( -- )
                    255:        \ cdrom-alias-num 1 + TO cdrom-alias-num
                    256:    ELSE 
                    257:        drop                         ( -- )
                    258:    THEN
                    259:    uDOC-check  \ check if uDOC-device is present and working (ELBA only)
                    260:    false to scan-time?                 \ suppress proceeding signs
                    261: ;
                    262: 
                    263: : usb-probe
                    264: 
                    265:   usb-scan
                    266: 
                    267:   cdrom-alias-num 0= IF
                    268:      ." Not found CDROM! " cr
                    269:   THEN
                    270:      ." CDROM found " cdrom-alias-num . cr 
                    271: ;
                    272: 
                    273:  
                    274: : usb-dev-test ( -- TRUE )
                    275:    s" USB Device Test " usb-debug-print
                    276:    1 usb-create-alias-name
                    277:    find-alias ?dup IF
                    278:       ." * open " 2dup type . cr
                    279:    ELSE
                    280:       s" can't found alias " usb-debug-print
                    281:    THEN
                    282:    open-dev ?dup IF
                    283:       dup to my-self
                    284:       dup ihandle>phandle dup set-node
                    285:       s" bulk" $open-package ihandle-bulk-tran !
                    286: \      make-media-ready
                    287:       s" close all " usb-debug-print
                    288:       close-dev 0 set-node 0 to my-self
                    289: 
                    290:       ihandle-bulk-tran close-package
                    291:    ELSE
                    292:       s" can't open usb hub" usb-debug-print
                    293:    THEN
                    294: 
                    295:    TRUE
                    296: ;
                    297: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.