usbhost.tcl
来自「开放源码实时操作系统源码.」· TCL 代码 · 共 532 行 · 第 1/2 页
TCL
532 行
lappend usbtest::_out_endpoints_in_use $endpoint
}
default {
error "Invalid direction passed to usbtest::use_endpoint"
}
}
}
}
proc test_submitted { } {
incr usbtest::_tests_submitted
}
proc start { timeout } {
set result 0
if { 0 == $usbtest::_tests_submitted } {
error "Attempt to start tests when no tests are scheduled to run."
} elseif { ! [string is integer -strict $timeout] } {
error "Invalid timeout specified, it should be a simple number."
} else {
set usbtest::results [list]
set result [usbtest::_run $timeout]
set usbtest::_tests_submitted 0
set usbtest::_control_endpoint_in_use 0
array unset _in_endpoints_in_use
array unset _out_endpoints_in_use
}
return $result
}
}
# }}}
# {{{ Bulk tests
# Prepare to run a bulk test.
#
# This test requires rather a lot of parameters, many of which
# will have sensible defaults.
namespace eval usbtest {
proc bulktest { endpoint direction number_packets args } {
# Parameters to be passed to the C code. Most are
# held in an array indexed by the option name,
# facilitating command-line parsing.
set arguments(format) "none"
set arguments(data1) 0
set arguments(data*) 1
set arguments(data+) 0
set arguments(data1*) 1
set arguments(data1+) 0
set arguments(data**) 1
set arguments(data*+) 0
set arguments(data+*) 1
set arguments(data++) 0
set arguments(mechanism) "usb"
set arguments(txsize1) 32
set arguments(txsize>=) 0
set arguments(txsize<=) -1
set arguments(txsize*) 1
set arguments(txsize/) 1
set arguments(txsize+) 0
set arguments(rxsize1) 0
set arguments(rxsize>=) 0
set arguments(rxsize<=) -1
set arguments(rxsize*) 1
set arguments(rxsize/) 1
set arguments(rxsize+) 0
set arguments(txdelay1) 0
set arguments(txdelay>=) 0
set arguments(txdelay<=) 1000000000
set arguments(txdelay*) 1
set arguments(txdelay/) 1
set arguments(txdelay+) 0
set arguments(rxdelay1) 0
set arguments(rxdelay>=) 0
set arguments(rxdelay<=) 1000000000
set arguments(rxdelay*) 1
set arguments(rxdelay/) 1
set arguments(rxdelay+) 0
set endpoint_param ""
# Target limits
set target_min_size 0
set target_max_size 0
set target_padding 0
set target_devtab ""
# Start by validating the endpoint and direction arguments.
# Also check that the specified endpoint is not yet in use.
if { ![string is integer -strict $endpoint] } {
error "Invalid endpoint argument \"$endpoint\": should be a number"
}
if { ($endpoint < 1) || ($endpoint > 15) } {
error "Invalid bulk endpoint argument \"$endpoint\": should be between 1 and 15"
}
switch -- $direction {
"in" -
"In" -
"IN" {
set direction "in"
if { -1 == [lsearch -exact $usbtest::bulk_in_endpoints $endpoint] } {
error "Invalid bulk endpoint argument \"$endpoint\": the target does not list that as a bulk IN endpoint"
}
set target_min_size $usbtest::bulk_in($endpoint,min_size)
set target_max_size $usbtest::bulk_in($endpoint,max_size)
set target_padding $usbtest::bulk_in($endpoint,max_in_padding)
set target_devtab $usbtest::bulk_in($endpoint,devtab);
set endpoint_param [expr $endpoint | $usbtest::_USB_DIR_IN]
}
"out" -
"Out" -
"OUT" {
set direction "out"
if { -1 == [lsearch -exact $usbtest::bulk_out_endpoints $endpoint] } {
error "Invalid bulk endpoint argument \"$endpoint\": the target does not list that as a bulk OUT endpoint"
}
set target_min_size $usbtest::bulk_out($endpoint,min_size)
set target_max_size $usbtest::bulk_out($endpoint,max_size)
set target_devtab $usbtest::bulk_out($endpoint,devtab);
set target_padding 0; # Not applicable
set endpoint_param $endpoint
}
default {
error "Invalid direction argument \"$direction\": should be \"in\" or \"out\""
}
}
# Now parse any remaining arguments
usbtest::process_arguments $args arguments
# Convert two of the arguments from strings to numbers, for the
# convenience of the C code
switch -- $arguments(format) {
"none" { set arguments(format) $usbtest::_DATA_NONE }
"bytefill" { set arguments(format) $usbtest::_DATA_BYTE_FILL }
"wordfill" { set arguments(format) $usbtest::_DATA_WORD_FILL }
"byteseq" { set arguments(format) $usbtest::_DATA_BYTE_GEN }
"wordseq" { set arguments(format) $usbtest::_DATA_WORD_GEN }
default {
error "Invalid data format argument \"$arguments(data)\"\n \
Should be \"none\", \"bytefill\", \"wordfill\", \"byteseq\" or \"wordseq\""
}
}
switch -- $arguments(mechanism) {
"usb" { set arguments(mechanism) $usbtest::_IO_MECHANISM_USB }
"devtab" { set arguments(mechanism) $usbtest::_IO_MECHANISM_DEV }
default {
error "Invalid mechanism argument \"$arguments(mechanism)\"\n \
Should be \"usb\" or \"devtab\""
}
}
puts "validating fields"
# Validate the remaining fields
foreach field [list data1 data* data+ data1* data1+ data** data*+ data+* data++ \
txsize1 txsize>= txsize<= txsize* txsize/ txsize+ \
rxsize1 rxsize>= rxsize<= rxsize* rxsize/ rxsize+ \
txdelay1 txdelay>= txdelay<= txdelay* txdelay/ txdelay+ \
rxdelay1 rxdelay>= rxdelay<= rxdelay* rxdelay/ rxdelay+] {
if { ![string is integer -strict $arguments($field)] } {
error "Invalid value \"$arguments($field)\" for argument $field, should be an integer."
}
}
if { $arguments(txsize>=) < $target_min_size } {
set arguments(txsize>=) $target_min_size
}
if { (-1 == $arguments(txsize<=) ) || ($arguments(txsize<=) > $target_max_size) } {
set arguments(txsize<=) $target_max_size
}
if { $arguments(rxsize<=) == -1 } {
set arguments(rxsize<=) $target_max_size
}
if { $arguments(txsize1) < $arguments(txsize>=) } {
set arguments(txsize1) $arguments(txsize>=)
}
# Make sure the endpoint is not already in use
usbtest::use_endpoint $endpoint $direction
puts "Submitting test"
# Now submit the test. This is handled by C code.
usbtest::_test_bulk \
$number_packets \
$endpoint_param \
$arguments(txsize1) \
$arguments(txsize>=) \
$arguments(txsize<=) \
$arguments(txsize*) \
$arguments(txsize/) \
$arguments(txsize+) \
$arguments(rxsize1) \
$arguments(rxsize>=) \
$arguments(rxsize<=) \
$arguments(rxsize*) \
$arguments(rxsize/) \
$arguments(rxsize+) \
$target_padding \
$arguments(txdelay1) \
$arguments(txdelay>=) \
$arguments(txdelay<=) \
$arguments(txdelay*) \
$arguments(txdelay/) \
$arguments(txdelay+) \
$arguments(rxdelay1) \
$arguments(rxdelay>=) \
$arguments(rxdelay<=) \
$arguments(rxdelay*) \
$arguments(rxdelay/) \
$arguments(rxdelay+) \
$arguments(mechanism) \
$arguments(format) \
$arguments(data1) \
$arguments(data*) \
$arguments(data+) \
$arguments(data1*) \
$arguments(data1+) \
$arguments(data**) \
$arguments(data*+) \
$arguments(data+*) \
$arguments(data++)
test_submitted
}
}
# }}}
# {{{ Execute the specified test script
# Interpret the arguments as a test script plus auxiliary data.
set script [lindex $::argv 0]
set ::argv [lrange $::argv 1 end]
set result [catch {
set path [file join [pwd] $script]
if { ![file exists $path] } {
set path "$path.tcl"
if { ![file exists $path] } {
set path [file join $usbtest::USBAUXDIR $script]
if { ![file exists $path] } {
set path "$path.tcl"
if { ![file exists $path] } {
error "Error: unknown test script $script"
}
}
}
}
source $path
} message]
if { 0 != $result } {
puts $message
}
# }}}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?