Annotation of qemu/roms/SLOF/slof/fs/usb/usb-enumerate.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: 
                     14: \ create the device tree for hub
                     15: 
                     16: : (hub-create) ( -- )
                     17:    mps port-number new-device-address port-number 
                     18:    ( mps port-number usb-address port-number )
                     19:    new-device set-space                ( mps port-number usb-address )
                     20:    encode-int s" USB-ADDRESS" property ( mps port-number )
                     21:    s" Address Set"  usb-debug-print
                     22:    encode-int s" reg" property         ( mps )
                     23:    s" Port Number Set"   usb-debug-print 
                     24:    encode-int s" MPS-DCP" property
                     25:    s" MPS Set"   usb-debug-print
                     26:    s" usb-hub.fs" INCLUDED
                     27:    s" Driver Included"   usb-debug-print
                     28:    finish-device
                     29: ;
                     30: 
                     31: 
                     32: \ encode properties for scsi or atapi device
                     33: 
                     34: : (atapi-scsi-property-set) ( -- )
                     35:    dd-buffer @ e + c@     ( Manuf )
                     36:    dd-buffer @ f + c@     ( Manuf Prod )
                     37:    dd-buffer @ 10 + c@    ( Manuf Prod Serial-Num )
                     38:    cd-buffer @ 16 + w@-le ( Manuf Prod Serial-Num ep-mps )
                     39:    cd-buffer @ 14 + c@    ( Manuf Prod Serial-Num ep-mps ep-addr )
                     40:    cd-buffer @ 1d + w@-le ( Manuf Prod Serial-Num ep-mps ep-addr ep-mps )
                     41:    cd-buffer @ 1b + c@    ( Manuf Prod Serial-Num ep-mps ep-addr ep-mps ep-addr )
                     42:    mps port-number new-device-address port-number
                     43:                         ( Manuf Prod Serial-Num ep-mps ep-addr ep-mps ep-addr 
                     44:                           mps port-num usb-addr port-num )
                     45:    new-device set-space
                     46:                         ( Manuf Prod Serial-Num ep-mps ep-addr ep-mps ep-addr
                     47:                            mps port-num usb-addr )
                     48:    encode-int s" USB-ADDRESS" property
                     49:                         ( Manuf Prod Serial-Num ep-mps ep-addr ep-mps ep-addr
                     50:                            mps port-num )
                     51:    encode-int s" reg" property
                     52:                         ( Manuf Prod Serial-Num ep-mps ep-addr ep-mps ep-addr 
                     53:                            mps )
                     54:    encode-int s" MPS-DCP" property
                     55:                         ( Manuf Prod Serial-Num ep-mps ep-addr ep-mps ep-addr )
                     56:    2 0  DO
                     57:       dup 80 and IF
                     58:          7f and encode-int
                     59:          s" BULK-IN-EP-ADDR" property
                     60:          encode-int s" MPS-BULKIN" property
                     61:       ELSE
                     62:          encode-int s" BULK-OUT-EP-ADDR" property
                     63:          encode-int s" MPS-BULKOUT" property
                     64:       THEN
                     65:    LOOP                                  ( Manuf Prod Serial-Num )
                     66:    encode-int s" iSerialNumber" property ( Manuf Prod )
                     67:    encode-int s" iProduct" property      ( Manuf )
                     68:    encode-int s" iManufacturer" property
                     69: ;
                     70: 
                     71: 
                     72: \ To classify device as hub/atapi/scsi/HID device
                     73: 
                     74: : (device-classify) 
                     75:    ( -- Interface-protocol Interface-subclass Interface-class TRUE|FALSE )
                     76:    cd-buffer @ BULK-CONFIG-DESCRIPTOR-LEN erase
                     77:    cd-buffer @ BULK-CONFIG-DESCRIPTOR-LEN mps new-device-address 
                     78:                                   ( buffer descp-len mps usb-address )
                     79:    control-std-get-configuration-descriptor
                     80:    IF
                     81:       cd-buffer @ 1+ c@           ( Descriptor-type )
                     82:       2 =   IF
                     83:          cd-buffer @ 10 + c@      ( protocol )
                     84:          cd-buffer @ f + c@       ( protocol subclass )
                     85:          cd-buffer @ e + c@       ( protocol subclass class )
                     86:          TRUE
                     87:       ELSE
                     88:          s" Not a valid configuration descriptor!!" usb-debug-print
                     89:          FALSE
                     90:       THEN
                     91:    ELSE
                     92:       s" Unable to read configuration descriptor!!" usb-debug-print
                     93:       FALSE
                     94:    THEN
                     95: ;
                     96: 
                     97: 
                     98: \ create device tree for Atapi SFF-8020 device
                     99: 
                    100: : (atapi-8020-create) ( -- )
                    101:    (atapi-scsi-property-set)
                    102:    s" usb-storage.fs" INCLUDED
                    103:    finish-device
                    104: ;
                    105: 
                    106: \ create device tree for Atapi SFF-8070 device
                    107: 
                    108: : (atapi-8070-create) ( -- )
                    109:    (atapi-scsi-property-set)
                    110:    s" usb-storage.fs" INCLUDED
                    111:    \ s" storage" device-name
                    112:    finish-device
                    113: ;
                    114: 
                    115: 
                    116: \ create device tree for SCSI device
                    117: 
                    118: : (scsi-create) ( -- )
                    119:    s" SCSI-CREATE " usb-debug-print
                    120: 
                    121: \ ***********************************************************************
                    122: \ a problem was encountered on Media-Tray (REV-0):
                    123: \ The CDROM is connected to USB via an ATA/USB-Bridge (U38: CYPRESS CY7C68300)
                    124: \ The C-Revision of this chip has an malfunction which results in a
                    125: \ hanging IORD Signal at the ATA-Interface and so prevents from reading.
                    126: \ The B-Revision doesn't have this problem (populated on Media-Tray REV-5)
                    127: \ Two additional Mass-Storage-Resets are necessary to reset the ATA-Interface.
                    128: \ (see CYPRESS Application Notes to CY7C68300)
                    129: \ (see USB-Spec: 'Bulk-Only-Transport')
                    130: \ ***********************************************************************
                    131: \ a mounted ISO image (via USB) doesn't accept this bulk-reset-command!
                    132: \ ***********************************************************************
                    133: 
                    134:    dd-buffer @ 8 + w@-le 4b4 =         \ VendorID = CYPRESS ?
                    135:    IF
                    136:       dd-buffer @ a + w@-le 6830 =     \ Device = CY7C68300 ?
                    137:       IF
                    138:        \ here a Cypress ATA/USB Bridge is detected
                    139:        d# 20 ms
                    140:        mps new-device-address 0 0 0   ( MPS fun-addr dir data-buff data-len )
                    141:        control-bulk-reset             ( TRUE|FALSE )
                    142:        d# 100 ms
                    143:        mps new-device-address 0 0 0   ( TRUE|FALSE MPS fun-addr dir data-buff data-len )
                    144:        control-bulk-reset             ( TRUE|FALSE TRUE|FALSE )
                    145:        and invert
                    146:        IF
                    147:           ."   ** BULK-RESET failed **" cr
                    148:        THEN
                    149:        d# 20 ms
                    150:       THEN
                    151:    THEN
                    152: 
                    153:    0 ch-buffer !                 \ preset a clean response
                    154:    mps new-device-address 0 ch-buffer 1 control-std-get-maxlun ( TRUE|FALSE )
                    155:    IF
                    156: \      s" GET-MAX-LUN IS WORKING :" usb-debug-print
                    157: \      ch-buffer  5 dump cr      \ dump the responsed message
                    158:    ELSE
                    159:       s" ERROR in GET-MAX-LUN " usb-debug-print
                    160:       0 ch-buffer !              \ clear invalid numbers
                    161:       cd-buffer @ 5 + c@ to temp1
                    162:       temp1 new-device-address control-std-set-configuration drop
                    163:    THEN
                    164:    \ FIXME: an IBM external HDD reported a number of 127 LUNs which could
                    165:    \        not be set up. We need to understand how to set up the device
                    166:    \        to report the correct number of LUNs.
                    167:    \        The USB Massbulk Standard 1.0 defines a maximum of 15 mult. LUNs.
                    168:    \ Workaround: Devices that might report a higher number are treated
                    169:    \             as having exactly one LUN. Without this workaround the
                    170:    \             USB scan hangs during the setup of non-available LUNs.
                    171:    \
                    172:    \ Concerns: "FUJITSU MHV2040AT" (VendorID: 0x984 / DeviceID: 0x70)
                    173:    \
                    174:    \ MR: This Device reports an invalid MaxLUN number within the first
                    175:    \ three seconds after power-on or USB-Reset. The following loop repeats
                    176:    \ the MaxLUN request up to 8 times until a valid ( <15 ) value is responded.
                    177:    \ This can last up to four seconds as there is a delay of 500ms in every loop
                    178: 
                    179:    0                       ( counter )
                    180:    begin
                    181:       dup 8 <              ( counter flag )           \ max 8 * 500 ms
                    182:       ch-buffer c@ f >     ( counter flag flag )      \ is MuxLUN above limit ?
                    183:       AND                  ( counter flag )
                    184:       while
                    185:          d# 500 ms                     \ this device is not yet ready
                    186:          0 ch-buffer !                 \ preset a clean response
                    187:          mps new-device-address 0 ch-buffer 1 control-std-get-maxlun ( TRUE|FALSE )
                    188:          not
                    189:          IF
                    190:             s"  ** ERROR in GET-MAX-LUN ** " usb-debug-print
                    191:             drop 10                    \ replace counter to force loop end
                    192:          THEN
                    193:          1+                ( counter+1 )
                    194:       repeat
                    195:    drop
                    196: 
                    197:    \ here is still the workaround to handle invalid MaxLUNs as '0'
                    198:    \
                    199:    ch-buffer c@ dup 0= swap f > or IF   
                    200:       s" + LUN: " ch-buffer c@  usb-debug-print-val
                    201:       (atapi-scsi-property-set)
                    202:       s" usb-storage.fs" INCLUDED
                    203:       finish-device
                    204: 
                    205:    ELSE
                    206:       s" - LUN: " ch-buffer c@ usb-debug-print-val
                    207:       (atapi-scsi-property-set)
                    208:       s" usb-storage-wrapper.fs" INCLUDED
                    209:       finish-device
                    210: 
                    211:    THEN
                    212: ;
                    213: 
                    214: 
                    215: \ Classify USB storage device by sub-class code
                    216: 
                    217: : (classify-storage)  ( interface-protocol interface-subclass -- )
                    218:    s" USB: Mass Storage Device Found!" usb-debug-print
                    219:    swap 50 <> IF
                    220:       s" USB storage: Protocol is not 50." usb-debug-print
                    221:       drop EXIT
                    222:    THEN
                    223:    ( interface-subclass )
                    224:    CASE
                    225:       02 OF  (atapi-8020-create) s" ATAPI Interface " usb-debug-print ENDOF
                    226:       05 OF  (atapi-8070-create) s" ATAPI Interface " usb-debug-print ENDOF
                    227:       06 OF  (scsi-create) s" SCSI Interface " usb-debug-print ENDOF
                    228:       dup OF  s" USB storage: Unsupported sub-class code." usb-debug-print ENDOF
                    229:    ENDCASE
                    230: ;
                    231: 
                    232: 
                    233: \ create keyboard device tree
                    234: 
                    235: : (keyboard-create) ( -- )
                    236:    cd-buffer @ 1f + c@                 ( ep-mps )
                    237:    cd-buffer @ 1d + c@                 ( ep-mps ep-addr )  
                    238:    mps port-number new-device-address port-number
                    239:                                         ( ep-mps ep-addr mps port-num usb-addr port-num )
                    240:    new-device set-space                 ( ep-mps ep-addr mps port-num usb-addr )
                    241:    encode-int s" USB-ADDRESS" property  ( ep-mps ep-addr mps port-num )
                    242:    encode-int s" reg" property          ( ep-mps ep-addr mps )
                    243:    encode-int s" MPS-DCP" property      ( ep-mps ep-addr )
                    244:    7f and encode-int s" INT-IN-EP-ADDR" property
                    245:    encode-int s" MPS-INTIN" property
                    246:    new-device-address   \ device-speed
                    247:    s" usb-keyboard.fs" INCLUDED
                    248:    finish-device
                    249: ;
                    250: 
                    251: : (mouse-create) ( -- )
                    252:    mps port-number new-device-address port-number
                    253:                                         ( mps port-num usb-addr port-num )
                    254:    new-device set-space                 ( mps port-num usb-addr )
                    255:    encode-int s" USB-ADDRESS" property  ( mps port-num )
                    256:    encode-int s" reg" property          ( mps )
                    257:    encode-int s" MPS-DCP" property
                    258:    s" usb-mouse.fs" INCLUDED
                    259:    finish-device
                    260: ;
                    261: 
                    262: 
                    263: \ Classify by interface class code
                    264: 
                    265: : (classify-by-interface) ( -- )
                    266:    (device-classify)  IF
                    267:       ( Interface-protocol Interface-subclass Interface-class )
                    268:       CASE
                    269:          08 OF
                    270:             ( Interface-protocol Interface-subclass )
                    271:             (classify-storage)
                    272:          ENDOF
                    273:          03 OF
                    274:                 ( Interface-protocol Interface-subclass )
                    275:                 s" USB: HID Found!" usb-debug-print
                    276:                 01 =
                    277:             IF
                    278:                         case
                    279:                            01 of
                    280:                                    s" USB keyboard!" usb-debug-print
                    281:                                    (keyboard-create)
                    282:                            endof
                    283:                            02 of
                    284:                                 s" USB mouse!" usb-debug-print
                    285:                                 (mouse-create)
                    286:                            endof
                    287:                            dup of
                    288:                                    s" USB: unsupported HID!" usb-debug-print
                    289:                            endof
                    290:                         endcase
                    291:                 ELSE
                    292:                         s" USB: unsupported HID!" usb-debug-print
                    293:                 THEN
                    294:              ENDOF
                    295:          dup OF
                    296:             ( Interface-protocol Interface-subclass )
                    297:             s" USB: unsupported interface type." usb-debug-print
                    298:             2drop
                    299:          ENDOF
                    300:       ENDCASE
                    301:    THEN
                    302: ;
                    303: 
                    304: 
                    305: \ create usb device tree depending upon classification of the device
                    306: \ after encoding apt properties
                    307: 
                    308: : create-usb-device-tree ( -- )
                    309:    dd-buffer @ DEVICE-DESCRIPTOR-DEVCLASS-OFFSET + c@    ( Device-class )
                    310:    CASE
                    311:       HUB-DEVICE-CLASS OF s" USB: HUB found"   usb-debug-print
                    312:          (hub-create)
                    313:       ENDOF
                    314:       NO-CLASS  OF
                    315:          \ In this case, the INTERFACE descriptor
                    316:          \ tells you whats what -- Refer USB spec.
                    317:          (classify-by-interface)
                    318:       ENDOF
                    319:       DUP OF
                    320:          s" USB: Unknown device found." usb-debug-print
                    321:       ENDOF
                    322:    ENDCASE
                    323:    uDOC-present 0f and to uDOC-present \ remove uDOC processing flag
                    324: ;

unix.superglobalmegacorp.com

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