⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbhost.tcl

📁 eCos操作系统源码
💻 TCL
📖 第 1 页 / 共 2 页
字号:
# {{{  Banner						#===============================================================================##    usbhost.tcl##    Support for USB testing##===============================================================================#####ECOSGPLCOPYRIGHTBEGIN###### -------------------------------------------## This file is part of eCos, the Embedded Configurable Operating System.## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.#### eCos is free software; you can redistribute it and/or modify it under## the terms of the GNU General Public License as published by the Free## Software Foundation; either version 2 or (at your option) any later version.#### eCos is distributed in the hope that it will be useful, but WITHOUT ANY## WARRANTY; without even the implied warranty of MERCHANTABILITY or## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License## for more details.#### You should have received a copy of the GNU General Public License along## with eCos; if not, write to the Free Software Foundation, Inc.,## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.#### As a special exception, if other files instantiate templates or use macros## or inline functions from this file, or you compile this file and link it## with other works to produce a work based on this file, this file does not## by itself cause the resulting work to be covered by the GNU General Public## License. However the source code for this file must still be made available## in accordance with section (3) of the GNU General Public License.#### This exception does not invalidate any other reasons why a work based on## this file might be covered by the GNU General Public License.#### Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.## at http://sources.redhat.com/ecos/ecos-license/## -------------------------------------------#####ECOSGPLCOPYRIGHTEND#####===============================================================================######DESCRIPTIONBEGIN###### Author(s):	bartv# Date:		2001-07-04# Purpose:      To provide higher-level utility commands for performing#               USB testing, and to iterate through the various test scripts#               specified on the command line.######DESCRIPTIONEND#####===============================================================================## }}}# {{{  Endpoint data					# Given the raw endpoint data provided by the C code, turn# it something more usable from inside Tcl scripts.namespace eval usbtest {    array set control {}    variable bulk_in_endpoints [list]    array set bulk_in {}    variable bulk_out_endpoints [list]    array set bulk_out {}        variable isochronous_in_endpoints [list]    array set isochronous_in {}    variable isochronous_out_endpoints [list]    array set isochronous_out {}    variable interrupt_in_endpoints [list]    array set interrupt_in {}    variable interrupt_out_endpoints [list]    array set interrupt_out {}    for { set i 0 } { $i < $usbtest::endpoint_count } { incr i } {	switch -- $usbtest::endpoint_data($i,type) {	    "control" {		set usbtest::control(min_size) $usbtest::endpoint_data($i,min_size)		set usbtest::control(max_size) $usbtest::endpoint_data($i,max_size)	    }	    "bulk" {		set number $usbtest::endpoint_data($i,number)		if { "in" == $usbtest::endpoint_data($i,direction) } {		    lappend usbtest::bulk_in_endpoints $number		    set usbtest::bulk_in($number,min_size)		$usbtest::endpoint_data($i,min_size)		    set usbtest::bulk_in($number,max_size)		$usbtest::endpoint_data($i,max_size)		    set usbtest::bulk_in($number,max_in_padding)	$usbtest::endpoint_data($i,max_in_padding)		    set usbtest::bulk_in($number,devtab)		$usbtest::endpoint_data($i,devtab)		} else {		    lappend usbtest::bulk_out_endpoints $number		    set usbtest::bulk_out($number,min_size)		$usbtest::endpoint_data($i,min_size)		    set usbtest::bulk_out($number,max_size)		$usbtest::endpoint_data($i,max_size)		    set usbtest::bulk_out($number,devtab)		$usbtest::endpoint_data($i,devtab)		}	    }	    "isochronous" {		set number $usbtest::endpoint_data($i,number)		if { "in" == $usbtest::endpoint_data($i,direction) } {		    lappend usbtest::isochronous_in_endpoints $number		    set usbtest::isochronous_in($number,min_size)	$usbtest::endpoint_data($i,min_size)		    set usbtest::isochronous_in($number,max_size)	$usbtest::endpoint_data($i,max_size)		    set usbtest::isochronous_in($number,devtab)		$usbtest::endpoint_data($i,devtab)		} else {		    lappend usbtest::isochronous_out_endpoints $number		    set usbtest::isochronous_out($number,min_size)	$usbtest::endpoint_data($i,min_size)		    set usbtest::isochronous_out($number,max_size)	$usbtest::endpoint_data($i,max_size)		    set usbtest::isochronous_out($number,devtab)	$usbtest::endpoint_data($i,devtab)		}	    }	    "interrupt" {		set number $usbtest::endpoint_data($i,number)		if { "in" == $usbtest::endpoint_data($i,direction) } {		    lappend usbtest::interrupt_in_endpoints $number		    set usbtest::interrupt_in($number,min_size)		$usbtest::endpoint_data($i,min_size)		    set usbtest::interrupt_in($number,max_size)		$usbtest::endpoint_data($i,max_size)		    set usbtest::interrupt_in($number,devtab)		$usbtest::endpoint_data($i,devtab)		} else {		    lappend usbtest::interrupt_out_endpoints $number		    set usbtest::interrupt_out($number,min_size)	$usbtest::endpoint_data($i,min_size)		    set usbtest::interrupt_out($number,max_size)	$usbtest::endpoint_data($i,max_size)		    set usbtest::interrupt_out($number,devtab)		$usbtest::endpoint_data($i,devtab)		}	    }	    default {		puts stderr "Internal error: invalid endpoint type $usbtest::endpoint_data($i,type)"		exit 1	    }	}    }}# }}}# {{{  Constants					# The C code expects to receive certain data as simple numbers,# corresponding to #define's in common.c and elsewhere. Strictly# speaking it would be better to pass strings to the C code and# have it do the translation, thus ensuring that these constants# exist in only one place.namespace eval usbtest {    variable _USB_DIR_IN        0x0080    variable _DATA_NONE		     0    variable _DATA_BYTE_FILL	     1    variable _DATA_WORD_FILL	     2    variable _DATA_BYTE_GEN	     3    variable _DATA_WORD_GEN	     4    variable _IO_MECHANISM_USB	     1    variable _IO_MECHANISM_DEV	     2}# It is also desirable to have some constants corresponding# to common random number generators.namespace eval usbtest {    variable MULTIPLIER        1103515245    variable INCREMENT              12345}# }}}# {{{  Argument processing                              # ----------------------------------------------------------------------------# Given a list of arguments of the form "xyzzy=123" or "xyzzy 123", and# an array arguments containing entries such as arguments(xyzzy) and# already filled in with default values, update the array using the# actual argumentsnamespace eval usbtest {    proc process_arguments { list array_ref } {	upvar $array_ref array	array set defined_args [list]	set listlen [llength $list]	for { set index 0 } { $index < $listlen } { incr index } {	    set arg [lindex $list $index]	    set found 0	    foreach name [array names array] {		set len [string length $name]		if { [string equal -length $len $name $arg] } {		    # Partial match found.		    if { [string equal $name $arg] } {			# Exact match found, The value must be the next arg.			if { [info exists defined_args($name)] } {			    error "Argument $name should be specified only once"			}			incr index			if { $index >= $listlen } {			    error "Missing value after argument $name"			}			set array($name) [lindex $list $index]			set found 1			break		    }		    # Not an exact match. Try looking for x=y		    incr len		    if { [string equal -length $len "$name=" $arg] } {			if { [info exists defined_args($name)] } {			    error "Argument $name should be specified only once"			}			set array($name) [string range $arg $len end]			set found 1			break		    }		}	    }	    if { ! $found } {		error "Invalid argument $arg"	    }	}    }}# }}}# {{{  Starting and ending tests			# This section deals with starting tests, or cleaning up when the# tests cannot actually proceed. Also there is some validation,# for example to make sure that no endpoint number is used for# multiple tests.namespace eval usbtest {    variable results    variable _tests_submitted 0    variable _control_endpoint_in_use 0    variable _in_endpoints_in_use [list]    variable _out_endpoints_in_use [list]        proc reset { } {	if { 0 != $usbtest::_tests_submitted } {	    usbtest::_cancel	    set usbtest::_tests_submitted 0	    	}	set usbtest::_in_endpoints_in_use [list]	set usbtest::_out_endpoints_in_use [list]    }    proc use_endpoint { endpoint direction } {	if { 0 == $endpoint } {	    if { $usbtest::_control_endpoint_in_use } {		error "Attempt to run multiple tests on the control endpoint"	    }	    set usbtest::_control_endpoint_in_use 1	} else {	    switch -- $direction {		"in" {		    if { -1 != [lsearch -exact $usbtest::_in_endpoints_in_use $endpoint] } {			error "Attempt to run multiple IN tests on endpoint $endpoint"		    }		    lappend usbtest::_in_endpoints_in_use $endpoint		}		"out" {		    if { -1 != [lsearch -exact $usbtest::_out_endpoints_in_use $endpoint] } {			error "Attempt to run multiple OUT tests on endpoint $endpoint"		    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -