Annotation of qemu/roms/SLOF/slof/fs/usb/usb-storage.fs, revision 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: \ -----------------------------------------------------------
        !            15: \ OF properties
        !            16: \ -----------------------------------------------------------
        !            17: 
        !            18: s" storage" device-name
        !            19: s" block" device-type
        !            20: 
        !            21: 2 encode-int s" #address-cells" property
        !            22: 0 encode-int s" #size-cells" property
        !            23: 
        !            24: \ -----------------------------------------------------------
        !            25: \ Specific properties
        !            26: \ -----------------------------------------------------------
        !            27: 
        !            28: 8 VALUE mps-bulk-out
        !            29: 8 VALUE mps-bulk-in
        !            30: 8 VALUE mps-dcp
        !            31: 0 VALUE bulk-in-ep
        !            32: 0 VALUE bulk-out-ep
        !            33: 0 VALUE bulk-in-toggle
        !            34: 0 VALUE bulk-out-toggle
        !            35: 0 VALUE lun
        !            36: 0 VALUE my-usb-address
        !            37: 
        !            38: 
        !            39: \ ----------------------------------------------------------
        !            40: \ Instance specific values
        !            41: \ ----------------------------------------------------------
        !            42: 
        !            43: 0  VALUE csw-buffer
        !            44: 0e VALUE cfg-buffer
        !            45: 0  VALUE response-buffer
        !            46: 0  VALUE command-buffer
        !            47: 0  VALUE resp-size
        !            48: 0  VALUE resp-buffer
        !            49: INSTANCE VARIABLE ihandle-bulk
        !            50: INSTANCE VARIABLE ihandle-deblocker
        !            51: INSTANCE VARIABLE flag
        !            52: INSTANCE VARIABLE count
        !            53: 0     VALUE max-transfer
        !            54: 200   VALUE block-size           \ default (512 Bytes)
        !            55: -1    VALUE max-block-num        \ highest reported block-number
        !            56: 
        !            57: 
        !            58: \ -------------------------------------------------------
        !            59: \ General Constants
        !            60: \ -------------------------------------------------------
        !            61: 
        !            62: 0f CONSTANT SCSI-COMMAND-OFFSET
        !            63: 
        !            64: 
        !            65: \ -------------------------------------------------------
        !            66: \ All support methods inherited from parent or imported
        !            67: \ from support packages are included here. Also included
        !            68: \ are the internal methods
        !            69: \ -------------------------------------------------------
        !            70: 
        !            71: s" usb-storage-support.fs" INCLUDED
        !            72: 
        !            73: \ ---------------------------------------------------------------
        !            74: \ COLON Definitions: Implementation of Standard SCSI commands
        !            75: \ over USB OHCI
        !            76: \ ---------------------------------------------------------------
        !            77: 
        !            78: 
        !            79: \ to use the general bulk command a lot of global variables
        !            80: \ must be set. See for example the inquiry command.
        !            81: 0 VALUE bulk-cnt
        !            82: 0 VALUE bulk-cmd-len
        !            83: 0 VALUE itest
        !            84: : do-bulk-command ( resp-buffer resp-size -- TRUE | FALSE )
        !            85:    TO resp-size
        !            86:    TO resp-buffer
        !            87:    \ dump buffer in debug-mode
        !            88:    usb-debug-flag
        !            89:    IF
        !            90:       command-buffer 0E + c@ TO bulk-cmd-len 
        !            91:       s" cmd-length: " bulk-cmd-len usb-debug-print-val
        !            92:       command-buffer bulk-cmd-len 0E + dump cr
        !            93:    THEN
        !            94: 
        !            95:    6 TO bulk-cnt \ 2 old value
        !            96:    FALSE dup
        !            97:    BEGIN
        !            98:       0=
        !            99:       WHILE
        !           100:       drop
        !           101:       \ prepare and send bulk CBW
        !           102:       1 1 bulk-out-toggle command-buffer 1f mps-bulk-out
        !           103:                ( pt ed-type toggle buffer length mps-bulk-out )
        !           104:       my-usb-address bulk-out-ep 7 lshift or
        !           105:                ( pt ed-type toggle buffer length mps address )
        !           106:       rw-endpoint swap                      ( TRUE toggle | FALSE toggle )
        !           107:       to bulk-out-toggle                ( TRUE | FALSE )
        !           108:       IF
        !           109:          s" resp-size : " resp-size usb-debug-print-val
        !           110:          resp-size 0<>
        !           111:          IF       \ do we need a response ?!
        !           112:                   \ read the bulk response
        !           113:             0 1 bulk-in-toggle resp-buffer resp-size mps-bulk-in
        !           114:                      ( pt ed-type toggle buffer length mps-bulk-in )
        !           115:             my-usb-address bulk-in-ep 7 lshift or
        !           116:                      ( pt ed-type toggle buffer length mps address )
        !           117:             rw-endpoint swap                       ( TRUE toggle | FALSE toggle )
        !           118:             to bulk-in-toggle                      ( TRUE | FALSE )
        !           119:          ELSE
        !           120:             TRUE
        !           121:          THEN
        !           122:          IF               \ read the bulk CSW
        !           123:             0 1 bulk-in-toggle csw-buffer D mps-bulk-in
        !           124:                      ( pt ed-type toggle buffer length mps-bulk-in )
        !           125:             my-usb-address bulk-in-ep 7 lshift or
        !           126:                      ( pt ed-type toggle buffer length mps address )
        !           127:             rw-endpoint swap                    ( TRUE toggle | FALSE toggle )
        !           128:             to bulk-in-toggle                   ( TRUE | FALSE )
        !           129:             IF
        !           130:                    s" Command successful." usb-debug-print
        !           131:                    TRUE dup
        !           132:             ELSE
        !           133:                s" Command failed in CSW stage" usb-debug-print
        !           134:                    FALSE dup
        !           135:             THEN
        !           136:          ELSE
        !           137:             s" Command failed while receiving DATA... read CSW..." usb-debug-print
        !           138:             \ STALLED: Get CSW to send the CBW again
        !           139:             0 1 bulk-in-toggle csw-buffer D mps-bulk-in
        !           140:                      ( pt ed-type toggle buffer length mps-bulk-in )
        !           141:             my-usb-address bulk-in-ep 7 lshift or
        !           142:                      ( pt ed-type toggle buffer length mps address )
        !           143:             rw-endpoint swap                    ( TRUE toggle | FALSE toggle )
        !           144:             to bulk-in-toggle                   ( TRUE | FALSE )
        !           145:             IF
        !           146:                    s" OK evaluate the CSW ..." usb-debug-print
        !           147:                csw-buffer c + c@ dup TO itest
        !           148:                    s" CSW Status: " itest usb-debug-print-val
        !           149:                    dup
        !           150:                2 =
        !           151:                IF \ Phase Error
        !           152:                       s" Phase error do a bulk reset-recovery ..." usb-debug-print
        !           153:                   bulk-out-ep bulk-in-ep my-usb-address
        !           154:                   bulk-reset-recovery-procedure
        !           155:                THEN
        !           156:                \ ELSE
        !           157:                    \ don't abort if the read fails.
        !           158:                    1 =
        !           159:                IF \ Command failed
        !           160:                   s" Command Failed do a bulk-reset-recovery" usb-debug-print
        !           161:                   bulk-out-ep bulk-in-ep my-usb-address
        !           162:                   bulk-reset-recovery-procedure
        !           163:                THEN
        !           164:                 THEN
        !           165:             FALSE dup
        !           166:          THEN
        !           167:       ELSE
        !           168:          s" Command failed while Sending CBW ..." usb-debug-print
        !           169:          FALSE dup
        !           170:       THEN
        !           171:       bulk-cnt 1 - TO bulk-cnt
        !           172:       bulk-cnt 0=
        !           173:       IF
        !           174:          2drop FALSE dup
        !           175:       THEN
        !           176:    REPEAT
        !           177: ;
        !           178: 
        !           179: 
        !           180: \ ---------------------------------------------------------------
        !           181: \ Method to 1. Send the INQUIRY command 2. Receive and analyse
        !           182: \ (pending) INQUIRY data
        !           183: \ ---------------------------------------------------------------
        !           184: scsi-open
        !           185: usb-debug-flag to scsi-param-debug  \ copy debug flag
        !           186: 
        !           187: 24 CONSTANT inquiry-length    \ was 20
        !           188: 
        !           189: : inquiry ( -- )
        !           190:    s" usb-storage: inquiry" usb-debug-print
        !           191:    command-buffer 1 inquiry-length 80 lun scsi-length-inquiry
        !           192:    ( address tag transfer-len direction lun command-len )
        !           193:    build-cbw
        !           194:    inquiry-length command-buffer SCSI-COMMAND-OFFSET +   ( alloc-len address  )
        !           195:    scsi-build-inquiry
        !           196:    response-buffer inquiry-length erase      \ provide clean buffer
        !           197:    response-buffer inquiry-length do-bulk-command
        !           198:    IF
        !           199:      s" Successfully read INQUIRY data" usb-debug-print
        !           200:      0d emit space space
        !           201:      response-buffer c@  \ get 'Peripheral Device Type' (PDT)
        !           202:      CASE
        !           203:         0   OF ." BLOCK-DEV: " ENDOF  \ SCSI Block Device
        !           204:         5   OF ." CD-ROM   : " ENDOF
        !           205:         7   OF ." OPTICAL  : " ENDOF
        !           206:         e   OF ." RED-BLOCK: " ENDOF  \ SCSI Reduced Block Device
        !           207:         dup dup OF ." ? (" . 8 emit 29 emit 2 spaces ENDOF
        !           208:      ENDCASE
        !           209:      space
        !           210:      \ create vendor identification in device property
        !           211:      response-buffer 8 + 16 encode-string s" ident-str" property
        !           212:      response-buffer .inquiry-text
        !           213:    ELSE
        !           214:      5040 error" (USB) Device transaction error. (inquiry)"
        !           215:      ABORT
        !           216:    THEN
        !           217: ;
        !           218: 
        !           219: \ ---------------------------------------------------------------
        !           220: \ Method to 1. Send the READ CAPACITY command
        !           221: \           2. Recieve and analyse the response data
        !           222: \ ---------------------------------------------------------------
        !           223: 
        !           224: : read-capacity ( -- )
        !           225:    s" usb-storage: read-capacity" usb-debug-print
        !           226:    command-buffer 1 8  80 lun  scsi-length-read-cap-10
        !           227:    ( address tag transfer-len direction lun command-len )
        !           228:    build-cbw 
        !           229:    \ command-buffer 30 dump cr      \ dump the command buffer
        !           230:    command-buffer SCSI-COMMAND-OFFSET +      ( address )   
        !           231:    scsi-build-read-cap-10
        !           232:    lun 5 lshift
        !           233:    command-buffer SCSI-COMMAND-OFFSET +      ( address )
        !           234:    read-cap-10>reserved1 c!
        !           235: 
        !           236:    response-buffer 8 erase          \ provide clean buffer
        !           237:    response-buffer 8 do-bulk-command
        !           238:    IF
        !           239:      s" Successfully read READ CAPACITY data" usb-debug-print
        !           240:    ELSE
        !           241:      5040 error" (USB) Device transaction error. (capacity)"
        !           242:      ABORT
        !           243:    THEN
        !           244: ;
        !           245: 
        !           246: 
        !           247: \ -------------------------------------------------------------------
        !           248: \ Method to 1. Send TEST UNIT READY command 2. Analyse the status
        !           249: \ of the response
        !           250: \ -------------------------------------------------------------------
        !           251: 
        !           252: : test-unit-ready ( -- TRUE | FALSE )
        !           253:    command-buffer 1 0 80 lun scsi-length-test-unit-ready    \ was: 0c
        !           254:    ( address tag transfer-len direction lun command-len )
        !           255:    build-cbw
        !           256:    command-buffer SCSI-COMMAND-OFFSET +      ( address )
        !           257:    scsi-build-test-unit-ready                ( cdb -- )
        !           258:    response-buffer 0 do-bulk-command
        !           259:    IF
        !           260:      s" Successfully read test unit ready data" usb-debug-print
        !           261:      s" Test Unit STATUS availabe in csw-buffer" usb-debug-print
        !           262:      csw-buffer 0c + c@ 0=  IF
        !           263:        s" Test Unit Command Successfully Executed" usb-debug-print
        !           264:        TRUE                             ( TRUE )
        !           265:      ELSE
        !           266:        s" Test Unit Command Failed to execute" usb-debug-print
        !           267:        FALSE                            ( FALSE )
        !           268:      THEN
        !           269:    ELSE
        !           270:      \ TRUE ABORT" USB device transaction error. (test-unit-ready)"
        !           271:       5040 error" (USB) Device transaction error. (test-unit-ready)"
        !           272:       ABORT
        !           273:    THEN
        !           274: ;
        !           275: 
        !           276: \ ****************************************************
        !           277: \ multiple checks of 'test-unit-ready' with timeout
        !           278: \ ****************************************************
        !           279: : wait-for-unit-ready            ( -- TRUE|FALSE )
        !           280:    s" --> WAIT: test-unit-ready ... " usb-debug-print
        !           281:    d# 100                        ( count )   \ up to 10 seconds
        !           282:    BEGIN                         ( count )
        !           283:       dup 0>                     ( count flag )
        !           284:       test-unit-ready      \ dup IF 2b ELSE 2d THEN emit
        !           285:       not and    ( count flag )
        !           286:       WHILE
        !           287:       1-                         ( count )
        !           288:       d# 100 wait-proceed        \ wait 100 ms
        !           289:    REPEAT                        ( count )
        !           290:    0=
        !           291:    IF
        !           292:       s" **  Device not ready **  " usb-debug-print
        !           293:       FALSE
        !           294:    ELSE
        !           295:       TRUE
        !           296:    THEN
        !           297: ;
        !           298: 
        !           299: 
        !           300: \ -------------------------------------------------
        !           301: \ Method to 1. read sense data 2. analyse sesnse
        !           302: \ data(pending)
        !           303: \ ------------------------------------------------
        !           304: 
        !           305: : request-sense ( -- )
        !           306:    s" request-sense: Command ready." usb-debug-print
        !           307:    command-buffer 1 12 80 lun scsi-length-request-sense
        !           308:    ( address tag transfer-len direction lun command-len )
        !           309:    build-cbw
        !           310: \ -scsi-supp-   command-buffer SCSI-COMMAND-OFFSET + 12   ( address alloc-len )
        !           311: \ -scsi-supp-   build-request-sense
        !           312: 
        !           313:    12 command-buffer SCSI-COMMAND-OFFSET +   ( alloc-len cdb )
        !           314:    scsi-build-request-sense                  ( alloc-len cdb -- )
        !           315: 
        !           316:    response-buffer 12 do-bulk-command
        !           317:    IF
        !           318:       s" Read Sense data successfully" usb-debug-print
        !           319:       \   response-buffer 12 dump cr      \ dump the rsponsed message
        !           320:    ELSE
        !           321:      \ TRUE ABORT" USB device transaction error. (request-sense)"
        !           322:      5040 error" (USB) Device transaction error. (request-sense)"
        !           323:      ABORT
        !           324:    THEN
        !           325: ;
        !           326: 
        !           327: : start ( -- )
        !           328:    command-buffer 1 0 80 lun scsi-length-start-stop-unit
        !           329:    ( address tag transfer-len direction lun command-len )
        !           330:    build-cbw
        !           331: \ -scsi-supp-   command-buffer SCSI-COMMAND-OFFSET +  ( address )
        !           332: \ -scsi-supp-   build-start
        !           333: 
        !           334:    command-buffer SCSI-COMMAND-OFFSET +            ( cdb )
        !           335:    scsi-const-start scsi-build-start-stop-unit     ( state# cdb -- )
        !           336: 
        !           337:    response-buffer 0 do-bulk-command
        !           338:    IF
        !           339:      s" Start successfully" usb-debug-print
        !           340:    ELSE
        !           341:      \ TRUE ABORT" USB device transaction error. (start)"
        !           342:      5040 error" (USB) Device transaction error. (start)"
        !           343:      ABORT
        !           344:    THEN
        !           345: ;
        !           346: 
        !           347: 
        !           348: \ To transmit SCSI Stop command
        !           349: 
        !           350: : stop ( -- )
        !           351:    command-buffer 1 0 80 lun scsi-length-start-stop-unit
        !           352:    ( address tag transfer-len direction lun command-len )
        !           353:    build-cbw
        !           354: \ -scsi-supp-   command-buffer SCSI-COMMAND-OFFSET +      ( address )
        !           355: \ -scsi-supp-   build-stop
        !           356: 
        !           357:    command-buffer SCSI-COMMAND-OFFSET +         ( cdb )
        !           358:    scsi-const-stop scsi-build-start-stop-unit   ( state# cdb -- )
        !           359: 
        !           360:    response-buffer 0 do-bulk-command
        !           361:    IF
        !           362:      s" Stop successfully" usb-debug-print
        !           363:    ELSE
        !           364:      \ TRUE ABORT" USB device transaction error. (stop)"
        !           365:      5040 error" (USB) Device transaction error. (stop)"
        !           366:      ABORT
        !           367:    THEN
        !           368: ;
        !           369: 
        !           370: 
        !           371: 0 VALUE temp1
        !           372: 0 VALUE temp2
        !           373: 0 VALUE temp3
        !           374: 
        !           375: 
        !           376: \ -------------------------------------------------------------
        !           377: \          block device's seek
        !           378: \ -------------------------------------------------------------
        !           379: \ if anything is wrong in the boot device, a seek-request can
        !           380: \ occur that exceeds the limits of the device in the following
        !           381: \ read-command. So checking is required and the appropriate
        !           382: \ return-value has to be returned
        !           383: \ Spec requires -1 if operation fails and 0 or 1 if it succeeds !!
        !           384: \ -------------------------------------------------------------
        !           385: 
        !           386: : seek ( pos-lo pos-hi -- status )
        !           387:    2dup lxjoin max-block-num block-size * >
        !           388:    IF
        !           389:       ." ** Seek Error: pos too large ("
        !           390:       dup . over . ." -> " max-block-num block-size * .
        !           391:       ." ) ** " cr
        !           392:       -1                   \ see spec-1275 page 183
        !           393:    ELSE
        !           394:       s" seek" ihandle-deblocker @ $call-method
        !           395:    THEN
        !           396: ;
        !           397: 
        !           398: 
        !           399: \ -------------------------------------------------------------
        !           400: \          block device's read
        !           401: \ -------------------------------------------------------------
        !           402: 
        !           403: : read ( address length -- actual )
        !           404:    s" read" ihandle-deblocker @  $call-method
        !           405: ;
        !           406: 
        !           407: 
        !           408: \ -------------------------------------------------------------
        !           409: \         read-blocks to be used by deblocker
        !           410: \ -------------------------------------------------------------
        !           411: : read-blocks ( address block# #blocks -- #read-blocks )
        !           412:    2dup + max-block-num >
        !           413:    IF
        !           414:       ." ** Requested block too large "
        !           415:       2dup + ." (" .d ." -> " max-block-num .d
        !           416:       bs emit ." ) ... read aborted **" cr
        !           417:       nip nip                       \ leave #blocks on stack
        !           418:    ELSE
        !           419:       block-size * command-buffer  ( address block# transfer-len command-buffer )
        !           420:       1 2 pick 80 lun 0c build-cbw ( address block# transfer-len )
        !           421:       dup to temp1                 ( address block# transfer-len )
        !           422:       block-size /                 ( address block# #blocks )
        !           423:       command-buffer               ( address block# #blocks command-addr )
        !           424:       SCSI-COMMAND-OFFSET +        ( address block# #blocks cdb )
        !           425:       scsi-build-read?                     ( block# #blocks cdb -- length )
        !           426:       command-buffer 0e + c!       \ update bCBWCBLength-field with resulting CDB length
        !           427:       temp1                        ( address length )
        !           428:       do-bulk-command
        !           429:       IF
        !           430:         s" Read  data successfully" usb-debug-print
        !           431:       ELSE
        !           432:         \ TRUE ABORT" USB device transaction error. (read-blocks)"
        !           433:         5040 error" (USB) Device transaction error. (read-blocks)"
        !           434:         ABORT
        !           435:       THEN
        !           436:       temp1 block-size /  ( #read-blocks )
        !           437:    THEN
        !           438: ;
        !           439: 
        !           440: \ ------------------------------------------------
        !           441: \ To bring the the media to seekable and readable
        !           442: \ condition.
        !           443: \ ------------------------------------------------
        !           444: 
        !           445: d# 800 CONSTANT media-ready-retry
        !           446: 
        !           447: : make-media-ready ( -- )
        !           448:    s" usb-storage: make-media-ready" usb-debug-print
        !           449:    0  flag !
        !           450:    0  count !
        !           451:    BEGIN
        !           452:       flag @  0=
        !           453:    WHILE
        !           454:       test-unit-ready IF
        !           455:          s" Media ready for access." usb-debug-print
        !           456:          1  flag !
        !           457:       ELSE
        !           458:          count @  1 +  count !
        !           459:          count @ media-ready-retry = IF
        !           460:             1 flag !
        !           461:             5000 error" (USB) Media or drive not ready for this blade."
        !           462:             ABORT
        !           463:          THEN
        !           464:          request-sense
        !           465:          response-buffer scsi-get-sense-ID? ( addr -- false | sense-ID true )
        !           466:          IF
        !           467:             ffff00 AND     \ remaining: sense-key ASC
        !           468:             CASE
        !           469:                023a00 OF   \ MEDIUM NOT PRESENT (02 3a 00)
        !           470:                   5010 error" (USB) No Media found! Check for the drawer/inserted media."
        !           471:                   ABORT
        !           472:                ENDOF
        !           473: 
        !           474:                020400 OF   \ LOGICAL DRIVE NOT READY - INITIALIZATION REQUIRED
        !           475:                   5010 error" (USB) No Media found! Check for the drawer/inserted media."
        !           476:                   ABORT
        !           477:                ENDOF
        !           478: 
        !           479:                033000 OF   \ CANNOT READ MEDIUM - UNKNOWN FORMAT
        !           480:                   5020 error" (USB) Unknown media format."
        !           481:                   ABORT
        !           482:                ENDOF
        !           483:             ENDCASE
        !           484:          THEN
        !           485:       THEN
        !           486:       d# 10 ms             \ wait maximum 10ms * 800 (=8s)
        !           487:    REPEAT
        !           488:    usb-debug-flag IF
        !           489:       ." make-media-ready finished after "
        !           490:       count @ decimal . hex ." tries." cr
        !           491:    THEN
        !           492: ;
        !           493: 
        !           494: \ ------------------------------------------------
        !           495: \ read and show devices capacity
        !           496: \ ------------------------------------------------
        !           497: : .showcap
        !           498:    space
        !           499:    test-unit-ready drop             \ initial command
        !           500:    request-sense
        !           501:    response-buffer scsi-get-sense-ID? ( addr -- false | sense-ID true )
        !           502:    IF
        !           503:       dup FFFF00 and 023a00 =       ( sense-id flag )
        !           504:       IF
        !           505:          uDOC-failure?
        !           506:          023a02 =                   \ see sense-codes SPC-3 clause 4.5.6
        !           507:          IF
        !           508:             ."  Tray Open!"
        !           509:          ELSE
        !           510:             ."    No Media"
        !           511:          THEN
        !           512:       ELSE                          ( sense-id )
        !           513:          drop
        !           514:          wait-for-unit-ready
        !           515:          IF
        !           516:             read-capacity
        !           517:             response-buffer scsi-get-capacity-10 space .capacity-text
        !           518:          ELSE
        !           519:             request-sense
        !           520:             response-buffer scsi-get-sense-ID? ( addr -- false | sense-ID true )
        !           521:             IF
        !           522:                dup ff0000 and 040000 =       \ sense-code = 4 ?
        !           523:                IF
        !           524:                   ." *HW-ERROR*"
        !           525:                   uDOC-failure?
        !           526:                ELSE
        !           527:                   dup FFFF00 and 023a00 = IF uDOC-failure? THEN
        !           528:                   CASE              ( sense-ID )
        !           529:                      \ see SPC-3 clause 4.5.6
        !           530:                      023a00 OF ."   No Media " ENDOF
        !           531:                      023a02 OF ." Tray Open! " ENDOF
        !           532:                      dup    OF ."          ? " ENDOF
        !           533:                   ENDCASE
        !           534:                THEN
        !           535:             THEN
        !           536:          THEN
        !           537:       THEN
        !           538:    ELSE
        !           539:       ."       ??   "
        !           540:    THEN
        !           541: ;
        !           542: 
        !           543: 
        !           544: 
        !           545: : init-dev-ready
        !           546:    test-unit-ready drop
        !           547:    4 >r                \ loop-counter
        !           548:    0 0
        !           549:    BEGIN
        !           550:       2drop
        !           551:       request-sense
        !           552:       response-buffer scsi-get-sense-data ( ascq asc sense-key )
        !           553:       0<>  r> 1- dup >r 0<> AND          \ loop-counter or sense-key
        !           554:       WHILE
        !           555:    REPEAT
        !           556:    2drop
        !           557:    r> drop
        !           558: ;
        !           559: 
        !           560: 
        !           561: 
        !           562: scsi-close        \ no further scsi words required
        !           563: 
        !           564: 
        !           565: \ Set up the block-size of the device, using the READ CAPACITY command.
        !           566: \ Note: Media must be ready (=> make-media-ready) or READ CAPACITY
        !           567: \ might fail!
        !           568: 
        !           569: : (init-block-size)
        !           570:    read-capacity
        !           571:    response-buffer l@ dup 0<>
        !           572:    IF
        !           573:       to max-block-num        \ highest block-number
        !           574:    ELSE
        !           575:       -1 to max-block-num     \ indeterminate
        !           576:    THEN
        !           577:    response-buffer 4 + 
        !           578:    l@ to block-size
        !           579:    s" usb-storage: block-size=" block-size usb-debug-print-val
        !           580: ;
        !           581: 
        !           582: 
        !           583: \ Standard OF methods
        !           584: 
        !           585: : open ( -- TRUE )
        !           586:    s" usb-storage: open" usb-debug-print
        !           587:    ihandle-bulk s" bulk" (open-package)
        !           588: 
        !           589:    make-media-ready
        !           590:    (init-block-size)           \ Init block-size before opening the deblocker
        !           591: 
        !           592:    ihandle-deblocker s" deblocker" (open-package)
        !           593: 
        !           594:    s" disk-label" find-package IF  ( phandle )
        !           595:       usb-debug-flag IF ." my-args for disk-label = " my-args swap . . cr THEN
        !           596:       my-args rot interpose
        !           597:    THEN
        !           598:    TRUE                        ( TRUE )
        !           599: ;
        !           600: 
        !           601: 
        !           602: : close  ( -- )
        !           603:    ihandle-deblocker (close-package)
        !           604:    ihandle-bulk (close-package)
        !           605: ;
        !           606: 
        !           607: 
        !           608: \ Set device name according to type
        !           609: 
        !           610: : (init-device-name)  ( -- )
        !           611:    init-dev-ready
        !           612:    inquiry
        !           613:    response-buffer c@
        !           614:    CASE
        !           615:       1  OF .showcap s" tape"    device-name ENDOF
        !           616:       5  OF .showcap s" cdrom"   device-name s" CDROM found" usb-debug-print ENDOF
        !           617:       0  OF .showcap s" sbc-dev" device-name s" SBC Direct access device" usb-debug-print ENDOF
        !           618:       7  OF .showcap s" optical" device-name s" Optical memory found" usb-debug-print ENDOF
        !           619:       0E OF .showcap s" rbc-dev" device-name s" RBC direct acces device found" usb-debug-print ENDOF
        !           620:       \ dup OF s" storage" device-name ENDOF
        !           621:    ENDCASE
        !           622: ;
        !           623: 
        !           624: 
        !           625: \ Initial device node setup
        !           626: 
        !           627: : (initial-setup)
        !           628:    ihandle-bulk s" bulk" (open-package)
        !           629:    device-init
        !           630:    (init-device-name)
        !           631:    set-drive-alias
        !           632:    200 to block-size       \ Default block-size, will be overwritten in "open"
        !           633:    10000 to max-transfer
        !           634:    
        !           635:    ihandle-bulk (close-package)
        !           636: ;
        !           637: 
        !           638: (initial-setup)
        !           639: 

unix.superglobalmegacorp.com

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