]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - doc/html/ref/usbs-testing.html
RedBoot TX53 Release 2012-02-15
[karo-tx-redboot.git] / doc / html / ref / usbs-testing.html
1 <!-- Copyright (C) 2003 Red Hat, Inc.                                -->
2 <!-- This material may be distributed only subject to the terms      -->
3 <!-- and conditions set forth in the Open Publication License, v1.0  -->
4 <!-- or later (the latest version is presently available at          -->
5 <!-- http://www.opencontent.org/openpub/).                           -->
6 <!-- Distribution of the work or derivative of the work in any       -->
7 <!-- standard (paper) book form is prohibited unless prior           -->
8 <!-- permission is obtained from the copyright holder.               -->
9 <HTML
10 ><HEAD
11 ><TITLE
12 >Testing</TITLE
13 ><meta name="MSSmartTagsPreventParsing" content="TRUE">
14 <META
15 NAME="GENERATOR"
16 CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
17 "><LINK
18 REL="HOME"
19 TITLE="eCos Reference Manual"
20 HREF="ecos-ref.html"><LINK
21 REL="UP"
22 TITLE="eCos USB Slave Support"
23 HREF="io-usb-slave.html"><LINK
24 REL="PREVIOUS"
25 TITLE="Writing a USB Device Driver"
26 HREF="usbs-writing.html"><LINK
27 REL="NEXT"
28 TITLE="eCos Support for Developing USB-ethernet Peripherals"
29 HREF="io-usb-slave-eth.html"></HEAD
30 ><BODY
31 CLASS="REFENTRY"
32 BGCOLOR="#FFFFFF"
33 TEXT="#000000"
34 LINK="#0000FF"
35 VLINK="#840084"
36 ALINK="#0000FF"
37 ><DIV
38 CLASS="NAVHEADER"
39 ><TABLE
40 SUMMARY="Header navigation table"
41 WIDTH="100%"
42 BORDER="0"
43 CELLPADDING="0"
44 CELLSPACING="0"
45 ><TR
46 ><TH
47 COLSPAN="3"
48 ALIGN="center"
49 >eCos Reference Manual</TH
50 ></TR
51 ><TR
52 ><TD
53 WIDTH="10%"
54 ALIGN="left"
55 VALIGN="bottom"
56 ><A
57 HREF="usbs-writing.html"
58 ACCESSKEY="P"
59 >Prev</A
60 ></TD
61 ><TD
62 WIDTH="80%"
63 ALIGN="center"
64 VALIGN="bottom"
65 ></TD
66 ><TD
67 WIDTH="10%"
68 ALIGN="right"
69 VALIGN="bottom"
70 ><A
71 HREF="io-usb-slave-eth.html"
72 ACCESSKEY="N"
73 >Next</A
74 ></TD
75 ></TR
76 ></TABLE
77 ><HR
78 ALIGN="LEFT"
79 WIDTH="100%"></DIV
80 ><H1
81 ><A
82 NAME="USBS-TESTING">Testing</H1
83 ><DIV
84 CLASS="REFNAMEDIV"
85 ><A
86 NAME="AEN16868"
87 ></A
88 ><H2
89 >Name</H2
90 >Testing&nbsp;--&nbsp;Testing of USB Device Drivers</DIV
91 ><DIV
92 CLASS="REFSECT1"
93 ><A
94 NAME="AEN16871"
95 ></A
96 ><H2
97 >Introduction</H2
98 ><P
99 >The support for USB testing provided by the eCos USB common slave
100 package is somewhat different in nature from the kind of testing used
101 in many other packages. One obvious problem is that USB tests cannot
102 be run on just a bare target platform: instead the target platform
103 must be connected to a suitable USB host machine, and that host
104 machine must be running appropriate software for the test code to
105 interact with. This is very different from say a kernel test which
106 typically will have no external dependencies. Another important
107 difference between USB testing and say a C library
108 <TT
109 CLASS="FUNCTION"
110 >strcmp</TT
111 > test is sensitivity to timing and to
112 hardware boundary conditions: although a simple test case that just
113 performs a small number of USB transfers is better than no testing at
114 all, it should also be possible to run tests for hours or days on end,
115 under a variety of loads. In order to provide the required
116 functionality the basic architecture of the USB testing support is as
117 follows: </P
118 ><P
119 ></P
120 ><OL
121 TYPE="1"
122 ><LI
123 ><P
124 >    There is a single target-side program
125     <SPAN
126 CLASS="APPLICATION"
127 >usbtarget</SPAN
128 >. By default when this is run
129     on a target platform it will appear to do nothing. In fact it is
130     waiting to be contacted by another program
131     <SPAN
132 CLASS="APPLICATION"
133 >usbhost</SPAN
134 > which will tell it what test or
135     tests to run. <SPAN
136 CLASS="APPLICATION"
137 >usbtarget</SPAN
138 > provides
139     mechanisms for running a wide range of tests.
140   </P
141 ></LI
142 ><LI
143 ><P
144 >    <SPAN
145 CLASS="APPLICATION"
146 >usbtarget</SPAN
147 > is a generic program, but USB
148     testing depends to some extent on the functionality provided by the
149     hardware. For example there is no point in testing bulk transmits
150     to endpoint 12 if the target hardware does not support an endpoint
151     12. Therefore each USB device driver should supply information about
152     what the hardware is actually capable of, in the form of an array of
153     <SPAN
154 CLASS="STRUCTNAME"
155 >usbs_testing_endpoint</SPAN
156 > data structures.
157   </P
158 ></LI
159 ><LI
160 ><P
161 >    There is a single host-side program
162     <SPAN
163 CLASS="APPLICATION"
164 >usbhost</SPAN
165 >, which acts as a counterpart to
166     <SPAN
167 CLASS="APPLICATION"
168 >usbtarget</SPAN
169 >. Again
170     <SPAN
171 CLASS="APPLICATION"
172 >usbhost</SPAN
173 > has no built-in knowledge of
174     the test or tests that are supposed to run, it only provides
175     mechanisms for running a wide range of tests. On start-up
176     <SPAN
177 CLASS="APPLICATION"
178 >usbhost</SPAN
179 > will search the USB bus for
180     hardware running the target-side program, specifically a USB device
181     that identifies itself as the product <TT
182 CLASS="LITERAL"
183 >&quot;Red Hat eCos
184     USB test&quot;</TT
185 >.
186   </P
187 ></LI
188 ><LI
189 ><P
190 >    <SPAN
191 CLASS="APPLICATION"
192 >usbhost</SPAN
193 > contains a Tcl interpreter, and
194     will execute any Tcl scripts specified on the command line
195     together with appropriate arguments. The Tcl interpreter has been
196     extended with various commands such as
197     <TT
198 CLASS="LITERAL"
199 >usbtest::bulktest</TT
200 >, so the script can perform
201     the desired test or tests.
202   </P
203 ></LI
204 ><LI
205 ><P
206 >    Adding a new test simply involves writing a short Tcl script that
207     invokes the appropriate USB-specific commands. Running multiple
208     tests involves passing appropriate arguments to
209     <SPAN
210 CLASS="APPLICATION"
211 >usbhost</SPAN
212 >, or alternatively writing a
213     single script that just invokes other scripts.
214   </P
215 ></LI
216 ></OL
217 ><P
218 >The current implementation of <SPAN
219 CLASS="APPLICATION"
220 >usbhost</SPAN
221 >
222 depends heavily on functionality provided by the Linux kernel and in
223 particular the usbdevfs support. It uses
224 <TT
225 CLASS="FILENAME"
226 >/proc/bus/usb/devices</TT
227 > to find out what devices
228 are attached to the bus, and will then access the device by opening
229 <TT
230 CLASS="FILENAME"
231 >/proc/bus/usb/xxx/yyy</TT
232 > and performing
233 <TT
234 CLASS="FUNCTION"
235 >ioctl</TT
236 > operations. This allows USB testing to take
237 place without having to write a new host-side device driver, but
238 getting the code working on host machines not running Linux would
239 obviously be problematical.</P
240 ></DIV
241 ><DIV
242 CLASS="REFSECT1"
243 ><A
244 NAME="AEN16904"
245 ></A
246 ><H2
247 >Building and Running the Target-side Code</H2
248 ><P
249 >The target-side component of the USB testing software consists of a
250 single program <SPAN
251 CLASS="APPLICATION"
252 >usbtarget</SPAN
253 > which contains
254 support for a range of different tests, under the control of host-side
255 software. This program is not built by default alongside other eCos
256 test cases since it will only operate in certain environments,
257 specifically when the target board's connector is plugged into a Linux
258 host, and when the appropriate host-side software has been installed
259 on that host. Instead the user must enable a configuration option
260 <TT
261 CLASS="LITERAL"
262 >CYGBLD_IO_USB_SLAVE_USBTEST</TT
263 > to add the program to
264 the list of tests for the current configuration.</P
265 ><P
266 >Starting the <SPAN
267 CLASS="APPLICATION"
268 >usbtarget</SPAN
269 > program does not
270 require anything unusual, so it can be run in a normal
271 <SPAN
272 CLASS="APPLICATION"
273 >gdb</SPAN
274 > session just like any eCos application.
275 After initialization the program will wait for activity from the host.
276 Depending on the hardware, the Linux host will detect that a new USB
277 peripheral is present on the bus either when the
278 <SPAN
279 CLASS="APPLICATION"
280 >usbtarget</SPAN
281 > initialization is complete or
282 when the cable between target and host is connected. The host will
283 perform the normal USB enumeration sequence and discover that the
284 peripheral does not match any known vendor or product id and that
285 there is no device driver for <TT
286 CLASS="LITERAL"
287 >&quot;Red Hat eCos USB
288 test&quot;</TT
289 >, so it will ignore the peripheral. When the
290 <SPAN
291 CLASS="APPLICATION"
292 >usbhost</SPAN
293 > program is run on the host it will
294 connect to the target-side software, and testing can now commence.</P
295 ></DIV
296 ><DIV
297 CLASS="REFSECT1"
298 ><A
299 NAME="AEN16915"
300 ></A
301 ><H2
302 >Building and Running the Host-side Code</H2
303 ><DIV
304 CLASS="NOTE"
305 ><BLOCKQUOTE
306 CLASS="NOTE"
307 ><P
308 ><B
309 >Note: </B
310 >In theory the host-side software should be built when the package is
311 installed in the component repository, and removed when a package
312 is uninstalled. The current eCos administration tool does not provide
313 this functionality.</P
314 ></BLOCKQUOTE
315 ></DIV
316 ><P
317 >The host-side software should be built via the usual sequence of
318 &quot;configure/make/make install&quot;. It can only be built on a
319 Linux host and the <B
320 CLASS="COMMAND"
321 >configure</B
322 > script contains an
323 explicit test for this. Because the eCos component repository should
324 generally be treated as a read-only resource the configure script will
325 also prevent you from trying to build inside the source tree. Instead
326 a separate build tree is required. Hence a typical sequence for
327 building the host-side software would be as follows:</P
328 ><TABLE
329 BORDER="5"
330 BGCOLOR="#E0E0F0"
331 WIDTH="70%"
332 ><TR
333 ><TD
334 ><PRE
335 CLASS="SCREEN"
336 >$ mkdir usbhost_build
337 $ cd usbhost_build
338 $ &lt;repo&gt;packages/io/usb/slave/current/host/configure <A
339 NAME="PATH"
340 ><IMG
341 SRC="../images/callouts/1.gif"
342 HSPACE="0"
343 VSPACE="0"
344 BORDER="0"
345 ALT="(1)"></A
346 > <A
347 NAME="VERSION"
348 ><IMG
349 SRC="../images/callouts/2.gif"
350 HSPACE="0"
351 VSPACE="0"
352 BORDER="0"
353 ALT="(2)"></A
354 > &lt;args&gt; <A
355 NAME="ARGS"
356 ><IMG
357 SRC="../images/callouts/3.gif"
358 HSPACE="0"
359 VSPACE="0"
360 BORDER="0"
361 ALT="(3)"></A
362 >
363 $ make
364 &lt;output from make&gt;
365 $ su <A
366 NAME="ROOT"
367 ><IMG
368 SRC="../images/callouts/4.gif"
369 HSPACE="0"
370 VSPACE="0"
371 BORDER="0"
372 ALT="(4)"></A
373 >
374 $ make install
375 &lt;output from make install&gt;
376 $</PRE
377 ></TD
378 ></TR
379 ></TABLE
380 ><DIV
381 CLASS="CALLOUTLIST"
382 ><DL
383 COMPACT="COMPACT"
384 ><DT
385 ><A
386 HREF="usbs-testing.html#PATH"
387 ><IMG
388 SRC="../images/callouts/1.gif"
389 HSPACE="0"
390 VSPACE="0"
391 BORDER="0"
392 ALT="(1)"></A
393 ></DT
394 ><DD
395 >The location of the eCos component repository should be substituted
396 for <TT
397 CLASS="LITERAL"
398 >&lt;repo&gt;</TT
399 >.</DD
400 ><DT
401 ><A
402 HREF="usbs-testing.html#VERSION"
403 ><IMG
404 SRC="../images/callouts/2.gif"
405 HSPACE="0"
406 VSPACE="0"
407 BORDER="0"
408 ALT="(2)"></A
409 ></DT
410 ><DD
411 >If the package has been obtained via CVS or anonymous CVS then the
412 package version will be <TT
413 CLASS="FILENAME"
414 >current</TT
415 >, as per the
416 example. If instead the package has been obtained as part of a full
417 eCos release or as a separate <TT
418 CLASS="FILENAME"
419 >.epk</TT
420 > file then the
421 appropriate package version should be used instead of
422 <TT
423 CLASS="FILENAME"
424 >current</TT
425 >.</DD
426 ><DT
427 ><A
428 HREF="usbs-testing.html#ARGS"
429 ><IMG
430 SRC="../images/callouts/3.gif"
431 HSPACE="0"
432 VSPACE="0"
433 BORDER="0"
434 ALT="(3)"></A
435 ></DT
436 ><DD
437 >The <B
438 CLASS="COMMAND"
439 >configure</B
440 > script takes the usual arguments such
441 as <TT
442 CLASS="PARAMETER"
443 ><I
444 >--prefix=</I
445 ></TT
446 > to specify where the executables
447 and support files should be installed. The only other parameter that
448 some users may wish to specify is the location of a suitable Tcl
449 installation. By default <SPAN
450 CLASS="APPLICATION"
451 >usbhost</SPAN
452 > will use
453 the existing Tcl installation in <TT
454 CLASS="FILENAME"
455 >/usr</TT
456 >,
457 as provided by your Linux distribution. An alternative Tcl
458 installation can be specified using the parameter
459 <TT
460 CLASS="PARAMETER"
461 ><I
462 >--with-tcl=</I
463 ></TT
464 >, or alternatively using some
465 combination of <TT
466 CLASS="PARAMETER"
467 ><I
468 >--with-tcl-include</I
469 ></TT
470 >,
471 <TT
472 CLASS="PARAMETER"
473 ><I
474 >--with-tcl-lib</I
475 ></TT
476 > and
477 <TT
478 CLASS="PARAMETER"
479 ><I
480 >--with-tcl-version</I
481 ></TT
482 >. </DD
483 ><DT
484 ><A
485 HREF="usbs-testing.html#ROOT"
486 ><IMG
487 SRC="../images/callouts/4.gif"
488 HSPACE="0"
489 VSPACE="0"
490 BORDER="0"
491 ALT="(4)"></A
492 ></DT
493 ><DD
494 >One of the host-side executables that gets built,
495 <SPAN
496 CLASS="APPLICATION"
497 >usbchmod</SPAN
498 >, needs to be installed with suid
499 root privileges. Although the Linux kernel makes it possible for
500 applications to perform low-level USB operations such as transmitting
501 bulk packets, by default access to this functionality is restricted to
502 programs with superuser privileges. It is undesirable to run a complex
503 program such as <SPAN
504 CLASS="APPLICATION"
505 >usbhost</SPAN
506 > with such
507 privileges, especially since the program contains a general-purpose
508 Tcl interpreter. Therefore when <SPAN
509 CLASS="APPLICATION"
510 >usbhost</SPAN
511 >
512 starts up and discovers that it does not have sufficient access to the
513 appropriate entries in <TT
514 CLASS="FILENAME"
515 >/proc/bus/usb</TT
516 >, 
517 it spawns an instance of <SPAN
518 CLASS="APPLICATION"
519 >usbchmod</SPAN
520 > to modify
521 the permissions on these entries. <SPAN
522 CLASS="APPLICATION"
523 >usbchmod</SPAN
524 >
525 will only do this for a USB device <TT
526 CLASS="LITERAL"
527 >&quot;Red Hat eCos USB
528 test&quot;</TT
529 >, so installing this program suid root should not
530 introduce any security problems.</DD
531 ></DL
532 ></DIV
533 ><P
534 >During <B
535 CLASS="COMMAND"
536 >make install</B
537 > the following actions will take
538 place: </P
539 ><P
540 ></P
541 ><OL
542 TYPE="1"
543 ><LI
544 ><P
545 ><SPAN
546 CLASS="APPLICATION"
547 >usbhost</SPAN
548 > will be installed in <TT
549 CLASS="FILENAME"
550 >/usr/local/bin</TT
551 >,
552 or some other <TT
553 CLASS="FILENAME"
554 >bin</TT
555 > directory if
556 the default location is changed at configure-time using a
557 <TT
558 CLASS="PARAMETER"
559 ><I
560 >--prefix=</I
561 ></TT
562 > or similar option. It will be
563 installed as the executable
564 <SPAN
565 CLASS="APPLICATION"
566 >usbhost_&lt;version&gt;</SPAN
567 >, for example
568 <SPAN
569 CLASS="APPLICATION"
570 >usbhost_current</SPAN
571 >, thus allowing several
572 releases of the USB slave package to co-exist. For convenience a
573 symbolic link from <TT
574 CLASS="FILENAME"
575 >usbhost</TT
576 > to this executable
577 will be created, so users can just run <B
578 CLASS="COMMAND"
579 >usbhost</B
580 > to
581 access the most recently-installed version.</P
582 ></LI
583 ><LI
584 ><P
585 ><SPAN
586 CLASS="APPLICATION"
587 >usbchmod</SPAN
588 > will be installed in
589 <TT
590 CLASS="FILENAME"
591 >/usr/local/libexec/ecos/io_usb_slave_&lt;version&gt;</TT
592 >.
593 This program should only be run by <SPAN
594 CLASS="APPLICATION"
595 >usbhost</SPAN
596 >,
597 not invoked directly, so it is not placed in the <TT
598 CLASS="FILENAME"
599 >bin</TT
600
601 directory. Again the presence of the package version in the directory
602 name allows multiple releases of the package to co-exist.</P
603 ></LI
604 ><LI
605 ><P
606 >A Tcl script <TT
607 CLASS="FILENAME"
608 >usbhost.tcl</TT
609 > will get installed in
610 the same directory as <SPAN
611 CLASS="APPLICATION"
612 >usbchmod</SPAN
613 >. This Tcl
614 script is loaded automatically by the
615 <SPAN
616 CLASS="APPLICATION"
617 >usbhost</SPAN
618 > executable. </P
619 ></LI
620 ><LI
621 ><P
622 >A number of additional Tcl scripts, for example
623 <TT
624 CLASS="FILENAME"
625 >list.tcl</TT
626 > will get installed alongside
627 <TT
628 CLASS="FILENAME"
629 >usbhost.tcl</TT
630 >. These correspond to various test
631 cases provided as standard. If a given test case is specified on the
632 command line and cannot be found relative to the current directory
633 then <SPAN
634 CLASS="APPLICATION"
635 >usbhost</SPAN
636 > will search the install
637 directory for these test cases.</P
638 ><DIV
639 CLASS="NOTE"
640 ><BLOCKQUOTE
641 CLASS="NOTE"
642 ><P
643 ><B
644 >Note: </B
645 >Strictly speaking installing the <TT
646 CLASS="FILENAME"
647 >usbhost.tcl</TT
648 > and
649 other Tcl scripts below the <TT
650 CLASS="FILENAME"
651 >libexec</TT
652 >
653 directory deviates from standard practice: they are
654 architecture-independent data files so should be installed below
655 the <TT
656 CLASS="FILENAME"
657 >share</TT
658 > subdirectory. In
659 practice the files are sufficiently small that there is no point in
660 sharing them, and keeping them below <TT
661 CLASS="FILENAME"
662 >libexec</TT
663 >
664 simplifies the host-side software somewhat.</P
665 ></BLOCKQUOTE
666 ></DIV
667 ></LI
668 ></OL
669 ><P
670 >The <B
671 CLASS="COMMAND"
672 >usbhost</B
673 > should be run only when there is a
674 suitable target attached to the USB bus and running the
675 <SPAN
676 CLASS="APPLICATION"
677 >usbtarget</SPAN
678 > program. It will search
679 <TT
680 CLASS="FILENAME"
681 >/proc/bus/usb/devices</TT
682 > for an entry corresponding
683 to this program, invoke <SPAN
684 CLASS="APPLICATION"
685 >usbchmod</SPAN
686 > if
687 necessary to change the access rights, and then interact with
688 <SPAN
689 CLASS="APPLICATION"
690 >usbtarget</SPAN
691 > over the USB bus.
692 <B
693 CLASS="COMMAND"
694 >usbhost</B
695 > should be invoked as follows:</P
696 ><TABLE
697 BORDER="5"
698 BGCOLOR="#E0E0F0"
699 WIDTH="70%"
700 ><TR
701 ><TD
702 ><PRE
703 CLASS="SCREEN"
704 >$ usbhost [-v|--version] [-h|--help] [-V|--verbose] &lt;test&gt; [&lt;test parameters&gt;]</PRE
705 ></TD
706 ></TR
707 ></TABLE
708 ><P
709 ></P
710 ><OL
711 TYPE="1"
712 ><LI
713 ><P
714 >The <TT
715 CLASS="PARAMETER"
716 ><I
717 >-v</I
718 ></TT
719 > or <TT
720 CLASS="PARAMETER"
721 ><I
722 >--version</I
723 ></TT
724 >
725 option will display version information for
726 <SPAN
727 CLASS="APPLICATION"
728 >usbhost</SPAN
729 > including the version of the USB
730 slave package that was used to build the executable.</P
731 ></LI
732 ><LI
733 ><P
734 >The <TT
735 CLASS="PARAMETER"
736 ><I
737 >-h</I
738 ></TT
739 > or <TT
740 CLASS="PARAMETER"
741 ><I
742 >--help</I
743 ></TT
744 > option
745 will display usage information.</P
746 ></LI
747 ><LI
748 ><P
749 >The <TT
750 CLASS="PARAMETER"
751 ><I
752 >-V</I
753 ></TT
754 > or <TT
755 CLASS="PARAMETER"
756 ><I
757 >--verbose</I
758 ></TT
759 >
760 option can be used to obtain more information at run-time, for example
761 some output for every USB transfer. This option can be repeated
762 multiple times to increase the amount of output.</P
763 ></LI
764 ><LI
765 ><P
766 >The first argument that does not begin with a hyphen specifies a test
767 that should be run, in the form of a Tcl script. For example an
768 argument of <TT
769 CLASS="PARAMETER"
770 ><I
771 >list.tcl</I
772 ></TT
773 > will cause
774 <SPAN
775 CLASS="APPLICATION"
776 >usbhost</SPAN
777 > to look for a script with that
778 name, adding a <TT
779 CLASS="FILENAME"
780 >.tcl</TT
781 > suffix if necessarary, and
782 run that script. <SPAN
783 CLASS="APPLICATION"
784 >usbhost</SPAN
785 > will look in the
786 current directory first, then in the install tree for standard test
787 scripts provided by the USB slave package.</P
788 ></LI
789 ><LI
790 ><P
791 >Some test scripts may want their own parameters, for example a
792 duration in seconds. These can be passed on the command line after
793 the name of the test, for example
794 <B
795 CLASS="COMMAND"
796 >usbhost&nbsp;mytest&nbsp;60</B
797 >. </P
798 ></LI
799 ></OL
800 ></DIV
801 ><DIV
802 CLASS="REFSECT1"
803 ><A
804 NAME="AEN17020"
805 ></A
806 ><H2
807 >Writing a Test</H2
808 ><P
809 >Each test is defined by a Tcl script, running inside an interpreter
810 provided by <SPAN
811 CLASS="APPLICATION"
812 >usbhost</SPAN
813 >. In addition to the
814 normal Tcl functionality this interpreter provides a number of
815 variables and functions related to USB testing. For example there is a
816 variable <TT
817 CLASS="VARNAME"
818 >bulk_in_endpoints</TT
819 > that lists all the
820 endpoints on the target that can perform bulk IN operations, and a
821 related array <TT
822 CLASS="VARNAME"
823 >bulk_in</TT
824 > which contains information
825 such as the minimum and maximum packets sizes. There is a function
826 <TT
827 CLASS="FUNCTION"
828 >bulktest</TT
829 > which can be used to perform bulk tests
830 on a particular endpoint. A simple test script aimed at specific
831 hardware could ignore the information variables since it would know
832 exactly what USB hardware is available on the target, whereas a
833 general-purpose script would use the information to adapt to the
834 hardware capabilities.</P
835 ><P
836 >To avoid namespace pollution all USB-related Tcl variables and
837 functions live in the <TT
838 CLASS="VARNAME"
839 >usbtest::</TT
840 > namespace.
841 Therefore accessing requires either explicitly including the
842 namespace any references, for example
843 <TT
844 CLASS="LITERAL"
845 >$usbtest::bulk_in_endpoints</TT
846 >, or by using Tcl's
847 <TT
848 CLASS="FUNCTION"
849 >namespace import</TT
850 > facility.</P
851 ><P
852 >A very simple test script might look like this:</P
853 ><TABLE
854 BORDER="5"
855 BGCOLOR="#E0E0F0"
856 WIDTH="70%"
857 ><TR
858 ><TD
859 ><PRE
860 CLASS="PROGRAMLISTING"
861 >usbtest::bulktest 1 out 4000
862 usbtest::bulktest 2 in  4000
863 if { [usbtest::start 60] } {
864     puts "Test successful"
865 } else
866     puts "Test failed"
867     foreach result $usbtest::results {
868         puts $result
869     }
870 }</PRE
871 ></TD
872 ></TR
873 ></TABLE
874 ><P
875 >This would perform a test run involving 4000 bulk transfers from the
876 host to the target's endpoint 1, and concurrently 4000 bulk transfers
877 from endpoint 2. Default settings for packet sizes, contents, and
878 delays would be used. The actual test would not start running until
879 <TT
880 CLASS="FILENAME"
881 >usbtest</TT
882 > is invoked, and it is expected that the
883 test would complete within 60 seconds. If any failures occur then they
884 are reported.</P
885 ></DIV
886 ><DIV
887 CLASS="REFSECT1"
888 ><A
889 NAME="AEN17035"
890 ></A
891 ><H2
892 >Available Hardware</H2
893 ><P
894 >Each target-side USB device driver provides information about the
895 actual capabilities of the hardware, for example which endpoints are
896 available. Strictly speaking it provides information about what is
897 actually supported by the device driver, which may be a subset of what
898 the hardware is capable of. For example, the hardware may support
899 isochronous transfers on a particular endpoint but if there is no
900 software support for this in the driver then this endpoint will not be
901 listed. When <SPAN
902 CLASS="APPLICATION"
903 >usbhost</SPAN
904 > first contacts the
905 <SPAN
906 CLASS="APPLICATION"
907 >usbtarget</SPAN
908 > program running on the target
909 platform, it obtains this information and makes it available to test
910 scripts via Tcl variables:</P
911 ><P
912 ></P
913 ><DIV
914 CLASS="VARIABLELIST"
915 ><DL
916 ><DT
917 ><TT
918 CLASS="VARNAME"
919 >bulk_in_endpoints</TT
920 ></DT
921 ><DD
922 ><P
923 >    This is a simple list of the endpoints which can support bulk IN
924     transfers. For example if the target-side hardware supports
925     these transfers on endpoints 3 and 5 then the value would be
926     <TT
927 CLASS="LITERAL"
928 >&quot;3 5&quot;</TT
929 > Typical test scripts would
930     iterate over the list using something like:
931   </P
932 ><TABLE
933 BORDER="5"
934 BGCOLOR="#E0E0F0"
935 WIDTH="70%"
936 ><TR
937 ><TD
938 ><PRE
939 CLASS="PROGRAMLISTING"
940 >  if { 0 != [llength $usbtest::bulk_in_endpoints] } {
941       puts"Bulk IN endpoints: $usbtest::bulk_in_endpoints"
942       foreach endpoint $usbtest:bulk_in_endpoints {
943           &#8230;
944       }
945   }
946   </PRE
947 ></TD
948 ></TR
949 ></TABLE
950 ></DD
951 ><DT
952 ><TT
953 CLASS="VARNAME"
954 >bulk_in()</TT
955 ></DT
956 ><DD
957 ><P
958 >  This array holds additional information about each bulk IN endpoint.
959   The array is indexed by two fields, the endpoint number and one of
960   <TT
961 CLASS="LITERAL"
962 >min_size</TT
963 >, <TT
964 CLASS="LITERAL"
965 >max_size</TT
966 >,
967   <TT
968 CLASS="LITERAL"
969 >max_in_padding</TT
970 > and <TT
971 CLASS="LITERAL"
972 >devtab</TT
973 >:
974   </P
975 ><P
976 ></P
977 ><DIV
978 CLASS="VARIABLELIST"
979 ><DL
980 ><DT
981 ><TT
982 CLASS="LITERAL"
983 >min_size</TT
984 ></DT
985 ><DD
986 ><P
987 >    This field specifies a lower bound on the size of bulk transfers,
988     and will typically will have a value of 1.
989     </P
990 ><DIV
991 CLASS="NOTE"
992 ><BLOCKQUOTE
993 CLASS="NOTE"
994 ><P
995 ><B
996 >Note: </B
997 >    The typical minimum transfer size of a single byte is not strictly
998     speaking correct, since under some circumstances it can make sense
999     to have a transfer size of zero bytes. However current target-side
1000     device drivers interpret a request to transfer zero bytes as a way
1001     for higher-level code to determine whether or not an endpoint is
1002     stalled, so it is not actually possible to perform zero-byte
1003     transfers. This issue will be addressed at some future point.
1004     </P
1005 ></BLOCKQUOTE
1006 ></DIV
1007 ></DD
1008 ><DT
1009 ><TT
1010 CLASS="LITERAL"
1011 >max_size</TT
1012 ></DT
1013 ><DD
1014 ><P
1015 >    This field specifies an upper bound on the size of bulk transfers.
1016     Some target-side drivers may be limited to transfers of say
1017     0x0FFFF bytes because of hardware limitations. In practice the
1018     transfer size is likely to be limited primarily to limit memory
1019     consumption of the test code on the target hardware, and to ensure
1020     that tests complete reasonably quickly. At the time of writing
1021     transfers are limited to 4K.
1022     </P
1023 ></DD
1024 ><DT
1025 ><TT
1026 CLASS="LITERAL"
1027 >max_in_padding</TT
1028 ></DT
1029 ><DD
1030 ><P
1031 >    On some hardware it may be necessary for the target-side device
1032     driver to send more data than is actually intended. For example
1033     the SA11x0 USB hardware cannot perform bulk transfers that are
1034     an exact multiple of 64 bytes, instead it must pad such
1035     transfers with an extra byte and the host must be ready to
1036     accept and discard this byte. The
1037     <TT
1038 CLASS="LITERAL"
1039 >max_in_padding</TT
1040 > field indicates the amount of
1041     padding that is required. The low-level code inside
1042     <SPAN
1043 CLASS="APPLICATION"
1044 >usbhost</SPAN
1045 > will use this field
1046     automatically, and there is no need for test scripts to adjust
1047     packet sizes for padding. The field is provided for
1048     informational purposes only.
1049     </P
1050 ></DD
1051 ><DT
1052 ><TT
1053 CLASS="LITERAL"
1054 >devtab</TT
1055 ></DT
1056 ><DD
1057 ><P
1058 >    This is a string indicating whether or not the
1059     target-side USB device driver supports access to this endpoint
1060     via entries in the device table, in other words through
1061     conventional calls like <TT
1062 CLASS="FUNCTION"
1063 >open</TT
1064 > and
1065     <TT
1066 CLASS="FUNCTION"
1067 >write</TT
1068 >. Some device drivers may only
1069     support low-level USB access because typically that is what gets
1070     used by USB class-specific packages such as USB-ethernet.
1071     An empty string indicates that no devtab entry is available,
1072     otherwise it will be something like
1073     <TT
1074 CLASS="LITERAL"
1075 >&quot;/dev/usbs2w&quot;</TT
1076 >. 
1077     </P
1078 ></DD
1079 ></DL
1080 ></DIV
1081 ><P
1082 >  Typical test scripts would access this data using something like:
1083   </P
1084 ><TABLE
1085 BORDER="5"
1086 BGCOLOR="#E0E0F0"
1087 WIDTH="70%"
1088 ><TR
1089 ><TD
1090 ><PRE
1091 CLASS="PROGRAMLISTING"
1092 >  foreach endpoint $usbtest:bulk_in_endpoints {
1093       puts "Endpoint $endpoint: "
1094       puts "    minimum transfer size $usbtest::bulk_in($endpoint,min_size)"
1095       puts "    maximum transfer size $usbtest::bulk_in($endpoint,max_size)"
1096       if { 0 == $usbtest::bulk_in($endpoint,max_in_padding) } {
1097           puts "    no IN padding required"
1098       } else {
1099           puts "    $usbtest::bulk_in($endpoint,max_in_padding) bytes of IN padding required"
1100       }
1101       if { "" == $usbtest::bulk_in($endpoint,devtab) } {
1102           puts "    no devtab entry provided"
1103       } else {
1104           puts "    corresponding devtab entry is $usbtest::bulk_in($endpoint,devtab)"
1105       }
1106   }
1107   </PRE
1108 ></TD
1109 ></TR
1110 ></TABLE
1111 ></DD
1112 ><DT
1113 ><TT
1114 CLASS="VARNAME"
1115 >bulk_out_endpoint</TT
1116 ></DT
1117 ><DD
1118 ><P
1119 >    This is a simple list of the endpoints which can support bulk OUT
1120     transfers. It is analogous to
1121     <TT
1122 CLASS="VARNAME"
1123 >bulk_in_endpoints</TT
1124 >.
1125   </P
1126 ></DD
1127 ><DT
1128 ><TT
1129 CLASS="VARNAME"
1130 >bulk_out()</TT
1131 ></DT
1132 ><DD
1133 ><P
1134 >  This array holds additional information about each bulk OUT
1135   endpoint. It can be accessed in the same way as
1136   <TT
1137 CLASS="VARNAME"
1138 >bulk_in()</TT
1139 >, except that there is no
1140   <TT
1141 CLASS="LITERAL"
1142 >max_in_padding</TT
1143 > field because that field only
1144   makes sense for IN transfers.
1145   </P
1146 ></DD
1147 ><DT
1148 ><TT
1149 CLASS="VARNAME"
1150 >control()</TT
1151 ></DT
1152 ><DD
1153 ><P
1154 >  This array holds information about the control endpoint. It contains
1155   two fields, <TT
1156 CLASS="LITERAL"
1157 >min_size</TT
1158 > and
1159   <TT
1160 CLASS="LITERAL"
1161 >max_size</TT
1162 >. Note that there is no variable
1163   <TT
1164 CLASS="VARNAME"
1165 >control_endpoints</TT
1166 > because a USB target always
1167   supports a single control endpoint <TT
1168 CLASS="LITERAL"
1169 >0</TT
1170 >. Similarly
1171   the <TT
1172 CLASS="VARNAME"
1173 >control</TT
1174 > array does not use an endpoint number
1175   as the first index because that would be redundant.
1176   </P
1177 ></DD
1178 ><DT
1179 ><TT
1180 CLASS="VARNAME"
1181 >isochronous_in_endpoints</TT
1182 > and
1183         <TT
1184 CLASS="VARNAME"
1185 >isochronous_in()</TT
1186 ></DT
1187 ><DD
1188 ><P
1189 >  These variables provide the same information as
1190   <TT
1191 CLASS="VARNAME"
1192 >bulk_in_endpoints</TT
1193 > and <TT
1194 CLASS="VARNAME"
1195 >bulk_in</TT
1196 >,
1197   but for endpoints that support isochronous IN transfers.
1198   </P
1199 ></DD
1200 ><DT
1201 ><TT
1202 CLASS="VARNAME"
1203 >isochronous_out_endpoints</TT
1204 > and
1205         <TT
1206 CLASS="VARNAME"
1207 >isochronous_out()</TT
1208 ></DT
1209 ><DD
1210 ><P
1211 >  These variables provide the same information as
1212   <TT
1213 CLASS="VARNAME"
1214 >bulk_out_endpoints</TT
1215 > and <TT
1216 CLASS="VARNAME"
1217 >bulk_out</TT
1218 >,
1219   but for endpoints that support isochronous OUT transfers.
1220   </P
1221 ></DD
1222 ><DT
1223 ><TT
1224 CLASS="VARNAME"
1225 >interrupt_in_endpoints</TT
1226 > and
1227         <TT
1228 CLASS="VARNAME"
1229 >interrupt_in()</TT
1230 ></DT
1231 ><DD
1232 ><P
1233 >  These variables provide the same information as
1234   <TT
1235 CLASS="VARNAME"
1236 >bulk_in_endpoints</TT
1237 > and <TT
1238 CLASS="VARNAME"
1239 >bulk_in</TT
1240 >,
1241   but for endpoints that support interrupt IN transfers.
1242   </P
1243 ></DD
1244 ><DT
1245 ><TT
1246 CLASS="VARNAME"
1247 >interrupt_out_endpoints</TT
1248 > and
1249         <TT
1250 CLASS="VARNAME"
1251 >interrupt_out()</TT
1252 ></DT
1253 ><DD
1254 ><P
1255 >  These variables provide the same information as
1256   <TT
1257 CLASS="VARNAME"
1258 >bulk_out_endpoints</TT
1259 > and <TT
1260 CLASS="VARNAME"
1261 >bulk_out</TT
1262 >,
1263   but for endpoints that support interrupt OUT transfers.
1264   </P
1265 ></DD
1266 ></DL
1267 ></DIV
1268 ></DIV
1269 ><DIV
1270 CLASS="REFSECT1"
1271 ><A
1272 NAME="AEN17142"
1273 ></A
1274 ><H2
1275 >Testing Bulk Transfers</H2
1276 ><P
1277 >The main function for initiating a bulk test is
1278 <TT
1279 CLASS="FUNCTION"
1280 >usbtest::bulktest</TT
1281 >. This takes three compulsory
1282 arguments, and can be given a number of additional arguments to
1283 control the exact behaviour. The compulsory arguments are:</P
1284 ><P
1285 ></P
1286 ><DIV
1287 CLASS="VARIABLELIST"
1288 ><DL
1289 ><DT
1290 >endpoint</DT
1291 ><DD
1292 ><P
1293 >    This specifies the endpoint to use. It should correspond to
1294     one of the entries in
1295     <TT
1296 CLASS="VARNAME"
1297 >usbtest::bulk_in_endpoints</TT
1298 > or
1299     <TT
1300 CLASS="VARNAME"
1301 >usbtest::bulk_out_endpoints</TT
1302 >, depending on the
1303     transfer direction.
1304   </P
1305 ></DD
1306 ><DT
1307 >direction</DT
1308 ><DD
1309 ><P
1310 >  This should be either <TT
1311 CLASS="LITERAL"
1312 >in</TT
1313 > or <TT
1314 CLASS="LITERAL"
1315 >out</TT
1316 >.
1317   </P
1318 ></DD
1319 ><DT
1320 >number of transfers</DT
1321 ><DD
1322 ><P
1323 >  This specifies the number of transfers that should take place. The
1324   testing software does not currently support the concept of performing
1325   transfers for a given period of time because synchronising this on
1326   both the host and a wide range of targets is difficult. However it
1327   is relatively easy to work out the approximate time a number of bulk
1328   transfers should take place, based on a typical bandwidth of
1329   1MB/second and assuming say a 1ms overhead per transfer.
1330   Alternatively a test script could perform a small initial run to
1331   determine what performance can actually be expected from a given
1332   target, and then use this information to run a much longer test.
1333   </P
1334 ></DD
1335 ></DL
1336 ></DIV
1337 ><P
1338 >Additional arguments can be used to control the exact transfer. For
1339 example a <TT
1340 CLASS="PARAMETER"
1341 ><I
1342 >txdelay+</I
1343 ></TT
1344 > argument can be used to
1345 slowly increase the delay between transfers. All such arguments involve
1346 a value which can be passed either as part of the argument itself,
1347 for example <TT
1348 CLASS="LITERAL"
1349 >txdelay+=5</TT
1350 >, or as a subsequent
1351 argument, <TT
1352 CLASS="LITERAL"
1353 >txdelay+ 5</TT
1354 >. The possible arguments fall
1355 into a number of categories: data, I/O mechanism, transmit size,
1356 receive size, transmit delay, and receive delay.</P
1357 ><DIV
1358 CLASS="REFSECT2"
1359 ><A
1360 NAME="AEN17167"
1361 ></A
1362 ><H3
1363 >Data</H3
1364 ><P
1365 >An obvious parameter to control is the actual data that gets sent.
1366 This can be controlled by the argument <TT
1367 CLASS="PARAMETER"
1368 ><I
1369 >data</I
1370 ></TT
1371 >
1372 which can take one of five values: <TT
1373 CLASS="LITERAL"
1374 >none</TT
1375 >,
1376 <TT
1377 CLASS="LITERAL"
1378 >bytefill</TT
1379 >, <TT
1380 CLASS="LITERAL"
1381 >intfill</TT
1382 >,
1383 <TT
1384 CLASS="LITERAL"
1385 >byteseq</TT
1386 > and <TT
1387 CLASS="LITERAL"
1388 >wordseq</TT
1389 >. The default
1390 value is <TT
1391 CLASS="LITERAL"
1392 >none</TT
1393 >.</P
1394 ><P
1395 ></P
1396 ><DIV
1397 CLASS="VARIABLELIST"
1398 ><DL
1399 ><DT
1400 ><TT
1401 CLASS="LITERAL"
1402 >none</TT
1403 ></DT
1404 ><DD
1405 ><P
1406 >  The transmit code will not attempt to fill the buffer in any way,
1407   and the receive code will not check it. The actual data that gets
1408   transferred will be whatever happened to be in the buffer before
1409   the transfer started.
1410   </P
1411 ></DD
1412 ><DT
1413 ><TT
1414 CLASS="LITERAL"
1415 >bytefill</TT
1416 ></DT
1417 ><DD
1418 ><P
1419 >  The entire buffer will be filled with a single byte, as per
1420   <TT
1421 CLASS="FUNCTION"
1422 >memset</TT
1423 >. 
1424   </P
1425 ></DD
1426 ><DT
1427 ><TT
1428 CLASS="LITERAL"
1429 >intfill</TT
1430 ></DT
1431 ><DD
1432 ><P
1433 >  The buffer will be treated as an array of 32-bit integers, and will
1434   be filled with the same integer repeated the appropriate number of
1435   times. If the buffer size is not a multiple of four bytes then
1436   the last few bytes will be set to 0.
1437   </P
1438 ></DD
1439 ><DT
1440 ><TT
1441 CLASS="LITERAL"
1442 >byteseq</TT
1443 ></DT
1444 ><DD
1445 ><P
1446 >  The buffer will be filled with a sequence of bytes, generated by
1447   a linear congruential generator. If the first byte in the buffer is
1448   filled with the value <TT
1449 CLASS="LITERAL"
1450 >x</TT
1451 >, the next byte will be
1452   <TT
1453 CLASS="LITERAL"
1454 >(m*x)+i</TT
1455 >. For example a sequence of slowly
1456   incrementing bytes can be achieved by setting both the multiplier
1457   and the increment to 1. Alternatively a pseudo-random number
1458   sequence can be achieved using values 1103515245 and 12345, as
1459   per the standard C library <TT
1460 CLASS="FUNCTION"
1461 >rand</TT
1462 > function.
1463   For convenience these two constants are available as Tcl
1464   variables <TT
1465 CLASS="VARNAME"
1466 >usbtest::MULTIPLIER</TT
1467 > and
1468   <TT
1469 CLASS="VARNAME"
1470 >usbtest::INCREMENT</TT
1471 >.
1472   </P
1473 ></DD
1474 ><DT
1475 ><TT
1476 CLASS="LITERAL"
1477 >wordseq</TT
1478 ></DT
1479 ><DD
1480 ><P
1481 >  This acts like <TT
1482 CLASS="LITERAL"
1483 >byteseq</TT
1484 >, except that the buffer is
1485   treated as an array of 32-bit integers rather than as an array of
1486   bytes. If the buffer is not a multiple of four bytes then the last
1487   few bytes will be filled with zeroes.
1488   </P
1489 ></DD
1490 ></DL
1491 ></DIV
1492 ><P
1493 >The above requires three additional parameters
1494 <TT
1495 CLASS="PARAMETER"
1496 ><I
1497 >data1</I
1498 ></TT
1499 >, <TT
1500 CLASS="PARAMETER"
1501 ><I
1502 >data*</I
1503 ></TT
1504 > and
1505 <TT
1506 CLASS="PARAMETER"
1507 ><I
1508 >data+</I
1509 ></TT
1510 >. <TT
1511 CLASS="PARAMETER"
1512 ><I
1513 >data1</I
1514 ></TT
1515 > specifies
1516 the value to be used for byte or word fills, or the first number when
1517 calculating a sequence. The default value is <TT
1518 CLASS="LITERAL"
1519 >0</TT
1520 >.
1521 <TT
1522 CLASS="PARAMETER"
1523 ><I
1524 >data*</I
1525 ></TT
1526 > and <TT
1527 CLASS="PARAMETER"
1528 ><I
1529 >data+</I
1530 ></TT
1531 > specify
1532 the multiplier and increment for a sequence, and have default values
1533 of <TT
1534 CLASS="LITERAL"
1535 >1</TT
1536 > and <TT
1537 CLASS="LITERAL"
1538 >0</TT
1539 > respectively. For
1540 example, to perform a bulk transfer of a pseudo-random sequence of
1541 integers starting with 42 the following code could be used:</P
1542 ><TABLE
1543 BORDER="5"
1544 BGCOLOR="#E0E0F0"
1545 WIDTH="70%"
1546 ><TR
1547 ><TD
1548 ><PRE
1549 CLASS="PROGRAMLISTING"
1550 >bulktest 2 IN 1000 data=wordseq data1=42 \
1551     data* $usbtest::MULTIPLIER data+ $usbtest::INCREMENT</PRE
1552 ></TD
1553 ></TR
1554 ></TABLE
1555 ><P
1556 >The above parameters define what data gets transferred for the first
1557 transfer, but a test can involve multiple transfers. The data format
1558 will be the same for all transfers, but it is possible to adjust the
1559 current value, the multiplier, and the increment between each
1560 transfer. This is achieved with parameters <TT
1561 CLASS="PARAMETER"
1562 ><I
1563 >data1*</I
1564 ></TT
1565 >,
1566 <TT
1567 CLASS="PARAMETER"
1568 ><I
1569 >data1+</I
1570 ></TT
1571 >, <TT
1572 CLASS="PARAMETER"
1573 ><I
1574 >data**</I
1575 ></TT
1576 >,
1577 <TT
1578 CLASS="PARAMETER"
1579 ><I
1580 >data*+</I
1581 ></TT
1582 >, <TT
1583 CLASS="PARAMETER"
1584 ><I
1585 >data+*</I
1586 ></TT
1587 >, and
1588 <TT
1589 CLASS="PARAMETER"
1590 ><I
1591 >data++</I
1592 ></TT
1593 >, with default values of 1 for each
1594 multiplier and 0 for each increment. For example, if the multiplier
1595 for the first transfer is set to <TT
1596 CLASS="LITERAL"
1597 >2</TT
1598 > using
1599 <TT
1600 CLASS="PARAMETER"
1601 ><I
1602 >data*</I
1603 ></TT
1604 >, and arguments
1605 <TT
1606 CLASS="LITERAL"
1607 >data**&nbsp;2</TT
1608 > and <TT
1609 CLASS="LITERAL"
1610 >data*+&nbsp;-1</TT
1611 > are also
1612 supplied, then the multiplier for subsequent transfers will be
1613 <TT
1614 CLASS="LITERAL"
1615 >3</TT
1616 >, <TT
1617 CLASS="LITERAL"
1618 >5</TT
1619 >, <TT
1620 CLASS="LITERAL"
1621 >9</TT
1622 >,
1623 &#8230;.</P
1624 ><DIV
1625 CLASS="NOTE"
1626 ><BLOCKQUOTE
1627 CLASS="NOTE"
1628 ><P
1629 ><B
1630 >Note: </B
1631 >Currently it is not possible for a test script to send specific data,
1632 for example a specific sequence of bytes captured by a protocol analyser
1633 that caused a problem. If the transfer was from host to target then
1634 the target would have to know the exact sequence of bytes to expect,
1635 which means transferring data over the USB bus when that data is known
1636 to have caused problems in the past. Similarly for target to host
1637 transfers the target would have to know what bytes to send. A possible
1638 future extension of the USB testing support would allow for bounce
1639 operations, where a given message is first sent to the target and then
1640 sent back to the host, with only the host checking that the data was
1641 returned correctly.</P
1642 ></BLOCKQUOTE
1643 ></DIV
1644 ></DIV
1645 ><DIV
1646 CLASS="REFSECT2"
1647 ><A
1648 NAME="AEN17237"
1649 ></A
1650 ><H3
1651 >I/O Mechanism</H3
1652 ><P
1653 >On the target side USB transfers can happen using either low-level
1654 USB calls such as <TT
1655 CLASS="FUNCTION"
1656 >usbs_start_rx_buffer</TT
1657 >, or by
1658 higher-level calls which go through the device table. By default the
1659 target-side code will use the low-level calls. If it is desired to
1660 test the higher-level calls instead, for example because those are
1661 what the application uses, then that can be achieved with an
1662 argument <TT
1663 CLASS="PARAMETER"
1664 ><I
1665 >mechanism=devtab</I
1666 ></TT
1667 >.</P
1668 ></DIV
1669 ><DIV
1670 CLASS="REFSECT2"
1671 ><A
1672 NAME="AEN17242"
1673 ></A
1674 ><H3
1675 >Transmit Size</H3
1676 ><P
1677 >The next set of arguments can be used to control the size of the
1678 transmitted buffer: <TT
1679 CLASS="PARAMETER"
1680 ><I
1681 >txsize1</I
1682 ></TT
1683 >,
1684 <TT
1685 CLASS="PARAMETER"
1686 ><I
1687 >txsize&gt;=</I
1688 ></TT
1689 >, <TT
1690 CLASS="PARAMETER"
1691 ><I
1692 >txsize&lt;=</I
1693 ></TT
1694 >
1695 <TT
1696 CLASS="PARAMETER"
1697 ><I
1698 >txsize*</I
1699 ></TT
1700 >, <TT
1701 CLASS="PARAMETER"
1702 ><I
1703 >txsize/</I
1704 ></TT
1705 >,
1706 and <TT
1707 CLASS="PARAMETER"
1708 ><I
1709 >txsize+</I
1710 ></TT
1711 >.</P
1712 ><P
1713 ><TT
1714 CLASS="PARAMETER"
1715 ><I
1716 >txsize1</I
1717 ></TT
1718 > determines the size of the first
1719 transfer, and has a default value of 32 bytes. The size of the next
1720 transfer is calculated by first multiplying by the
1721 <TT
1722 CLASS="PARAMETER"
1723 ><I
1724 >txsize*</I
1725 ></TT
1726 > value, then dividing by the
1727 <TT
1728 CLASS="PARAMETER"
1729 ><I
1730 >txsize/</I
1731 ></TT
1732 > value, and finally adding the
1733 <TT
1734 CLASS="PARAMETER"
1735 ><I
1736 >txsize+</I
1737 ></TT
1738 > value. The defaults for these are
1739 <TT
1740 CLASS="LITERAL"
1741 >1</TT
1742 >, <TT
1743 CLASS="LITERAL"
1744 >1</TT
1745 >, and <TT
1746 CLASS="LITERAL"
1747 >0</TT
1748 >
1749 respectively, which means that the transfer size will remain
1750 unchanged. If for example the transfer size should increase by
1751 approximately 50 per cent each time then suitable values might be
1752 <TT
1753 CLASS="LITERAL"
1754 >txsize*&nbsp;3</TT
1755 >, <TT
1756 CLASS="LITERAL"
1757 >txsize/&nbsp;2</TT
1758 >,
1759 and <TT
1760 CLASS="LITERAL"
1761 >txsize+&nbsp;1</TT
1762 >. </P
1763 ><P
1764 >The <TT
1765 CLASS="PARAMETER"
1766 ><I
1767 >txsize&gt;=</I
1768 ></TT
1769 > and
1770 <TT
1771 CLASS="PARAMETER"
1772 ><I
1773 >txsize&lt;=</I
1774 ></TT
1775 > arguments can be used to impose
1776 lower and upper bounds on the transfer. By default the
1777 <TT
1778 CLASS="LITERAL"
1779 >min_size</TT
1780 > and <TT
1781 CLASS="LITERAL"
1782 >max_size</TT
1783 > values
1784 appropriate for the endpoint will be used. If at any time the
1785 current size falls outside the bounds then it will be normalized.</P
1786 ></DIV
1787 ><DIV
1788 CLASS="REFSECT2"
1789 ><A
1790 NAME="AEN17267"
1791 ></A
1792 ><H3
1793 >Receive Size</H3
1794 ><P
1795 >The receive size, in other words the number of bytes that either host
1796 or target will expect to receive as opposed to the number of bytes
1797 that actually get sent, can be adjusted using a similar set of
1798 arguments: <TT
1799 CLASS="PARAMETER"
1800 ><I
1801 >rxsize1</I
1802 ></TT
1803 >,
1804 <TT
1805 CLASS="PARAMETER"
1806 ><I
1807 >rxsize&gt;=</I
1808 ></TT
1809 >,
1810 <TT
1811 CLASS="PARAMETER"
1812 ><I
1813 >rxsize&lt;=</I
1814 ></TT
1815 >,
1816 <TT
1817 CLASS="PARAMETER"
1818 ><I
1819 >rxsize*</I
1820 ></TT
1821 >, <TT
1822 CLASS="PARAMETER"
1823 ><I
1824 >rxsize/</I
1825 ></TT
1826 > and
1827 <TT
1828 CLASS="PARAMETER"
1829 ><I
1830 >rxsize+</I
1831 ></TT
1832 >. The current receive size will be
1833 adjusted between transfers just like the transmit size. However when
1834 communicating over USB it is not a good idea to attempt to receive
1835 less data than will actually be sent: typically neither the hardware
1836 nor the software will be able to do anything useful with the excess,
1837 so there will be problems. Therefore if at any time the calculated
1838 receive size is less than the transmit size, the actual receive will
1839 be for the exact number of bytes that will get transmitted. However
1840 this will not affect the calculations for the next receive size.</P
1841 ><P
1842 >The default values for <TT
1843 CLASS="PARAMETER"
1844 ><I
1845 >rxsize1</I
1846 ></TT
1847 >,
1848 <TT
1849 CLASS="PARAMETER"
1850 ><I
1851 >rxsize*</I
1852 ></TT
1853 >, <TT
1854 CLASS="PARAMETER"
1855 ><I
1856 >rxsize/</I
1857 ></TT
1858 > and
1859 <TT
1860 CLASS="PARAMETER"
1861 ><I
1862 >rxsize+</I
1863 ></TT
1864 > are <TT
1865 CLASS="LITERAL"
1866 >0</TT
1867 >,
1868 <TT
1869 CLASS="LITERAL"
1870 >1</TT
1871 >, <TT
1872 CLASS="LITERAL"
1873 >1</TT
1874 > and <TT
1875 CLASS="LITERAL"
1876 >0</TT
1877 >
1878 respectively. This means that the calculated receive size will always
1879 be less than the transmit size, so the receive operation will be for
1880 the exact number of bytes transmitted. For some USB protocols this
1881 would not accurately reflect the traffic that will happen. For example
1882 with USB-ethernet transfer sizes will vary between 16 and 1516 bytes,
1883 so the receiver will always expect up to 1516 bytes. This can be
1884 achieved using <TT
1885 CLASS="LITERAL"
1886 >rxsize1&nbsp;1516</TT
1887 >, leaving the
1888 other parameters at their default values.</P
1889 ><P
1890 >For target hardware which involves non-zero
1891 <TT
1892 CLASS="LITERAL"
1893 >max_in_padding</TT
1894 >, on the host side the padding will
1895 be added automatically to the receive size if necessary.</P
1896 ></DIV
1897 ><DIV
1898 CLASS="REFSECT2"
1899 ><A
1900 NAME="AEN17288"
1901 ></A
1902 ><H3
1903 >Transmit and Receive Delays</H3
1904 ><P
1905 >Typically during the testing there will be some minor delays between
1906 transfers on both host and target. Some of these delays will be caused
1907 by timeslicing, for example another process running on the host, or a
1908 concurrent test thread running inside the target. Other delays will be
1909 caused by the USB bus itself, for example activity from another device
1910 on the bus. However it is desirable that test cases be allowed to
1911 inject additional and somewhat more controlled delays into the system,
1912 for example to make sure that the target behaves correctly even if the
1913 target is not yet ready to receive data from the host.</P
1914 ><P
1915 >The transmit delay is controlled by six parameters:
1916 <TT
1917 CLASS="PARAMETER"
1918 ><I
1919 >txdelay1</I
1920 ></TT
1921 >, <TT
1922 CLASS="PARAMETER"
1923 ><I
1924 >txdelay*</I
1925 ></TT
1926 >,
1927 <TT
1928 CLASS="PARAMETER"
1929 ><I
1930 >txdelay/</I
1931 ></TT
1932 >, <TT
1933 CLASS="PARAMETER"
1934 ><I
1935 >txdelay+</I
1936 ></TT
1937 >,
1938 <TT
1939 CLASS="PARAMETER"
1940 ><I
1941 >txdelay&gt;=</I
1942 ></TT
1943 > and
1944 <TT
1945 CLASS="PARAMETER"
1946 ><I
1947 >txdelay&lt;=</I
1948 ></TT
1949 >. The default values for these are
1950 <TT
1951 CLASS="LITERAL"
1952 >0</TT
1953 >, <TT
1954 CLASS="LITERAL"
1955 >1</TT
1956 >, <TT
1957 CLASS="LITERAL"
1958 >1</TT
1959 >,
1960 <TT
1961 CLASS="LITERAL"
1962 >0</TT
1963 >, <TT
1964 CLASS="LITERAL"
1965 >0</TT
1966 > and
1967 <TT
1968 CLASS="LITERAL"
1969 >1000000000</TT
1970 > respectively, so that by default
1971 transmits will happen as quickly as possible. Delays are measured in
1972 nanoseconds, so a value of <TT
1973 CLASS="LITERAL"
1974 >1000000</TT
1975 > would correspond
1976 to a delay of 0.001 seconds or one millisecond. By default delays have
1977 an upper bound of one second. Between transfers the transmit delay is
1978 updated in much the same was as the transfer sizes.</P
1979 ><P
1980 >The receive delay is controlled by a similar set of six parameters:
1981 <TT
1982 CLASS="PARAMETER"
1983 ><I
1984 >rxdelay1</I
1985 ></TT
1986 >, <TT
1987 CLASS="PARAMETER"
1988 ><I
1989 >rxdelay*</I
1990 ></TT
1991 >,
1992 <TT
1993 CLASS="PARAMETER"
1994 ><I
1995 >rxdelay/</I
1996 ></TT
1997 >, <TT
1998 CLASS="PARAMETER"
1999 ><I
2000 >rxdelay+</I
2001 ></TT
2002 >,
2003 <TT
2004 CLASS="PARAMETER"
2005 ><I
2006 >rxdelay&gt;=</I
2007 ></TT
2008 > and
2009 <TT
2010 CLASS="PARAMETER"
2011 ><I
2012 >rxdelay&lt;=</I
2013 ></TT
2014 >. The default values for these are
2015 the same as for transmit delays.</P
2016 ><P
2017 >The transmit delay is used on the side which sends data over the USB
2018 bus, so for a bulk IN transfer it is the target that sends data and
2019 hence sleeps for the specified transmit delay, while the host receives
2020 data sleeps for the receive delay. For an OUT transfer the positions
2021 are reversed.</P
2022 ><P
2023 >It should be noted that although the delays are measured in
2024 nanoseconds, the actual delays will be much less precise and are
2025 likely to be of the order of milliseconds. The exact details will
2026 depend on the kernel clock speed.</P
2027 ></DIV
2028 ></DIV
2029 ><DIV
2030 CLASS="REFSECT1"
2031 ><A
2032 NAME="AEN17314"
2033 ></A
2034 ><H2
2035 >Other Types of Transfer</H2
2036 ><P
2037 >Support for testing other types of USB traffic such as isochronous
2038 transfers is not yet implemented.</P
2039 ></DIV
2040 ><DIV
2041 CLASS="REFSECT1"
2042 ><A
2043 NAME="AEN17317"
2044 ></A
2045 ><H2
2046 >Starting a Test and Collecting Results</H2
2047 ><P
2048 >A USB test script should prepare one or more transfers using
2049 appropriate functions such as <TT
2050 CLASS="FUNCTION"
2051 >usbtest::bulktest</TT
2052 >.
2053 Once all the individual tests have been prepared they can be started
2054 by a call to <TT
2055 CLASS="FUNCTION"
2056 >usbtest::start</TT
2057 >. This takes a single
2058 argument, a maximum duration measured in seconds. If all transfers
2059 have not been completed in the specified time then any remaining
2060 transfers will be aborted.</P
2061 ><P
2062 ><TT
2063 CLASS="FUNCTION"
2064 >usbtest::start</TT
2065 > will return <TT
2066 CLASS="LITERAL"
2067 >1</TT
2068 >
2069 if all the tests have succeeded, or <TT
2070 CLASS="LITERAL"
2071 >0</TT
2072 > if any of
2073 them have failed. More detailed reports will be stored in the
2074 Tcl variable <TT
2075 CLASS="VARNAME"
2076 >usbtests::results</TT
2077 >, which will be a
2078 list of string messages.</P
2079 ></DIV
2080 ><DIV
2081 CLASS="REFSECT1"
2082 ><A
2083 NAME="AEN17327"
2084 ></A
2085 ><H2
2086 >Existing Test Scripts</H2
2087 ><P
2088 >A number of test scripts are provided as standard. These are located
2089 in the <TT
2090 CLASS="FILENAME"
2091 >host</TT
2092 > subdirectory of the
2093 common USB slave package, and will be installed as part of the process
2094 of building the host-side software. When a script is specified on the
2095 command line <SPAN
2096 CLASS="APPLICATION"
2097 >usbhost</SPAN
2098 > will first search for
2099 it in the current directory, then in the install tree. Standard
2100 test scripts include the following:</P
2101 ><P
2102 ></P
2103 ><DIV
2104 CLASS="VARIABLELIST"
2105 ><DL
2106 ><DT
2107 ><TT
2108 CLASS="FILENAME"
2109 >list.tcl</TT
2110 ></DT
2111 ><DD
2112 ><P
2113 >      This script simply displays information about the capabilities
2114       of the target platform, as provided by the target-side USB
2115       device driver. It can help with tracking down problems, but its
2116       primary purpose is to let users check that everything is working
2117       correctly: if running <B
2118 CLASS="COMMAND"
2119 >usbhost list.tcl</B
2120 >
2121       outputs sensible information then the user knows that the
2122       target side is running correctly and that communication between
2123       host and target is possible.
2124     </P
2125 ></DD
2126 ><DT
2127 ><TT
2128 CLASS="FILENAME"
2129 >verbose.tcl</TT
2130 ></DT
2131 ><DD
2132 ><P
2133 >      The target-side code can provide information about what
2134       is happening while tests are prepared and run. This facility
2135       should not normally be used since the extra I/O involved will
2136       significantly affect the behaviour of the system, but in some
2137       circumstances it may prove useful. Since an eCos application
2138       cannot easily be given command-line arguments the target-side
2139       verbosity level cannot be controlled using
2140       <TT
2141 CLASS="PARAMETER"
2142 ><I
2143 >-V</I
2144 ></TT
2145 > or <TT
2146 CLASS="PARAMETER"
2147 ><I
2148 >--verbose</I
2149 ></TT
2150 >
2151       options. Instead it can be controlled from inside
2152       <SPAN
2153 CLASS="APPLICATION"
2154 >gdb</SPAN
2155 > by changing the integer
2156       variable <TT
2157 CLASS="VARNAME"
2158 >verbose</TT
2159 >. Alternatively it can
2160       be manipulated by running the test script
2161       <TT
2162 CLASS="FILENAME"
2163 >verbose.tcl</TT
2164 >. This script takes a single
2165       argument, the desired verbosity level, which should be a small
2166       integer. For example, to disable target-side run-time logging
2167       the command <B
2168 CLASS="COMMAND"
2169 >usbhost&nbsp;verbose&nbsp;0</B
2170 > can
2171       be used.
2172     </P
2173 ></DD
2174 ></DL
2175 ></DIV
2176 ></DIV
2177 ><DIV
2178 CLASS="REFSECT1"
2179 ><A
2180 NAME="AEN17350"
2181 ></A
2182 ><H2
2183 >Possible Problems</H2
2184 ><P
2185 >If all transfers succeed within the specified time then both host and
2186 target remain in synch and further tests can be run without problem.
2187 However, if at any time a failure occurs then things get more
2188 complicated. For example, if the current test involves a series of
2189 bulk OUT transfers and the target detects that for one of these
2190 transfers it received less data than was expected then the test has
2191 failed, and the target will stop accepting data on this endpoint.
2192 However the host-side software may not have detected anything wrong
2193 and is now blocked trying to send the next lot of data.</P
2194 ><P
2195 >The test code goes to considerable effort to recover from problems
2196 such as these. On the host-side separate threads are used for
2197 concurrent transfers, and on the target-side appropriate asynchronous
2198 I/O mechanisms are used. In addition there is a control thread on the
2199 host that checks the state of all the main host-side threads, and the
2200 state of the target using private control messages. If it discovers
2201 that one side has stopped sending or receiving data because of an
2202 error and the other side is blocked as a result, it will set certain
2203 flags and then cause one additional transfer to take place. That
2204 additional transfer will have the effect of unblocking the other side,
2205 which then discovers that an error has occurred by checking the
2206 appropriate flags. In this way both host and target should end up back
2207 in synch, and it is possible to move on to the next set of tests.</P
2208 ><P
2209 >However, the above assumes that the testing has not triggered any
2210 serious hardware conditions. If instead the target-side hardware has
2211 been left in some strange state so that, for example, it will no
2212 longer raise an interrupt for traffic on a particular endpoint then
2213 recovery is not currently possible, and the testing software will just
2214 hang.</P
2215 ><P
2216 >A possible future enhancement to the testing software would allow the
2217 host-side to raise a USB reset signal whenever a failure occurs, in
2218 the hope that this would clear any remaining problems within the
2219 target-side USB hardware.</P
2220 ></DIV
2221 ><DIV
2222 CLASS="NAVFOOTER"
2223 ><HR
2224 ALIGN="LEFT"
2225 WIDTH="100%"><TABLE
2226 SUMMARY="Footer navigation table"
2227 WIDTH="100%"
2228 BORDER="0"
2229 CELLPADDING="0"
2230 CELLSPACING="0"
2231 ><TR
2232 ><TD
2233 WIDTH="33%"
2234 ALIGN="left"
2235 VALIGN="top"
2236 ><A
2237 HREF="usbs-writing.html"
2238 ACCESSKEY="P"
2239 >Prev</A
2240 ></TD
2241 ><TD
2242 WIDTH="34%"
2243 ALIGN="center"
2244 VALIGN="top"
2245 ><A
2246 HREF="ecos-ref.html"
2247 ACCESSKEY="H"
2248 >Home</A
2249 ></TD
2250 ><TD
2251 WIDTH="33%"
2252 ALIGN="right"
2253 VALIGN="top"
2254 ><A
2255 HREF="io-usb-slave-eth.html"
2256 ACCESSKEY="N"
2257 >Next</A
2258 ></TD
2259 ></TR
2260 ><TR
2261 ><TD
2262 WIDTH="33%"
2263 ALIGN="left"
2264 VALIGN="top"
2265 >Writing a USB Device Driver</TD
2266 ><TD
2267 WIDTH="34%"
2268 ALIGN="center"
2269 VALIGN="top"
2270 ><A
2271 HREF="io-usb-slave.html"
2272 ACCESSKEY="U"
2273 >Up</A
2274 ></TD
2275 ><TD
2276 WIDTH="33%"
2277 ALIGN="right"
2278 VALIGN="top"
2279 >eCos Support for Developing USB-ethernet Peripherals</TD
2280 ></TR
2281 ></TABLE
2282 ></DIV
2283 ></BODY
2284 ></HTML
2285 >