aboutsummaryrefslogtreecommitdiff
path: root/slof/fs/packages/scsi.fs
diff options
context:
space:
mode:
Diffstat (limited to 'slof/fs/packages/scsi.fs')
-rw-r--r--slof/fs/packages/scsi.fs183
1 files changed, 183 insertions, 0 deletions
diff --git a/slof/fs/packages/scsi.fs b/slof/fs/packages/scsi.fs
new file mode 100644
index 0000000..3d40700
--- /dev/null
+++ b/slof/fs/packages/scsi.fs
@@ -0,0 +1,183 @@
+\ *****************************************************************************
+\ * Copyright (c) 2004, 2007 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
+\ ****************************************************************************/
+
+s" scsi" device-name
+
+
+\ Standard Open Firmware method
+
+: open true ;
+
+
+\ Standard Open Firmware method
+
+: close ;
+
+
+\ Temporary pointer to SCSI command area
+
+0 VALUE command
+
+
+\ Temporary pointer to SCSI response Buffer
+
+0 VALUE response
+
+
+\ Builds SCSI READ command in the buffer
+\ This method will take starting Address as an input
+
+: build-read ( address lba #blocks -- )
+ 2 pick to command
+ command 0c erase
+ dup 7fff < IF
+ \ Use READ (10) command - understood by all devices
+ 28 command c! ( address lba #blocks )
+ command 7 + w! ( address lba ) \ Set transfer length
+ command 2 + l! ( address ) \ Set logical block address
+ ELSE
+ \ Use READ (12) command - needed for large #blocks
+ A8 command c! ( address lba #blocks )
+ command 2 + l! ( address lba ) \ Set transfer length
+ command 6 + l! ( address ) \ Set logical block address
+ THEN
+ drop
+;
+
+
+\ Builds SCSI MODE-SENSE command in the Buffer
+\ This method will take the starting address as an input
+
+: build-mode-sense ( address alloc-len page-code page-control -- )
+ 3 pick to command ( address alloc-len page-code page-control )
+ command 0c erase ( address alloc-len page-code page-control )
+ 6 lshift or command 2 + c! ( address alloc-len )
+ swap 7 + w! \ Configure allocation length
+;
+
+
+\ Builds READ CAPACITY command in the buffer
+
+: build-read-capacity ( address -- )
+ TO command
+ command 0c erase \ Clear buffer
+ 25 command c! \ set Opcode
+;
+
+
+\ Builds SCSI TEST-UNIT-READY command in the Buffer
+\ This method will take the starting address as an input
+
+: build-test-unit-ready ( address -- ) TO command command 0c erase ;
+
+
+\ Builds SCSI INQUIRY command in the Buffer
+\ This method will take the starting address as an input
+
+: build-inquiry ( address alloc-len -- )
+ swap TO command ( alloc-len )
+ command 0c erase ( alloc-len )
+ command 4 + c! \ Set allocation length
+ 12 command c! \ set Opcode
+;
+
+
+\ Analyse response of build-inquiry command
+
+: return-inquiry ( address -- verson peripheral-type )
+ TO response
+ response 3 + c@ 4 rshift ( version# ) \ SCSI version num
+ response c@ ( version# peripheral-device-type )
+;
+
+
+\ Builds SCSI REQUEST-SENSE command in the Buffer
+\ This method will take the starting address as an input
+
+: build-request-sense ( address alloc-len -- )
+ swap TO command ( alloc-len )
+ command 0c erase ( alloc-len )
+ 03 command c! ( alloc-len)
+ command 4 + c! \ Configure the allocation length
+;
+
+
+\ Analyse reply of REQUEST-SENSE command in the Buffer
+\ This method will take Starting address as an input
+
+: return-request-sense ( address -- false|ascq asc sense-key true )
+ TO response
+ response c@ 71
+ = response c@ 70 = or IF ( TRUE | FALSE )
+ response 0D + c@ ( ASCQ ) \ additional sense code qualifier
+ response 0c + c@ ( ASCQ ASC) \ additional sense code
+ response 2 + c@ ( ASCQ ASC sense-key ) \ sense key error descriptor
+ TRUE ( ASCQ ASC sense-key TRUE )
+ ELSE
+ FALSE ( FALSE )
+ THEN
+;
+
+
+\ Builds SCSI SEEK command in the Buffer
+\ This method will take the starting address as an input
+
+: build-seek ( address lba -- )
+ swap TO command ( lba )
+ command 0c erase ( lba )
+ 2b command c! ( lba ) \ Configure the Opcode
+ command 2 + l! \ Configure the logical block address
+;
+
+
+\ Builds SCSI LOAD command in the Buffer
+\ This method will take the starting address as an input
+
+\ : build-load ( address -- )
+\ TO command
+\ command 0c erase
+\ 1b command c! \ Cofigure opcode
+\ 03 command 4 + c! \ configure load bit and start bit
+\ ;
+
+
+\ Builds SCSI UNLOAD command in the Buffer
+\ This method will take the starting address as an input
+
+\ : build-unload ( address -- )
+\ to command
+\ command 0c erase
+\ 1b command c! \ Configure Opcode
+\ 02 command 4 + c! \ Configure unload bit and start bit
+\ ;
+
+
+\ Builds SCSI START command in the Buffer
+\ This method will take the starting address as an input
+
+: build-start ( address -- )
+ TO command
+ command 0c erase
+ 1b command c! \ Configure Opcode
+ 01 command 4 + c!
+;
+
+
+\ Builds SCSI STOP command in the Buffer
+\ This method will take the starting address as an input
+
+: build-stop ( address -- )
+ TO command
+ command 0c erase
+ 1b command c! \ Configure Opcode
+;
+