Neue ASCII-Adressierung und Code-Dokumantation.
authorFlorian Pose <fp@igh-essen.com>
Tue, 14 Feb 2006 14:50:20 +0000
changeset 68 a452700db994
parent 67 56964b20c15d
child 69 69dad4ec73c2
Neue ASCII-Adressierung und Code-Dokumantation.
TODO
include/EtherCAT_rt.h
master/Doxyfile
master/Makefile
master/command.h
master/master.c
master/master.h
mini/mini.c
rt/msr_module.c
--- a/TODO	Tue Feb 14 14:40:47 2006 +0000
+++ b/TODO	Tue Feb 14 14:50:20 2006 +0000
@@ -6,3 +6,5 @@
 - Konfiguration SSI-/Inkrementalgeberklemmen (CoE)
 - Ethernet over EtherCAT (EoE)
 - eepro100-Kartentreiber
+- Proc/SysFS-Interface mit Baumdarstellung des Busses
+
--- a/include/EtherCAT_rt.h	Tue Feb 14 14:40:47 2006 +0000
+++ b/include/EtherCAT_rt.h	Tue Feb 14 14:50:20 2006 +0000
@@ -30,7 +30,7 @@
 void EtherCAT_rt_release_master(ec_master_t *master);
 
 ec_slave_t *EtherCAT_rt_register_slave(ec_master_t *master,
-                                       unsigned int slave_index,
+                                       const char *address,
                                        const char *vendor_name,
                                        const char *product_name,
                                        int domain);
