Files

672 lines
14 KiB
Plaintext

seti $printhelp = $printhelp
seti $help = $help
if $help = 1
echo 'usb test 3.'
echo 'Example: opensuperclone --tool -f usb_test3'
if $printhelp = 1
exit 0
endif
echo 'Hit ENTER to continue...'
userinput $choicestring
previousscript
endif
# set a blank string variable to compare with user input
# make sure not to set this anyplace else
sets $null = ""
# requesttype
seti $USB_DIR_OUT = 0
seti $USB_ENDPOINT_OUT = 0x02
seti $USB_DIR_IN = 0x80
seti $USB_ENDPOINT_IN = 0x81
seti $USB_TYPE_CLASS = 0x21
#seti $USB_ENDPOINT_OUT = 0x0a
#seti $USB_ENDPOINT_IN = 0x8b
# cbw csw signature
seti $cbwsig1 = 0x55
seti $cbwsig2 = 0x53
seti $cbwsig3 = 0x42
seti $cbwsig4 = 0x43
# cbw csw tag (remember to increment for each command)
seti $cbwtag = 1
gosub setcbwtag
# cbw data transfer length (remember to set before each command)
seti $cbwdatalen = 0
gosub setcbwdatalen
# cbw transfer direction (remember to set before each command)
seti $cbwflags = $USB_DIR_IN
# cbw command length (remember to set before each command)
seti $cbwcommandlen = 0
usbtimeout 6000
seti $sectorsize = 512
seti $usbrequesttype = 0
seti $usbrequest = 0
seti $usbvalue = 0
seti $usbindex = 0
usbbuffersize 8
while 1 = 1
echo " "
echo "usb mass storage test functions"
echo "q) Quit"
echo "p) Previous menu"
echo "h) Toggle script help
echo "1) identify"
echo "2) read 10"
echo "3) bulk only reset"
echo "4) endpoint in reset"
echo "5) endpoint out reset"
echo "6) reset recovery"
echo "7) get endpoint status"
echo "8) soft reset 12"
echo "9) hard reset 12"
echo "10) request sense"
echo "11) usb reset"
echo "12) inquiry"
echo "13) read capacity 10"
echo "14) read capacity 16"
echo "15) read 6"
echo "16) get csw"
if $printhelp = 1
exit 0
endif
echo "Enter your choice:
userinput $choicestring
if $choicestring = q
break
elseif $choicestring = p
previousscript
elseif $choicestring = h
if $help = 0
seti $help = 1
echo "Help is now turned on"
else
seti $help = 0
echo "Help is now turned off"
endif
elseif $choicestring = 1
gosub testidentify
elseif $choicestring = 2
gosub read10
elseif $choicestring = 3
gosub bulkreset
elseif $choicestring = 4
gosub endpointinreset
elseif $choicestring = 5
gosub endpointoutreset
elseif $choicestring = 6
gosub resetrecovery
elseif $choicestring = 7
gosub getendpointstatus
elseif $choicestring = 8
gosub softreset12
elseif $choicestring = 9
gosub hardreset12
elseif $choicestring = 10
gosub requestsense
elseif $choicestring = 11
gosub dousbreset
elseif $choicestring = 12
gosub testinquiry
elseif $choicestring = 13
gosub readcapacity10
elseif $choicestring = 14
gosub readcapacity16
elseif $choicestring = 15
gosub read6
elseif $choicestring = 16
gosub getcsw
else
echo "bad choice= " $choicestring
endif
done
end
subroutine setcbwtag
seti $cbwtag1 = $cbwtag & 0xff
seti $cbwtag2 = $cbwtag > 8
seti $cbwtag2 = $cbwtag2 & 0xff
seti $cbwtag3 = $cbwtag > 16
seti $cbwtag3 = $cbwtag3 & 0xff
seti $cbwtag4 = $cbwtag > 24
seti $cbwtag4 = $cbwtag4 & 0xff
endsubroutine
subroutine setcbwdatalen
seti $cbwdatalen1 = $cbwdatalen & 0xff
seti $cbwdatalen2 = $cbwdatalen > 8
seti $cbwdatalen2 = $cbwdatalen2 & 0xff
seti $cbwdatalen3 = $cbwdatalen > 16
seti $cbwdatalen3 = $cbwdatalen3 & 0xff
seti $cbwdatalen4 = $cbwdatalen > 24
seti $cbwdatalen4 = $cbwdatalen4 & 0xff
endsubroutine
subroutine bulkreset
seti $usbrequesttype = 0x21
seti $usbrequest = 0xff
seti $usbvalue = 0
seti $usbindex = 0
usbbuffersize 0
sendusbcontrolmsg $usbrequesttype $usbrequest $usbvalue $usbindex
echo "bulk reset return=" $usb_return_status
endsubroutine
subroutine endpointinreset
seti $usbrequesttype = 0x02
seti $usbrequest = 0x01
seti $usbvalue = 0
seti $usbindex = $USB_ENDPOINT_IN
usbbuffersize 0
sendusbcontrolmsg $usbrequesttype $usbrequest $usbvalue $usbindex
echo "reset in return=" $usb_return_status
endsubroutine
subroutine endpointoutreset
seti $usbrequesttype = 0x02
seti $usbrequest = 0x01
seti $usbvalue = 0
seti $usbindex = $USB_ENDPOINT_OUT
usbbuffersize 0
sendusbcontrolmsg $usbrequesttype $usbrequest $usbvalue $usbindex
echo "reset out return=" $usb_return_status
endsubroutine
subroutine resetrecovery
gosub bulkreset
gosub endpointinreset
gosub endpointoutreset
endsubroutine
subroutine getendpointstatus
seti $usbrequesttype = 0x82
seti $usbrequest = 0
seti $usbvalue = 0
seti $usbindex = 0
usbbuffersize 2
#sendusbcontrolmsg $usbrequesttype $usbrequest $usbvalue $usbindex
#printusbbuffer 0 2
#echo "endpoint 0 status return=" $usb_return_status
seti $usbindex = $USB_ENDPOINT_IN
sendusbcontrolmsg $usbrequesttype $usbrequest $usbvalue $usbindex
seti $endpointinstatus = usbbuffer 0 w
printusbbuffer 0 2
echo "endpoint in status return=" $usb_return_status "
seti $usbindex = $USB_ENDPOINT_OUT
sendusbcontrolmsg $usbrequesttype $usbrequest $usbvalue $usbindex
seti $endpointoutstatus = usbbuffer 0 w
printusbbuffer 0 2
echo "endpoint out status return=" $usb_return_status
endsubroutine
subroutine autoreset
gosub getendpointstatus
if $endpointinstatus != 0
gosub endpointinreset
endif
if $endpointoutstatus != 0
gosub endpointoutreset
endif
endsubroutine
subroutine testidentify
usbbuffersize 31
setusbbuffer 0
0x55 0x53 0x42 0x43 0x2f 1 0 0
0 2 0 0 0x80 0 0x0c 0xa1
8 0x2e 0 0 0 0 0 0xa0
0xec 0 0 0 0 0 0
endusbbuffer
usbrawwrite
echo "write cbw return=" $usb_return_status
usbbuffersize 512
usbrawread
echo "read data return=" $usb_return_status
printusbbuffer 0 512
usbbuffersize 13
usbrawread
echo "read csw return=" $usb_return_status
printusbbuffer 0 13
endsubroutine
subroutine testinquiry
seti $datasize = 0x2c
usbbuffersize 31
setusbbuffer 0
0x55 0x53 0x42 0x43 0x2f 1 0 0
$datasize 0 0 0 0x80 0 0x06 0x12
0 0 0 $datasize 0 0 0 0
0 0 0 0 0 0 0
endusbbuffer
usbrawwrite
echo "write cbw return=" $usb_return_status
usbbuffersize $datasize
usbrawread
echo "read data return=" $usb_return_status
printusbbuffer 0 $datasize
usbbuffersize 13
usbrawread
if $usb_return_status != 13
gosub endpointinreset
usbbuffersize 13
usbrawread
endif
echo "read csw return=" $usb_return_status
endsubroutine
subroutine readcapacity10
seti $datasize = 8
usbbuffersize 31
setusbbuffer 0
0x55 0x53 0x42 0x43 8 6 4 2
$datasize 0 0 0 0x80 0 0x0a 0x25
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
endusbbuffer
usbrawwrite
echo "write cbw return=" $usb_return_status
usbbuffersize $datasize
usbrawread
echo "read data return=" $usb_return_status
printusbbuffer 0 $datasize
if $datasize != $usb_return_status
gosub autoreset
endif
usbbuffersize 13
usbrawread
echo "read csw return=" $usb_return_status
printusbbuffer 0 13
endsubroutine
subroutine readcapacity16
seti $datasize = 32
usbbuffersize 31
setusbbuffer 0
0x55 0x53 0x42 0x43 8 6 4 2
$datasize 0 0 0 0x80 0 0x10 0x9e
0x10 0 0 0 0 0 0 0
0 0 0 0 $datasize 0 0
endusbbuffer
usbrawwrite
echo "write cbw return=" $usb_return_status
usbbuffersize $datasize
usbrawread
echo "read data return=" $usb_return_status
printusbbuffer 0 $datasize
if $datasize != $usb_return_status
gosub autoreset
endif
usbbuffersize 13
usbrawread
echo "read csw return=" $usb_return_status
printusbbuffer 0 13
endsubroutine
subroutine read10
seti $sector = 0
seti $count = 1
seti $sectorsize = 512
seti $lba1 = $sector & 0xff
seti $lba2 = $sector > 8
seti $lba2 = $lba2 & 0xff
seti $lba3 = $sector > 16
seti $lba3 = $lba3 & 0xff
seti $lba4 = $sector > 24
seti $lba4 = $lba4 & 0xff
seti $lba5 = $sector > 32
seti $lba5 = $lba5 & 0xff
seti $lba6 = $sector > 40
seti $lba6 = $lba6 & 0xff
seti $lba7 = $sector > 48
seti $lba7 = $lba7 & 0xff
seti $lba8 = $sector > 56
seti $lba8 = $lba8 & 0xff
seti $cnt1 = $count & 0xff
seti $cnt2 = $count > 8
seti $cnt2 = $cnt2 & 0xff
seti $cnt3 = $count > 16
seti $cnt3 = $cnt3 & 0xff
seti $cnt4 = $count > 24
seti $cnt4 = $cnt4 & 0xff
seti $cbwtag = $cbwtag + 1
gosub setcbwtag
seti $cbwdatalen = $count * $sectorsize
gosub setcbwdatalen
seti $cbwflags = $USB_DIR_IN
seti $cbwcommandlen = 10
seti $cbwcommand1 = 0x28
seti $cbwcommand2 = 0
seti $cbwcommand3 = $lba4
seti $cbwcommand4 = $lba3
seti $cbwcommand5 = $lba2
seti $cbwcommand6 = $lba1
seti $cbwcommand7 = 0
seti $cbwcommand8 = $cnt2
seti $cbwcommand9 = $cnt1
seti $cbwcommand10 = 0
seti $cbwcommand11 = 0
seti $cbwcommand12 = 0
seti $cbwcommand13 = 0
seti $cbwcommand14 = 0
seti $cbwcommand15 = 0
seti $cbwcommand16 = 0
gosub setcbwbuffer
gettime
echo $date
printusbbuffer 0 31
usbrawwrite
echo "write cbw return=" $usb_return_status
usbbuffersize $cbwdatalen
gettime
echo $date
usbrawread
echo "read data return=" $usb_return_status
if $usb_return_status != $cbwdatalen
echo "read error, performing in reset"
gosub endpointinreset
endif
seti $cswsuccess = 0
seti $cswgood = 0
gosub getcsw
if $cswgood = 0
echo "failed to get valid csw"
elseif $cswsuccess = 0
echo "csw reports error"
endif
endsubroutine
subroutine read6
seti $sector = 0
seti $count = 1
seti $sectorsize = 512
seti $lba1 = $sector & 0xff
seti $lba2 = $sector > 8
seti $lba2 = $lba2 & 0xff
seti $lba3 = $sector > 16
seti $lba3 = $lba3 & 0xff
seti $lba4 = $sector > 24
seti $lba4 = $lba4 & 0xff
seti $lba5 = $sector > 32
seti $lba5 = $lba5 & 0xff
seti $lba6 = $sector > 40
seti $lba6 = $lba6 & 0xff
seti $lba7 = $sector > 48
seti $lba7 = $lba7 & 0xff
seti $lba8 = $sector > 56
seti $lba8 = $lba8 & 0xff
seti $cnt1 = $count & 0xff
seti $cnt2 = $count > 8
seti $cnt2 = $cnt2 & 0xff
seti $cnt3 = $count > 16
seti $cnt3 = $cnt3 & 0xff
seti $cnt4 = $count > 24
seti $cnt4 = $cnt4 & 0xff
seti $cbwtag = $cbwtag + 1
gosub setcbwtag
seti $cbwdatalen = $count * $sectorsize
gosub setcbwdatalen
seti $cbwflags = $USB_DIR_IN
seti $cbwcommandlen = 6
seti $cbwcommand1 = 0x08
seti $cbwcommand2 = $lba3
seti $cbwcommand3 = $lba2
seti $cbwcommand4 = $lba1
seti $cbwcommand5 = $cnt1
seti $cbwcommand6 = 0
seti $cbwcommand7 = 0
seti $cbwcommand8 = 0
seti $cbwcommand9 = 0
seti $cbwcommand10 = 0
seti $cbwcommand11 = 0
seti $cbwcommand12 = 0
seti $cbwcommand13 = 0
seti $cbwcommand14 = 0
seti $cbwcommand15 = 0
seti $cbwcommand16 = 0
gosub setcbwbuffer
gettime
echo $date
printusbbuffer 0 31
usbrawwrite
echo "write cbw return=" $usb_return_status
usbbuffersize $cbwdatalen
gettime
echo $date
usbrawread
echo "read data return=" $usb_return_status
if $usb_return_status != $cbwdatalen
echo "read error, performing in reset"
gosub endpointinreset
endif
seti $cswsuccess = 0
seti $cswgood = 0
gosub getcsw
if $cswgood = 0
echo "failed to get valid csw"
elseif $cswsuccess = 0
echo "csw reports error"
endif
endsubroutine
subroutine getcsw
usbbuffersize 13
usbrawread
echo "read csw return=" $usb_return_status
if $usb_return_status = 13
printusbbuffer 0 13
seti $cswsig = usbbuffer 0 dw
if $cswsig = 0x53425355
echo "good cswsig"
seti $cswgood = 1
seti $cswstatus = usbbuffer 12 b
if $cswstatus = 0
echo "csw success"
seti $cswsuccess = 1
else
echo "csw fail"
endif
else
echo "bad cswsig"
endif
else
echo "bad cswsig"
endif
endsubroutine
subroutine softreset12
seti $cbwcommand2 = 0x02
gosub reset12
endsubroutine
subroutine hardreset12
seti $cbwcommand2 = 0x00
gosub reset12
endsubroutine
subroutine reset12
seti $cbwtag = $cbwtag + 1
gosub setcbwtag
seti $cbwdatalen = 0
gosub setcbwdatalen
seti $cbwflags = $USB_DIR_IN
seti $cbwcommandlen = 12
seti $cbwcommand1 = 0xa1
seti $cbwcommand3 = 0
seti $cbwcommand4 = 0
seti $cbwcommand5 = 0
seti $cbwcommand6 = 0
seti $cbwcommand7 = 0
seti $cbwcommand8 = 0
seti $cbwcommand9 = 0
seti $cbwcommand10 = 0
seti $cbwcommand11 = 0
seti $cbwcommand12 = 0
seti $cbwcommand13 = 0
seti $cbwcommand14 = 0
seti $cbwcommand15 = 0
seti $cbwcommand16 = 0
gosub setcbwbuffer
gettime
echo $date
printusbbuffer 0 31
usbrawwrite
echo "write cbw return=" $usb_return_status
seti $cswsuccess = 0
seti $cswgood = 0
gosub getcsw
if $cswgood = 0
echo "failed to get valid csw"
elseif $cswsuccess = 0
echo "csw reports error"
endif
gettime
echo $date
endsubroutine
subroutine setcbwbuffer
usbbuffersize 31
setusbbuffer 0
$cbwsig1 $cbwsig2 $cbwsig3 $cbwsig4
$cbwtag1 $cbwtag2 $cbwtag3 $cbwtag4
$cbwdatalen1 $cbwdatalen2 $cbwdatalen3 $cbwdatalen4
$cbwflags
0
$cbwcommandlen
$cbwcommand1 $cbwcommand2 $cbwcommand3 $cbwcommand4
$cbwcommand5 $cbwcommand6 $cbwcommand7 $cbwcommand8
$cbwcommand9 $cbwcommand10 $cbwcommand11 $cbwcommand12
$cbwcommand13 $cbwcommand14 $cbwcommand15 $cbwcommand16
endusbbuffer
endsubroutine
subroutine requestsense
seti $cbwtag = $cbwtag + 1
gosub setcbwtag
seti $cbwdatalen = 18
gosub setcbwdatalen
seti $cbwflags = $USB_DIR_IN
seti $cbwcommandlen = 6
seti $cbwcommand1 = 0x03
seti $cbwcommand2 = 0
seti $cbwcommand3 = 0
seti $cbwcommand4 = 0
seti $cbwcommand5 = 18
seti $cbwcommand6 = 0
gosub setcbwbuffer
printusbbuffer 0 31
usbrawwrite
echo "write cbw return=" $usb_return_status
usbbuffersize $cbwdatalen
usbrawread
echo "read data return=" $usb_return_status
if $usb_return_status > 0
if $usb_return_status > $cbwdatalen
echo "error: return is greater than expected size"
else
printusbbuffer 0 $cbwdatalen
seti $cswsuccess = 0
seti $cswgood = 0
gosub getcsw
if $cswgood = 0
echo "failed to get valid csw"
elseif $cswsuccess = 0
echo "csw reports error"
seti $badread = 1
endif
endif
endif
endsubroutine
subroutine dousbreset
usbreset
endsubroutine
previousscript
end