@@ -106,9 +106,10 @@
 
 struct ec_slave_init
 {
-    ec_slave_t **slave_ptr; /**< Zeiger auf den Slave-Zeiger, der mit der
-                               Adresse des Slaves belegt werden soll. */
-    unsigned int bus_index; /**< Bus-Index des zu registrierenden Slaves */
+    ec_slave_t **slave_ptr; /**< Zeiger auf den Slave-Zeiger, der später auf
+                               die Slave-Struktur zeigen soll. */
+    const char *address; /**< ASCII-kodierte Bus-Adresse des zu
+                            registrierenden Slaves \sa ec_address */
     const char *vendor_name; /**< Name des Herstellers */
     const char *product_name; /**< Name des Slaves-Typs */
     unsigned int domain; /**< Domäne, in der registriert werden soll. */
--- a/master/Doxyfile	Tue Feb 14 14:40:47 2006 +0000
+++ b/master/Doxyfile	Tue Feb 14 14:50:20 2006 +0000
@@ -1,15 +1,12 @@
-################################################################
+#---------------------------------------------------------------------------
 #
-#  Doxyfile
+# Doxyfile 1.4.4
 #
-#  IgH EtherCAT-Treiber
+# IgH EtherCAT-Treiber
 #
-#  $LastChangedDate$
-#  $Author$
+# $Id$
 #
-#################################################################
-
-# Doxyfile 1.2.18
+#---------------------------------------------------------------------------
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project
@@ -22,7 +19,7 @@
 # Values that contain spaces should be placed between quotes (" ")
 
 #---------------------------------------------------------------------------
-# General configuration options
+# Project related configuration options
 #---------------------------------------------------------------------------
 
 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
@@ -43,16 +40,187 @@
 
 OUTPUT_DIRECTORY       = doc
 
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
 # The OUTPUT_LANGUAGE tag is used to specify the language in which all 
 # documentation generated by doxygen is written. Doxygen will use this 
 # information to generate all constant output in the proper language. 
 # The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, 
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en 
-# (Japanese with english messages), Korean, Norwegian, Polish, Portuguese, 
-# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish and Ukrainian.
-
-OUTPUT_LANGUAGE        =
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = German
+
+# This tag can be used to specify the encoding used in the generated output. 
+# The encoding is not always determined by the language that is chosen, 
+# but also whether or not the output is meant for Windows or non-Windows users. 
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
+# forces the Windows encoding (this is the default for the Windows binary), 
+# whereas setting the tag to NO uses a Unix-style encoding (the default for 
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like the Qt-style comments (thus requiring an 
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = YES
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = YES
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 3
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources 
+# only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
 
 # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
 # documentation are documented, even if no documentation was available. 
@@ -77,17 +245,24 @@
 
 EXTRACT_LOCAL_CLASSES  = YES
 
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = YES
+
 # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
 # undocumented members of documented classes, files or namespaces. 
 # If set to NO (the default) these members will be included in the 
 # various overviews, but no documentation section is generated. 
 # This option has no effect if EXTRACT_ALL is enabled.
 
-HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_MEMBERS     = YES
 
 # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
 # undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these class will be included in the various 
+# If set to NO (the default) these classes will be included in the various 
 # overviews. This option has no effect if EXTRACT_ALL is enabled.
 
 HIDE_UNDOC_CLASSES     = YES
@@ -99,45 +274,12 @@
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
-ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited 
-# members of a class in the documentation of that class as if those members were 
-# ordinary class members. Constructors, destructors and assignment operators of 
-# the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. It is allowed to use relative paths in the argument list.
-
-STRIP_FROM_PATH        = 
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
 
 # The INTERNAL_DOCS tag determines if documentation 
 # that is typed after a \internal command is included. If the tag is set 
@@ -146,73 +288,26 @@
 
 INTERNAL_DOCS          = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
 # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower case letters. If set to YES upper case letters are also 
+# file names in lower-case letters. If set to YES upper-case letters are also 
 # allowed. This is useful if you have classes or files whose names only differ 
 # in case and if your file system supports case sensitive file names. Windows 
-# users are adviced to set this option to NO.
+# and Mac users are advised to set this option to NO.
 
 CASE_SENSE_NAMES       = YES
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = NO
-
 # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
 # will show members with their full class and namespace scopes in the 
 # documentation. If set to YES the scope will be hidden.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
 # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put list of the files that are included by a file in the documentation 
+# will put a list of the files that are included by a file in the documentation 
 # of that file.
 
 SHOW_INCLUDE_FILES     = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments  will behave just like the Qt-style comments (thus requiring an 
-# explict @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF      = YES
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = YES
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = YES
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# reimplements.
-
-INHERIT_DOCS           = YES
-
 # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
 # is inserted in the documentation for inline members.
 
@@ -225,17 +320,22 @@
 
 SORT_MEMBER_DOCS       = NO
 
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 3
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
 
 # The GENERATE_TODOLIST tag can be used to enable (YES) or 
 # disable (NO) the todo list. This list is created by putting \todo 
@@ -256,26 +356,18 @@
 GENERATE_BUGLIST       = NO
 
 # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting \deprecated commands in the documentation.
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
 
 GENERATE_DEPRECATEDLIST= NO
 
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                = 
-
 # The ENABLED_SECTIONS tag can be used to enable conditional 
 # documentation sections, marked by \if sectionname ... \endif.
 
 ENABLED_SECTIONS       = 
 
 # The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consist of for it to appear in 
+# the initial value of a variable or define consists of for it to appear in 
 # the documentation. If the initializer consists of more lines than specified 
 # here it will be hidden. Use a value of 0 to hide initializers completely. 
 # The appearance of the initializer of individual variables and defines in the 
@@ -284,26 +376,28 @@
 
 MAX_INITIALIZER_LINES  = 30
 
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources 
-# only. Doxygen will then generate output that is more tailored for C. 
-# For instance some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = YES
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources 
-# only. Doxygen will then generate output that is more tailored for Java. 
-# For instance namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
 # at the bottom of the documentation of classes and structs. If set to YES the 
 # list will mention the files that were used to generate the documentation.
 
 SHOW_USED_FILES        = NO
 
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is YES.
+
+SHOW_DIRECTORIES       = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the progam writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
@@ -325,10 +419,27 @@
 
 WARN_IF_UNDOCUMENTED   = YES
 
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
 # The WARN_FORMAT tag determines the format of the warning messages that 
 # doxygen can produce. The string should contain the $file, $line, and $text 
 # tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text.
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
 
 WARN_FORMAT            = "$file:$line: $text"
 
@@ -347,14 +458,15 @@
 # directories like "/usr/src/myproject". Separate the files or directories 
 # with spaces.
 
-INPUT                  = . ../include
+INPUT                  = . \
+                         ../include
 
 # If the value of the INPUT tag contains directories, you can use the 
 # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
 # and *.h) to filter out the source-files in the directories. If left 
 # blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp 
-# *.h++ *.idl *.odl
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
 
 FILE_PATTERNS          = 
 
@@ -368,16 +480,19 @@
 # excluded from the INPUT source files. This way you can easily exclude a 
 # subdirectory from a directory tree whose root is specified with the INPUT tag.
 
-EXCLUDE                =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories 
-# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
 
 EXCLUDE_SYMLINKS       = NO
 
 # If the value of the INPUT tag contains directories, you can use the 
 # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories.
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
 
 EXCLUDE_PATTERNS       = *.mod.c
 
@@ -412,10 +527,20 @@
 # by executing (via popen()) the command <filter> <input-file>, where <filter> 
 # is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
 # input file. Doxygen will then use the output that the filter program writes 
-# to standard output.
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
 
 INPUT_FILTER           = 
 
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
 # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
 # INPUT_FILTER) will be used to filter the input files when producing source 
 # files to browse (i.e. when SOURCE_BROWSER is set to YES).
@@ -427,7 +552,9 @@
 #---------------------------------------------------------------------------
 
 # If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources.
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
 
 SOURCE_BROWSER         = YES
 
@@ -436,17 +563,37 @@
 
 INLINE_SOURCES         = NO
 
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
 # If the REFERENCED_BY_RELATION tag is set to YES (the default) 
 # then for each documented function all documented 
 # functions referencing it will be listed.
 
-REFERENCED_BY_RELATION = YES
+REFERENCED_BY_RELATION = NO
 
 # If the REFERENCES_RELATION tag is set to YES (the default) 
 # then for each documented function all documented entities 
 # called/used by that function will be listed.
 
-REFERENCES_RELATION    = YES
+REFERENCES_RELATION    = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
 
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
@@ -504,10 +651,12 @@
 
 HTML_FOOTER            = 
 
-# The HTML_STYLESHEET tag can be used to specify a user defined cascading 
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
 # style sheet that is used by each HTML page. It can be used to 
 # fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
 
 HTML_STYLESHEET        = 
 
@@ -527,14 +676,14 @@
 # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
 # be used to specify the file name of the resulting .chm file. You 
 # can add a path in front of the file if the result should not be 
-# written to the html output dir.
+# written to the html output directory.
 
 CHM_FILE               = 
 
 # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
 # be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non empty doxygen will try to run 
-# the html help compiler on the generated index.hhp.
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
 
 HHC_LOCATION           = 
 
@@ -551,7 +700,7 @@
 BINARY_TOC             = NO
 
 # The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the Html help documentation and to the tree view.
+# to the contents of the HTML help documentation and to the tree view.
 
 TOC_EXPAND             = NO
 
@@ -569,10 +718,9 @@
 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
 # generated containing a tree-like index structure (just like the one that 
 # is generated for HTML Help). For this to work a browser that supports 
-# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+, 
-# or Internet explorer 4.0+). Note that for large projects the tree generation 
-# can take a very long time. In such cases it is better to disable this feature. 
-# Windows users are probably better off using the HTML help feature.
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
 
 GENERATE_TREEVIEW      = YES
 
@@ -597,7 +745,8 @@
 
 LATEX_OUTPUT           = latex
 
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be invoked. If left blank `latex' will be used as the default command name.
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
 
 LATEX_CMD_NAME         = latex
 
@@ -651,12 +800,18 @@
 
 LATEX_BATCHMODE        = NO
 
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
 # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimised for Word 97 and may not look very pretty with 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
 # other RTF readers or editors.
 
 GENERATE_RTF           = NO
@@ -683,7 +838,7 @@
 RTF_HYPERLINKS         = NO
 
 # Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assigments. You only have to provide 
+# config file, i.e. a series of assignments. You only have to provide 
 # replacements, missing definitions are set to their default value.
 
 RTF_STYLESHEET_FILE    = 
@@ -727,12 +882,16 @@
 
 # If the GENERATE_XML tag is set to YES Doxygen will 
 # generate an XML file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
+# the code including all documentation.
 
 GENERATE_XML           = NO
 
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
 # The XML_SCHEMA tag can be used to specify an XML schema, 
 # which can be used by a validating XML parser to check the 
 # syntax of the XML files.
@@ -745,6 +904,13 @@
 
 XML_DTD                = 
 
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
@@ -758,6 +924,39 @@
 GENERATE_AUTOGEN_DEF   = NO
 
 #---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
 # Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
 
@@ -802,11 +1001,13 @@
 # are defined before the preprocessor is started (similar to the -D option of 
 # gcc). The argument of the tag is a list of macros of the form: name 
 # or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed.
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
 
 PREDEFINED             = 
 
-# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then 
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
 # this tag can be used to specify a list of macro names that should be expanded. 
 # The macro definition that is found in the sources will be used. 
 # Use the PREDEFINED tag if you want to use a different macro definition.
@@ -816,16 +1017,29 @@
 # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
 # doxygen's preprocessor will remove all function-like macros that are alone 
 # on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse the 
-# parser if not removed.
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::addtions related to external references   
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tagfiles.
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
 
 TAGFILES               = 
 
@@ -856,10 +1070,11 @@
 #---------------------------------------------------------------------------
 
 # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or 
-# super classes. Setting the tag to NO turns the diagrams off. Note that this 
-# option is superceded by the HAVE_DOT option below. This is only a fallback. It is 
-# recommended to install and use dot, since it yield more powerful graphs.
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
 
 CLASS_DIAGRAMS         = YES
 
@@ -890,6 +1105,17 @@
 
 COLLABORATION_GRAPH    = YES
 
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
 # If set to YES, the inheritance and collaboration graphs will show the 
 # relations between templates and their instances.
 
@@ -909,11 +1135,26 @@
 
 INCLUDED_BY_GRAPH      = YES
 
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
 # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
 # will graphical hierarchy of all classes instead of a textual one.
 
 GRAPHICAL_HIERARCHY    = YES
 
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
 # generated by dot. Possible values are png, jpg, or gif
 # If left blank png will be used.
@@ -921,7 +1162,7 @@
 DOT_IMAGE_FORMAT       = png
 
 # The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found on the path.
+# found. If left blank, it is assumed the dot tool can be found in the path.
 
 DOT_PATH               = 
 
@@ -947,6 +1188,33 @@
 
 MAX_DOT_GRAPH_HEIGHT   = 1024
 
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that a graph may be further truncated if the graph's 
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
 # generate a legend page explaining the meaning of the various boxes and 
 # arrows in the dot generated graphs.
@@ -954,51 +1222,16 @@
 GENERATE_LEGEND        = YES
 
 # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermedate dot files that are used to generate 
+# remove the intermediate dot files that are used to generate 
 # the various graphs.
 
 DOT_CLEANUP            = YES
 
 #---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine   
+# Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
 
 # The SEARCHENGINE tag specifies whether or not a search engine should be 
 # used. If set to NO the values of all tags below this one will be ignored.
 
 SEARCHENGINE           = NO
-
-# The CGI_NAME tag should be the name of the CGI script that 
-# starts the search engine (doxysearch) with the correct parameters. 
-# A script with this name will be generated by doxygen.
-
-CGI_NAME               = search.cgi
-
-# The CGI_URL tag should be the absolute URL to the directory where the 
-# cgi binaries are located. See the documentation of your http daemon for 
-# details.
-
-CGI_URL                = 
-
-# The DOC_URL tag should be the absolute URL to the directory where the 
-# documentation is located. If left blank the absolute path to the 
-# documentation, with file:// prepended to it, will be used.
-
-DOC_URL                = 
-
-# The DOC_ABSPATH tag should be the absolute path to the directory where the 
-# documentation is located. If left blank the directory on the local machine 
-# will be used.
-
-DOC_ABSPATH            = 
-
-# The BIN_ABSPATH tag must point to the directory where the doxysearch binary 
-# is installed.
-
-BIN_ABSPATH            = /usr/local/bin/
-
-# The EXT_DOC_PATHS tag can be used to specify one or more paths to 
-# documentation generated for other projects. This allows doxysearch to search 
-# the documentation for these projects as well.
-
-EXT_DOC_PATHS          = 
--- a/master/Makefile	Tue Feb 14 14:40:47 2006 +0000
+++ b/master/Makefile	Tue Feb 14 14:50:20 2006 +0000
@@ -48,6 +48,8 @@
 cleandoc:
 	@rm -rf doc
 
+.PHONY: doc
+
 #------------------------------------------------------------------------------
 
 endif
--- a/master/command.h	Tue Feb 14 14:40:47 2006 +0000
+++ b/master/command.h	Tue Feb 14 14:50:20 2006 +0000
@@ -30,13 +30,12 @@
 /**
    EtherCAT-Adresse.
 
-   Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die
-   ja nach Kommandoty eine andere bedeutung haben: Bei Autoinkrement-
-   befehlen sind die ersten zwei Bytes die (negative)
-   Autoinkrement-Adresse, bei Knoten-adressierten Befehlen entsprechen
-   sie der Knotenadresse. Das dritte und vierte Byte entspricht in
-   diesen Fällen der physikalischen Speicheradresse auf dem Slave.
-   Bei einer logischen Adressierung entsprechen alle vier Bytes
+   Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach
+   Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen
+   sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten-
+   adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und
+   vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse
+   auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes
    der logischen Adresse.
 */
 
@@ -53,7 +52,7 @@
 
     unsigned short mem; /**< Physikalische Speicheradresse im Slave */
   }
-  phy;
+  phy; /**< Physikalische Adresse */
 
   unsigned long logical; /**< Logische Adresse */
   unsigned char raw[4]; /**< Rohdaten für die Generierung des Frames */
@@ -68,12 +67,12 @@
 
 typedef struct ec_command
 {
-  ec_command_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc...) */
+  ec_command_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc) */
   ec_address_t address; /**< Adresse des/der Empfänger */
   unsigned int data_length; /**< Länge der zu sendenden und/oder
                                empfangenen Daten */
   ec_command_state_t state; /**< Zustand des Kommandos
-                           (bereit, gesendet, etc...) */
+                           (bereit, gesendet, etc) */
   unsigned char index; /**< Kommando-Index, mit der das Kommando gesendet
                           wurde (wird vom Master beim Senden gesetzt. */
   unsigned int working_counter; /**< Working-Counter bei Empfang (wird
--- a/master/master.c	Tue Feb 14 14:40:47 2006 +0000
+++ b/master/master.c	Tue Feb 14 14:50:20 2006 +0000
@@ -36,11 +36,11 @@
 
 /**
    Konstruktor des EtherCAT-Masters.
-
-   @param master Zeiger auf den zu initialisierenden EtherCAT-Master
-*/
-
-void ec_master_init(ec_master_t *master)
+*/
+
+void ec_master_init(ec_master_t *master
+                    /**< Zeiger auf den zu initialisierenden EtherCAT-Master */
+                    )
 {
   master->bus_slaves = NULL;
   master->bus_slaves_count = 0;
@@ -62,11 +62,11 @@
 
    Entfernt alle Kommandos aus der Liste, löscht den Zeiger
    auf das Slave-Array und gibt die Prozessdaten frei.
-
-   @param master Zeiger auf den zu löschenden Master
-*/
-
-void ec_master_clear(ec_master_t *master)
+*/
+
+void ec_master_clear(ec_master_t *master
+                     /**< Zeiger auf den zu löschenden Master */
+                     )
 {
   if (master->bus_slaves) {
     kfree(master->bus_slaves);
@@ -85,11 +85,11 @@
 
    Bei einem "release" sollte immer diese Funktion aufgerufen werden,
    da sonst Slave-Liste, Domains, etc. weiter existieren.
-
-   @param master Zeiger auf den zurückzusetzenden Master
-*/
-
-void ec_master_reset(ec_master_t *master)
+*/
+
+void ec_master_reset(ec_master_t *master
+                     /**< Zeiger auf den zurückzusetzenden Master */
+                     )
 {
   if (master->bus_slaves) {
     kfree(master->bus_slaves);
@@ -112,13 +112,11 @@
 /**
    Öffnet das EtherCAT-Geraet des Masters.
 
-   @param master Der EtherCAT-Master
-
-   @return 0, wenn alles o.k., < 0, wenn das Geraet nicht geoeffnet werden
-           konnte.
-*/
-
-int ec_master_open(ec_master_t *master)
+   \return 0, wenn alles o.k., < 0, wenn kein Gerät registriert wurde oder
+   es nicht geoeffnet werden konnte.
+*/
+
+int ec_master_open(ec_master_t *master /**< Der EtherCAT-Master */)
 {
   if (!master->device_registered) {
     printk(KERN_ERR "EtherCAT: No device registered!\n");
@@ -137,11 +135,9 @@
 
 /**
    Schliesst das EtherCAT-Geraet, auf dem der Master arbeitet.
-
-   @param master Der EtherCAT-Master
-*/
-
-void ec_master_close(ec_master_t *master)
+*/
+
+void ec_master_close(ec_master_t *master /**< EtherCAT-Master */)
 {
   if (!master->device_registered) {
     printk(KERN_WARNING "EtherCAT: Warning -"
@@ -160,13 +156,14 @@
    Sendet ein einzelnes Kommando in einem Frame und
    wartet auf dessen Empfang.
 
-   @param master EtherCAT-Master
-   @param cmd    Kommando zum Senden/Empfangen
-
-   @return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_simple_send_receive(ec_master_t *master, ec_command_t *cmd)
+   \return 0 bei Erfolg, sonst < 0
+*/
+
+int ec_simple_send_receive(ec_master_t *master,
+                           /**< EtherCAT-Master */
+                           ec_command_t *cmd
+                           /**< Kommando zum Senden/Empfangen */
+                           )
 {
   unsigned int tries_left;
 
@@ -194,13 +191,12 @@
 /**
    Sendet ein einzelnes Kommando in einem Frame.
 
-   @param master EtherCAT-Master
-   @param cmd    Kommando zum Senden
-
-   @return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_simple_send(ec_master_t *master, ec_command_t *cmd)
+   \return 0 bei Erfolg, sonst < 0
+*/
+
+int ec_simple_send(ec_master_t *master, /**< EtherCAT-Master */
+                   ec_command_t *cmd /**< Kommando zum Senden */
+                   )
 {
   unsigned int length, framelength, i;
 
@@ -294,13 +290,12 @@
    Wartet auf den Empfang eines einzeln gesendeten
    Kommandos.
 
-   @param master EtherCAT-Master
-   @param cmd    Gesendetes Kommando
-
-   @return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_simple_receive(ec_master_t *master, ec_command_t *cmd)
+   \return 0 bei Erfolg, sonst < 0
+*/
+
+int ec_simple_receive(ec_master_t *master, /**< EtherCAT-Master */
+                      ec_command_t *cmd /**< Gesendetes Kommando */
+                      )
 {
   unsigned int length;
   int ret;
@@ -377,12 +372,10 @@
 /**
    Durchsucht den Bus nach Slaves.
 
-   @param master Der EtherCAT-Master
-
    @return 0 bei Erfolg, sonst < 0
 */
 
-int ec_scan_for_slaves(ec_master_t *master)
+int ec_scan_for_slaves(ec_master_t *master /**< EtherCAT-Master */)
 {
   ec_command_t cmd;
   ec_slave_t *slave;
@@ -510,17 +503,19 @@
    Liest Daten aus dem Slave-Information-Interface
    eines EtherCAT-Slaves.
 
-   @param master EtherCAT-Master
-   @param node_address Knotenadresse des Slaves
-   @param offset Adresse des zu lesenden SII-Registers
-   @param target Zeiger auf einen 4 Byte großen Speicher
-   zum Ablegen der Daten
-
-   @return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_sii_read(ec_master_t *master, unsigned short int node_address,
-                unsigned short int offset, unsigned int *target)
+   \return 0 bei Erfolg, sonst < 0
+*/
+
+int ec_sii_read(ec_master_t *master,
+                /**< EtherCAT-Master */
+                unsigned short int node_address,
+                /**< Knotenadresse des Slaves */
+                unsigned short int offset,
+                /**< Adresse des zu lesenden SII-Registers */
+                unsigned int *target
+                /**< Zeiger auf einen 4 Byte großen Speicher zum Ablegen der
+                   Daten */
+                )
 {
   ec_command_t cmd;
   unsigned char data[10];
@@ -586,20 +581,18 @@
 /*****************************************************************************/
 
 /**
-   Ändert den Zustand eines Slaves (asynchron).
-
-   Führt eine (asynchrone) Zustandsänderung bei einem Slave durch.
-
-   @param master EtherCAT-Master
-   @param slave Slave, dessen Zustand geändert werden soll
-   @param state_and_ack Neuer Zustand, evtl. mit gesetztem
-   Acknowledge-Flag
-
-   @return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_state_change(ec_master_t *master, ec_slave_t *slave,
-                    unsigned char state_and_ack)
+   Ändert den Zustand eines Slaves.
+
+   \return 0 bei Erfolg, sonst < 0
+*/
+
+int ec_state_change(ec_master_t *master,
+                    /**<EtherCAT-Master */
+                    ec_slave_t *slave,
+                    /**< Slave, dessen Zustand geändert werden soll */
+                    unsigned char state_and_ack
+                    /**< Neuer Zustand, evtl. mit gesetztem Acknowledge-Flag */
+                    )
 {
   ec_command_t cmd;
   unsigned char data[2];
@@ -670,11 +663,9 @@
 
 /**
    Gibt Frame-Inhalte zwecks Debugging aus.
-
-   @param master EtherCAT-Master
-*/
-
-void ec_output_debug_data(const ec_master_t *master)
+*/
+
+void ec_output_debug_data(const ec_master_t *master /**< EtherCAT-Master */)
 {
   unsigned int i;
 
@@ -705,11 +696,9 @@
 
 /**
    Gibt von Zeit zu Zeit die Anzahl verlorener Frames aus.
-
-   @param master EtherCAT-Master
-*/
-
-void ec_output_lost_frames(ec_master_t *master)
+*/
+
+void ec_output_lost_frames(ec_master_t *master /**< EtherCAT-Master */)
 {
   unsigned long int t;
 
@@ -723,6 +712,92 @@
   }
 }
 
+/*****************************************************************************/
+
+/**
+   Wandelt eine ASCII-kodierte Bus-Adresse in einen Slave-Zeiger.
+
+   Gültige Adress-Strings sind Folgende:
+
+   - \a "X" = der X. Slave im Bus,
+   - \a "X:Y" = der Y. Slave hinter dem X. Buskoppler,
+   - \a "#X" = der Slave mit der SSID X,
+   - \a "#X:Y" = der Y. Slave hinter dem Buskoppler mit der SSID X.
+
+   \return Zeiger auf Slave bei Erfolg, sonst NULL
+*/
+
+ec_slave_t *ec_address(const ec_master_t *master,
+                       /**< EtherCAT-Master */
+                       const char *address
+                       /**< Address-String */
+                       )
+{
+  unsigned long first, second;
+  char *remainder, *remainder2;
+  unsigned int i;
+  int coupler_idx, slave_idx;
+  ec_slave_t *slave;
+
+  if (!address || address[0] == 0) return NULL;
+
+  if (address[0] == '#') {
+    printk(KERN_ERR "EtherCAT: Bus ID - #<SSID> not implemented yet!\n");
+    return NULL;
+  }
+
+  first = simple_strtoul(address, &remainder, 0);
+  if (remainder == address) {
+    printk(KERN_ERR "EtherCAT: Bus ID - First number empty!\n");
+    return NULL;
+  }
+
+  if (!remainder[0]) { // absolute position
+    if (first < master->bus_slaves_count) {
+      return master->bus_slaves + first;
+    }
+
+    printk(KERN_ERR "EtherCAT: Bus ID - Absolute position illegal!\n");
+  }
+
+  else if (remainder[0] == ':') { // field position
+
+    remainder++;
+    second = simple_strtoul(remainder, &remainder2, 0);
+
+    if (remainder2 == remainder) {
+      printk(KERN_ERR "EtherCAT: Bus ID - Sencond number empty!\n");
+      return NULL;
+    }
+
+    if (remainder2[0]) {
+      printk(KERN_ERR "EtherCAT: Bus ID - Illegal trailer (2)!\n");
+      return NULL;
+    }
+
+    coupler_idx = -1;
+    slave_idx = 0;
+    for (i = 0; i < master->bus_slaves_count; i++, slave_idx++) {
+      slave = master->bus_slaves + i;
+      if (!slave->type) continue;
+
+      if (strcmp(slave->type->vendor_name, "Beckhoff") == 0 &&
+          strcmp(slave->type->product_name, "EK1100") == 0) {
+        coupler_idx++;
+        slave_idx = 0;
+      }
+
+      if (coupler_idx == first && slave_idx == second) return slave;
+    }
+  }
+
+  else {
+    printk(KERN_ERR "EtherCAT: Bus ID - Illegal trailer!\n");
+  }
+
+  return NULL;
+}
+
 /******************************************************************************
  *
  * Echtzeitschnittstelle
@@ -732,20 +807,21 @@
 /**
    Registriert einen Slave beim Master.
 
-   @param master Der EtherCAT-Master
-   @param bus_index Index des Slaves im EtherCAT-Bus
-   @param vendor_name String mit dem Herstellernamen
-   @param product_name String mit dem Produktnamen
-   @param domain Domäne, in der der Slave sein soll
-
-   @return Zeiger auf den Slave bei Erfolg, sonst NULL
+   \return Zeiger auf den Slave bei Erfolg, sonst NULL
 */
 
 ec_slave_t *EtherCAT_rt_register_slave(ec_master_t *master,
-                                       unsigned int bus_index,
+                                       /**< EtherCAT-Master */
+                                       const char *address,
+                                       /**< ASCII-Addresse des Slaves, siehe
+                                          auch ec_address() */
                                        const char *vendor_name,
+                                       /**< Herstellername */
                                        const char *product_name,
-                                       int domain)
+                                       /**< Produktname */
+                                       int domain
+                                       /**< Domäne */
+                                       )
 {
   ec_slave_t *slave;
   const ec_slave_type_t *type;
@@ -757,21 +833,20 @@
     return NULL;
   }
 
-  if (bus_index >= master->bus_slaves_count) {
-    printk(KERN_ERR "EtherCAT: Illegal bus index! (%i / %i)\n", bus_index,
-           master->bus_slaves_count);
+  if ((slave = ec_address(master, address)) == NULL) {
+    printk(KERN_ERR "EtherCAT: Illegal address: \"%s\"\n", address);
     return NULL;
   }
 
-  slave = master->bus_slaves + bus_index;
-
   if (slave->registered) {
-    printk(KERN_ERR "EtherCAT: Slave %i is already registered!\n", bus_index);
+    printk(KERN_ERR "EtherCAT: Slave \"%s\" (position %i) has already been"
+           " registered!\n", address, slave->ring_position * (-1));
     return NULL;
   }
 
   if (!slave->type) {
-    printk(KERN_ERR "EtherCAT: Unknown slave at position %i!\n", bus_index);
+    printk(KERN_ERR "EtherCAT: Slave \"%s\" (position %i) has unknown type!\n",
+           address, slave->ring_position * (-1));
     return NULL;
   }
 
@@ -829,23 +904,24 @@
 /**
    Registriert eine ganze Liste von Slaves beim Master.
 
-   @param master Der EtherCAT-Master
-   @param slaves Array von Slave-Initialisierungsstrukturen
-   @param count Anzahl der Strukturen in "slaves"
-
-   @return 0 bei Erfolg, sonst < 0
+   \return 0 bei Erfolg, sonst < 0
 */
 
 int EtherCAT_rt_register_slave_list(ec_master_t *master,
+                                    /**< EtherCAT-Master */
                                     const ec_slave_init_t *slaves,
-                                    unsigned int count)
+                                    /**< Array von Slave-Initialisierungs-
+                                       strukturen */
+                                    unsigned int count
+                                    /**< Anzahl der Strukturen in \a slaves */
+                                    )
 {
   unsigned int i;
 
   for (i = 0; i < count; i++)
   {
     if ((*(slaves[i].slave_ptr) =
-         EtherCAT_rt_register_slave(master, slaves[i].bus_index,
+         EtherCAT_rt_register_slave(master, slaves[i].address,
                                     slaves[i].vendor_name,
                                     slaves[i].product_name,
                                     slaves[i].domain)) == NULL)
@@ -864,12 +940,10 @@
    Slaves durch. Setzt Sync-Manager und FMMU's, führt die entsprechenden
    Zustandsübergänge durch, bis der Slave betriebsbereit ist.
 
-   @param master EtherCAT-Master
-
-   @return 0 bei Erfolg, sonst < 0
-*/
-
-int EtherCAT_rt_activate_slaves(ec_master_t *master)
+   \return 0 bei Erfolg, sonst < 0
+*/
+
+int EtherCAT_rt_activate_slaves(ec_master_t *master /**< EtherCAT-Master */)
 {
   unsigned int i;
   ec_slave_t *slave;
@@ -1072,12 +1146,10 @@
 /**
    Setzt alle Slaves zurück in den Init-Zustand.
 
-   @param master EtherCAT-Master
-
-   @return 0 bei Erfolg, sonst < 0
-*/
-
-int EtherCAT_rt_deactivate_slaves(ec_master_t *master)
+   \return 0 bei Erfolg, sonst < 0
+*/
+
+int EtherCAT_rt_deactivate_slaves(ec_master_t *master /**< EtherCAT-Master */)
 {
   ec_slave_t *slave;
   unsigned int i;
@@ -1098,15 +1170,16 @@
 /**
    Sendet und empfängt Prozessdaten der angegebenen Domäne
 
-   @param master EtherCAT-Master
-   @param domain Domäne
-   @param timeout_us Timeout in Mikrosekunden
-
-   @return 0 bei Erfolg, sonst < 0
-*/
-
-int EtherCAT_rt_domain_xio(ec_master_t *master, unsigned int domain,
-                           unsigned int timeout_us)
+   \return 0 bei Erfolg, sonst < 0
+*/
+
+int EtherCAT_rt_domain_xio(ec_master_t *master,
+                           /**< EtherCAT-Master */
+                           unsigned int domain,
+                           /**< Domäne */
+                           unsigned int timeout_us
+                           /**< Timeout in Mikrosekunden */
+                           )
 {
   unsigned int i;
   ec_domain_t *dom;
@@ -1183,9 +1256,18 @@
 
 /**
    Setzt die Debug-Ebene des Masters.
-*/
-
-void EtherCAT_rt_debug_level(ec_master_t *master, int level)
+
+   Folgende Debug-level sind definiert:
+
+   - 1: Nur Positionsmarken in bestimmten Funktionen
+   - 2: Komplette Frame-Inhalte
+*/
+
+void EtherCAT_rt_debug_level(ec_master_t *master,
+                             /**< EtherCAT-Master */
+                             int level
+                             /**< Debug-Level */
+                             )
 {
   master->debug_level = level;
 }
--- a/master/master.h	Tue Feb 14 14:40:47 2006 +0000
+++ b/master/master.h	Tue Feb 14 14:50:20 2006 +0000
@@ -61,6 +61,7 @@
 
 // Slave management
 int ec_scan_for_slaves(ec_master_t *);
+ec_slave_t *ec_address(const ec_master_t *, const char *);
 
 // Data
 int ec_simple_send_receive(ec_master_t *, ec_command_t *);
--- a/mini/mini.c	Tue Feb 14 14:40:47 2006 +0000
+++ b/mini/mini.c	Tue Feb 14 14:50:20 2006 +0000
@@ -24,9 +24,9 @@
 
 ec_slave_init_t slaves[] = {
     // Zeiger, Index, Herstellername, Produktname, Domäne
-    {  &s_out, 2,     "Beckhoff",     "EL2004",    1      },
-    {  &s_in,  1,     "Beckhoff",     "EL3102",    1      },
-    {  &s_ssi, 7,     "Beckhoff",     "EL5001",    1      }
+    {  &s_in,  "1",   "Beckhoff",     "EL3102",    1      },
+    {  &s_out, "2",   "Beckhoff",     "EL2004",    1      },
+    {  &s_ssi, "3",   "Beckhoff",     "EL5001",    1      }
 };
 
 #define SLAVE_COUNT (sizeof(slaves) / sizeof(ec_slave_init_t))
@@ -35,12 +35,28 @@
 
 void run(unsigned long data)
 {
+    static unsigned int counter;
+
     // Klemmen-IO
     EC_WRITE_EL20XX(s_out, 3, EC_READ_EL31XX(s_in, 0) < 0);
 
+    if (!counter) {
+        EtherCAT_rt_debug_level(master, 2);
+    }
+
     // Prozessdaten lesen und schreiben
     EtherCAT_rt_domain_xio(master, 1, 100);
 
+    if (counter) {
+        counter--;
+    }
+    else {
+        EtherCAT_rt_debug_level(master, 0);
+        printk("SSI status=%X value=%u\n",
+               EC_READ_EL5001_STATE(s_ssi), EC_READ_EL5001_VALUE(s_ssi));
+        counter = 1000;
+    }
+
     // Timer neu starten
     timer.expires += HZ / 1000;
     add_timer(&timer);
@@ -71,14 +87,15 @@
 
     printk("Configuring EtherCAT slaves.\n");
 
-    EtherCAT_rt_debug_level(master, 2);
-
     if (EtherCAT_rt_canopen_sdo_write(master, s_ssi, 0x4067, 0, 2, 2)) {
         printk(KERN_ERR "EtherCAT: Could not set SSI baud rate!\n");
         goto out_release_master;
     }
 
-    EtherCAT_rt_debug_level(master, 0);
+    if (EtherCAT_rt_canopen_sdo_write(master, s_ssi, 0x4061, 4, 1, 1)) {
+        printk(KERN_ERR "EtherCAT: Could not set SSI feature bit!\n");
+        goto out_release_master;
+    }
 
     printk("Starting cyclic sample thread.\n");
 
--- a/rt/msr_module.c	Tue Feb 14 14:40:47 2006 +0000
+++ b/rt/msr_module.c	Tue Feb 14 14:50:20 2006 +0000
@@ -52,16 +52,15 @@
 
 // EtherCAT
 ec_master_t *master = NULL;
-ec_slave_t *s_in1, *s_out1, *s_out2, *s_out3;
-
-double value;
-int dig1;
+ec_slave_t *s_in1, *s_out1, *s_ssi, *s_inc;
+
+uint16_t angle0;
 
 ec_slave_init_t slaves[] = {
-    {&s_in1,   1, "Beckhoff", "EL3102", 0},
-    {&s_out1,  8, "Beckhoff", "EL2004", 0},
-    {&s_out2,  9, "Beckhoff", "EL2004", 0},
-    {&s_out3, 10, "Beckhoff", "EL2004", 0}
+    {&s_in1,  "1", "Beckhoff", "EL3102", 0},
+    {&s_out1, "2", "Beckhoff", "EL2004", 0},
+    {&s_ssi,  "3", "Beckhoff", "EL5001", 0},
+    {&s_inc,  "0:4", "Beckhoff", "EL5101", 0}
 };
 
 #define SLAVE_COUNT (sizeof(slaves) / sizeof(ec_slave_init_t))
@@ -78,30 +77,29 @@
 
     msr_jitter_run(MSR_ABTASTFREQUENZ);
 
+    EC_WRITE_EL20XX(s_out1, 3, EC_READ_EL31XX(s_in1, 0) < 0);
+
+    if (!counter) {
+        EtherCAT_rt_debug_level(master, 2);
+    }
+
+    // Prozessdaten lesen und schreiben
+    EtherCAT_rt_domain_xio(master, 0, 40);
+
     if (counter) {
         counter--;
     }
     else {
-        // "Star Trek"-Effekte
-        EC_WRITE_EL20XX(s_out1, 0, jiffies & 1);
-        EC_WRITE_EL20XX(s_out1, 1, (jiffies >> 1) & 1);
-        EC_WRITE_EL20XX(s_out1, 2, (jiffies >> 2) & 1);
-        EC_WRITE_EL20XX(s_out1, 3, (jiffies >> 3) & 1);
-        EC_WRITE_EL20XX(s_out2, 0, (jiffies >> 4) & 1);
-        EC_WRITE_EL20XX(s_out2, 1, (jiffies >> 3) & 1);
-        EC_WRITE_EL20XX(s_out2, 2, (jiffies >> 2) & 1);
-        EC_WRITE_EL20XX(s_out2, 3, (jiffies >> 6) & 1);
-        EC_WRITE_EL20XX(s_out3, 0, (jiffies >> 7) & 1);
-        EC_WRITE_EL20XX(s_out3, 1, (jiffies >> 2) & 1);
-        EC_WRITE_EL20XX(s_out3, 2, (jiffies >> 8) & 1);
-
-        counter = MSR_ABTASTFREQUENZ / 4;
-    }
-
-    EC_WRITE_EL20XX(s_out3, 3, EC_READ_EL31XX(s_in1, 0) < 0);
-
-    // Prozessdaten lesen und schreiben
-    EtherCAT_rt_domain_xio(master, 0, 40);
+        EtherCAT_rt_debug_level(master, 0);
+        printk("SSI status=0x%X value=%u\n",
+               EC_READ_EL5001_STATE(s_ssi), EC_READ_EL5001_VALUE(s_ssi));
+        printk("INC status=0x%X value=%u\n",
+               EC_READ_EL5101_STATE(s_inc), EC_READ_EL5101_VALUE(s_inc));
+
+        counter = MSR_ABTASTFREQUENZ * 5;
+    }
+
+    angle0 = EC_READ_EL5101_VALUE(s_inc);
 }
 
 /******************************************************************************
@@ -143,7 +141,7 @@
     ipipe_virtualize_irq(ipipe_current_domain,sys_info.archdep.tmirq,
 			 &msr_run, NULL, IPIPE_HANDLE_MASK);
 
-    ipipe_tune_timer(1000000000UL/MSR_ABTASTFREQUENZ,0);
+    ipipe_tune_timer(1000000000UL / MSR_ABTASTFREQUENZ, 0);
 }
 
 /******************************************************************************
@@ -162,8 +160,9 @@
 
 int msr_globals_register(void)
 {
-    msr_reg_kanal("/value", "V", &value, TDBL);
-    msr_reg_kanal("/dig1", "", &dig1, TINT);
+    //msr_reg_kanal("/value", "V", &value, TDBL);
+    //msr_reg_kanal("/dig1", "", &dig1, TINT);
+    msr_reg_kanal("/angle0", "", &angle0, TINT);
 
     return 0;
 }
@@ -201,6 +200,16 @@
         goto out_release_master;
     }
 
+    if (EtherCAT_rt_canopen_sdo_write(master, s_ssi, 0x4067, 0, 1, 2)) {
+        printk(KERN_ERR "EtherCAT: Could not set SSI baud rate!\n");
+        goto out_release_master;
+    }
+
+    if (EtherCAT_rt_canopen_sdo_write(master, s_ssi, 0x4061, 4, 1, 1)) {
+        printk(KERN_ERR "EtherCAT: Could not set SSI feature bit!\n");
+        goto out_release_master;
+    }
+
     do_gettimeofday(&process_time);
     msr_time_increment.tv_sec = 0;
     msr_time_increment.tv_usec = (unsigned int) (1000000 / MSR_ABTASTFREQUENZ);