From 1fd71c078e63628fc408726fa386b766e908d7f0 Mon Sep 17 00:00:00 2001
From: Chris Spangler <chris.spangler@fau.de>
Date: Fri, 3 Aug 2018 09:52:11 +0200
Subject: [PATCH] I finally fixed my Git repo

---
 .gitignore                                    |     1 +
 firmware/.goutputstream-J4JHNZ                |    84 +
 firmware/CMakeLists.txt                       |    41 +
 firmware/Doxyfile.in                          |  1792 ++
 firmware/EZS.cmake                            |    54 +
 firmware/axis.c                               |    98 +
 firmware/axis.h                               |    43 +
 firmware/ecos/ecos.ecc                        | 14463 ++++++++++++++++
 firmware/ecosenv.sh                           |    29 +
 firmware/gcbuf.c                              |    47 +
 firmware/gcbuf.h                              |    32 +
 firmware/gcode.c                              |    64 +
 firmware/gcode.h                              |    26 +
 firmware/hello.c                              |   618 +
 firmware/libDIY/drivers/include/diy_adc.h     |    51 +
 firmware/libDIY/drivers/include/diy_gpio.h    |    75 +
 firmware/libDIY/drivers/include/diy_int.h     |    12 +
 firmware/libDIY/drivers/include/diy_tim.h     |    95 +
 firmware/libDIY/drivers/src/diy_adc.c         |    47 +
 firmware/libDIY/drivers/src/diy_gpio.c        |   103 +
 firmware/libDIY/drivers/src/diy_int.c         |    24 +
 firmware/libDIY/drivers/src/diy_tim.c         |    89 +
 firmware/libDIY/include/diy_ds18b20.h         |    17 +
 firmware/libDIY/include/diy_gparser.h         |    12 +
 firmware/libDIY/src/diy_ds18b20.c             |    19 +
 firmware/libDIY/src/diy_gparser.c             |     6 +
 firmware/libEZS/drivers/i386/ezs_adc.c        |    20 +
 firmware/libEZS/drivers/i386/ezs_counter.c    |   144 +
 firmware/libEZS/drivers/i386/ezs_dac.c        |    19 +
 firmware/libEZS/drivers/i386/ezs_fb.c         |    88 +
 firmware/libEZS/drivers/i386/ezs_keycodes.c   |    22 +
 firmware/libEZS/drivers/i386/ezs_tracer.cpp   |    34 +
 .../libEZS/drivers/stm32f4/ezs_counter.cpp    |    62 +
 firmware/libEZS/drivers/stm32f4/ezs_dac.cpp   |   132 +
 firmware/libEZS/drivers/stm32f4/ezs_gpio.c    |    14 +
 .../libEZS/drivers/stm32f4/ezs_serial.cpp     |    84 +
 firmware/libEZS/include/ezs_adc.h             |    25 +
 firmware/libEZS/include/ezs_common.h          |    26 +
 firmware/libEZS/include/ezs_counter.h         |    68 +
 firmware/libEZS/include/ezs_dac.h             |    33 +
 firmware/libEZS/include/ezs_delay.h           |    29 +
 firmware/libEZS/include/ezs_fb.h              |   135 +
 firmware/libEZS/include/ezs_fft.h             |    42 +
 firmware/libEZS/include/ezs_gcd.h             |    24 +
 firmware/libEZS/include/ezs_gpio.h            |    24 +
 firmware/libEZS/include/ezs_interpolation.h   |    13 +
 firmware/libEZS/include/ezs_io.h              |    27 +
 firmware/libEZS/include/ezs_io_fel.h          |   127 +
 firmware/libEZS/include/ezs_keycodes.h        |    16 +
 firmware/libEZS/include/ezs_plot.h            |    27 +
 firmware/libEZS/include/ezs_plot_pds.h        |    18 +
 firmware/libEZS/include/ezs_sensor.h          |    39 +
 firmware/libEZS/include/ezs_serial.h          |    51 +
 firmware/libEZS/include/ezs_stopwatch.h       |    42 +
 firmware/libEZS/include/ezs_trace.h           |    14 +
 firmware/libEZS/include/ezs_window.h          |    28 +
 firmware/libEZS/src/ezs_common.c              |    10 +
 firmware/libEZS/src/ezs_dac.c                 |    21 +
 firmware/libEZS/src/ezs_delay.c               |    24 +
 firmware/libEZS/src/ezs_fb.c                  |    93 +
 firmware/libEZS/src/ezs_fft.c                 |   219 +
 firmware/libEZS/src/ezs_gcd.c                 |    20 +
 firmware/libEZS/src/ezs_impure_ptr.c          |     1 +
 firmware/libEZS/src/ezs_interpolation.c       |    82 +
 firmware/libEZS/src/ezs_io.c                  |     8 +
 firmware/libEZS/src/ezs_io_fel.c              |   112 +
 firmware/libEZS/src/ezs_plot.c                |   147 +
 firmware/libEZS/src/ezs_plot_pds.c            |    51 +
 firmware/libEZS/src/ezs_sensor.c              |    78 +
 firmware/libEZS/src/ezs_stopwatch.c           |    16 +
 firmware/libEZS/src/ezs_tracer.cpp            |    49 +
 firmware/libEZS/src/ezs_window.c              |    34 +
 firmware/motor.c                              |    83 +
 firmware/motor.h                              |    32 +
 firmware/myLibEZS/exclude                     |     4 +
 firmware/system.odg                           |   Bin 0 -> 13827 bytes
 firmware/test.c                               |    12 +
 pinmap.ods                                    |   Bin 0 -> 10369 bytes
 pinmap.pdf                                    |   Bin 0 -> 19210 bytes
 79 files changed, 20465 insertions(+)
 create mode 100644 firmware/.goutputstream-J4JHNZ
 create mode 100644 firmware/CMakeLists.txt
 create mode 100644 firmware/Doxyfile.in
 create mode 100644 firmware/EZS.cmake
 create mode 100644 firmware/axis.c
 create mode 100644 firmware/axis.h
 create mode 100644 firmware/ecos/ecos.ecc
 create mode 100644 firmware/ecosenv.sh
 create mode 100644 firmware/gcbuf.c
 create mode 100644 firmware/gcbuf.h
 create mode 100644 firmware/gcode.c
 create mode 100644 firmware/gcode.h
 create mode 100644 firmware/hello.c
 create mode 100644 firmware/libDIY/drivers/include/diy_adc.h
 create mode 100644 firmware/libDIY/drivers/include/diy_gpio.h
 create mode 100644 firmware/libDIY/drivers/include/diy_int.h
 create mode 100644 firmware/libDIY/drivers/include/diy_tim.h
 create mode 100644 firmware/libDIY/drivers/src/diy_adc.c
 create mode 100644 firmware/libDIY/drivers/src/diy_gpio.c
 create mode 100644 firmware/libDIY/drivers/src/diy_int.c
 create mode 100644 firmware/libDIY/drivers/src/diy_tim.c
 create mode 100644 firmware/libDIY/include/diy_ds18b20.h
 create mode 100644 firmware/libDIY/include/diy_gparser.h
 create mode 100644 firmware/libDIY/src/diy_ds18b20.c
 create mode 100644 firmware/libDIY/src/diy_gparser.c
 create mode 100644 firmware/libEZS/drivers/i386/ezs_adc.c
 create mode 100644 firmware/libEZS/drivers/i386/ezs_counter.c
 create mode 100644 firmware/libEZS/drivers/i386/ezs_dac.c
 create mode 100644 firmware/libEZS/drivers/i386/ezs_fb.c
 create mode 100644 firmware/libEZS/drivers/i386/ezs_keycodes.c
 create mode 100644 firmware/libEZS/drivers/i386/ezs_tracer.cpp
 create mode 100644 firmware/libEZS/drivers/stm32f4/ezs_counter.cpp
 create mode 100644 firmware/libEZS/drivers/stm32f4/ezs_dac.cpp
 create mode 100644 firmware/libEZS/drivers/stm32f4/ezs_gpio.c
 create mode 100644 firmware/libEZS/drivers/stm32f4/ezs_serial.cpp
 create mode 100644 firmware/libEZS/include/ezs_adc.h
 create mode 100644 firmware/libEZS/include/ezs_common.h
 create mode 100644 firmware/libEZS/include/ezs_counter.h
 create mode 100644 firmware/libEZS/include/ezs_dac.h
 create mode 100644 firmware/libEZS/include/ezs_delay.h
 create mode 100644 firmware/libEZS/include/ezs_fb.h
 create mode 100644 firmware/libEZS/include/ezs_fft.h
 create mode 100644 firmware/libEZS/include/ezs_gcd.h
 create mode 100644 firmware/libEZS/include/ezs_gpio.h
 create mode 100644 firmware/libEZS/include/ezs_interpolation.h
 create mode 100644 firmware/libEZS/include/ezs_io.h
 create mode 100644 firmware/libEZS/include/ezs_io_fel.h
 create mode 100644 firmware/libEZS/include/ezs_keycodes.h
 create mode 100644 firmware/libEZS/include/ezs_plot.h
 create mode 100644 firmware/libEZS/include/ezs_plot_pds.h
 create mode 100644 firmware/libEZS/include/ezs_sensor.h
 create mode 100644 firmware/libEZS/include/ezs_serial.h
 create mode 100644 firmware/libEZS/include/ezs_stopwatch.h
 create mode 100644 firmware/libEZS/include/ezs_trace.h
 create mode 100644 firmware/libEZS/include/ezs_window.h
 create mode 100644 firmware/libEZS/src/ezs_common.c
 create mode 100644 firmware/libEZS/src/ezs_dac.c
 create mode 100644 firmware/libEZS/src/ezs_delay.c
 create mode 100644 firmware/libEZS/src/ezs_fb.c
 create mode 100644 firmware/libEZS/src/ezs_fft.c
 create mode 100644 firmware/libEZS/src/ezs_gcd.c
 create mode 100644 firmware/libEZS/src/ezs_impure_ptr.c
 create mode 100644 firmware/libEZS/src/ezs_interpolation.c
 create mode 100644 firmware/libEZS/src/ezs_io.c
 create mode 100644 firmware/libEZS/src/ezs_io_fel.c
 create mode 100644 firmware/libEZS/src/ezs_plot.c
 create mode 100644 firmware/libEZS/src/ezs_plot_pds.c
 create mode 100644 firmware/libEZS/src/ezs_sensor.c
 create mode 100644 firmware/libEZS/src/ezs_stopwatch.c
 create mode 100644 firmware/libEZS/src/ezs_tracer.cpp
 create mode 100644 firmware/libEZS/src/ezs_window.c
 create mode 100644 firmware/motor.c
 create mode 100644 firmware/motor.h
 create mode 100644 firmware/myLibEZS/exclude
 create mode 100644 firmware/system.odg
 create mode 100644 firmware/test.c
 create mode 100644 pinmap.ods
 create mode 100644 pinmap.pdf

diff --git a/.gitignore b/.gitignore
index 0624c65..1c33b87 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+firmware/build
 *.aux
 *.log
 *.nav
diff --git a/firmware/.goutputstream-J4JHNZ b/firmware/.goutputstream-J4JHNZ
new file mode 100644
index 0000000..c8b98d5
--- /dev/null
+++ b/firmware/.goutputstream-J4JHNZ
@@ -0,0 +1,84 @@
+#include <math.h>
+#include <stdio.h>
+#include <cyg/hal/hal_arch.h>
+#include <libopencm3/cm3/sync.h>
+
+#include "axis.h"
+#include "motor.h"
+#include "ezs_io.h"
+
+static int16_t roundSteps(double x) {
+	return floor(x+0.5);
+}
+
+void setAxisValues_M5(axis* axis, motor* motorA, motor* motorB) {
+	// pitch: mm per rotation of the leadscrew
+	double pitch = 0.8;
+	axis->motorA = motorA;
+	axis->motorB = motorB;
+	axis->lastPosMm = 0;
+	axis->stepsPerMm = (axis->motorA->stepsPerRevo * axis->motorA->gearRatio) / pitch;
+	axis->mmPerStep = 1.0 / axis->stepsPerMm;
+	axis->maxMmPerMin = 20000 * axis->mmPerStep;
+	axis->isReversed = false;
+}
+
+void setAxisValues_T25(axis* axis, motor* motorA, motor* motorB, uint8_t teeth) {
+	// pitch: distance between two tooth centers on the timing belt in mm
+	// teeth: number of teeth on the pulley attached to the motor shaft
+	double pitch = 2.5;
+	axis->motorA = motorA;
+	axis->motorB = motorB;
+	axis->lastPosMm = 0;
+	axis->stepsPerMm = (axis->motorA->stepsPerRevo * axis->motorA->gearRatio) / (pitch * teeth);
+	axis->mmPerStep = 1.0 / axis->stepsPerMm;
+	axis->isReversed = false;
+}
+
+void homeAxis(axis* axis) {
+	int8_t one = -1;
+	if (axis->isReversed) one = -1;
+	while (diy_gpio_read_pin(axis->endstopPort, axis->endstopPin) == 0) {
+		setMotorMotion(axis->motorA, -one, 1);
+		updateMotor(axis->motorA);
+		if (axis->motorB != NULL) {
+			setMotorMotion(axis->motorB, -one, 1);
+			updateMotor(axis->motorB);
+		}
+		ezs_delay_us(1e3);
+	}
+	while (diy_gpio_read_pin(axis->endstopPort, axis->endstopPin) == 1) {
+		setMotorMotion(axis->motorA, one, 1);
+		updateMotor(axis->motorA);
+		if (axis->motorB != NULL) {
+			setMotorMotion(axis->motorB, one, 1);
+			updateMotor(axis->motorB);
+		}
+		ezs_delay_us(1e5);
+	}
+	axis->lastPosMm = 0;
+}
+
+void setAxisTarget(axis* axis, double targetPosMm, double speed) {
+	mutex_lock(&(axis->lock));
+	if (axis->stepsPerMm == 0) ezs_printf("AXIS ERROR: attempting to set axis target while uninitialized");
+	int32_t stepsToMove = roundSteps((targetPosMm - axis->lastPosMm) * axis->stepsPerMm);
+	if (axis->isReversed) stepsToMove = -stepsToMove;
+	uint16_t stepsPerSec = (speed / 60) / axis->mmPerStep;
+	setMotorMotion(axis->motorA, stepsToMove, stepsPerSec);
+	if (axis->motorB != NULL) setMotorMotion(axis->motorB, stepsToMove, stepsPerSec);
+	axis->lastPosMm = targetPosMm;
+	mutex_unlock(&(axis->lock));
+}
+
+uint32_t updateAxis(axis* axis) {
+	mutex_lock(&(axis->lock));
+	uint32_t ret = updateMotor(axis->motorA);
+	if (axis->motorB != NULL) updateMotor(axis->motorB);
+	mutex_unlock(&(axis->lock));
+	return ret;
+}
+
+bool axisIsFinished(axis* axis) {
+	return (axis->motorA->stepsLeft) == 0;
+}
diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt
new file mode 100644
index 0000000..ad299b2
--- /dev/null
+++ b/firmware/CMakeLists.txt
@@ -0,0 +1,41 @@
+Project(3DPrinter)
+
+cmake_minimum_required(VERSION 2.8)
+
+#include CMAKE-Modules from base directory
+set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}")
+INCLUDE(EZS)
+
+add_definitions("-D EZS_DUMB_SERIAL")
+
+include_directories(${PROJECT_SOURCE_DIR}/libDIY/drivers/include)
+include_directories(${PROJECT_SOURCE_DIR}/libDIY/include)
+set(LIBEZS_SOURCES
+#	libEZS/src/ezs_tracer.cpp
+	libEZS/drivers/${EZS_ARCH}/ezs_gpio.c
+	libEZS/drivers/${EZS_ARCH}/ezs_dac.cpp
+	libEZS/drivers/${EZS_ARCH}/ezs_serial.cpp
+	libEZS/drivers/${EZS_ARCH}/ezs_counter.cpp
+	libEZS/src/ezs_delay.c
+	)
+
+set(LIBDIY_SOURCES
+    libDIY/drivers/src/diy_adc.c
+    libDIY/drivers/src/diy_gpio.c
+    libDIY/drivers/src/diy_tim.c
+    libDIY/drivers/src/diy_int.c
+    )
+
+SET(SRC_LIST
+    gcode.c
+    gcbuf.c
+    axis.c
+    motor.c
+    hello.c
+	${LIBEZS_SOURCES}
+    ${LIBDIY_SOURCES}
+	)
+
+set(TGT "app")
+
+ECOS_ADD_EXECUTABLE(${TGT} ${SRC_LIST})
diff --git a/firmware/Doxyfile.in b/firmware/Doxyfile.in
new file mode 100644
index 0000000..bbad035
--- /dev/null
+++ b/firmware/Doxyfile.in
@@ -0,0 +1,1792 @@
+# Doxyfile 1.8.1.2
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should
+# identify the project. Note that if you do not use Doxywizard you need
+# to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME           = @PROJECT_NAME@
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "i4ezs: Echtzeitsysteme"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = @DOXY_OUTPUT@
+
+# 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:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# 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        = YES
+
+# 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        = @CMAKE_SOURCE_DIR@
+
+# 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 if your file system
+# 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 regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# 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 = NO
+
+# 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 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               = 8
+
+# 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                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding
+# "class=itcl::class" will allow you to use the command class in the
+# itcl::class meaning.
+
+TCL_SUBST              =
+
+# 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 OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all
+# comments according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you
+# can mix doxygen, HTML, and XML commands with Markdown formatting.
+# Disable only in case of backward compatibilities issues.
+
+MARKDOWN_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = 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
+
+# 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
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
+# unions with only public data fields will be shown inline in the documentation
+# of the scope in which they are defined (i.e. file, namespace, or group
+# documentation), provided this scope is documented. If set to NO (the default),
+# structs, classes, and unions are shown on a separate page (for HTML and Man
+# pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols.
+
+SYMBOL_CACHE_SIZE      = 0
+
+# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
+# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
+# their name and scope. Since this can be an expensive process and often the
+# same symbol appear multiple times in the code, doxygen keeps a cache of
+# pre-resolved symbols. If the cache is too small doxygen will become slower.
+# If the cache is too large, memory is wasted. The cache size is given by this
+# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# 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.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+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  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# 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
+
+# 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 classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# 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
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# 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
+# 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
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# 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 SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# 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_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = 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
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# 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.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# 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 macro 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 macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# 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        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = 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 program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files
+# containing the references data. This must be a list of .bib files. The
+# .bib extension is automatically appended if omitted. Using this command
+# requires the bibtex tool to be installed. See also
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
+# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
+# feature you need bibtex and perl available in the search path.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = NO
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# 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
+
+# The WARN_NO_PARAMDOC option can be enabled 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. 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"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = @CMAKE_SOURCE_DIR@ @CMAKE_SOURCE_DIR@/../libEZS/
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# 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++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# 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.
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                = @DOXY_IGNORE@
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system 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. 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       = */src/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_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 all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# 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.
+# 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 or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+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).
+
+FILTER_SOURCE_FILES    = YES
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# 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.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+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, C++ and Fortran comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# 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
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+#  for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is advised to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# 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. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# style sheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the style sheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
+# entries shown in the various tree structured indices initially; the user
+# can expand and collapse entries dynamically later on. Doxygen will expand
+# the tree to such a level that at most the specified number of entries are
+# visible (unless a fully collapsed tree already exceeds this amount).
+# So setting the number of entries 1 will produce a full collapsed tree by
+# default. 0 is a special value representing an infinite number of entries
+# and will result in a full expanded tree by default.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# 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 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.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+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.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
+# at top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it. Since the tabs have the same information as the
+# navigation tree you can set this option to NO if you already set
+# GENERATE_TREEVIEW to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value 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, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+# Since the tree basically has the same information as the tab index you
+# could consider to set DISABLE_INDEX to NO when enabling this option.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you may also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to
+# the MathJax Content Delivery Network so you can quickly see the result without
+# installing MathJax.
+# However, it is strongly recommended to install a local
+# copy of MathJax from http://www.mathjax.org before deployment.
+
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS     =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+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.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+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
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# 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 optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load style sheet definitions from file. Syntax is similar to doxygen's
+# 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    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man 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 `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# 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.
+
+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.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+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
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+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
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# 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. 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_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 that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. For each
+# tag file the location of the external documentation should be added. 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. 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               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# 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 also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will use the Helvetica font for all dot files that
+# doxygen generates. When you want a differently looking font you can specify
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find
+# the font, which can be done by putting it in a standard location or by setting
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the Helvetica font.
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+# set the path where dot can find it.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+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 the UML_LOOK tag is enabled, the fields and methods are shown inside
+# the class node. If there are many fields or methods and many nodes the
+# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
+# threshold limits the number of items for each type to make the size more
+# managable. Set this to 0 for no limit. Note that the threshold may be
+# exceeded by 50% before the limit is enforced.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options 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 CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller 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 caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH 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 svg, png, jpg, or gif.
+# If left blank png will be used. If you choose svg you need to set
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible in IE 9+ (other browsers do not have this requirement).
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+# Note that this requires a modern browser other than Internet Explorer.
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible. Older versions of IE do not have SVG support.
+
+INTERACTIVE_SVG        = NO
+
+# 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 in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# 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 the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. 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      = YES
+
+# 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.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/firmware/EZS.cmake b/firmware/EZS.cmake
new file mode 100644
index 0000000..e4c2489
--- /dev/null
+++ b/firmware/EZS.cmake
@@ -0,0 +1,54 @@
+
+if(POLICY CMP0037)
+  cmake_policy(SET CMP0037 OLD)
+endif()
+
+# first check that ecosconfig is available
+FIND_PROGRAM(ECOSCONFIG_EXECUTABLE NAMES ecosconfig)
+
+IF("$ENV{EZS_BASE}" STREQUAL "")
+  MESSAGE(FATAL_ERROR "EZS_BASE not set. Did you run 'source ../ecosenv.sh'?")
+ELSE()
+message(STATUS "EZS_BASE: $ENV{EZS_BASE}")
+  IF(NOT IS_DIRECTORY "$ENV{EZS_BASE}")
+    MESSAGE(FATAL_ERROR "EZS_BASE set but not a directory. Check your settings in ../ecosenv.sh and your installation'?")
+  ENDIF()
+  IF(NOT IS_DIRECTORY "$ENV{EZS_CMAKE_MODULE_DIR}")
+    MESSAGE(FATAL_ERROR "EZS_CMAKE_MODULE_DIR is not a directory. Check your settings in ../ecosenv.sh and your installation'?")
+  ENDIF()
+  MESSAGE(STATUS "USING $ENV{EZS_BASE}")
+  MESSAGE(STATUS "USING $ENV{EZS_CMAKE_MODULE_DIR} as cmake module path")
+  set(CMAKE_MODULE_PATH "$ENV{EZS_CMAKE_MODULE_DIR}" ${CMAKE_MODULE_PATH})
+  set(EZS_TOOLS_DIR "$ENV{EZS_CMAKE_MODULE_DIR}")
+  MESSAGE(STATUS "USING ${EZS_TOOLS_DIR} as tools path")
+ENDIF("$ENV{EZS_BASE}" STREQUAL "")
+
+IF(NOT ECOSCONFIG_EXECUTABLE)
+  MESSAGE(FATAL_ERROR "ecosconfig was not found. Do you have a valid ecos repository?")
+ENDIF(NOT ECOSCONFIG_EXECUTABLE)
+
+IF("$ENV{EZS_LIBOPENCM3_DIR}" STREQUAL "")
+  MESSAGE(WARNING "OPENCM3_PATH not set. Did you run 'source ../ecosenv.sh'")
+ELSE()
+  set(OPENCM3_PATH $ENV{EZS_LIBOPENCM3_DIR})
+ENDIF()
+
+set(EZS_CPU_FLAGS "-mcpu=cortex-m3 -mthumb")
+
+add_definitions( "-D STM32F4")
+INCLUDE(EZSconvenience)
+INCLUDE(ezs_ecos_stm32)
+
+set(EZS_ARCH stm32f4)
+
+include_directories(${OPENCM3_PATH}/include)
+ECOS_EZS_ADDLIB("${OPENCM3_PATH}/lib/libopencm3_stm32f4.a")
+
+include_directories(${PROJECT_SOURCE_DIR}/libEZS/include)
+
+FIND_PROGRAM(MELD_EXECUTABLE NAMES meld)
+IF(MELD_EXECUTABLE)
+  add_custom_target(diff
+    COMMAND ${MELD_EXECUTABLE} "/proj/i4ezs/vorgaben/${CMAKE_PROJECT_NAME}/" "${PROJECT_SOURCE_DIR}"
+    COMMENT "Invoking diff")
+ENDIF()
diff --git a/firmware/axis.c b/firmware/axis.c
new file mode 100644
index 0000000..6bafb1e
--- /dev/null
+++ b/firmware/axis.c
@@ -0,0 +1,98 @@
+#include <math.h>
+#include <stdio.h>
+#include <cyg/hal/hal_arch.h>
+#include <libopencm3/cm3/sync.h>
+
+#include "axis.h"
+#include "motor.h"
+#include "ezs_io.h"
+#include "ezs_delay.h"
+
+static int32_t roundSteps(double x) {
+	return floor(x+0.5);
+}
+
+void setAxisValues_extruderBolt(axis* axis, motor* motor) {
+	// pitch: mm per rotation of the bolt
+	// gearRatio: from stepper motor to bolt
+	double pitch = 20.3;
+	uint8_t gearRatio = 4;
+	axis->motor = motor;
+	axis->lastPosMm = 0;
+	axis->stepsPerMm = (axis->motor->stepsPerRevo * axis->motor->gearRatio * gearRatio) / pitch;
+	axis->mmPerStep = 1.0 / axis->stepsPerMm;
+	axis->isReversed = false;
+	axis->isRelative = true;
+}
+
+void setAxisValues_M5(axis* axis, motor* motor) {
+	// pitch: mm per rotation of the leadscrew
+	double pitch = 0.8;
+	axis->motor = motor;
+	axis->lastPosMm = 0;
+	axis->stepsPerMm = (axis->motor->stepsPerRevo * axis->motor->gearRatio) / pitch;
+	axis->mmPerStep = 1.0 / axis->stepsPerMm;
+	axis->isReversed = false;
+	axis->isRelative = false;
+}
+
+void setAxisValues_T25(axis* axis, motor* motor, uint8_t teeth) {
+	// pitch: distance between two tooth centers on the timing belt in mm
+	// teeth: number of teeth on the pulley attached to the motor shaft
+	double pitch = 2.5;
+	axis->motor = motor;
+	axis->lastPosMm = 0;
+	axis->stepsPerMm = (axis->motor->stepsPerRevo * axis->motor->gearRatio) / (pitch * teeth);
+	axis->mmPerStep = 1.0 / axis->stepsPerMm;
+	axis->isReversed = false;
+	axis->isRelative = false;
+}
+
+void homeAxis(axis* axis) {
+	int8_t one = 1;
+	if (axis->isReversed) one = -1;
+	while (diy_gpio_read_pin(axis->endstopPort, axis->endstopPin) == 0) {
+		while (diy_gpio_read_pin(axis->endstopPort, axis->endstopPin) == 0) {
+			setMotorMotion(axis->motor, -one, 1);
+			updateMotor(axis->motor);
+			axis->totalSteps--;
+			ezs_delay_us(2e3);
+		}
+		ezs_delay_us(5e5);
+	}
+	while (diy_gpio_read_pin(axis->endstopPort, axis->endstopPin) == 1) {
+		while (diy_gpio_read_pin(axis->endstopPort, axis->endstopPin) == 1) {
+			setMotorMotion(axis->motor, one, 1);
+			updateMotor(axis->motor);
+			axis->totalSteps++;
+			ezs_delay_us(1e4);
+		}
+		ezs_delay_us(5e5);
+	}
+	axis->lastHomeRest = axis->totalSteps;
+	axis->totalSteps = 0;
+	axis->lastPosMm = axis->homePos;
+}
+
+void setAxisTarget(axis* axis, double targetPosMm, double speed) {
+	mutex_lock(&(axis->lock));
+	if (axis->stepsPerMm == 0) ezs_printf("!! AXIS ERROR: attempting to set axis target while uninitialized\n");
+	int32_t stepsToMove = roundSteps((targetPosMm - axis->lastPosMm) * axis->stepsPerMm);
+	axis->totalSteps += stepsToMove;
+	if (axis->isReversed) stepsToMove = -stepsToMove;
+	uint16_t stepsPerSec = (speed / 60) / axis->mmPerStep;
+	setMotorMotion(axis->motor, stepsToMove, stepsPerSec);
+	if (!axis->isRelative) axis->lastPosMm = targetPosMm;
+	mutex_unlock(&(axis->lock));
+}
+
+uint32_t updateAxis(axis* axis) {
+	mutex_lock(&(axis->lock));
+	uint32_t ret = updateMotor(axis->motor);
+	mutex_unlock(&(axis->lock));
+	return ret;
+}
+
+bool axisIsFinished(axis* axis) {
+	return (axis->motor->stepsLeft) == 0;
+}
diff --git a/firmware/axis.h b/firmware/axis.h
new file mode 100644
index 0000000..458a991
--- /dev/null
+++ b/firmware/axis.h
@@ -0,0 +1,43 @@
+#ifndef HEADER_AXIS
+#define HEADER_AXIS
+
+#include <stdint.h>
+#include <cyg/hal/hal_arch.h>
+#include <libopencm3/cm3/sync.h>
+
+#include "motor.h"
+
+typedef struct {
+	motor* motor;
+	bool isReversed;
+	bool isRelative;
+	mutex_t lock;
+	double homePos;
+	double volatile lastPosMm;
+	double stepsPerMm;
+	double mmPerStep;
+	double maxMmPerMin;
+	uint32_t endstopPort;
+	uint16_t endstopPin;
+	int totalSteps;
+	int lastHomeRest; 
+} axis;
+
+// Sets default values for timing belts and leadscrews used in the ToyRep
+void setAxisValues_M5(axis* axis, motor* motor);
+void setAxisValues_T25(axis* axis, motor* motor, uint8_t teeth);
+void setAxisValues_extruderBolt(axis* axis, motor* motor);
+
+// Home axis and set lastPostMm to 0
+void homeAxis(axis* axis);
+
+// Starts a move towards targetPos with speed in mm/minute
+void setAxisTarget(axis* axis, double targetPosMm, double speed);
+
+// Returns time for which the axis thread should wait
+uint32_t updateAxis(axis* axis);
+
+// Returns whether the axis has reached it's destination
+bool axisIsFinished(axis* axis);
+
+#endif
diff --git a/firmware/ecos/ecos.ecc b/firmware/ecos/ecos.ecc
new file mode 100644
index 0000000..c8de407
--- /dev/null
+++ b/firmware/ecos/ecos.ecc
@@ -0,0 +1,14463 @@
+# eCos saved configuration
+
+# ---- commands --------------------------------------------------------
+# This section contains information about the savefile format.
+# It should not be edited. Any modifications made to this section
+# may make it impossible for the configuration tools to read
+# the savefile.
+
+cdl_savefile_version 1;
+cdl_savefile_command cdl_savefile_version {};
+cdl_savefile_command cdl_savefile_command {};
+cdl_savefile_command cdl_configuration { description hardware template package };
+cdl_savefile_command cdl_package { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_component { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_option { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_interface { value_source user_value wizard_value inferred_value };
+
+# ---- toplevel --------------------------------------------------------
+# This section defines the toplevel configuration object. The only
+# values that can be changed are the name of the configuration and
+# the description field. It is not possible to modify the target,
+# the template or the set of packages simply by editing the lines
+# below because these changes have wide-ranging effects. Instead
+# the appropriate tools should be used to make such modifications.
+
+cdl_configuration eCos {
+    description "" ;
+
+    # These fields should not be modified.
+    hardware    stm32f4discovery ;
+    template    default ;
+    package -template CYGPKG_HAL current ;
+    package -template CYGPKG_IO current ;
+    package -template CYGPKG_IO_SERIAL current ;
+    package -template CYGPKG_INFRA current ;
+    package -template CYGPKG_KERNEL current ;
+    package -template CYGPKG_MEMALLOC current ;
+    package -template CYGPKG_ISOINFRA current ;
+    package -template CYGPKG_LIBC current ;
+    package -template CYGPKG_LIBC_I18N current ;
+    package -template CYGPKG_LIBC_SETJMP current ;
+    package -template CYGPKG_LIBC_SIGNALS current ;
+    package -template CYGPKG_LIBC_STARTUP current ;
+    package -template CYGPKG_LIBC_STDIO current ;
+    package -template CYGPKG_LIBC_STDLIB current ;
+    package -template CYGPKG_LIBC_STRING current ;
+    package -template CYGPKG_LIBC_TIME current ;
+    package -template CYGPKG_LIBM current ;
+    package -template CYGPKG_IO_WALLCLOCK current ;
+    package -template CYGPKG_ERROR current ;
+    package -hardware CYGPKG_HAL_CORTEXM current ;
+    package -hardware CYGPKG_HAL_CORTEXM_STM32 current ;
+    package -hardware CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY current ;
+    package -hardware CYGPKG_DEVS_FLASH_STM32 current ;
+    package -hardware CYGPKG_IO_SERIAL_CORTEXM_STM32 current ;
+};
+
+# ---- conflicts -------------------------------------------------------
+# There are no conflicts.
+
+# ---- contents --------------------------------------------------------
+# >
+# >
+# Flash driver support
+# Control flash device support for STM32F4-Discovery board.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_FLASH {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_IO_FLASH
+    #     CYGPKG_IO_FLASH (unknown) == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Global build options
+# Global build options including control over
+# compiler flags, linker flags and choice of toolchain.
+#
+cdl_component CYGBLD_GLOBAL_OPTIONS {
+    # There is no associated value.
+
+    # The following properties are affected by this value
+};
+
+# >
+# Global command prefix
+# This option specifies the command prefix used when
+# invoking the build tools.
+#
+cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX {
+    # Flavor: data
+    user_value arm-none-eabi
+    # value_source user
+    # Default value: arm-eabi
+};
+
+# Global compiler flags
+# This option controls the global compiler flags which are used to
+# compile all packages by default. Individual packages may define
+# options which override these global flags.
+#
+cdl_option CYGBLD_GLOBAL_CFLAGS {
+    # Flavor: data
+    user_value "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    # value_source user
+    # Default value:  CYGBLD_GLOBAL_WARNFLAGS . "-mcpu=cortex-m3 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions" 
+    #     CYGBLD_GLOBAL_WARNFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings "
+    #   --> "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m3 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+
+    # The following properties are affected by this value
+    # option CYGBLD_INFRA_CFLAGS_WARNINGS_AS_ERRORS
+    #     Requires:  is_substr(CYGBLD_GLOBAL_CFLAGS, " -Werror") 
+    # option CYGBLD_INFRA_CFLAGS_PIPE
+    #     Requires:  is_substr(CYGBLD_GLOBAL_CFLAGS, " -pipe") 
+    # package CYGPKG_HAL_CORTEXM
+    #     Requires:  CYGHWR_HAL_CORTEXM_BIGENDIAN implies
+    #             is_substr(CYGBLD_GLOBAL_CFLAGS,   " -mbig-endian ") &&
+    #             is_substr(CYGBLD_GLOBAL_LDFLAGS,  " -mbig-endian ") 
+    # package CYGPKG_HAL_CORTEXM
+    #     Requires:  !CYGHWR_HAL_CORTEXM_BIGENDIAN implies
+    #             !is_substr(CYGBLD_GLOBAL_CFLAGS,  " -mbig-endian ") &&
+    #             !is_substr(CYGBLD_GLOBAL_LDFLAGS, " -mbig-endian ") 
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# Global linker flags
+# This option controls the global linker flags. Individual
+# packages may define options which override these global flags.
+#
+cdl_option CYGBLD_GLOBAL_LDFLAGS {
+    # Flavor: data
+    user_value "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    # value_source user
+    # Default value: "-mcpu=cortex-m3 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+
+    # The following properties are affected by this value
+    # package CYGPKG_HAL_CORTEXM
+    #     Requires:  CYGHWR_HAL_CORTEXM_BIGENDIAN implies
+    #             is_substr(CYGBLD_GLOBAL_CFLAGS,   " -mbig-endian ") &&
+    #             is_substr(CYGBLD_GLOBAL_LDFLAGS,  " -mbig-endian ") 
+    # package CYGPKG_HAL_CORTEXM
+    #     Requires:  !CYGHWR_HAL_CORTEXM_BIGENDIAN implies
+    #             !is_substr(CYGBLD_GLOBAL_CFLAGS,  " -mbig-endian ") &&
+    #             !is_substr(CYGBLD_GLOBAL_LDFLAGS, " -mbig-endian ") 
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# Standard compiler warning flags
+# This option specifies the default warning-related compiler flags used
+# on all eCos platforms.
+#
+cdl_option CYGBLD_GLOBAL_WARNFLAGS {
+    # Calculated value:  "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings " 
+    # Flavor: data
+    # Current_value: -Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings 
+
+    # The following properties are affected by this value
+    # option CYGBLD_GLOBAL_CFLAGS
+    #     DefaultValue:  CYGBLD_GLOBAL_WARNFLAGS . "-mcpu=cortex-m3 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions" 
+};
+
+# Build common GDB stub ROM image
+# Unless a target board has specific requirements to the
+# stub implementation, it can use a simple common stub.
+# This option, which gets enabled by platform HALs as
+# appropriate, controls the building of the common stub.
+#
+cdl_option CYGBLD_BUILD_COMMON_GDB_STUBS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS == 0
+    #   --> 0
+};
+
+# <
+# STM32 FLASH memory support
+# Flash memory support for on-chip flash on STM32 devices and compatibles.
+# This driver implements the V2 flash driver API.
+#
+cdl_package CYGPKG_DEVS_FLASH_STM32 {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_IO_FLASH
+    #     CYGPKG_IO_FLASH (unknown) == 0
+    #   --> 0
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+};
+
+# >
+# Number of words to write per burst
+# On typical hardware programming the flash requires disabling
+# interrupts for an extended period of time.
+# Some or all of the flash hardware will be unusable while each word
+# is programmed, and disabling interrupts is the only reliable
+# way of ensuring that no interrupt handler or other thread will
+# try to access the flash in the middle of an operation. This
+# can have a major impact on the real-time responsiveness of
+# typical applications. To ameliorate this the driver will
+# perform writes in small bursts, briefly re-enabling the cache
+# and interrupts between each burst. The number of write operations
+# per burst is determined by this option: reducing the number of
+# writes per burst will improve real-time response, but will add
+# overhead so the actual flash program operation will take
+# longer; conversely more writes per burst will worsen response
+# times but reduce overhead.
+#
+cdl_option CYGNUM_DEVS_FLASH_STM32_V2_PROGRAM_BURST_SIZE {
+    # This option is not active
+    # The parent CYGPKG_DEVS_FLASH_STM32 is not active
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 256
+    # value_source default
+    # Default value: 256
+    # Legal values: 4 to 4096
+};
+
+# Program/erase parallelism
+# The Flash interface of the STM32 F2 and F4 families can program or erase
+# multiple bits in one step. The maximum possible parallelism depends
+# on the supply voltage. The default value of this option (32)
+# corresponds to supply voltage of 2.7 - 3.6V, but another value
+# may be chosen if a different voltage is used.
+#
+cdl_option CYGNUM_DEVS_FLASH_STM32_PARALLELISM {
+    # This option is not active
+    # The parent CYGPKG_DEVS_FLASH_STM32 is not active
+    # ActiveIf constraint:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")) 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #   --> 1
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 32
+    # value_source default
+    # Default value: 32
+    # Legal values:  8 16 32 64 
+};
+
+# STM32 driver build options
+# Package specific build options including control over
+# compiler flags used only in building the STM32
+# flash driver, and details of which tests are built.
+#
+cdl_component CYGPKG_DEVS_FLASH_STM32_OPTIONS {
+    # This option is not active
+    # The parent CYGPKG_DEVS_FLASH_STM32 is not active
+
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the STM32 flash driver. These flags
+# are used in addition to the set of global flags.
+#
+cdl_option CYGPKG_DEVS_FLASH_STM32_CFLAGS_ADD {
+    # This option is not active
+    # The parent CYGPKG_DEVS_FLASH_STM32_OPTIONS is not active
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the STM32 flash driver. These flags
+# are removed from the set of global flags if present.
+#
+cdl_option CYGPKG_DEVS_FLASH_STM32_CFLAGS_REMOVE {
+    # This option is not active
+    # The parent CYGPKG_DEVS_FLASH_STM32_OPTIONS is not active
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# <
+# <
+# <
+# eCos HAL
+# doc: ref/the-ecos-hardware-abstraction-layer.html
+# The eCos HAL package provide a porting layer for
+# higher-level parts of the system such as the kernel and the
+# C library. Each installation should have HAL packages for
+# one or more architectures, and for each architecture there
+# may be one or more supported platforms. It is necessary to
+# select one target architecture and one platform for that
+# architecture. There are also a number of configuration
+# options that are common to all HAL packages.
+#
+cdl_package CYGPKG_HAL {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_INFRA
+    #     CYGPKG_INFRA == current
+    #   --> 1
+
+    # The following properties are affected by this value
+};
+
+# >
+# Platform-independent HAL options
+# A number of configuration options are common to most or all
+# HAL packages, for example options controlling how much state
+# should be saved during a context switch. The implementations
+# of these options will vary from architecture to architecture.
+#
+cdl_component CYGPKG_HAL_COMMON {
+    # There is no associated value.
+};
+
+# >
+# Provide eCos kernel support
+# The HAL can be configured to either support the full eCos
+# kernel, or to support only very simple applications which do
+# not require a full kernel. If kernel support is not required
+# then some of the startup, exception, and interrupt handling
+# code can be eliminated.
+#
+cdl_option CYGFUN_HAL_COMMON_KERNEL_SUPPORT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+    # Requires: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+};
+
+# HAL exception support
+# When a processor exception occurs, for example an attempt to
+# execute an illegal instruction or to perform a divide by
+# zero, this exception may be handled in a number of different
+# ways. If the target system has gdb support then typically
+# the exception will be handled by gdb code. Otherwise if the
+# HAL exception support is enabled then the HAL will invoke a
+# routine deliver_exception(). Typically this routine will be
+# provided by the eCos kernel, but it is possible for
+# application code to provide its own implementation. If the
+# HAL exception support is not enabled and a processor
+# exception occurs then the behaviour of the system is
+# undefined.
+#
+cdl_option CYGPKG_HAL_EXCEPTIONS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: CYGPKG_KERNEL_EXCEPTIONS
+    #     CYGPKG_KERNEL_EXCEPTIONS == 1
+    #   --> 1
+    # Requires: CYGPKG_KERNEL_EXCEPTIONS
+    #     CYGPKG_KERNEL_EXCEPTIONS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # component CYGPKG_KERNEL_EXCEPTIONS
+    #     Requires: CYGPKG_HAL_EXCEPTIONS
+};
+
+# Stop calling constructors early
+# This option supports environments where some constructors
+# must be run in the context of a thread rather than at
+# simple system startup time. A boolean flag named
+# cyg_hal_stop_constructors is set to 1 when constructors
+# should no longer be invoked. It is up to some other
+# package to deal with the rest of the constructors.
+# In the current version this is only possible with the
+# C library.
+#
+cdl_option CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGSEM_LIBC_INVOKE_DEFAULT_STATIC_CONSTRUCTORS
+    #     CYGSEM_LIBC_INVOKE_DEFAULT_STATIC_CONSTRUCTORS == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBC_INVOKE_DEFAULT_STATIC_CONSTRUCTORS
+    #     Requires: CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
+};
+
+# HAL uses the MMU and allows for CDL manipulation of it's use
+#
+cdl_interface CYGINT_HAL_SUPPORTS_MMU_TABLES {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # option CYGSEM_HAL_INSTALL_MMU_TABLES
+    #     ActiveIf: CYGINT_HAL_SUPPORTS_MMU_TABLES
+};
+
+# Install MMU tables.
+# This option controls whether this application installs
+# its own Memory Management Unit (MMU) tables, or relies on the
+# existing environment to run.
+#
+cdl_option CYGSEM_HAL_INSTALL_MMU_TABLES {
+    # This option is not active
+    # ActiveIf constraint: CYGINT_HAL_SUPPORTS_MMU_TABLES
+    #     CYGINT_HAL_SUPPORTS_MMU_TABLES == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYG_HAL_STARTUP != "RAM" 
+    #     CYG_HAL_STARTUP == ROM
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_HAL_STATIC_MMU_TABLES
+    #     Requires: CYGSEM_HAL_INSTALL_MMU_TABLES
+};
+
+# Use static MMU tables.
+# This option defines an environment where any Memory
+# Management Unit (MMU) tables are constant.  Normally used by ROM
+# based environments, this provides a way to save RAM usage which
+# would otherwise be required for these tables.
+#
+cdl_option CYGSEM_HAL_STATIC_MMU_TABLES {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGSEM_HAL_INSTALL_MMU_TABLES
+    #     CYGSEM_HAL_INSTALL_MMU_TABLES == 0
+    #   --> 0
+};
+
+# Route diagnostic output to debug channel
+# If not inheriting the console setup from the ROM monitor,
+# it is possible to redirect diagnostic output to the debug
+# channel by enabling this option. Depending on the debugger
+# used it may also be necessary to select a mangler for the
+# output to be displayed by the debugger.
+#
+cdl_component CYGDBG_HAL_DIAG_TO_DEBUG_CHAN {
+    # ActiveIf constraint: !CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE == 0
+    #   --> 1
+    # ActiveIf constraint:  CYGPKG_HAL_ARM || CYGPKG_HAL_POWERPC_MPC8xx  || CYGPKG_HAL_V85X_V850 || CYGSEM_HAL_VIRTUAL_VECTOR_DIAG 
+    #     CYGPKG_HAL_ARM (unknown) == 0
+    #     CYGPKG_HAL_POWERPC_MPC8xx (unknown) == 0
+    #     CYGPKG_HAL_V85X_V850 (unknown) == 0
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_DIAG == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  (CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS  || CYG_HAL_STARTUP == "RAM") ? 1 : 0
+    #     CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS == 0
+    #     CYG_HAL_STARTUP == ROM
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE
+    #     Calculated:  !CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE  && !CYGDBG_HAL_DIAG_TO_DEBUG_CHAN 
+};
+
+# >
+# Mangler used on diag output
+# It is sometimes necessary to mangle (encode) the
+# diag ASCII text output in order for it to show up at the
+# other end. In particular, GDB may silently ignore raw
+# ASCII text.
+#
+cdl_option CYGSEM_HAL_DIAG_MANGLER {
+    # This option is not active
+    # The parent CYGDBG_HAL_DIAG_TO_DEBUG_CHAN is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value GDB
+    # value_source default
+    # Default value: GDB
+    # Legal values: "GDB" "None"
+};
+
+# <
+# Grouped libraries for linking
+# This option provides a list of libraries used to satisfy
+# linker dependencies, but necessary for building eCos. It is passed
+# to a GROUP() directive in the linker script, which is analogous
+# to using the "-(" aka "--start-group", and "-)" aka
+# "--end-group" options on the linker command line.
+# It provides a similar function to adding "-llibname" to the
+# linker, but with the added feature that each library in the group
+# is scanned in turn for unresolved symbols, and this process is
+# repeated until there are no more unresolved symbols. This is important
+# for system libraries as there are often mutual dependencies.
+# This option should not be used for adding application specific
+# libraries. That should be done in the application's own makefile
+# or link line.
+# Users wishing to use the GNU Compiler prior to GCC 3.0 will
+# need to remove libsupc++.a from this option.
+# Note that libtarget.a is always required to build eCos.
+#
+cdl_component CYGBLD_HAL_LINKER_GROUPED_LIBS {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "libtarget.a libgcc.a libsupc++.a"
+    # value_source default
+    # Default value: CYGBLD_HAL_LINKER_GROUPED_LIBS_DEFAULT
+    #     CYGBLD_HAL_LINKER_GROUPED_LIBS_DEFAULT == "libtarget.a libgcc.a libsupc++.a"
+    #   --> "libtarget.a libgcc.a libsupc++.a"
+    # Requires:  is_substr(CYGBLD_HAL_LINKER_GROUPED_LIBS, "libtarget.a") 
+    #     CYGBLD_HAL_LINKER_GROUPED_LIBS == "libtarget.a libgcc.a libsupc++.a"
+    #   --> 1
+
+    # The following properties are affected by this value
+    # component CYGBLD_HAL_LINKER_GROUPED_LIBS
+    #     Requires:  is_substr(CYGBLD_HAL_LINKER_GROUPED_LIBS, "libtarget.a") 
+};
+
+# >
+# Default setting
+# This option is intended to be used by other eCos packages (including
+# HAL packages) to provide a different default value for
+# CYGBLD_HAL_LINKER_GROUPED_LIBS.
+# This is separated into its own option to continue to
+# allow the user to make customisations to the grouped library
+# list.
+#
+cdl_option CYGBLD_HAL_LINKER_GROUPED_LIBS_DEFAULT {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "libtarget.a libgcc.a libsupc++.a"
+    # value_source default
+    # Default value: "libtarget.a libgcc.a libsupc++.a"
+
+    # The following properties are affected by this value
+    # component CYGBLD_HAL_LINKER_GROUPED_LIBS
+    #     DefaultValue: CYGBLD_HAL_LINKER_GROUPED_LIBS_DEFAULT
+};
+
+# <
+# <
+# HAL interrupt handling
+# A number of configuration options related to interrupt
+# handling are common to most or all HAL packages, even though
+# the implementations will vary from architecture to
+# architecture.
+#
+cdl_component CYGPKG_HAL_COMMON_INTERRUPTS {
+    # There is no associated value.
+};
+
+# >
+# Use separate stack for interrupts
+# When an interrupt occurs this interrupt can be handled either
+# on the current stack or on a separate stack maintained by the
+# HAL. Using a separate stack requires a small number of extra
+# instructions in the interrupt handling code, but it has the
+# advantage that it is no longer necessary to allow extra space
+# in every thread stack for the interrupt handlers. The amount
+# of extra space required depends on the interrupt handlers
+# that are being used.
+#
+cdl_option CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Interrupt stack size
+# This configuration option specifies the stack size in bytes
+# for the interrupt stack. Typically this should be a multiple
+# of 16, but the exact requirements will vary from architecture
+# to architecture. The interrupt stack serves two separate
+# purposes. It is used as the stack during system
+# initialization. In addition, if the interrupt system is
+# configured to use a separate stack then all interrupts will
+# be processed on this stack. The exact memory requirements
+# will vary from application to application, and will depend
+# heavily on whether or not other interrupt-related options,
+# for example nested interrupts, are enabled. On most targets,
+# in a configuration with no kernel this stack will also be
+# the stack used to invoke the application, and must obviously
+# be appropriately large in that case.
+#
+cdl_option CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 4096
+    # value_source default
+    # Default value:  CYGPKG_KERNEL ? 4096 : 32768 
+    #     CYGPKG_KERNEL == current
+    #   --> 4096
+    # Legal values: 128 to 1048576
+};
+
+# Allow nested interrupts
+# When an interrupt occurs the HAL interrupt handling code can
+# either leave interrupts disabled for the duration of the
+# interrupt handling code, or by doing some extra work it can
+# reenable interrupts before invoking the interrupt handler and
+# thus allow nested interrupts to happen. If all the interrupt
+# handlers being used are small and do not involve any loops
+# then it is usually better to disallow nested interrupts.
+# However if any of the interrupt handlers are more complicated
+# than nested interrupts will usually be required.
+#
+cdl_option CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Save minimum context on interrupt
+# The HAL interrupt handling code can exploit the calling conventions
+# defined for a given architecture to reduce the amount of state
+# that has to be saved. Generally this improves performance and
+# reduces code size. However it can make source-level debugging
+# more difficult.
+#
+cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     Requires: ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
+};
+
+# Chain all interrupts together
+# Interrupts can be attached to vectors either singly, or be
+# chained together. The latter is necessary if there is no way
+# of discovering which device has interrupted without
+# inspecting the device itself. It can also reduce the amount
+# of RAM needed for interrupt decoding tables and code.
+#
+cdl_option CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGIMP_KERNEL_INTERRUPTS_CHAIN
+    #     Requires: CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
+};
+
+# Ignore spurious [fleeting] interrupts
+# On some hardware, interrupt sources may not be de-bounced or
+# de-glitched.  Rather than try to handle these interrupts (no
+# handling may be possible), this option allows the HAL to simply
+# ignore them.  In most cases, if the interrupt is real it will
+# reoccur in a detectable form.
+#
+cdl_option CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# <
+# HAL context switch support
+# A number of configuration options related to thread contexts
+# are common to most or all HAL packages, even though the
+# implementations will vary from architecture to architecture.
+#
+cdl_component CYGPKG_HAL_COMMON_CONTEXT {
+    # There is no associated value.
+
+    # The following properties are affected by this value
+};
+
+# >
+# Use minimum thread context
+# The thread context switch code can exploit the calling
+# conventions defined for a given architecture to reduce the
+# amount of state that has to be saved during a context
+# switch. Generally this improves performance and reduces
+# code size. However it can make source-level debugging more
+# difficult.
+#
+cdl_option CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     Requires: ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
+};
+
+# <
+# Explicit control over cache behaviour
+# These options let the default behaviour of the caches 
+# be easily configurable.
+#
+cdl_component CYGPKG_HAL_CACHE_CONTROL {
+    # There is no associated value.
+};
+
+# >
+# Enable DATA cache on startup
+# Enabling this option will cause the data cache to be enabled
+# as soon as practicable when eCos starts up.  One would choose
+# to disable this if the data cache cannot safely be turned on,
+# such as a case where the cache(s) require additional platform
+# specific setup.
+#
+cdl_component CYGSEM_HAL_ENABLE_DCACHE_ON_STARTUP {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# DATA cache mode on startup
+# This option controls the mode the cache will be set to
+# when enabled on startup.
+#
+cdl_option CYGSEM_HAL_DCACHE_STARTUP_MODE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value COPYBACK
+    # value_source default
+    # Default value: COPYBACK
+    # Legal values:  "COPYBACK" "WRITETHRU" 
+};
+
+# <
+# Enable INSTRUCTION cache on startup
+# Enabling this option will cause the instruction cache to be enabled
+# as soon as practicable when eCos starts up.  One would choose
+# to disable this if the instruction cache cannot safely be turned on,
+# such as a case where the cache(s) require additional platform
+# specific setup.
+#
+cdl_option CYGSEM_HAL_ENABLE_ICACHE_ON_STARTUP {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Source-level debugging support
+# If the source level debugger gdb is to be used for debugging
+# application code then it may be necessary to configure in support
+# for this in the HAL.
+#
+cdl_component CYGPKG_HAL_DEBUG {
+    # There is no associated value.
+};
+
+# >
+# Support for GDB stubs
+# The HAL implements GDB stubs for the target.
+#
+cdl_interface CYGINT_HAL_DEBUG_GDB_STUBS {
+    # Implemented by CYGPKG_HAL_CORTEXM_STM32, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+    # option CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     ActiveIf: CYGINT_HAL_DEBUG_GDB_STUBS
+};
+
+# Include GDB stubs in HAL
+# This option causes a set of GDB stubs to be included into the
+# system. On some target systems the GDB support will be
+# provided by other means, for example by a ROM monitor. On
+# other targets, especially when building a ROM-booting system,
+# the necessary support has to go into the target library
+# itself. When GDB stubs are include in a configuration, HAL
+# serial drivers must also be included.
+#
+cdl_option CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS {
+    # ActiveIf constraint: CYGINT_HAL_DEBUG_GDB_STUBS
+    #     CYGINT_HAL_DEBUG_GDB_STUBS == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: ! CYGSEM_HAL_USE_ROM_MONITOR
+    #     CYGSEM_HAL_USE_ROM_MONITOR (unknown) == 0
+    #   --> 1
+    # Requires: ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
+    #     CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT == 1
+    #   --> 0
+    # Requires: ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
+    #     CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM == 1
+    #   --> 0
+    # Requires:  !CYGSEM_HAL_VIRTUAL_VECTOR_DIAG  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_DIAG == 1
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # component CYGDBG_HAL_DIAG_TO_DEBUG_CHAN
+    #     DefaultValue:  (CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS  || CYG_HAL_STARTUP == "RAM") ? 1 : 0
+    # option CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
+    #     Requires: CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    # option CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
+    #     DefaultValue: CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    # option CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
+    #     ActiveIf:  CYGSEM_HAL_USE_ROM_MONITOR || CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS 
+    # option CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
+    #     DefaultValue:  !CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS 
+    # option CYGBLD_BUILD_COMMON_GDB_STUBS
+    #     Requires: CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    # option CYGPKG_HAL_GDB_FILEIO
+    #     Requires: CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+};
+
+# Support for external break support in GDB stubs
+# The HAL implements external break (or asynchronous interrupt)
+# in the GDB stubs for the target.
+#
+cdl_interface CYGINT_HAL_DEBUG_GDB_STUBS_BREAK {
+    # Implemented by CYGPKG_HAL_CORTEXM_STM32, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+    # option CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
+    #     ActiveIf: CYGINT_HAL_DEBUG_GDB_STUBS_BREAK
+};
+
+# Include GDB external break support for stubs
+# This option causes the GDB stub to add a serial interrupt handler
+# which will listen for GDB break packets. This lets you stop the
+# target asynchronously when using GDB, usually by hitting Control+C
+# or pressing the STOP button. This option differs from
+# CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT in that it is used when
+# GDB stubs are present.
+#
+cdl_option CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT {
+    # ActiveIf constraint: CYGINT_HAL_DEBUG_GDB_STUBS_BREAK
+    #     CYGINT_HAL_DEBUG_GDB_STUBS_BREAK == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS == 0
+    #   --> 0
+    # Requires: CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
+    #     Requires: !CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
+};
+
+# Platform does not support CTRLC
+#
+cdl_interface CYGINT_HAL_DEBUG_GDB_CTRLC_UNSUPPORTED {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # option CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
+    #     ActiveIf:  CYGINT_HAL_DEBUG_GDB_CTRLC_UNSUPPORTED == 0 
+};
+
+# Include GDB external break support when no stubs
+# This option adds an interrupt handler for the GDB serial line
+# which will listen for GDB break packets. This lets you stop the
+# target asynchronously when using GDB, usually by hitting Control+C
+# or pressing the STOP button. This option differs from
+# CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT in that it is used when the GDB
+# stubs are NOT present.
+#
+cdl_option CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT {
+    # This option is not active
+    # ActiveIf constraint:  CYGSEM_HAL_USE_ROM_MONITOR || CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS 
+    #     CYGSEM_HAL_USE_ROM_MONITOR (unknown) == 0
+    #     CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS == 0
+    #   --> 0
+    # ActiveIf constraint:  CYGINT_HAL_DEBUG_GDB_CTRLC_UNSUPPORTED == 0 
+    #     CYGINT_HAL_DEBUG_GDB_CTRLC_UNSUPPORTED == 0
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  !CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS 
+    #     CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS == 0
+    #   --> 1
+    # Requires: !CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
+    #     CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT == 0
+    #   --> 1
+};
+
+# Include GDB multi-threading debug support
+# This option enables some extra HAL code which is needed
+# to support multi-threaded source level debugging.
+#
+cdl_option CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT {
+    # ActiveIf constraint:  CYGSEM_HAL_ROM_MONITOR || CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT 
+    #     CYGSEM_HAL_ROM_MONITOR (unknown) == 0
+    #     CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT
+    #     Requires: CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
+};
+
+# Number of times to retry sending a $O packet
+# This option controls the number of attempts that eCos programs
+# will make to send a $O packet to a host GDB process.  If it is
+# set non-zero, then the target process will attempt to resend the
+# $O packet data up to this number of retries.  Caution: use of
+# this option is not recommended as it can thoroughly confuse the
+# host GDB process.
+#
+cdl_option CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Timeout period for GDB packets
+# This option controls the time (in milliseconds) that eCos programs
+# will wait for a response when sending packets to a host GDB process.
+# If this time elapses, then the packet will be resent, up to some
+# maximum number of times (CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES).
+#
+cdl_option CYGNUM_HAL_DEBUG_GDB_PROTOCOL_TIMEOUT {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 500
+    # value_source default
+    # Default value: 500
+};
+
+# Location of CRC32 table
+# The stubs use a 1 kilobyte CRC table that can either be pregenerated
+# and placed in ROM, or generated at runtime in RAM. Depending on
+# your memory constraints, one of these options may be better.
+#
+cdl_option CYGDBG_HAL_CRCTABLE_LOCATION {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value RAM
+    # value_source default
+    # Default value: RAM
+    # Legal values: "ROM" "RAM"
+};
+
+# <
+# ROM monitor support
+# Support for ROM monitors can be built in to your application. 
+# It may also be relevant to build your application as a ROM monitor
+# itself. Such options are contained here if relevant for your chosen
+# platform. The options and ROM monitors available to choose are
+# platform-dependent.
+#
+cdl_component CYGPKG_HAL_ROM_MONITOR {
+    # There is no associated value.
+};
+
+# >
+# Target has virtual vector support
+#
+cdl_interface CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT {
+    # Implemented by CYGPKG_HAL_CORTEXM_STM32, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+    # component CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+    #     ActiveIf: CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT
+};
+
+# Target supports baud rate control via vectors
+# Whether this target supports the __COMMCTL_GETBAUD
+# and __COMMCTL_SETBAUD virtual vector comm control operations.
+#
+cdl_interface CYGINT_HAL_VIRTUAL_VECTOR_COMM_BAUD_SUPPORT {
+    # Implemented by CYGPKG_HAL_CORTEXM_STM32, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+};
+
+# Enable use of virtual vector calling interface
+# Virtual vector support allows the HAL to let the ROM
+# monitor handle certain operations. The virtual vector table
+# defines a calling interface between applications running in
+# RAM and the ROM monitor.
+#
+cdl_component CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT {
+    # ActiveIf constraint: CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT
+    #     CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT == 1
+    #   --> 1
+
+    # Calculated value: 1
+    # Flavor: bool
+    # Current value: 1
+};
+
+# >
+# Inherit console settings from ROM monitor
+# When this option is set, the application will inherit
+# the console as set up by the ROM monitor. This means
+# that the application will use whatever channel and
+# mangling style was used by the ROM monitor when
+# the application was launched.
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE {
+    # This option is not active
+    # ActiveIf constraint: CYGSEM_HAL_USE_ROM_MONITOR
+    #     CYGSEM_HAL_USE_ROM_MONITOR (unknown) == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  !CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS == 1
+    #   --> 0
+
+    # The following properties are affected by this value
+    # component CYGDBG_HAL_DIAG_TO_DEBUG_CHAN
+    #     ActiveIf: !CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE
+    # option CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE
+    #     Calculated:  !CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE  && !CYGDBG_HAL_DIAG_TO_DEBUG_CHAN 
+};
+
+# Debug channel is configurable
+# This option is a configuration hint - it is enabled
+# when the HAL initialization code will make use
+# of the debug channel configuration option.
+#
+cdl_option CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE {
+    # Calculated value:  CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS == 1
+    # Flavor: bool
+    # Current value: 1
+
+    # The following properties are affected by this value
+    # option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL
+    #     ActiveIf: CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE
+};
+
+# Console channel is configurable
+# This option is a configuration hint - it is enabled
+# when the HAL initialization code will make use
+# of the console channel configuration option.
+#
+cdl_option CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE {
+    # Calculated value:  !CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE  && !CYGDBG_HAL_DIAG_TO_DEBUG_CHAN 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE == 0
+    #     CYGDBG_HAL_DIAG_TO_DEBUG_CHAN == 0
+    # Flavor: bool
+    # Current value: 1
+
+    # The following properties are affected by this value
+    # option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL
+    #     ActiveIf: CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE
+};
+
+# Initialize whole of virtual vector table
+# This option will cause the whole of the virtual
+# vector table to be initialized with dummy values on
+# startup. When this option is enabled, all the
+# options below must also be enabled - or the
+# table would be empty when the application
+# launches.
+# On targets where older ROM monitors without
+# virtual vector support may still be in use, it is
+# necessary for RAM applictions to initialize the
+# table (since all HAL diagnostics and debug IO
+# happens via the table).
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYG_HAL_STARTUP != "RAM" || !CYGSEM_HAL_USE_ROM_MONITOR 
+    #     CYG_HAL_STARTUP == ROM
+    #     CYGSEM_HAL_USE_ROM_MONITOR (unknown) == 0
+    #   --> 1
+    # Requires: CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET == 1
+    #   --> 1
+    # Requires: CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US == 1
+    #   --> 1
+    # Requires: CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA == 1
+    #   --> 1
+    # Requires: CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT
+    #     ActiveIf: !CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_VERSION
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS 
+};
+
+# Claim virtual vector table entries by default
+# By default most virtual vectors will be claimed by
+# RAM startup configurations, meaning that the RAM
+# application will provide the services. The
+# exception is COMMS support (HAL
+# diagnostics/debugging IO) which is left in the
+# control of the ROM monitor.
+# The reasoning behind this is to get as much of the
+# code exercised during regular development so it
+# is known to be working the few times a new ROM
+# monitor or a ROM production configuration is used
+# - COMMS are excluded only by necessity in order to
+# avoid breaking an existing debugger connections
+# (there may be ways around this).
+# For production RAM configurations this option can
+# be switched off, causing the appliction to rely on
+# the ROM monitor for these services, thus
+# saving some space.
+# Individual vectors may also be left unclaimed,
+# controlled by the below options (meaning that the
+# associated service provided by the ROM monitor
+# will be used).
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT {
+    # This option is not active
+    # ActiveIf constraint: !CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE == 1
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA
+    #     DefaultValue:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+};
+
+# Claim reset virtual vectors
+# This option will cause the reset and kill_by_reset
+# virtual vectors to be claimed.
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE == 1
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE
+    #     Requires: CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET
+};
+
+# Claim version virtual vectors
+# This option will cause the version
+# virtual vectors to be claimed.
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_VERSION {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE == 1
+    #   --> 1
+};
+
+# Claim delay_us virtual vector
+# This option will cause the delay_us
+# virtual vector to be claimed.
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE == 1
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE
+    #     Requires: CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US
+};
+
+# Claim data virtual vectors
+# This option will cause the data virtual vectors
+# to be claimed. At present there is only one, used
+# by the RedBoot ethernet driver to share diag output.
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE == 1
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE
+    #     Requires: CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA
+};
+
+# Claim comms virtual vectors
+# This option will cause the communication tables
+# that are part of the virtual vectors mechanism to
+# be claimed. Note that doing this may cause an
+# existing ROM monitor communication connection to
+# be closed. For this reason, the option is disabled
+# per default for normal application
+# configurations.
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE  || CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS 
+    #     CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE == 1
+    #     CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     Requires:  !CYGSEM_HAL_VIRTUAL_VECTOR_DIAG  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE
+    #     DefaultValue:  !CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS 
+    # option CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE
+    #     Calculated:  CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS 
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE
+    #     Requires: CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS
+};
+
+# Do diagnostic IO via virtual vector table
+# All HAL IO happens via the virtual vector table / comm
+# tables when those tables are supported by the HAL.
+# If so desired, the low-level IO functions can
+# still be provided by the RAM application by
+# enabling the CLAIM_COMMS option.
+#
+cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_DIAG {
+    # Calculated value: 1
+    # Flavor: bool
+    # Current value: 1
+
+    # The following properties are affected by this value
+    # component CYGDBG_HAL_DIAG_TO_DEBUG_CHAN
+    #     ActiveIf:  CYGPKG_HAL_ARM || CYGPKG_HAL_POWERPC_MPC8xx  || CYGPKG_HAL_V85X_V850 || CYGSEM_HAL_VIRTUAL_VECTOR_DIAG 
+    # option CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     Requires:  !CYGSEM_HAL_VIRTUAL_VECTOR_DIAG  || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS 
+};
+
+# <
+# <
+# Platform defined I/O channels
+# Platforms which provide additional I/O channels can implement
+# this interface, indicating that the function plf_if_init()
+# needs to be called.
+#
+cdl_interface CYGINT_HAL_PLF_IF_INIT {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Platform IDE I/O support
+# Platforms which provide IDE controllers can implement
+# this interface, indicating that IDE I/O macros are
+# available.
+#
+cdl_interface CYGINT_HAL_PLF_IF_IDE {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Saved interrupt state required
+# Components requiring access to saved interrupt state via the
+# hal_saved_interrupt_state symbol should implement this
+# interface.
+#
+cdl_interface CYGINT_HAL_COMMON_SAVED_INTERRUPT_STATE_REQUIRED {
+    # Implemented by CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT, active, disabled
+    # Implemented by CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT, inactive, enabled
+    # Implemented by CYGFUN_HAL_CORTEXM_STM32_PROFILE_TIMER, inactive, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+};
+
+# File I/O operations via GDB
+# This option enables support for various file I/O
+# operations using the GDB remote protocol to communicate
+# with GDB. The operations are then performed on the
+# debugging host by proxy. These operations are only
+# currently available by using a system call interface
+# to RedBoot. This may change in the future.
+#
+cdl_option CYGPKG_HAL_GDB_FILEIO {
+    # This option is not active
+    # ActiveIf constraint: CYGSEM_REDBOOT_BSP_SYSCALLS
+    #     CYGSEM_REDBOOT_BSP_SYSCALLS (unknown) == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+    #     CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS == 0
+    #   --> 0
+};
+
+# Build Compiler sanity checking tests
+# Enabling this option causes compiler tests to be built.
+#
+cdl_option CYGPKG_HAL_BUILD_COMPILER_TESTS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_HAL_TESTS
+    #     Calculated:   "tests/context tests/basic"
+    #                           . ((!CYGINT_HAL_TESTS_NO_CACHES) ? " tests/cache" : "")
+    #                           . ((CYGPKG_HAL_BUILD_COMPILER_TESTS) ? " tests/cpp1 tests/vaargs" : "")
+    #                           . ((!CYGVAR_KERNEL_COUNTERS_CLOCK) ?   " tests/intr" : "") 
+};
+
+# Common HAL tests
+# This option specifies the set of tests for the common HAL.
+#
+cdl_component CYGPKG_HAL_TESTS {
+    # Calculated value:   "tests/context tests/basic"
+    #                           . ((!CYGINT_HAL_TESTS_NO_CACHES) ? " tests/cache" : "")
+    #                           . ((CYGPKG_HAL_BUILD_COMPILER_TESTS) ? " tests/cpp1 tests/vaargs" : "")
+    #                           . ((!CYGVAR_KERNEL_COUNTERS_CLOCK) ?   " tests/intr" : "") 
+    #     CYGINT_HAL_TESTS_NO_CACHES == 0
+    #     CYGPKG_HAL_BUILD_COMPILER_TESTS == 0
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    # Flavor: data
+    # Current_value: tests/context tests/basic tests/cache
+};
+
+# >
+# Interface for cache presence
+# Some architectures and/or platforms do not have caches. By
+# implementing this interface, these can disable the various
+# cache-related tests.
+#
+cdl_interface CYGINT_HAL_TESTS_NO_CACHES {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_HAL_TESTS
+    #     Calculated:   "tests/context tests/basic"
+    #                           . ((!CYGINT_HAL_TESTS_NO_CACHES) ? " tests/cache" : "")
+    #                           . ((CYGPKG_HAL_BUILD_COMPILER_TESTS) ? " tests/cpp1 tests/vaargs" : "")
+    #                           . ((!CYGVAR_KERNEL_COUNTERS_CLOCK) ?   " tests/intr" : "") 
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+};
+
+# <
+# Cortex-M Architecture
+# This package provides generic support for the ARM Cortex-M architecture.
+# It is also necessary to select a variant and platform HAL package.
+#
+cdl_package CYGPKG_HAL_CORTEXM {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires:  CYGHWR_HAL_CORTEXM_BIGENDIAN implies
+    #             is_substr(CYGBLD_GLOBAL_CFLAGS,   " -mbig-endian ") &&
+    #             is_substr(CYGBLD_GLOBAL_LDFLAGS,  " -mbig-endian ") 
+    #     CYGHWR_HAL_CORTEXM_BIGENDIAN == 0
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #   --> 1
+    # Requires:  !CYGHWR_HAL_CORTEXM_BIGENDIAN implies
+    #             !is_substr(CYGBLD_GLOBAL_CFLAGS,  " -mbig-endian ") &&
+    #             !is_substr(CYGBLD_GLOBAL_LDFLAGS, " -mbig-endian ") 
+    #     CYGHWR_HAL_CORTEXM_BIGENDIAN == 0
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #   --> 1
+
+    # The following properties are affected by this value
+};
+
+# >
+# The platform and architecture supports Big Endian operation
+#
+cdl_interface CYGINT_HAL_CORTEXM_BIGENDIAN {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_BIGENDIAN
+    #     ActiveIf:  CYGINT_HAL_CORTEXM_BIGENDIAN != 0 
+};
+
+# Use big-endian mode
+# Use the CPU in big-endian mode.
+#
+cdl_option CYGHWR_HAL_CORTEXM_BIGENDIAN {
+    # This option is not active
+    # ActiveIf constraint:  CYGINT_HAL_CORTEXM_BIGENDIAN != 0 
+    #     CYGINT_HAL_CORTEXM_BIGENDIAN == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_HAL_CORTEXM
+    #     Requires:  CYGHWR_HAL_CORTEXM_BIGENDIAN implies
+    #             is_substr(CYGBLD_GLOBAL_CFLAGS,   " -mbig-endian ") &&
+    #             is_substr(CYGBLD_GLOBAL_LDFLAGS,  " -mbig-endian ") 
+    # package CYGPKG_HAL_CORTEXM
+    #     Requires:  !CYGHWR_HAL_CORTEXM_BIGENDIAN implies
+    #             !is_substr(CYGBLD_GLOBAL_CFLAGS,  " -mbig-endian ") &&
+    #             !is_substr(CYGBLD_GLOBAL_LDFLAGS, " -mbig-endian ") 
+};
+
+# Cortex-M CPU family
+# The Cortex-M architecture has two variants at present. The
+# M3 and M4 are based on the ARMV7 architecture specification
+# and execute the Thumb2 instruction set. The M4 in addition
+# to M3 instruction set has SIMD and optional single precision
+# floating point instructions.
+#
+cdl_option CYGHWR_HAL_CORTEXM {
+    # Flavor: data
+    user_value M4
+    # value_source user
+    # Default value: M3
+    # Legal values:  "M3" "M4" 
+
+    # The following properties are affected by this value
+    # component CYGPKG_HAL_CORTEXM_FPU
+    #     ActiveIf:  CYGHWR_HAL_CORTEXM == "M4" 
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Calculated:  CYGHWR_HAL_CORTEXM == "M3" ? " -mcpu=cortex-m3" :
+    #                          CYGHWR_HAL_CORTEXM_FPU     ? " -mcpu=cortex-m4" : " " 
+    # option CYGBLD_ARCH_CPUFLAGX_M4
+    #     Calculated:  (CYGHWR_HAL_CORTEXM != "M4") ? "-mcpu=cortex-m4" : "no_exclude" 
+    # package CYGPKG_HAL_CORTEXM_STM32
+    #     Requires:  (CYGHWR_HAL_CORTEXM == "M3") || (CYGHWR_HAL_CORTEXM == "M4") 
+    # package CYGPKG_HAL_CORTEXM_STM32
+    #     Requires:  (CYGHWR_HAL_CORTEXM == "M3") || (CYGHWR_HAL_CORTEXM == "M4") 
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM == "M4" 
+};
+
+# System tick timer clock
+# Select the Cortex-M system tick timer clock source.
+#
+cdl_option CYGHWR_HAL_CORTEXM_SYSTICK_CLK_SOURCE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value EXTERNAL
+    # value_source default
+    # Default value: EXTERNAL
+    # Legal values:  "EXTERNAL" "INTERNAL" 
+};
+
+# Floating Point Support
+# Floating point arithmetics can be executed in software or,
+# on devices with floating point unit - FPU, in hardware.
+# FPU is optional on Cortex-M4 architecture, and is present
+# on Cortex-M4F cores.
+#
+cdl_component CYGPKG_HAL_CORTEXM_FPU {
+    # ActiveIf constraint:  CYGHWR_HAL_CORTEXM == "M4" 
+    #     CYGHWR_HAL_CORTEXM == M4
+    #   --> 1
+
+    # Calculated value:  !CYGHWR_HAL_CORTEXM_FPU ? "SOFT" :
+    #                               "HARD: " . CYGHWR_HAL_CORTEXM_FPU_SWITCH 
+    #     CYGHWR_HAL_CORTEXM_FPU == 0
+    #     CYGHWR_HAL_CORTEXM_FPU_SWITCH == 0
+    # Flavor: data
+    # Current_value: SOFT
+};
+
+# >
+# FPU is FPv4-SP-D16
+#
+cdl_interface CYGINT_HAL_FPV4_SP_D16 {
+    # Implemented by CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY, active, enabled
+    # This value cannot be modified here.
+    # Flavor: bool
+    # Current value: 1
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_FPV4_SP_D16
+    #     ActiveIf:  CYGINT_HAL_FPV4_SP_D16 
+    # option CYGHWR_HAL_FPV4_SP_D16
+    #     Calculated:  CYGINT_HAL_FPV4_SP_D16 && CYGHWR_HAL_CORTEXM_FPU 
+};
+
+# FPU present.
+#
+cdl_interface CYGINT_HAL_CORTEXM_FPU {
+    # Implemented by CYGINT_HAL_FPV4_SP_D16, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+    # component CYGHWR_HAL_CORTEXM_FPU
+    #     ActiveIf:  CYGINT_HAL_CORTEXM_FPU 
+};
+
+# Use hardware FPU
+# Cortex-M4F cores have a single precision floating point unit.
+# This option enables FPU usage and provides related FPU control
+# options.
+# Hardware FPU enable, implies Cortex-M4 code generation, and
+# build flags shall be set accordingly, including -mcpu=cortex-m4.
+# As a side effect, the Cortex_M4 build flag will remain (sticky)
+# even if hardware FPU is subsequently disabled.
+# 
+#
+cdl_component CYGHWR_HAL_CORTEXM_FPU {
+    # ActiveIf constraint:  CYGINT_HAL_CORTEXM_FPU 
+    #     CYGINT_HAL_CORTEXM_FPU == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_HAL_CORTEXM_FPU
+    #     Calculated:  !CYGHWR_HAL_CORTEXM_FPU ? "SOFT" :
+    #                               "HARD: " . CYGHWR_HAL_CORTEXM_FPU_SWITCH 
+    # option CYGHWR_HAL_FPV4_SP_D16
+    #     Calculated:  CYGINT_HAL_FPV4_SP_D16 && CYGHWR_HAL_CORTEXM_FPU 
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Calculated:  CYGHWR_HAL_CORTEXM == "M3" ? " -mcpu=cortex-m3" :
+    #                          CYGHWR_HAL_CORTEXM_FPU     ? " -mcpu=cortex-m4" : " " 
+    # option CYGBLD_ARCH_CPUFLAGX_M3
+    #     Calculated:  CYGHWR_HAL_CORTEXM_FPU ? "-mcpu=cortex-m3" : "no_exclude" 
+    # component CYGBLD_ARCH_CPUFLAG_FLOAT_ABI
+    #     Calculated:  CYGHWR_HAL_CORTEXM_FPU ? " -mfloat-abi=hard" : "" 
+    # option CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI
+    #     Calculated:  CYGHWR_HAL_CORTEXM_FPU ? "-mfloat-abi=soft" : "-mfloat-abi=hard" 
+    # option CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT
+    #     Calculated:  CYGHWR_HAL_CORTEXM_FPU ? "-msoft-float" : "-mhard-float" 
+};
+
+# >
+# FPU context switch
+# This option selects the FPU context switching scheme.
+# Straight-forward behaviour is to save and
+# restore FPU state on every CPU context save/restore.
+# While simple, robust and deterministic, this
+# approach can be expensive if the FPU is used by
+# few threads. The alternative schemes, available by this
+# option, are to use hardware features that allow either:
+# - LAZY: Save FPU context only if the thread makes use of
+# the FPU. Where only few threads use FPU this should give
+# shorter average context switching delay compared to ALL
+# scheme. If more than one threads use FPU, the worst context
+# switching time is typically worse than the one for ALL
+# scheme.
+# - ALL: Save FPU context for all threads. This is a simple
+# scheme, which if all, or majority of threads use FPU may
+# give better average context switching time than LAZY.
+# This scheme also includes Lazy Stacking of FPU state
+# for exceptions/interrupts.
+# - NONE: No FPU state saving, this scheme adds no additional
+# delay for saving of FPU state to context switching, but is
+# only suitable if maximum one thread uses floating point.
+#
+cdl_option CYGHWR_HAL_CORTEXM_FPU_SWITCH {
+    # This option is not active
+    # The parent CYGHWR_HAL_CORTEXM_FPU is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value LAZY
+    # value_source default
+    # Default value: LAZY
+    # Legal values:  "ALL" "LAZY" "NONE" 
+    # Requires:  is_active (CYGPKG_KERNEL) implies
+    #                         CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ==
+    #                         (CYGHWR_HAL_CORTEXM_FPU_SWITCH == "NONE") 
+    #     CYGPKG_KERNEL == current
+    #     CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST == 0
+    #     CYGHWR_HAL_CORTEXM_FPU_SWITCH == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # component CYGPKG_HAL_CORTEXM_FPU
+    #     Calculated:  !CYGHWR_HAL_CORTEXM_FPU ? "SOFT" :
+    #                               "HARD: " . CYGHWR_HAL_CORTEXM_FPU_SWITCH 
+    # option CYGHWR_HAL_CORTEXM_FPU_SWITCH
+    #     Requires:  is_active (CYGPKG_KERNEL) implies
+    #                         CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ==
+    #                         (CYGHWR_HAL_CORTEXM_FPU_SWITCH == "NONE") 
+};
+
+# FPv4-SP-D16
+# FPv4-SP-D16 is ARMv7 architecture single precision floating
+# point unit with 16 double precision / 32 single precision
+# registers. It is found on Cortex-M4F and Cortex-R5 cores.
+#
+cdl_option CYGHWR_HAL_FPV4_SP_D16 {
+    # This option is not active
+    # The parent CYGHWR_HAL_CORTEXM_FPU is disabled
+    # ActiveIf constraint:  CYGINT_HAL_FPV4_SP_D16 
+    #     CYGINT_HAL_FPV4_SP_D16 == 1
+    #   --> 1
+
+    # Calculated value:  CYGINT_HAL_FPV4_SP_D16 && CYGHWR_HAL_CORTEXM_FPU 
+    #     CYGINT_HAL_FPV4_SP_D16 == 1
+    #     CYGHWR_HAL_CORTEXM_FPU == 0
+    # Flavor: bool
+    # Current value: 0
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAG_FPV4SPD16
+    #     Calculated:  CYGHWR_HAL_FPV4_SP_D16 ? " -mfpu=fpv4-sp-d16" : "" 
+    # option CYGBLD_ARCH_CPUFLAGX_FPV4SPD16
+    #     Calculated:  CYGHWR_HAL_FPV4_SP_D16 ? "do_not_exclude" : "-mfpu=fpv4-sp-d16" 
+};
+
+# <
+# <
+# Architecture optimized endian functions
+# Cortex-M architecture implements instructions for endian
+# manipulation (byte swapping).  If enabled, this feature
+# can produce shorter and faster code for that.
+#
+cdl_option CYGIMP_HAL_ARCH_ENDIAN {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Maximum usable priority
+# Calculate the maximum exception priority that can be set by interrupts.
+# Higher priorities are reserved for the DEBUG and SVC traps.
+#
+cdl_option CYGNUM_HAL_CORTEXM_PRIORITY_MAX {
+    # Calculated value: 1<<(8-CYGNUM_HAL_CORTEXM_PRIORITY_LEVEL_BITS)
+    #     CYGNUM_HAL_CORTEXM_PRIORITY_LEVEL_BITS == 4
+    # Flavor: data
+    # Current_value: 16
+};
+
+# Support call-graph profiling
+# Calculate whether mcount functions should be built
+# to support call-graph profiling.
+#
+cdl_option CYGBLD_HAL_CORTEXM_MCOUNT {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_PROFILE_GPROF
+    #     CYGPKG_PROFILE_GPROF (unknown) == 0
+    #   --> 0
+
+    # Calculated value: CYGPKG_PROFILE_CALLGRAPH
+    #     CYGPKG_PROFILE_CALLGRAPH (unknown) == 0
+    # Flavor: bool
+    # Current value: 0
+};
+
+# Linker script
+#
+cdl_option CYGBLD_LINKER_SCRIPT {
+    # Calculated value:  "src/cortexm.ld" 
+    # Flavor: data
+    # Current_value: src/cortexm.ld
+};
+
+# Number of breakpoints supported by the HAL.
+# This option determines the number of breakpoints supported by the HAL.
+#
+cdl_option CYGNUM_HAL_BREAKPOINT_LIST_SIZE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 8
+    # value_source default
+    # Default value: 8
+};
+
+# Architecture related build flags
+# This component defines flags that code generation dependent on specific
+# CPU type or CPU features.
+#
+cdl_component CYGBLD_ARCH_CPUFLAGS {
+    # Calculated value:  CYGHWR_HAL_CORTEXM == "M3" ? " -mcpu=cortex-m3" :
+    #                          CYGHWR_HAL_CORTEXM_FPU     ? " -mcpu=cortex-m4" : " " 
+    #     CYGHWR_HAL_CORTEXM == M4
+    #     CYGHWR_HAL_CORTEXM_FPU == 0
+    # Flavor: data
+    # Current_value:  
+    # Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_ARCH_CPUFLAGX_M3 == no_exclude
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_ARCH_CPUFLAGX_M4 == no_exclude
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI == -mfloat-abi=hard
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT == -mhard-float
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_ARCH_CPUFLAGX_FPV4SPD16 == -mfpu=fpv4-sp-d16
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_ARCH_CPUFLAGS == " "
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_ARCH_CPUFLAG_FLOAT_ABI == ""
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #     CYGBLD_ARCH_CPUFLAG_FPV4SPD16 == ""
+    #   --> 1
+    # Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #     CYGBLD_ARCH_CPUFLAGX_M3 == no_exclude
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #     CYGBLD_ARCH_CPUFLAGX_M4 == no_exclude
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #     CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI == -mfloat-abi=hard
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #     CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT == -mhard-float
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #     CYGBLD_ARCH_CPUFLAGX_FPV4SPD16 == -mfpu=fpv4-sp-d16
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #     CYGBLD_ARCH_CPUFLAGS == " "
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #     CYGBLD_ARCH_CPUFLAG_FLOAT_ABI == ""
+    #     CYGBLD_GLOBAL_LDFLAGS == "-mcpu=cortex-m4 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib"
+    #     CYGBLD_ARCH_CPUFLAG_FPV4SPD16 == ""
+    #   --> 1
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# >
+# Exclude Cortex-M3 build flag
+#
+cdl_option CYGBLD_ARCH_CPUFLAGX_M3 {
+    # Calculated value:  CYGHWR_HAL_CORTEXM_FPU ? "-mcpu=cortex-m3" : "no_exclude" 
+    #     CYGHWR_HAL_CORTEXM_FPU == 0
+    # Flavor: data
+    # Current_value: no_exclude
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# Exclude Cortex-M4 build flag
+#
+cdl_option CYGBLD_ARCH_CPUFLAGX_M4 {
+    # Calculated value:  (CYGHWR_HAL_CORTEXM != "M4") ? "-mcpu=cortex-m4" : "no_exclude" 
+    #     CYGHWR_HAL_CORTEXM == M4
+    # Flavor: data
+    # Current_value: no_exclude
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# Float ABI build flags
+#
+cdl_component CYGBLD_ARCH_CPUFLAG_FLOAT_ABI {
+    # Calculated value:  CYGHWR_HAL_CORTEXM_FPU ? " -mfloat-abi=hard" : "" 
+    #     CYGHWR_HAL_CORTEXM_FPU == 0
+    # Flavor: data
+    # Current_value: 
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# >
+# Float ABI flag to exclude
+#
+cdl_option CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI {
+    # Calculated value:  CYGHWR_HAL_CORTEXM_FPU ? "-mfloat-abi=soft" : "-mfloat-abi=hard" 
+    #     CYGHWR_HAL_CORTEXM_FPU == 0
+    # Flavor: data
+    # Current_value: -mfloat-abi=hard
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# Alt. float flag to exclude
+#
+cdl_option CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT {
+    # Calculated value:  CYGHWR_HAL_CORTEXM_FPU ? "-msoft-float" : "-mhard-float" 
+    #     CYGHWR_HAL_CORTEXM_FPU == 0
+    # Flavor: data
+    # Current_value: -mhard-float
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# FPv4-SP-D16 flags
+#
+cdl_component CYGBLD_ARCH_CPUFLAG_FPV4SPD16 {
+    # Calculated value:  CYGHWR_HAL_FPV4_SP_D16 ? " -mfpu=fpv4-sp-d16" : "" 
+    #     CYGHWR_HAL_FPV4_SP_D16 == 0
+    # Flavor: data
+    # Current_value: 
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# >
+# Exclude FPv4-SP-D16 flag
+#
+cdl_option CYGBLD_ARCH_CPUFLAGX_FPV4SPD16 {
+    # Calculated value:  CYGHWR_HAL_FPV4_SP_D16 ? "do_not_exclude" : "-mfpu=fpv4-sp-d16" 
+    #     CYGHWR_HAL_FPV4_SP_D16 == 0
+    # Flavor: data
+    # Current_value: -mfpu=fpv4-sp-d16
+
+    # The following properties are affected by this value
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_CFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+    # component CYGBLD_ARCH_CPUFLAGS
+    #     Requires: 
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M3)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_M4)             &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FLOAT_ABI)      &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_HARDSOFT_FLOAT) &&
+    #                 !is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGX_FPV4SPD16)      &&
+    #     
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAGS)                 &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FLOAT_ABI)        &&
+    #                 is_substr(CYGBLD_GLOBAL_LDFLAGS, CYGBLD_ARCH_CPUFLAG_FPV4SPD16)
+    #             
+};
+
+# <
+# <
+# <
+# Cortex-M3/-M4 STM32 Variant
+# This package provides generic support for the ST Cortex-M based STM32
+# microcontroller family.
+# It is also necessary to select a variant and platform HAL package.
+#
+cdl_package CYGPKG_HAL_CORTEXM_STM32 {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires:  (CYGHWR_HAL_CORTEXM == "M3") || (CYGHWR_HAL_CORTEXM == "M4") 
+    #     CYGHWR_HAL_CORTEXM == M4
+    #     CYGHWR_HAL_CORTEXM == M4
+    #   --> 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_IO_SERIAL_CORTEXM_STM32
+    #     ActiveIf: CYGPKG_HAL_CORTEXM_STM32
+};
+
+# >
+# STM32 processor selection
+# The options within this component allow you to select which STM32
+# processor is in use.
+#
+cdl_component CYGHWR_HAL_CORTEXM_STM32_SELECTION {
+    # There is no associated value.
+};
+
+# >
+# STM32 processor variant in use
+# The STM32 has several variants, the main differences
+# being in the size of on-chip FLASH and SRAM
+# and numbers of some peripherals. This option
+# allows the platform HAL to select the specific
+# microcontroller fitted.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32 {
+    # Flavor: data
+    user_value F407VG
+    # value_source user
+    # Default value:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1") ? CYGHWR_HAL_CORTEXM_STM32_F1 :  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") ? CYGHWR_HAL_CORTEXM_STM32_F2 :  CYGHWR_HAL_CORTEXM_STM32_F4 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_F1 == 0
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_F2 == 0
+    #     CYGHWR_HAL_CORTEXM_STM32_F4 == F407VG
+    #   --> F407VG
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32_F1
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F1 
+    # option CYGHWR_HAL_CORTEXM_STM32_F2
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F2 
+    # option CYGHWR_HAL_CORTEXM_STM32_F4
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F4 
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+};
+
+# Processor family in use
+# Which family of STM32 processors is in use. This will
+# usually be the leading part of the processor model name.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_FAMILY {
+    # Flavor: data
+    user_value F4
+    # value_source user
+    # Default value: F1
+    # Legal values:  "F1" "F2" "F4" 
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1") ? CYGHWR_HAL_CORTEXM_STM32_F1 :  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") ? CYGHWR_HAL_CORTEXM_STM32_F2 :  CYGHWR_HAL_CORTEXM_STM32_F4 
+    # option CYGHWR_HAL_CORTEXM_STM32
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1") ? CYGHWR_HAL_CORTEXM_STM32_F1 :  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") ? CYGHWR_HAL_CORTEXM_STM32_F2 :  CYGHWR_HAL_CORTEXM_STM32_F4 
+    # option CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
+    #     ActiveIf:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4") 
+    # option CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
+    #     ActiveIf:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4") 
+    # option CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
+    #     Calculated:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4") 
+    # option CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
+    #     Calculated:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4") 
+    # option CYGHWR_HAL_CORTEXM_STM32_F1
+    #     ActiveIf:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1" 
+    # option CYGHWR_HAL_CORTEXM_STM32_F2
+    #     ActiveIf:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2" 
+    # option CYGHWR_HAL_CORTEXM_STM32_F4
+    #     ActiveIf:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4" 
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV <= 16) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") && (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == "HSI")) implies  (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 2) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV >= 2) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV >= 2) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL
+    #     Requires:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 16) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 432) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 432) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV
+    #     ActiveIf:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV
+    #     ActiveIf:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV
+    #     ActiveIf:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV
+    #     ActiveIf:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) 
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4" &&
+    #                         CYGHWR_HAL_CORTEXM_STM32_F4 == "F407VG" 
+    # option CYGNUM_DEVS_FLASH_STM32_PARALLELISM
+    #     ActiveIf:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")) 
+    # option CYGNUM_DEVS_FLASH_STM32_PARALLELISM
+    #     ActiveIf:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")) 
+};
+
+# Part belongs to ST Hi-Performance family
+# Indicates that this part conforms to the I/O
+# definitions for the Hi-Performance family of
+# devices. Currently this includes the STM32 F2 and F4
+# devices.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE {
+    # ActiveIf constraint:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4") 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #   --> 1
+
+    # Calculated value:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4") 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    # Flavor: bool
+    # Current value: 1
+};
+
+# F1 processor family selection
+# This option specifies which member of the STM32F1 family is
+# in use.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_F1 {
+    # This option is not active
+    # ActiveIf constraint:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1" 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #   --> 0
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value F103ZE
+    # value_source default
+    # Default value: F103ZE
+    # Legal values: "F103RC" "F103VC" "F103ZC"
+    #                                   "F103RD" "F103VD" "F103ZD"
+    #                                   "F103RE" "F103VE" "F103ZE"
+    #                                   "F105R8" "F105V8"
+    #                                   "F105RB" "F105VB"
+    #                                   "F105RC" "F105VC"
+    #                                   "F107RB" "F107VB"
+    #                                   "F107RC" "F107VC"
+    #                                  
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F1 
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32_F1 == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1") ? CYGHWR_HAL_CORTEXM_STM32_F1 :  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") ? CYGHWR_HAL_CORTEXM_STM32_F2 :  CYGHWR_HAL_CORTEXM_STM32_F4 
+    # option CYGHWR_HAL_CORTEXM_STM32_F1
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F1 
+};
+
+# F2 processor family selection
+# This option specifies which member of the STM32F2 family is
+# in use.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_F2 {
+    # This option is not active
+    # ActiveIf constraint:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2" 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #   --> 0
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value F207IG
+    # value_source default
+    # Default value: F207IG
+    # Legal values: "F205RB" "F205RC" "F205RE" "F205RF" "F205RG"
+    #                                   "F205VB" "F205VC" "F205VE" "F205VF" "F205VG"
+    #                                   "F205ZB" "F205ZC" "F205ZE" "F205ZF" "F205ZG"
+    #                                   "F207VB" "F207VC" "F207VE" "F207VF" "F207VG"
+    #                                   "F207ZB" "F207ZC" "F207ZE" "F207ZF" "F207ZG"
+    #                                   "F207IB" "F207IC" "F207IE" "F207IF" "F207IG"
+    #                                  
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F2 
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32_F2 == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1") ? CYGHWR_HAL_CORTEXM_STM32_F1 :  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") ? CYGHWR_HAL_CORTEXM_STM32_F2 :  CYGHWR_HAL_CORTEXM_STM32_F4 
+    # option CYGHWR_HAL_CORTEXM_STM32_F2
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F2 
+};
+
+# F4 processor family selection
+# This option specifies which member of the STM32F4 family is
+# in use.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_F4 {
+    # ActiveIf constraint:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4" 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #   --> 1
+
+    # Flavor: data
+    user_value F407VG
+    # value_source user
+    # Default value: F407IG
+    # Legal values: "F405RG" "F405VG" "F405ZG"
+    #                                   "F415RG" "F415VG" "F415ZG"
+    #                                   "F407IG" "F407VG" "F407ZG"
+    #                                   "F407IE" "F407VE" "F407ZE"
+    #                                   "F417IG" "F417VG" "F417ZG"
+    #                                   "F417IE" "F417VE" "F417ZE"
+    #                                  
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F4 
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32_F4 == F407VG
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32
+    #     DefaultValue:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1") ? CYGHWR_HAL_CORTEXM_STM32_F1 :  (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") ? CYGHWR_HAL_CORTEXM_STM32_F2 :  CYGHWR_HAL_CORTEXM_STM32_F4 
+    # option CYGHWR_HAL_CORTEXM_STM32_F4
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F4 
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4" &&
+    #                         CYGHWR_HAL_CORTEXM_STM32_F4 == "F407VG" 
+};
+
+# <
+# Part belongs to connectivity family
+# Indicates that this part belongs to the connectivity
+# family of devices. These have slightly different interrupt
+# and GPIO layouts to the original STM32 F103 devices.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY {
+    # Flavor: bool
+    user_value 1
+    # value_source user
+    # Default value:  (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+    #                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+    #                             
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32 == F407VG
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  !CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV <= 2) 
+    # option CYGHWR_HAL_STM32_SPI1_REMAP
+    #     ActiveIf: CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    # option CYGHWR_HAL_STM32_SPI3_REMAP
+    #     ActiveIf: CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+};
+
+# CPU priority levels
+# This option defines the number of bits used to
+# encode the exception priority levels that this
+# variant of the Cortex-M CPU implements.
+#
+cdl_option CYGNUM_HAL_CORTEXM_PRIORITY_LEVEL_BITS {
+    # Calculated value: 4
+    # Flavor: data
+    # Current_value: 4
+
+    # The following properties are affected by this value
+    # option CYGNUM_HAL_CORTEXM_PRIORITY_MAX
+    #     Calculated: 1<<(8-CYGNUM_HAL_CORTEXM_PRIORITY_LEVEL_BITS)
+};
+
+# Clock setup calculations
+#
+cdl_component CYGHWR_HAL_CORTEXM_STM32_CLOCK {
+    # There is no associated value.
+};
+
+# >
+# PLL input source
+# This sets whether the PLL will be driven by the external
+# high-speed clock (HSE), or internal high-speed clock (HSI).
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value HSE
+    # value_source default
+    # Default value: HSE
+    # Legal values:  "HSI" "HSE" 
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") && (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == "HSI")) implies  (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 2) 
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == "HSE" 
+};
+
+# PLL pre-divider
+# This option corresponds to the divider used before input to the PLL.
+# On non-connectivity parts, you can only divide by 2 or 1. On other
+# F1 parts, if using HSI as the clock source, then that is automatically
+# divided by 2. If using HSE as the clock source, then this value corresponds
+# to the PREDIV1 field of register RCC_CFGR2. On F2 and F4 parts, this value
+# corresponds to the PLLM field of RCC_PLLCFGR.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV {
+    # Flavor: data
+    user_value 8
+    # value_source user
+    # Default value: 1
+    # Legal values: 1 to 63
+    # Requires:  !CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV <= 2) 
+    #     CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY == 1
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 8
+    #   --> 1
+    # Requires:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV <= 16) 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 8
+    #   --> 1
+    # Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") && (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == "HSI")) implies  (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 2) 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == HSE
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 8
+    #   --> 1
+    # Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV >= 2) 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 8
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  !CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV <= 2) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV <= 16) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") && (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == "HSI")) implies  (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 2) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV >= 2) 
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 8 
+};
+
+# PLL multiplier
+# This value is used to multiply up the PLL input. On the F1 it corresponds
+# to the PLLMUL field of RCC_CFGR. On the F2 and F4 it corresponds to the PLLN
+# field of RCC_PLLCFGR.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL {
+    # Flavor: data
+    user_value 336
+    # value_source user
+    # Default value: 9
+    # Legal values: 2 to 432
+    # Requires:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 16) 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL == 336
+    #   --> 1
+    # Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 432) 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL == 336
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL
+    #     Requires:  (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 16) 
+    # option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL
+    #     Requires:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 432) 
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL == 336 
+};
+
+# SYSCLK divider
+# This value is used to divide down the PLL output for use as
+# the SYSCLK clock. This corresponds to the PLLP field of
+# RCC_PLLCFGR
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV {
+    # ActiveIf constraint:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #   --> 1
+
+    # Flavor: data
+    user_value 4
+    # value_source user
+    # Default value: 4
+    # Legal values:  2 4 6 8 
+
+    # The following properties are affected by this value
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV == 4 
+};
+
+# HCLK divider
+# Divider for AHB
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Legal values:  1 2 4 8 16 64 128 256 512 
+
+    # The following properties are affected by this value
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 1 
+};
+
+# PCLK1 divider
+# Divider for APB1
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV {
+    # Flavor: data
+    user_value 4
+    # value_source user
+    # Default value: 2
+    # Legal values:  1 2 4 8 16 
+
+    # The following properties are affected by this value
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 4 
+};
+
+# PCLK2 divider
+# Divider for APB2
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV {
+    # Flavor: data
+    user_value 2
+    # value_source user
+    # Default value: 1
+    # Legal values:  1 2 4 8 16 
+
+    # The following properties are affected by this value
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 2 
+};
+
+# PLLQ divider
+# This PLL divider is used in the F2 and F4 families to divide down the
+# PLL output clock (VCO clock) for use by the USB OTG FS, SDIO
+# and RNG peripherals. USB OTG FS requires a 48MHz clock and
+# other peripherals require a clock no greater than 48MHz.
+#
+cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV {
+    # ActiveIf constraint:  ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #   --> 1
+
+    # Flavor: data
+    user_value 7
+    # value_source user
+    # Default value: 10
+    # Legal values: 4 to 15
+
+    # The following properties are affected by this value
+    # package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY
+    #     Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV == 7 
+};
+
+# <
+# Clock interrupt ISR priority
+# Set clock ISR priority to lowest priority.
+#
+cdl_option CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY {
+    # Calculated value: 0xE0
+    # Flavor: data
+    # Current_value: 0x000000E0
+
+    # The following properties are affected by this value
+    # option CYGNUM_KERNEL_COUNTERS_CLOCK_ISR_PRIORITY
+    #     DefaultValue:  is_loaded(CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY) ?
+    #      	                      CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY : 1 
+    # option CYGNUM_KERNEL_COUNTERS_CLOCK_ISR_PRIORITY
+    #     DefaultValue:  is_loaded(CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY) ?
+    #      	                      CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY : 1 
+};
+
+# Real-time clock constants
+#
+cdl_component CYGNUM_HAL_RTC_CONSTANTS {
+    # There is no associated value.
+};
+
+# >
+# Real-time clock numerator
+#
+cdl_option CYGNUM_HAL_RTC_NUMERATOR {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 1000000000
+    # value_source default
+    # Default value: 1000000000
+};
+
+# Real-time clock denominator
+#
+cdl_option CYGNUM_HAL_RTC_DENOMINATOR {
+    # Flavor: data
+    user_value 1000
+    # value_source user
+    # Default value: 100
+
+    # The following properties are affected by this value
+    # option CYGNUM_HAL_RTC_PERIOD
+    #     DefaultValue: 1000000 / CYGNUM_HAL_RTC_DENOMINATOR
+};
+
+# Real-time clock period
+# The period defined here is something of a fake, it is expressed
+# in terms of a notional 1MHz clock. The value actually installed
+# in the hardware is calculated from the current settings of the
+# clock generation hardware.
+#
+cdl_option CYGNUM_HAL_RTC_PERIOD {
+    # Flavor: data
+    user_value 1000
+    # value_source user
+    # Default value: 1000000 / CYGNUM_HAL_RTC_DENOMINATOR
+    #     CYGNUM_HAL_RTC_DENOMINATOR == 1000
+    #   --> 1000
+};
+
+# <
+# Platform has UART0 serial port
+# The platform has a socket on UART0.
+#
+cdl_interface CYGINT_HAL_STM32_UART0 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0
+    #     DefaultValue: CYGINT_HAL_STM32_UART0>0
+};
+
+# Platform has UART1 serial port
+# The platform has a socket on UART1.
+#
+cdl_interface CYGINT_HAL_STM32_UART1 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1
+    #     DefaultValue: CYGINT_HAL_STM32_UART1>0
+};
+
+# Platform has UART2 serial port
+# The platform has a socket on UART2.
+#
+cdl_interface CYGINT_HAL_STM32_UART2 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2
+    #     DefaultValue: CYGINT_HAL_STM32_UART2>0
+};
+
+# Platform has UART3 serial port
+# The platform has a socket on UART3.
+#
+cdl_interface CYGINT_HAL_STM32_UART3 {
+    # Implemented by CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3
+    #     DefaultValue: CYGINT_HAL_STM32_UART3>0
+};
+
+# Platform has UART4 serial port
+# The platform has a socket on UART4.
+#
+cdl_interface CYGINT_HAL_STM32_UART4 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4
+    #     DefaultValue: CYGINT_HAL_STM32_UART4>0
+};
+
+# Platform has UART5 serial port
+# The platform has a socket on UART5.
+#
+cdl_interface CYGINT_HAL_STM32_UART5 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL5
+    #     DefaultValue: CYGINT_HAL_STM32_UART5>0
+};
+
+# Remap UART0 (USART1) pins
+# Remap UART0 (USART1) to alternate set of pins.
+# This will usually be set by the platform
+# HAL to reflect the configuration of the hardware.
+#
+cdl_option CYGHWR_HAL_STM32_UART0_REMAP {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Remap UART1 (USART2) pins
+# Remap UART1 (USART2) to alternate set of pins.
+# This will usually be set by the platform
+# HAL to reflect the configuration of the hardware.
+#
+cdl_option CYGHWR_HAL_STM32_UART1_REMAP {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Remap UART2 (USART3) pins
+# Remap UART2 (USART3) to alternate set of pins.
+# This will usually be set by the platform
+# HAL to reflect the configuration of the hardware.
+#
+cdl_option CYGHWR_HAL_STM32_UART2_REMAP {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value NONE
+    # value_source default
+    # Default value: NONE
+    # Legal values:  "NONE" "PARTIAL" "FULL" 
+};
+
+# Remap I2C bus 1 pins
+# Remap I2C bus 1 to alternate set of pins.
+# This will usually be set by the platform
+# HAL to reflect the configuration of the hardware.
+#
+cdl_option CYGHWR_HAL_STM32_I2C1_REMAP {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Remap SPI bus 1 pins
+# Remap SPI bus 1 to alternate set of pins.
+# This will usually be set by the platform
+# HAL to reflect the configuration of the hardware.
+#
+cdl_option CYGHWR_HAL_STM32_SPI1_REMAP {
+    # ActiveIf constraint: CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Remap SPI bus 3 pins
+# Remap SPI bus 3 to alternate set of pins.
+# This will usually be set by the platform
+# HAL to reflect the configuration of the hardware.
+# This option is only available on connectivity line
+# devices.
+#
+cdl_option CYGHWR_HAL_STM32_SPI3_REMAP {
+    # ActiveIf constraint: CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    #     CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Use TIM2 for gprof profiling
+# The STM32 variant HAL can provide support for gprof-based
+# profiling. This uses timer TIM2 to generate regular interrupts,
+# and the interrupt handler records the PC at the time of the
+# interrupt. Disable this option if you wish to provide
+# an alternative profiling timer implementation.
+#
+cdl_option CYGFUN_HAL_CORTEXM_STM32_PROFILE_TIMER {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_PROFILE_GPROF
+    #     CYGPKG_PROFILE_GPROF (unknown) == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Build options
+# Package specific build options including control over
+# compiler flags used only in building this package.
+#
+cdl_component CYGPKG_HAL_CORTEXM_STM32_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the STM32 variant HAL package. These flags are used
+# in addition to the set of global flags.
+#
+cdl_option CYGPKG_HAL_CORTEXM_STM32_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the STM32 variant HAL package. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_HAL_CORTEXM_STM32_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# <
+# STM32 tests
+# This option specifies the set of tests for the STM32 HAL.
+#
+cdl_option CYGPKG_HAL_CORTEXM_STM32_TESTS {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Calculated value:  "tests/timers" 
+    # Flavor: data
+    # Current_value: tests/timers
+};
+
+# STMicroelectronics STM32F4-Discovery board HAL
+# doc: ref/hal-cortexm-stm32f4discovery-part.html
+# The STM32F4-Discovery HAL package provides the support needed to run
+# eCos on the STMicroelectronics STM32F4-Discovery board.
+#
+cdl_package CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires:  CYGHWR_HAL_CORTEXM == "M4" 
+    #     CYGHWR_HAL_CORTEXM == M4
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4" &&
+    #                         CYGHWR_HAL_CORTEXM_STM32_F4 == "F407VG" 
+    #     CYGHWR_HAL_CORTEXM_STM32_FAMILY == F4
+    #     CYGHWR_HAL_CORTEXM_STM32_F4 == F407VG
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == "HSE" 
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == HSE
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 8 
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 8
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL == 336 
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL == 336
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV == 4 
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV == 4
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV == 7 
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV == 7
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 1 
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 1
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 4 
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 4
+    #   --> 1
+    # Requires:  CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 2 
+    #     CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 2
+    #   --> 1
+};
+
+# >
+# Startup type
+# Select 'JTAG' when building applications to download into on-chip RAM
+# using the on-board ST-LINK/V2 serial wire debugging interface. Select
+# 'ROM' when building an application which will be written to on-chip
+# Flash memory for immediate execution on system reset.
+#
+cdl_component CYG_HAL_STARTUP {
+    # Flavor: data
+    user_value ROM
+    # value_source user
+    # Default value: JTAG
+    # Legal values: "JTAG" "ROM"
+
+    # The following properties are affected by this value
+    # component CYGHWR_MEMORY_LAYOUT
+    #     Calculated:  (CYG_HAL_STARTUP == "ROM"    ) ? "cortexm_stm32f4discovery_rom"      :
+    #                             (CYG_HAL_STARTUP == "JTAG"   ) ? "cortexm_stm32f4discovery_jtag"     :
+    #                                                              "undefined" 
+    # component CYGHWR_MEMORY_LAYOUT
+    #     Calculated:  (CYG_HAL_STARTUP == "ROM"    ) ? "cortexm_stm32f4discovery_rom"      :
+    #                             (CYG_HAL_STARTUP == "JTAG"   ) ? "cortexm_stm32f4discovery_jtag"     :
+    #                                                              "undefined" 
+    # option CYGSEM_HAL_INSTALL_MMU_TABLES
+    #     DefaultValue:  CYG_HAL_STARTUP != "RAM" 
+    # component CYGDBG_HAL_DIAG_TO_DEBUG_CHAN
+    #     DefaultValue:  (CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS  || CYG_HAL_STARTUP == "RAM") ? 1 : 0
+    # option CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE
+    #     DefaultValue:  CYG_HAL_STARTUP != "RAM" || !CYGSEM_HAL_USE_ROM_MONITOR 
+};
+
+# Memory layout
+#
+cdl_component CYGHWR_MEMORY_LAYOUT {
+    # Calculated value:  (CYG_HAL_STARTUP == "ROM"    ) ? "cortexm_stm32f4discovery_rom"      :
+    #                             (CYG_HAL_STARTUP == "JTAG"   ) ? "cortexm_stm32f4discovery_jtag"     :
+    #                                                              "undefined" 
+    #     CYG_HAL_STARTUP == ROM
+    #     CYG_HAL_STARTUP == ROM
+    # Flavor: data
+    # Current_value: cortexm_stm32f4discovery_rom
+
+    # The following properties are affected by this value
+    # option CYGHWR_MEMORY_LAYOUT_LDI
+    #     Calculated:  "<pkgconf/mlt_" . CYGHWR_MEMORY_LAYOUT . ".ldi>" 
+    # option CYGHWR_MEMORY_LAYOUT_H
+    #     Calculated:  "<pkgconf/mlt_" . CYGHWR_MEMORY_LAYOUT . ".h>" 
+};
+
+# >
+# Memory layout linker script fragment
+#
+cdl_option CYGHWR_MEMORY_LAYOUT_LDI {
+    # Calculated value:  "<pkgconf/mlt_" . CYGHWR_MEMORY_LAYOUT . ".ldi>" 
+    #     CYGHWR_MEMORY_LAYOUT == cortexm_stm32f4discovery_rom
+    # Flavor: data
+    # Current_value: <pkgconf/mlt_cortexm_stm32f4discovery_rom.ldi>
+};
+
+# Memory layout header file
+#
+cdl_option CYGHWR_MEMORY_LAYOUT_H {
+    # Calculated value:  "<pkgconf/mlt_" . CYGHWR_MEMORY_LAYOUT . ".h>" 
+    #     CYGHWR_MEMORY_LAYOUT == cortexm_stm32f4discovery_rom
+    # Flavor: data
+    # Current_value: <pkgconf/mlt_cortexm_stm32f4discovery_rom.h>
+};
+
+# <
+# Input clock frequency
+# Main clock input.
+#
+cdl_option CYGARC_HAL_CORTEXM_STM32_INPUT_CLOCK {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 8000000
+    # value_source default
+    # Default value: 8000000
+    # Legal values: 0 to 1000000000
+};
+
+# Flash read wait states
+# This option gives the number of wait states to use for accessing
+# the flash for reads. The correct setting for this value depends
+# on both the CPU clock (HCLK) frequency and the voltage. Consult
+# the STM32 Flash programming manual (PM0059) for appropriate
+# values for different clock speeds or voltages. The default of
+# 5 reflects a supply voltage of 3.3V and HCLK of 168MHz.
+#
+cdl_option CYGNUM_HAL_CORTEXM_STM32_FLASH_WAIT_STATES {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 5
+    # value_source default
+    # Default value: 5
+    # Legal values: 0 to 7
+};
+
+# Number of communication channels on the board
+#
+cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS {
+    # Calculated value: 1
+    # Flavor: data
+    # Current_value: 1
+};
+
+# Debug serial port
+# The STM32F4-Discovery board has one serial port enabled. This option
+# informs the rest of the system which port will be used to connect
+# to a host running GDB.
+#
+cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL {
+    # ActiveIf constraint: CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE
+    #     CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE == 1
+    #   --> 1
+
+    # Calculated value: 0
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Diagnostic serial port
+# The STM32F4-Discovery board has one serial port enabled. This option
+# informs the rest of the system which port will be used for
+# diagnostic output.
+#
+cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL {
+    # ActiveIf constraint: CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE
+    #     CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE == 1
+    #   --> 1
+
+    # Calculated value: 0
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Diagnostic serial port baud rate
+# This option controls the default baud rate used for the
+# console connection.
+#
+cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 115200
+    # value_source default
+    # Default value: 115200
+    # Legal values: 9600 19200 38400 57600 115200
+
+    # The following properties are affected by this value
+    # option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_BAUD
+    #     Calculated: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    # option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL0_BAUD
+    #     DefaultValue:  CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD 
+    # option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL1_BAUD
+    #     DefaultValue: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    # option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL2_BAUD
+    #     DefaultValue: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    # option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL3_BAUD
+    #     DefaultValue: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    # option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL4_BAUD
+    #     DefaultValue: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    # option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL5_BAUD
+    #     DefaultValue: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+};
+
+# Debug serial port baud rate
+# This option controls the default baud rate used for the
+# GDB connection.
+#
+cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_BAUD {
+    # Calculated value: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    #     CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD == 115200
+    # Flavor: data
+    # Current_value: 115200
+};
+
+# STM32F4-Discovery HAL build options
+# Package specific build options including control over
+# compiler flags used only in building this HAL package.
+#
+cdl_component CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags
+# for building this HAL. These flags are used
+# in addition to the set of global flags.
+#
+cdl_option CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value -Werror
+    # value_source default
+    # Default value: -Werror
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags
+# for building this HAL. These flags are
+# removed from the set of global flags if
+# present.
+#
+cdl_option CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# <
+# STM32F4-Discovery tests
+# This option specifies the set of tests for the STM32F4-Discovery HAL.
+#
+cdl_option CYGPKG_HAL_CORTEXM_STM32_STM32F4DISCOVERY_TESTS {
+    # Calculated value:  "tests/gpio" 
+    # Flavor: data
+    # Current_value: tests/gpio
+};
+
+# <
+# <
+# <
+# <
+# I/O sub-system
+# doc: ref/io.html
+# The eCos system is supplied with a number of different
+# device drivers.  This option enables the basic I/O system
+# support which is the basis for all drivers.
+#
+cdl_package CYGPKG_IO {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_ERROR
+    #     CYGPKG_ERROR == current
+    #   --> 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_IO_SERIAL
+    #     ActiveIf: CYGPKG_IO
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGPKG_IO
+};
+
+# >
+# Debug I/O sub-system
+# This option enables verbose messages to be displayed on the
+# system 'diag' device during I/O system initialization.
+#
+cdl_option CYGDBG_IO_INIT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Basic support for file based I/O
+# This option control support for simple file I/O primitives. It is only
+# present if the FILEIO package is not included.
+#
+cdl_component CYGPKG_IO_FILE_SUPPORT {
+    # ActiveIf constraint: !CYGPKG_IO_FILEIO
+    #     CYGPKG_IO_FILEIO (unknown) == 0
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# Number of open files
+# This option controls the number of open files.
+#
+cdl_option CYGPKG_IO_NFILE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 16
+    # value_source default
+    # Default value: 16
+};
+
+# <
+# Serial device drivers
+# doc: ref/io.html
+# This option enables drivers for basic I/O services on
+# serial devices.
+#
+cdl_package CYGPKG_IO_SERIAL {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # ActiveIf constraint: CYGPKG_IO
+    #     CYGPKG_IO == current
+    #   --> 1
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_ERROR
+    #     CYGPKG_ERROR == current
+    #   --> 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_IO_SERIAL_CORTEXM_STM32
+    #     ActiveIf: CYGPKG_IO_SERIAL
+};
+
+# >
+# Support non-blocking read and write calls
+# This option enables extra code in the generic serial driver
+# which allows clients to switch read() and write() call
+# semantics from blocking to non-blocking.
+#
+cdl_option CYGOPT_IO_SERIAL_SUPPORT_NONBLOCKING {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Driver requires block transfer callback functions
+# Some low-level drivers can be optimized to transfer blocks
+# of data instead of a single character at a time. These usually
+# rely on a hardware FIFO of some sort.
+#
+cdl_interface CYGINT_IO_SERIAL_BLOCK_TRANSFER {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Serial driver supports line status
+#
+cdl_interface CYGINT_IO_SERIAL_LINE_STATUS_HW {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # option CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
+    #     Requires:  CYGINT_IO_SERIAL_LINE_STATUS_HW > 0 
+    # option CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
+    #     DefaultValue:  0 != CYGINT_IO_SERIAL_LINE_STATUS_HW 
+};
+
+# Support line status callbacks
+# This option indicates that if the serial driver supports it,
+# serial line status and modem status information should be
+# propagated to higher layers via callbacks.
+#
+cdl_option CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  0 != CYGINT_IO_SERIAL_LINE_STATUS_HW 
+    #     CYGINT_IO_SERIAL_LINE_STATUS_HW == 0
+    #   --> 0
+    # Requires:  CYGINT_IO_SERIAL_LINE_STATUS_HW > 0 
+    #     CYGINT_IO_SERIAL_LINE_STATUS_HW == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGOPT_IO_SERIAL_FLOW_CONTROL_HW
+    #     Requires: CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
+    # option CYGOPT_IO_SERIAL_FLOW_CONTROL_HW
+    #     DefaultValue:  CYGINT_IO_SERIAL_FLOW_CONTROL_HW > 0 ?  CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS : 0 
+};
+
+# Flow control
+# This component contains options related to flow control.
+#
+cdl_component CYGPKG_IO_SERIAL_FLOW_CONTROL {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: (CYGOPT_IO_SERIAL_FLOW_CONTROL_SOFTWARE || CYGOPT_IO_SERIAL_FLOW_CONTROL_HW)
+    #     CYGOPT_IO_SERIAL_FLOW_CONTROL_SOFTWARE == 0
+    #     CYGOPT_IO_SERIAL_FLOW_CONTROL_HW == 0
+    #   --> 0
+};
+
+# >
+# Software flow control
+# This component enables support of software flow control.
+#
+cdl_component CYGOPT_IO_SERIAL_FLOW_CONTROL_SOFTWARE {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_FLOW_CONTROL is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_FLOW_CONTROL
+    #     Requires: (CYGOPT_IO_SERIAL_FLOW_CONTROL_SOFTWARE || CYGOPT_IO_SERIAL_FLOW_CONTROL_HW)
+};
+
+# >
+# Start character
+# This option specifies the ascii character used to
+# indicate that transmission should start.
+#
+cdl_option CYGDAT_IO_SERIAL_FLOW_CONTROL_XON_CHAR {
+    # This option is not active
+    # The parent CYGOPT_IO_SERIAL_FLOW_CONTROL_SOFTWARE is not active
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 17
+    # value_source default
+    # Default value: 17
+    # Legal values: 0 to 255
+};
+
+# Stop character
+# This option specifies the ascii character used to
+# indicate that transmission should stop.
+#
+cdl_option CYGDAT_IO_SERIAL_FLOW_CONTROL_XOFF_CHAR {
+    # This option is not active
+    # The parent CYGOPT_IO_SERIAL_FLOW_CONTROL_SOFTWARE is not active
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 19
+    # value_source default
+    # Default value: 19
+    # Legal values: 0 to 255
+};
+
+# <
+# Hardware flow control
+# If the hardware supports it, this option allows hardware
+# flow control to be enabled. This may be in the form of
+# either or both of RTS/CTS, or DSR/DTR flow control.
+#
+cdl_option CYGOPT_IO_SERIAL_FLOW_CONTROL_HW {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_FLOW_CONTROL is disabled
+    # ActiveIf constraint:  CYGINT_IO_SERIAL_FLOW_CONTROL_HW > 0 
+    #     CYGINT_IO_SERIAL_FLOW_CONTROL_HW == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  CYGINT_IO_SERIAL_FLOW_CONTROL_HW > 0 ?  CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS : 0 
+    #     CYGINT_IO_SERIAL_FLOW_CONTROL_HW == 0
+    #     CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS == 0
+    #   --> 0
+    # Requires:  CYGINT_IO_SERIAL_FLOW_CONTROL_HW > 0 
+    #     CYGINT_IO_SERIAL_FLOW_CONTROL_HW == 0
+    #   --> 0
+    # Requires: CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
+    #     CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_FLOW_CONTROL
+    #     Requires: (CYGOPT_IO_SERIAL_FLOW_CONTROL_SOFTWARE || CYGOPT_IO_SERIAL_FLOW_CONTROL_HW)
+};
+
+# Serial h/w supports hardware flow control
+#
+cdl_interface CYGINT_IO_SERIAL_FLOW_CONTROL_HW {
+    # No options implement this inferface
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_FLOW_CONTROL is disabled
+
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # option CYGOPT_IO_SERIAL_FLOW_CONTROL_HW
+    #     ActiveIf:  CYGINT_IO_SERIAL_FLOW_CONTROL_HW > 0 
+    # option CYGOPT_IO_SERIAL_FLOW_CONTROL_HW
+    #     Requires:  CYGINT_IO_SERIAL_FLOW_CONTROL_HW > 0 
+    # option CYGOPT_IO_SERIAL_FLOW_CONTROL_HW
+    #     DefaultValue:  CYGINT_IO_SERIAL_FLOW_CONTROL_HW > 0 ?  CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS : 0 
+};
+
+# Default flow control method
+# This option allows a default flow control method
+# to be defined. Combinations of flow control methods
+# may also be set, but this is only possible by
+# using the cyg_io_set_config() API in source code.
+#
+cdl_option CYGDAT_IO_SERIAL_FLOW_CONTROL_DEFAULT {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_FLOW_CONTROL is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value NONE
+    # value_source default
+    # Default value: NONE
+    # Legal values:  "NONE" "XONXOFF" "RTSCTS" "DSRDTR" 
+};
+
+# Rx flow control low water mark
+# This sets the water mark used for determining
+# when to disable flow control, expressed
+# as a percentage of the buffer size. When the
+# receive buffer size is lower than this percentage,
+# if the transmitter had previously been throttled, it
+# will now be informed it can restart.
+#
+cdl_option CYGNUM_IO_SERIAL_FLOW_CONTROL_LOW_WATER_PERCENT {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_FLOW_CONTROL is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 33
+    # value_source default
+    # Default value: 33
+    # Legal values: 1 to 100
+
+    # The following properties are affected by this value
+    # option CYGNUM_IO_SERIAL_FLOW_CONTROL_HIGH_WATER_PERCENT
+    #     Requires:  CYGNUM_IO_SERIAL_FLOW_CONTROL_HIGH_WATER_PERCENT >=  CYGNUM_IO_SERIAL_FLOW_CONTROL_LOW_WATER_PERCENT 
+};
+
+# Rx flow control high water mark
+# This sets the water mark used for determining
+# when to enable flow control, expressed
+# as a percentage of the buffer size. When the
+# receive buffer size exceeds this percentage,
+# signals are sent to the transmitter to tell it
+# to throttle tranmission.
+#
+cdl_option CYGNUM_IO_SERIAL_FLOW_CONTROL_HIGH_WATER_PERCENT {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_FLOW_CONTROL is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 66
+    # value_source default
+    # Default value: 66
+    # Legal values: 1 to 100
+    # Requires:  CYGNUM_IO_SERIAL_FLOW_CONTROL_HIGH_WATER_PERCENT >=  CYGNUM_IO_SERIAL_FLOW_CONTROL_LOW_WATER_PERCENT 
+    #     CYGNUM_IO_SERIAL_FLOW_CONTROL_HIGH_WATER_PERCENT == 0
+    #     CYGNUM_IO_SERIAL_FLOW_CONTROL_LOW_WATER_PERCENT == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGNUM_IO_SERIAL_FLOW_CONTROL_HIGH_WATER_PERCENT
+    #     Requires:  CYGNUM_IO_SERIAL_FLOW_CONTROL_HIGH_WATER_PERCENT >=  CYGNUM_IO_SERIAL_FLOW_CONTROL_LOW_WATER_PERCENT 
+};
+
+# <
+# TTY-mode serial device drivers
+# This option enables a simple terminal-like device driver 
+# that can be used for serial devices that interact with humans,
+# such as a system console.
+#
+cdl_component CYGPKG_IO_SERIAL_TTY {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# HAL/diag serial device driver
+# This option enables the use of the HAL diagnostic channel
+# via the standard I/O drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_HALDIAG {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  (CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE == "\"/dev/ttydiag\"" ?  CYGPKG_IO_SERIAL_HALDIAG : 1) 
+};
+
+# Console device name
+# This option selects the TTY device to use for the console.
+#
+cdl_option CYGDAT_IO_SERIAL_TTY_CONSOLE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ttydiag\""
+    # value_source default
+    # Default value: "\"/dev/ttydiag\""
+
+    # The following properties are affected by this value
+    # option CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE
+    #     DefaultValue:  CYGDAT_IO_SERIAL_TTY_CONSOLE ? CYGDAT_IO_SERIAL_TTY_CONSOLE : "\"/dev/null\"" 
+    # option CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE
+    #     DefaultValue:  CYGDAT_IO_SERIAL_TTY_CONSOLE ? CYGDAT_IO_SERIAL_TTY_CONSOLE : "\"/dev/null\"" 
+};
+
+# TTY mode HAL/diag channel
+# This option causes '/dev/ttydiag' to be included in the standard
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TTY_TTYDIAG {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# TTY mode channel #0
+# This option causes '/dev/tty0' to be included in the standard 
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TTY_TTY0 {
+    # Flavor: bool
+    user_value 1
+    # value_source user
+    # Default value: 0
+};
+
+# >
+# TTY mode channel #0 device
+# This option selects the physical device to use for 
+# '/dev/tty0'.
+#
+cdl_option CYGDAT_IO_SERIAL_TTY_TTY0_DEV {
+    # Flavor: data
+    user_value "\"/dev/ser1\""
+    # value_source user
+    # Default value: "\"/dev/ser0\""
+};
+
+# <
+# TTY mode channel #1
+# This option causes '/dev/tty1' to be included in the standard 
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TTY_TTY1 {
+    # Flavor: bool
+    user_value 1
+    # value_source user
+    # Default value: 0
+};
+
+# >
+# TTY mode channel #1 device
+# This option selects the physical device to use for 
+# '/dev/tty1'.
+#
+cdl_option CYGDAT_IO_SERIAL_TTY_TTY1_DEV {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser1\""
+    # value_source default
+    # Default value: "\"/dev/ser1\""
+};
+
+# <
+# TTY mode channel #2
+# This option causes '/dev/tty2' to be included in the standard 
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TTY_TTY2 {
+    # Flavor: bool
+    user_value 1
+    # value_source user
+    # Default value: 0
+};
+
+# >
+# TTY mode channel #2 device
+# This option selects the physical device to use for 
+# '/dev/tty2'.
+#
+cdl_option CYGDAT_IO_SERIAL_TTY_TTY2_DEV {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser2\""
+    # value_source default
+    # Default value: "\"/dev/ser2\""
+};
+
+# <
+# TTY mode channel #3
+# This option causes '/dev/tty3' to be included in the standard 
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TTY_TTY3 {
+    # Flavor: bool
+    user_value 1
+    # value_source user
+    # Default value: 0
+};
+
+# >
+# TTY mode channel #3 device
+# This option selects the physical device to use for 
+# '/dev/tty3'.
+#
+cdl_option CYGDAT_IO_SERIAL_TTY_TTY3_DEV {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser3\""
+    # value_source default
+    # Default value: "\"/dev/ser3\""
+};
+
+# <
+# <
+# Termios compatible TTY drivers
+# This option enables terminal drivers compatible with
+# POSIX termios.
+#
+cdl_component CYGPKG_IO_SERIAL_TERMIOS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  0 != CYGPKG_ISOINFRA && 0 != CYGPKG_IO_FILEIO &&  0 != CYGINT_ISO_ERRNO_CODES &&  0 != CYGINT_ISO_ERRNO 
+    #     CYGPKG_ISOINFRA == current
+    #     CYGPKG_IO_FILEIO (unknown) == 0
+    #     CYGINT_ISO_ERRNO_CODES == 1
+    #     CYGINT_ISO_ERRNO == 1
+    #   --> 0
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+    # Requires: CYGPKG_IO_FILEIO
+    #     CYGPKG_IO_FILEIO (unknown) == 0
+    #   --> 0
+    # Requires: CYGINT_ISO_ERRNO_CODES
+    #     CYGINT_ISO_ERRNO_CODES == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_ERRNO
+    #     CYGINT_ISO_ERRNO == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_MALLOC
+    #     CYGINT_ISO_MALLOC == 1
+    #   --> 1
+};
+
+# >
+# Interface for termios tty driver file enabling
+#
+cdl_interface CYGINT_IO_SERIAL_TERMIOS_TERMIOS_TTY {
+    # Implemented by CYGPKG_IO_SERIAL_TERMIOS_TERMIOS0, inactive, disabled
+    # Implemented by CYGPKG_IO_SERIAL_TERMIOS_TERMIOS1, inactive, disabled
+    # Implemented by CYGPKG_IO_SERIAL_TERMIOS_TERMIOS2, inactive, disabled
+    # Implemented by CYGPKG_IO_SERIAL_TERMIOS_TERMIOS3, inactive, disabled
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS is disabled
+
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # option CYGBLD_IO_SERIAL_TERMIOS_TERMIOS_TTY
+    #     ActiveIf:  CYGINT_IO_SERIAL_TERMIOS_TERMIOS_TTY > 0 
+};
+
+# Build termios tty driver file
+#
+cdl_option CYGBLD_IO_SERIAL_TERMIOS_TERMIOS_TTY {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS is disabled
+    # ActiveIf constraint:  CYGINT_IO_SERIAL_TERMIOS_TERMIOS_TTY > 0 
+    #     CYGINT_IO_SERIAL_TERMIOS_TERMIOS_TTY == 0
+    #   --> 0
+
+    # Calculated value: 1
+    # Flavor: bool
+    # Current value: 1
+};
+
+# Termios TTY channel #0
+# This option causes '/dev/termios0' to be included in the standard 
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TERMIOS_TERMIOS0 {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# >
+# Termios TTY channel #0 device
+# This option selects the physical device to use for 
+# '/dev/termios0'.
+#
+cdl_option CYGDAT_IO_SERIAL_TERMIOS_TERMIOS0_DEV {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS_TERMIOS0 is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS_TERMIOS0 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser0\""
+    # value_source default
+    # Default value: "\"/dev/ser0\""
+};
+
+# <
+# Termios TTY channel #1
+# This option causes '/dev/termios1' to be included in the standard 
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TERMIOS_TERMIOS1 {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# >
+# Termios TTY channel #1 device
+# This option selects the physical device to use for 
+# '/dev/termios1'.
+#
+cdl_option CYGDAT_IO_SERIAL_TERMIOS_TERMIOS1_DEV {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS_TERMIOS1 is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS_TERMIOS1 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser1\""
+    # value_source default
+    # Default value: "\"/dev/ser1\""
+};
+
+# <
+# Termios TTY channel #2
+# This option causes '/dev/termios2' to be included in the standard 
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TERMIOS_TERMIOS2 {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# >
+# Termios TTY channel #2 device
+# This option selects the physical device to use for 
+# '/dev/termios2'.
+#
+cdl_option CYGDAT_IO_SERIAL_TERMIOS_TERMIOS2_DEV {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS_TERMIOS2 is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS_TERMIOS2 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser2\""
+    # value_source default
+    # Default value: "\"/dev/ser2\""
+};
+
+# <
+# Termios TTY channel #3
+# This option causes '/dev/termios3' to be included in the standard 
+# drivers.
+#
+cdl_component CYGPKG_IO_SERIAL_TERMIOS_TERMIOS3 {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# >
+# Termios TTY channel #3 device
+# This option selects the physical device to use for 
+# '/dev/termios3'.
+#
+cdl_option CYGDAT_IO_SERIAL_TERMIOS_TERMIOS3_DEV {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS_TERMIOS3 is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS_TERMIOS3 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser3\""
+    # value_source default
+    # Default value: "\"/dev/ser3\""
+};
+
+# <
+# Support signals
+# This option selects whether those parts of the termios
+# interface involving signals is supported. This includes
+# BRKINT mode, the INTR and QUIT characters, and whether
+# SIGHUP is sent on terminal close.
+#
+cdl_option CYGSEM_IO_SERIAL_TERMIOS_USE_SIGNALS {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_TERMIOS is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYGINT_ISO_SIGNAL_NUMBERS != 0 &&  CYGINT_ISO_SIGNAL_IMPL != 0 
+    #     CYGINT_ISO_SIGNAL_NUMBERS == 1
+    #     CYGINT_ISO_SIGNAL_IMPL == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_SIGNAL_NUMBERS
+    #     CYGINT_ISO_SIGNAL_NUMBERS == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_SIGNAL_IMPL
+    #     CYGINT_ISO_SIGNAL_IMPL == 1
+    #   --> 1
+};
+
+# <
+# Hardware serial device drivers
+# This option enables the hardware device drivers
+# for the current platform.
+#
+cdl_component CYGPKG_IO_SERIAL_DEVICES {
+    # Flavor: bool
+    user_value 1
+    # value_source user
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGPKG_IO_SERIAL_TESTS
+    #     Calculated:  CYGPKG_IO_SERIAL_DEVICES ? "tests/serial1 tests/serial2 tests/serial3 tests/serial4 tests/serial5 tests/tty1 tests/tty2 tests/flow1 tests/flow2" : "" 
+};
+
+# >
+# ST STM32 serial device drivers
+# This option enables the serial device drivers for the
+# ST STM32.
+#
+cdl_package CYGPKG_IO_SERIAL_CORTEXM_STM32 {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # ActiveIf constraint: CYGPKG_IO_SERIAL
+    #     CYGPKG_IO_SERIAL == current
+    #   --> 1
+    # ActiveIf constraint: CYGPKG_HAL_CORTEXM_STM32
+    #     CYGPKG_HAL_CORTEXM_STM32 == current
+    #   --> 1
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_ERROR
+    #     CYGPKG_ERROR == current
+    #   --> 1
+};
+
+# >
+# ST STM32 serial port 0 driver
+# This option includes the serial device driver for the ST STM32 
+# port 0.
+#
+cdl_component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 {
+    # Flavor: bool
+    user_value 1
+    # value_source user
+    # Default value: CYGINT_HAL_STM32_UART0>0
+    #     CYGINT_HAL_STM32_UART0 == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+    # option CYGPRI_SER_TEST_TTY_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? "\"/dev/tty0\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? "\"/dev/tty1\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? "\"/dev/tty2\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? "\"/dev/tty3\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? "\"/dev/tty4\"" :  "\"/dev/tty5\"" 
+};
+
+# >
+# Device name for ST STM32 serial port 0 driver
+# This option specifies the name of the serial device for the 
+# ST STM32 port 0.
+#
+cdl_option CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser0\""
+    # value_source default
+    # Default value: "\"/dev/ser0\""
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+};
+
+# Baud rate for the ST STM32 serial port 0 driver
+# This option specifies the default baud rate (speed) for the 
+# ST STM32 port 0.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL0_BAUD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 115200
+    # value_source default
+    # Default value:  CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD 
+    #     CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD == 115200
+    #   --> 115200
+    # Legal values:  50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600
+    #                           4800 7200 9600 14400 19200 38400 57600 115200 230400
+    #             
+};
+
+# Buffer size for the ST STM32 serial port 0 driver
+# This option specifies the size of the internal buffers used 
+# for the ST STM32 port 0.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL0_BUFSIZE {
+    # Flavor: data
+    user_value 0
+    # value_source user
+    # Default value: 128
+    # Legal values: 0 to 8192
+};
+
+# Interrupt priority for STM32 serial port 0
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL0_INT_PRI {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 128
+    # value_source default
+    # Default value: 128
+    # Legal values: 0 to 255
+};
+
+# <
+# ST STM32 serial port 1 driver
+# This option includes the serial device driver for the ST STM32 
+# port 1.
+#
+cdl_component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 {
+    # Flavor: bool
+    user_value 1
+    # value_source user
+    # Default value: CYGINT_HAL_STM32_UART1>0
+    #     CYGINT_HAL_STM32_UART1 == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+    # option CYGPRI_SER_TEST_TTY_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? "\"/dev/tty0\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? "\"/dev/tty1\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? "\"/dev/tty2\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? "\"/dev/tty3\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? "\"/dev/tty4\"" :  "\"/dev/tty5\"" 
+};
+
+# >
+# Device name for ST STM32 serial port 1 driver
+# This option specifies the name of the serial device for the 
+# ST STM32 port 1.
+#
+cdl_option CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser1\""
+    # value_source default
+    # Default value: "\"/dev/ser1\""
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+};
+
+# Baud rate for the ST STM32 serial port 1 driver
+# This option specifies the default baud rate (speed) for the
+# ST STM32 port 1.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL1_BAUD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 115200
+    # value_source default
+    # Default value: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    #     CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD == 115200
+    #   --> 115200
+    # Legal values:  50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600
+    #                           4800 7200 9600 14400 19200 38400 57600 115200 230400
+    #             
+};
+
+# Buffer size for the ST STM32 serial port 1 driver
+# This option specifies the size of the internal buffers used 
+# for the ST STM32 port 1.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL1_BUFSIZE {
+    # Flavor: data
+    user_value 0
+    # value_source user
+    # Default value: 128
+    # Legal values: 0 to 8192
+};
+
+# Interrupt priority for STM32 serial port 1
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL1_INT_PRI {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 128
+    # value_source default
+    # Default value: 128
+    # Legal values: 0 to 255
+};
+
+# <
+# ST STM32 serial port 2 driver
+# This option includes the serial device driver for the ST STM32 
+# port 2.
+#
+cdl_component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 {
+    # Flavor: bool
+    user_value 0
+    # value_source user
+    # Default value: CYGINT_HAL_STM32_UART2>0
+    #     CYGINT_HAL_STM32_UART2 == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+    # option CYGPRI_SER_TEST_TTY_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? "\"/dev/tty0\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? "\"/dev/tty1\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? "\"/dev/tty2\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? "\"/dev/tty3\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? "\"/dev/tty4\"" :  "\"/dev/tty5\"" 
+};
+
+# >
+# Device name for ST STM32 serial port 2 driver
+# This option specifies the name of the serial device for the 
+# ST STM32 port 2.
+#
+cdl_option CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser2\""
+    # value_source default
+    # Default value: "\"/dev/ser2\""
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+};
+
+# Baud rate for the ST STM32 serial port 2 driver
+# This option specifies the default baud rate (speed) for the
+# ST STM32 port 2.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL2_BAUD {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 115200
+    # value_source default
+    # Default value: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    #     CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD == 115200
+    #   --> 115200
+    # Legal values:  50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600
+    #                           4800 7200 9600 14400 19200 38400 57600 115200 230400
+    #             
+};
+
+# Buffer size for the ST STM32 serial port 2 driver
+# This option specifies the size of the internal buffers used 
+# for the ST STM32 port 2.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL2_BUFSIZE {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 is disabled
+
+    # Flavor: data
+    user_value 0
+    # value_source user
+    # Default value: 128
+    # Legal values: 0 to 8192
+};
+
+# Interrupt priority for STM32 serial port 2
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL2_INT_PRI {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 128
+    # value_source default
+    # Default value: 128
+    # Legal values: 0 to 255
+};
+
+# <
+# ST STM32 serial port 3 driver
+# This option includes the serial device driver for the ST STM32 
+# port 3.
+#
+cdl_component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 {
+    # Flavor: bool
+    user_value 0
+    # value_source user
+    # Default value: CYGINT_HAL_STM32_UART3>0
+    #     CYGINT_HAL_STM32_UART3 == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+    # option CYGPRI_SER_TEST_TTY_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? "\"/dev/tty0\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? "\"/dev/tty1\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? "\"/dev/tty2\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? "\"/dev/tty3\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? "\"/dev/tty4\"" :  "\"/dev/tty5\"" 
+};
+
+# >
+# Device name for ST STM32 serial port 3 driver
+# This option specifies the name of the serial device for the 
+# ST STM32 port 3.
+#
+cdl_option CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser3\""
+    # value_source default
+    # Default value: "\"/dev/ser3\""
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+};
+
+# Baud rate for the ST STM32 serial port 3 driver
+# This option specifies the default baud rate (speed) for the
+# ST STM32 port 3.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL3_BAUD {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 115200
+    # value_source default
+    # Default value: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    #     CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD == 115200
+    #   --> 115200
+    # Legal values:  50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600
+    #                           4800 7200 9600 14400 19200 38400 57600 115200 230400
+    #             
+};
+
+# Buffer size for the ST STM32 serial port 3 driver
+# This option specifies the size of the internal buffers used 
+# for the ST STM32 port 3.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL3_BUFSIZE {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 is disabled
+
+    # Flavor: data
+    user_value 0
+    # value_source user
+    # Default value: 128
+    # Legal values: 0 to 8192
+};
+
+# Interrupt priority for STM32 serial port 3
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL3_INT_PRI {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 128
+    # value_source default
+    # Default value: 128
+    # Legal values: 0 to 255
+};
+
+# <
+# ST STM32 serial port 4 driver
+# This option includes the serial device driver for the ST STM32 
+# port 4.
+#
+cdl_component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 {
+    # Flavor: bool
+    user_value 0
+    # value_source user
+    # Default value: CYGINT_HAL_STM32_UART4>0
+    #     CYGINT_HAL_STM32_UART4 == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+    # option CYGPRI_SER_TEST_TTY_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? "\"/dev/tty0\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? "\"/dev/tty1\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? "\"/dev/tty2\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? "\"/dev/tty3\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? "\"/dev/tty4\"" :  "\"/dev/tty5\"" 
+};
+
+# >
+# Device name for ST STM32 serial port 4 driver
+# This option specifies the name of the serial device for the 
+# ST STM32 port 4.
+#
+cdl_option CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser4\""
+    # value_source default
+    # Default value: "\"/dev/ser4\""
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+};
+
+# Baud rate for the ST STM32 serial port 4 driver
+# This option specifies the default baud rate (speed) for the
+# ST STM32 port 4.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL4_BAUD {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 115200
+    # value_source default
+    # Default value: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    #     CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD == 115200
+    #   --> 115200
+    # Legal values:  50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600
+    #                           4800 7200 9600 14400 19200 38400 57600 115200 230400
+    #             
+};
+
+# Buffer size for the ST STM32 serial port 4 driver
+# This option specifies the size of the internal buffers used 
+# for the ST STM32 port 4.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL4_BUFSIZE {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 is disabled
+
+    # Flavor: data
+    user_value 128
+    # value_source user
+    # Default value: 128
+    # Legal values: 0 to 8192
+};
+
+# Interrupt priority for STM32 serial port 4
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL4_INT_PRI {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 128
+    # value_source default
+    # Default value: 128
+    # Legal values: 0 to 255
+};
+
+# <
+# ST STM32 serial port 5 driver
+# This option includes the serial device driver for the ST STM32 
+# port 5.
+#
+cdl_component CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL5 {
+    # Flavor: bool
+    user_value 0
+    # value_source user
+    # Default value: CYGINT_HAL_STM32_UART5>0
+    #     CYGINT_HAL_STM32_UART5 == 0
+    #   --> 0
+};
+
+# >
+# Device name for ST STM32 serial port 5 driver
+# This option specifies the name of the serial device for the 
+# ST STM32 port 5.
+#
+cdl_option CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL5 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser5\""
+    # value_source default
+    # Default value: "\"/dev/ser5\""
+
+    # The following properties are affected by this value
+    # option CYGPRI_SER_TEST_SER_DEV
+    #     DefaultValue:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+};
+
+# Baud rate for the ST STM32 serial port 5 driver
+# This option specifies the default baud rate (speed) for the
+# ST STM32 port 5.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL5_BAUD {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL5 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 115200
+    # value_source default
+    # Default value: CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
+    #     CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD == 115200
+    #   --> 115200
+    # Legal values:  50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600
+    #                           4800 7200 9600 14400 19200 38400 57600 115200 230400
+    #             
+};
+
+# Buffer size for the ST STM32 serial port 5 driver
+# This option specifies the size of the internal buffers used 
+# for the ST STM32 port 5.
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL5_BUFSIZE {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL5 is disabled
+
+    # Flavor: data
+    user_value 0
+    # value_source user
+    # Default value: 128
+    # Legal values: 0 to 8192
+};
+
+# Interrupt priority for STM32 serial port 5
+#
+cdl_option CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL5_INT_PRI {
+    # This option is not active
+    # The parent CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL5 is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 128
+    # value_source default
+    # Default value: 128
+    # Legal values: 0 to 255
+};
+
+# <
+# Serial device driver build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_IO_SERIAL_CORTEXM_STM32_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building these serial device drivers. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_IO_SERIAL_CORTEXM_STM32_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building these serial device drivers. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_IO_SERIAL_CORTEXM_STM32_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# <
+# Testing parameters
+#
+cdl_component CYGPKG_IO_SERIAL_CORTEXM_STM32_TESTING {
+    # There is no associated value.
+};
+
+# >
+# Serial device used for testing
+#
+cdl_option CYGPRI_SER_TEST_SER_DEV {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/ser0\""
+    # value_source default
+    # Default value:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME :  CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME 
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 == 1
+    #     CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL0_NAME == "\"/dev/ser0\""
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 == 1
+    #     CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL1_NAME == "\"/dev/ser1\""
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 == 0
+    #     CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL2_NAME == 0
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 == 0
+    #     CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL3_NAME == 0
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 == 0
+    #     CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL4_NAME == 0
+    #     CYGDAT_IO_SERIAL_CORTEXM_STM32_SERIAL5_NAME == 0
+    #   --> "\"/dev/ser0\""
+};
+
+# TTY-mode serial device used for testing
+#
+cdl_option CYGPRI_SER_TEST_TTY_DEV {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "\"/dev/tty0\""
+    # value_source default
+    # Default value:  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 ? "\"/dev/tty0\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 ? "\"/dev/tty1\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 ? "\"/dev/tty2\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 ? "\"/dev/tty3\"" :  CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 ? "\"/dev/tty4\"" :  "\"/dev/tty5\"" 
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL0 == 1
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL1 == 1
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL2 == 0
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL3 == 0
+    #     CYGPKG_IO_SERIAL_CORTEXM_STM32_SERIAL4 == 0
+    #   --> "\"/dev/tty0\""
+};
+
+# <
+# <
+# <
+# Build extra serial tests
+# This option enables the building of some extra tests which
+# can be used when testing / debugging serial drivers. These
+# are not built by default since they do not use the dedicated
+# testing infrastructure.
+#
+cdl_option CYGBLD_IO_SERIAL_EXTRA_TESTS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Serial device driver build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_IO_SERIAL_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the serial device drivers. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_IO_SERIAL_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the serial device drivers. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_IO_SERIAL_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Serial device driver tests
+# This option specifies the set of tests for the serial device drivers.
+#
+cdl_option CYGPKG_IO_SERIAL_TESTS {
+    # Calculated value:  CYGPKG_IO_SERIAL_DEVICES ? "tests/serial1 tests/serial2 tests/serial3 tests/serial4 tests/serial5 tests/tty1 tests/tty2 tests/flow1 tests/flow2" : "" 
+    #     CYGPKG_IO_SERIAL_DEVICES == 1
+    # Flavor: data
+    # Current_value: tests/serial1 tests/serial2 tests/serial3 tests/serial4 tests/serial5 tests/tty1 tests/tty2 tests/flow1 tests/flow2
+};
+
+# <
+# Enable serial device select support
+# This option enables support for the select() API function on all
+# serial devices.
+#
+cdl_option CYGPKG_IO_SERIAL_SELECT_SUPPORT {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_IO_FILEIO
+    #     CYGPKG_IO_FILEIO (unknown) == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGFUN_IO_FILEIO_SELECT == 1 
+    #     CYGFUN_IO_FILEIO_SELECT (unknown) == 0
+    #   --> 0
+};
+
+# Serial testing specification
+#
+cdl_component CYGPKG_IO_SERIAL_TEST_SPECS {
+    # Calculated value: 1
+    # Flavor: bool
+    # Current value: 1
+};
+
+# >
+# Skip 9600 baud testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_9600 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Skip 14400 baud testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_14400 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Skip 19200 baud testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_19200 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Skip 38400 baud testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_38400 {
+    # Implemented by CYGPKG_IO_SERIAL_CORTEXM_STM32_TESTING, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+};
+
+# Skip 57600 baud testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_57600 {
+    # Implemented by CYGPKG_IO_SERIAL_CORTEXM_STM32_TESTING, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+};
+
+# Skip 115200 baud testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_115200 {
+    # Implemented by CYGPKG_IO_SERIAL_CORTEXM_STM32_TESTING, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+};
+
+# Skip even-parity testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_PARITY_EVEN {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Skip odd-parity testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_PARITY_ODD {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Skip 2-stop bit testing
+#
+cdl_interface CYGINT_IO_SERIAL_TEST_SKIP_STOP_2 {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+};
+
+# <
+# <
+# <
+# Infrastructure
+# Common types and useful macros.
+# Tracing and assertion facilities.
+# Package startup options.
+#
+cdl_package CYGPKG_INFRA {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+
+    # The following properties are affected by this value
+    # package CYGPKG_HAL
+    #     Requires: CYGPKG_INFRA
+};
+
+# >
+# Asserts & Tracing
+# The eCos source code contains a significant amount of
+# internal debugging support, in the form of assertions and
+# tracing.
+# Assertions check at runtime that various conditions are as
+# expected; if not, execution is halted.
+# Tracing takes the form of text messages that are output
+# whenever certain events occur, or whenever functions are
+# called or return.
+# The most important property of these checks and messages is
+# that they are not required for the program to run.
+# It is prudent to develop software with assertions enabled,
+# but disable them when making a product release, thus
+# removing the overhead of that checking.
+# It is possible to enable assertions and tracing
+# independently.
+# There are also options controlling the exact behaviour of
+# the assertion and tracing facilities, thus giving users
+# finer control over the code and data size requirements.
+#
+cdl_component CYGPKG_INFRA_DEBUG {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGNUM_INFRA_EMPTY_DELETE_THRESHOLD
+    #     ActiveIf: CYGPKG_INFRA_DEBUG
+    # component CYGFUN_KERNEL_THREADS_STACK_CHECKING
+    #     ActiveIf: CYGPKG_INFRA_DEBUG
+    # component CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT
+    #     DefaultValue:  0 != CYGPKG_INFRA_DEBUG 
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+};
+
+# >
+# Use asserts
+# If this option is defined, asserts in the code are tested.
+# Assert functions (CYG_ASSERT()) are defined in
+# 'include/cyg/infra/cyg_ass.h' within the 'install' tree.
+# If it is not defined, these result in no additional
+# object code and no checking of the asserted conditions.
+#
+cdl_component CYGDBG_USE_ASSERTS {
+    # This option is not active
+    # The parent CYGPKG_INFRA_DEBUG is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  1 == CYGINT_INFRA_DEBUG_TRACE_IMPL 
+    #     CYGINT_INFRA_DEBUG_TRACE_IMPL == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # component CYGFUN_KERNEL_THREADS_STACK_CHECKING
+    #     ActiveIf: CYGDBG_USE_ASSERTS
+    # option CYGDBG_MEMALLOC_ALLOCATOR_DLMALLOC_DEBUG
+    #     Requires: CYGDBG_USE_ASSERTS
+    # option CYGDBG_MEMALLOC_ALLOCATOR_DLMALLOC_DEBUG
+    #     DefaultValue:  0 != CYGDBG_USE_ASSERTS 
+    # option CYGSEM_LIBC_SIGNALS_BAD_SIGNAL_FATAL
+    #     Requires: CYGDBG_USE_ASSERTS
+};
+
+# >
+# Preconditions
+# This option allows individual control of preconditions.
+# A precondition is one type of assert, which it is
+# useful to control separately from more general asserts.
+# The function is CYG_PRECONDITION(condition,msg).
+#
+cdl_option CYGDBG_INFRA_DEBUG_PRECONDITIONS {
+    # This option is not active
+    # The parent CYGDBG_USE_ASSERTS is not active
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Postconditions
+# This option allows individual control of postconditions.
+# A postcondition is one type of assert, which it is
+# useful to control separately from more general asserts.
+# The function is CYG_POSTCONDITION(condition,msg).
+#
+cdl_option CYGDBG_INFRA_DEBUG_POSTCONDITIONS {
+    # This option is not active
+    # The parent CYGDBG_USE_ASSERTS is not active
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Loop invariants
+# This option allows individual control of loop invariants.
+# A loop invariant is one type of assert, which it is
+# useful to control separately from more general asserts,
+# particularly since a loop invariant is typically evaluated
+# a great many times when used correctly.
+# The function is CYG_LOOP_INVARIANT(condition,msg).
+#
+cdl_option CYGDBG_INFRA_DEBUG_LOOP_INVARIANTS {
+    # This option is not active
+    # The parent CYGDBG_USE_ASSERTS is not active
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Use assert text
+# All assertions within eCos contain a text message
+# which should give some information about the condition
+# being tested.
+# These text messages will end up being embedded in the
+# application image and hence there is a significant penalty
+# in terms of image size.
+# It is possible to suppress the use of these messages by
+# disabling this option.
+# This results in smaller code size, but there is less
+# human-readable information if an assertion actually gets
+# triggered.
+#
+cdl_option CYGDBG_INFRA_DEBUG_ASSERT_MESSAGE {
+    # This option is not active
+    # The parent CYGDBG_USE_ASSERTS is not active
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Use tracing
+# If this option is defined, tracing operations
+# result in output or logging, depending on other options.
+# This may have adverse effects on performance, if the time
+# taken to output message overwhelms the available CPU
+# power or output bandwidth.
+# Trace functions (CYG_TRACE()) are defined in
+# 'include/cyg/infra/cyg_trac.h' within the 'install' tree.
+# If it is not defined, these result in no additional
+# object code and no trace information.
+#
+cdl_component CYGDBG_USE_TRACING {
+    # This option is not active
+    # The parent CYGPKG_INFRA_DEBUG is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires:  1 == CYGINT_INFRA_DEBUG_TRACE_IMPL 
+    #     CYGINT_INFRA_DEBUG_TRACE_IMPL == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_SIZE
+    #     ActiveIf: CYGDBG_USE_TRACING
+    # option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_WRAP
+    #     ActiveIf: CYGDBG_USE_TRACING
+    # option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_HALT
+    #     ActiveIf: CYGDBG_USE_TRACING
+    # option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_PRINT
+    #     ActiveIf: CYGDBG_USE_TRACING
+    # option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_PRINT_ON_ASSERT
+    #     ActiveIf: CYGDBG_USE_TRACING
+    # option CYGDBG_KERNEL_TRACE_TIMESLICE
+    #     ActiveIf: CYGDBG_USE_TRACING
+    # component CYGPKG_LIBM_TRACE
+    #     Requires: CYGDBG_USE_TRACING
+};
+
+# >
+# Trace function reports
+# This option allows individual control of
+# function entry/exit tracing, independent of
+# more general tracing output.
+# This may be useful to remove clutter from a
+# trace log.
+#
+cdl_option CYGDBG_INFRA_DEBUG_FUNCTION_REPORTS {
+    # This option is not active
+    # The parent CYGDBG_USE_TRACING is not active
+    # The parent CYGDBG_USE_TRACING is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Use trace text
+# All trace calls within eCos contain a text message
+# which should give some information about the circumstances.
+# These text messages will end up being embedded in the
+# application image and hence there is a significant penalty
+# in terms of image size.
+# It is possible to suppress the use of these messages by
+# disabling this option.
+# This results in smaller code size, but there is less
+# human-readable information available in the trace output,
+# possibly only filenames and line numbers.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_MESSAGE {
+    # This option is not active
+    # The parent CYGDBG_USE_TRACING is not active
+    # The parent CYGDBG_USE_TRACING is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Trace output implementations
+#
+cdl_interface CYGINT_INFRA_DEBUG_TRACE_IMPL {
+    # Implemented by CYGDBG_INFRA_DEBUG_TRACE_ASSERT_NULL, inactive, disabled
+    # Implemented by CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE, inactive, disabled
+    # Implemented by CYGDBG_INFRA_DEBUG_TRACE_ASSERT_FANCY, inactive, disabled
+    # Implemented by CYGDBG_INFRA_DEBUG_TRACE_ASSERT_BUFFER, inactive, enabled
+    # This option is not active
+    # The parent CYGPKG_INFRA_DEBUG is disabled
+
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # component CYGDBG_USE_ASSERTS
+    #     Requires:  1 == CYGINT_INFRA_DEBUG_TRACE_IMPL 
+    # component CYGDBG_USE_TRACING
+    #     Requires:  1 == CYGINT_INFRA_DEBUG_TRACE_IMPL 
+};
+
+# Null output
+# A null output module which is useful when
+# debugging interactively; the output routines
+# can be breakpointed rather than have them actually
+# 'print' something.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_ASSERT_NULL {
+    # This option is not active
+    # The parent CYGPKG_INFRA_DEBUG is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Simple output
+# An output module which produces simple output
+# from tracing and assertion events.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE {
+    # This option is not active
+    # The parent CYGPKG_INFRA_DEBUG is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGDBG_KERNEL_TRACE_TIMESLICE
+    #     Requires: !CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE
+};
+
+# Fancy output
+# An output module which produces fancy output
+# from tracing and assertion events.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_ASSERT_FANCY {
+    # This option is not active
+    # The parent CYGPKG_INFRA_DEBUG is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGDBG_KERNEL_TRACE_TIMESLICE
+    #     Requires: !CYGDBG_INFRA_DEBUG_TRACE_ASSERT_FANCY
+};
+
+# Buffered tracing
+# An output module which buffers output
+# from tracing and assertion events. The stored
+# messages are output when an assert fires, or
+# CYG_TRACE_PRINT() (defined in <cyg/infra/cyg_trac.h>)
+# is called.
+# Of course, there will only be stored messages
+# if tracing per se (CYGDBG_USE_TRACING)
+# is enabled above.
+#
+cdl_component CYGDBG_INFRA_DEBUG_TRACE_ASSERT_BUFFER {
+    # This option is not active
+    # The parent CYGPKG_INFRA_DEBUG is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# Trace buffer size
+# The size of the trace buffer. This counts the number
+# of trace records stored. When the buffer fills it
+# either wraps, stops recording, or generates output.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_SIZE {
+    # This option is not active
+    # The parent CYGDBG_INFRA_DEBUG_TRACE_ASSERT_BUFFER is not active
+    # ActiveIf constraint: CYGDBG_USE_TRACING
+    #     CYGDBG_USE_TRACING == 0
+    #   --> 0
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 32
+    # value_source default
+    # Default value: 32
+    # Legal values: 5 to 65535
+};
+
+# Wrap trace buffer when full
+# When the trace buffer has filled with records it
+# starts again at the beginning. Hence only the last
+# CYGDBG_INFRA_DEBUG_TRACE_BUFFER_SIZE messages will
+# be recorded.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_WRAP {
+    # This option is not active
+    # The parent CYGDBG_INFRA_DEBUG_TRACE_ASSERT_BUFFER is not active
+    # ActiveIf constraint: CYGDBG_USE_TRACING
+    #     CYGDBG_USE_TRACING == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Halt trace buffer when full
+# When the trace buffer has filled with records it
+# stops recording. Hence only the first
+# CYGDBG_INFRA_DEBUG_TRACE_BUFFER_SIZE messages will
+# be recorded.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_HALT {
+    # This option is not active
+    # The parent CYGDBG_INFRA_DEBUG_TRACE_ASSERT_BUFFER is not active
+    # ActiveIf constraint: CYGDBG_USE_TRACING
+    #     CYGDBG_USE_TRACING == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Print trace buffer when full
+# When the trace buffer has filled with records it
+# prints the contents of the buffer. The buffer is then
+# emptied and the system continues.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_PRINT {
+    # This option is not active
+    # The parent CYGDBG_INFRA_DEBUG_TRACE_ASSERT_BUFFER is not active
+    # ActiveIf constraint: CYGDBG_USE_TRACING
+    #     CYGDBG_USE_TRACING == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Print trace buffer on assert fail
+# When an assertion fails the trace buffer will be 
+# printed to the default diagnostic device.
+#
+cdl_option CYGDBG_INFRA_DEBUG_TRACE_BUFFER_PRINT_ON_ASSERT {
+    # This option is not active
+    # The parent CYGDBG_INFRA_DEBUG_TRACE_ASSERT_BUFFER is not active
+    # ActiveIf constraint: CYGDBG_USE_TRACING
+    #     CYGDBG_USE_TRACING == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Use function names
+# All trace and assert calls within eCos contain a
+# reference to the builtin macro '__PRETTY_FUNCTION__',
+# which evaluates to a string containing
+# the name of the current function.
+# This is useful when reading a trace log.
+# It is possible to suppress the use of the function name
+# by disabling this option.
+# This results in smaller code size, but there is less
+# human-readable information available in the trace output,
+# possibly only filenames and line numbers.
+#
+cdl_option CYGDBG_INFRA_DEBUG_FUNCTION_PSEUDOMACRO {
+    # This option is not active
+    # The parent CYGPKG_INFRA_DEBUG is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Startup options
+# Some packages require a startup routine to be called.
+# This can be carried out by application code, by supplying
+# a routine called cyg_package_start() which calls the
+# appropriate package startup routine(s).
+# Alternatively, this routine can be constructed automatically
+# and configured to call the startup routines of your choice.
+#
+cdl_component CYGPKG_INFRA_STARTUP {
+    # There is no associated value.
+};
+
+# >
+# Start uITRON subsystem
+# Generate a call to initialize the
+# uITRON compatibility subsystem
+# within the system version of cyg_package_start().
+# This enables compatibility with uITRON.
+# You must configure uITRON with the correct tasks before
+# starting the uItron subsystem.
+# If this is disabled, and you want to use uITRON,
+# you must call cyg_uitron_start() from your own
+# cyg_package_start() or cyg_userstart().
+#
+cdl_option CYGSEM_START_UITRON_COMPATIBILITY {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_UITRON
+    #     CYGPKG_UITRON (unknown) == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGPKG_UITRON
+    #     CYGPKG_UITRON (unknown) == 0
+    #   --> 0
+};
+
+# <
+# Smaller slower memcpy()
+# Enabling this option causes the implementation of
+# the standard memcpy() routine to reduce code
+# size at the expense of execution speed. This
+# option is automatically enabled with the use of
+# the -Os option to the compiler. Also note that
+# the compiler will try to use its own builtin
+# version of memcpy() if possible, ignoring the
+# implementation in this package, unless given
+# the -fno-builtin compiler option.
+#
+cdl_option CYGIMP_INFRA_PREFER_SMALL_TO_FAST_MEMCPY {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Smaller slower memset()
+# Enabling this option causes the implementation of
+# the standard memset() routine to reduce code
+# size at the expense of execution speed. This
+# option is automatically enabled with the use of
+# the -Os option to the compiler. Also note that
+# the compiler will try to use its own builtin
+# version of memset() if possible, ignoring the
+# implementation in this package, unless given
+# the -fno-builtin compiler option.
+#
+cdl_option CYGIMP_INFRA_PREFER_SMALL_TO_FAST_MEMSET {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Provide empty C++ delete functions
+# To deal with virtual destructors, where the correct delete()
+# function must be called for the derived class in question, the
+# underlying delete is called when needed, from destructors.  This
+# is regardless of whether the destructor is called by delete itself.
+# So there is a reference to delete() from all destructors.  The
+# default builtin delete() attempts to call free() if there is
+# one defined.  So, if you have destructors, and you have free(),
+# as in malloc() and free(), any destructor counts as a reference
+# to free().  So the dynamic memory allocation code is linked
+# in regardless of whether it gets explicitly called. This
+# increases code and data size needlessly.
+# To defeat this undesirable behaviour, we define empty versions
+# of delete and delete[].  But doing this prevents proper use
+# of dynamic memory in C++ programs via C++'s new and delete
+# operators.
+# Therefore, this option is provided
+# for explicitly disabling the provision of these empty functions,
+# so that new and delete can be used, if that is what is required.
+#
+cdl_option CYGFUN_INFRA_EMPTY_DELETE_FUNCTIONS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Threshold for valid number of delete calls
+# Some users don't know about the empty delete function and then
+# wonder why their C++ classes are leaking memory. If
+# INFRA_DEBUG is enabled we keep a counter for the number of
+# times delete is called. If it goes above this threshold we throw
+# an assertion failure. This should point heavy users of
+# delete in the right direction without upsetting those who want
+# an empty delete function. 
+#
+cdl_option CYGNUM_INFRA_EMPTY_DELETE_THRESHOLD {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_INFRA_DEBUG
+    #     CYGPKG_INFRA_DEBUG == 0
+    #   --> 0
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 100
+    # value_source default
+    # Default value: 100
+};
+
+# Provide dummy abort() function
+# This option controls the inclusion of a dummy abort() function.
+# Parts of the C and C++ compiler runtime systems contain references
+# to abort(), particulary in the C++ exception handling code. It is
+# not possible to eliminate these references, so this dummy function
+# in included to satisfy them. It is not expected that this function
+# will ever be called, so its current behaviour is to simply loop.
+#
+cdl_option CYGFUN_INFRA_DUMMY_ABORT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  CYGINT_ISO_EXIT == 0 
+    #     CYGINT_ISO_EXIT == 1
+    #   --> 0
+    # Requires: !CYGINT_ISO_EXIT
+    #     CYGINT_ISO_EXIT == 1
+    #   --> 0
+};
+
+# Reset platform at end of test case execution
+# If this option is set then test case programs will reset the platform
+# when they terminate, as opposed to the default which is to just hang
+# in a loop.
+#
+cdl_option CYGSEM_INFRA_RESET_ON_TEST_EXIT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Provide dummy strlen() function
+# This option controls the inclusion of a dummy strlen() function.
+# Parts of the C and C++ compiler runtime systems contain references
+# to strlen(), particulary in the C++ exception handling code. It is
+# not possible to eliminate these references, so this dummy function
+# in included to satisfy them. While it is not expected that this function
+# will ever be called, it is functional but uses the simplest, smallest
+# algorithm. There is a faster version of strlen() in the C library.
+#
+cdl_option CYGFUN_INFRA_DUMMY_STRLEN {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  CYGINT_ISO_STRING_STRFUNCS == 0 
+    #     CYGINT_ISO_STRING_STRFUNCS == 1
+    #   --> 0
+    # Requires: !CYGINT_ISO_STRING_STRFUNCS
+    #     CYGINT_ISO_STRING_STRFUNCS == 1
+    #   --> 0
+};
+
+# Make all compiler warnings show as errors
+# Enabling this option will cause all compiler warnings to show
+# as errors and bring the library build to a halt. This is used
+# to ensure that the code base is warning free, and thus ensure
+# that newly introduced warnings stand out and get fixed before
+# they show up as weird run-time behavior.
+#
+cdl_option CYGBLD_INFRA_CFLAGS_WARNINGS_AS_ERRORS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires:  is_substr(CYGBLD_GLOBAL_CFLAGS, " -Werror") 
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #   --> 0
+};
+
+# Make compiler and assembler communicate by pipe
+# Enabling this option will cause the compiler to feed the
+# assembly output the the assembler via a pipe instead of
+# via a temporary file. This normally reduces the build
+# time.
+#
+cdl_option CYGBLD_INFRA_CFLAGS_PIPE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires:  is_substr(CYGBLD_GLOBAL_CFLAGS, " -pipe") 
+    #     CYGBLD_GLOBAL_CFLAGS == "-Wall -Wpointer-arith -Wstrict-prototypes -Wundef -Woverloaded-virtual -Wno-write-strings -mcpu=cortex-m4 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions"
+    #   --> 0
+};
+
+# Infra build options
+# Package specific build options including control over
+# compiler flags used only in building this package.
+#
+cdl_component CYGPKG_INFRA_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the eCos infra package. These flags are used
+# in addition to the set of global flags.
+#
+cdl_option CYGPKG_INFRA_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the eCos infra package. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_INFRA_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed linker flags
+# This option modifies the set of linker flags for
+# building the eCos infra package tests. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_INFRA_LDFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value -Wl,--gc-sections
+    # value_source default
+    # Default value: -Wl,--gc-sections
+};
+
+# Additional linker flags
+# This option modifies the set of linker flags for
+# building the eCos infra package tests. These flags are added to
+# the set of global flags if present.
+#
+cdl_option CYGPKG_INFRA_LDFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value -Wl,--fatal-warnings
+    # value_source default
+    # Default value: -Wl,--fatal-warnings
+};
+
+# Infra package tests
+#
+cdl_component CYGPKG_INFRA_TESTS {
+    # Calculated value:  "tests/cxxsupp tests/diag_sprintf1 tests/diag_sprintf2" 
+    # Flavor: data
+    # Current_value: tests/cxxsupp tests/diag_sprintf1 tests/diag_sprintf2
+};
+
+# >
+# Number of times a test runs
+# This option controls the number of times tests will execute their
+# basic function.  Not all tests will honor this setting, but those
+# that do will execute the test N times before terminating.  A value
+# less than 0 indicates to run forever.
+#
+cdl_option CYGNUM_TESTS_RUN_COUNT {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# <
+# <
+# eCos kernel
+# doc: ref/kernel.html
+# This package contains the core functionality of the eCos
+# kernel. It relies on functionality provided by various HAL
+# packages and by the eCos infrastructure. In turn the eCos
+# kernel provides support for other packages such as the device
+# drivers and the uITRON compatibility layer.
+#
+cdl_package CYGPKG_KERNEL {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+
+    # The following properties are affected by this value
+    # option CYGFUN_HAL_COMMON_KERNEL_SUPPORT
+    #     Requires: CYGPKG_KERNEL
+    # option CYGFUN_HAL_COMMON_KERNEL_SUPPORT
+    #     DefaultValue: CYGPKG_KERNEL
+    # option CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE
+    #     DefaultValue:  CYGPKG_KERNEL ? 4096 : 32768 
+    # option CYGSEM_MEMALLOC_ALLOCATOR_FIXED_THREADAWARE
+    #     ActiveIf: CYGPKG_KERNEL
+    # option CYGSEM_MEMALLOC_ALLOCATOR_VARIABLE_THREADAWARE
+    #     ActiveIf: CYGPKG_KERNEL
+    # option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_THREADAWARE
+    #     ActiveIf: CYGPKG_KERNEL
+    # option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_THREADAWARE
+    #     Requires: CYGPKG_KERNEL
+    # option CYGSEM_MEMALLOC_ALLOCATOR_SEPMETA_THREADAWARE
+    #     ActiveIf: CYGPKG_KERNEL
+    # option CYGFUN_MEMALLOC_KAPI
+    #     ActiveIf: CYGPKG_KERNEL
+    # option CYGSEM_LIBC_I18N_PER_THREAD_MB
+    #     ActiveIf: CYGPKG_KERNEL
+    # option CYGSEM_LIBC_SIGNALS_THREAD_SAFE
+    #     Requires: CYGPKG_KERNEL
+    # option CYGSEM_LIBC_STARTUP_MAIN_INITCONTEXT
+    #     DefaultValue:  0 == CYGPKG_KERNEL && 0 == 
+    #                                 CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE 
+    # component CYGSEM_LIBC_STARTUP_MAIN_THREAD
+    #     Requires: CYGPKG_KERNEL
+    # component CYGSEM_LIBC_STARTUP_MAIN_THREAD
+    #     DefaultValue:  0 != CYGPKG_KERNEL && 0 ==  CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE 
+    # option CYGSEM_LIBC_EXIT_STOPS_SYSTEM
+    #     Requires: CYGPKG_KERNEL
+    # option CYGSEM_LIBC_STDIO_THREAD_SAFE_STREAMS
+    #     ActiveIf: CYGPKG_KERNEL
+    # option CYGSEM_LIBC_STRING_PER_THREAD_STRTOK
+    #     ActiveIf: CYGPKG_KERNEL
+    # option CYGPKG_WALLCLOCK_EMULATE
+    #     Requires: CYGPKG_KERNEL
+    # option CYGIMP_WALLCLOCK_NONE
+    #     DefaultValue:  !CYGPKG_KERNEL && 0 == CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS 
+    # option CYGPKG_IO_WALLCLOCK_TESTS
+    #     Calculated:  CYGPKG_KERNEL ? "tests/wallclock tests/wallclock2" : "" 
+    # option CYGHWR_HAL_CORTEXM_FPU_SWITCH
+    #     Requires:  is_active (CYGPKG_KERNEL) implies
+    #                         CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ==
+    #                         (CYGHWR_HAL_CORTEXM_FPU_SWITCH == "NONE") 
+    # option CYGPKG_HAL_CORTEXM_STM32_TESTS
+    #     ActiveIf: CYGPKG_KERNEL
+};
+
+# >
+# Kernel interrupt handling
+# doc: ref/kernel-interrupts.html
+# The majority of configuration options related to interrupt
+# handling are in the HAL packages, since usually the code has
+# to be platform-specific. There are a number of options
+# provided within the kernel related to slightly higher-level
+# concepts, for example Delayed Service Routines.
+#
+cdl_component CYGPKG_KERNEL_INTERRUPTS {
+    # There is no associated value.
+
+    # The following properties are affected by this value
+    # option CYGDBG_KERNEL_INSTRUMENT_INTR
+    #     ActiveIf: CYGPKG_KERNEL_INTERRUPTS
+};
+
+# >
+# Use delayed service routines (DSRs)
+# In eCos the recommended way to handle device interrupts is to
+# do a minimum amount of work inside the low level interrupt
+# handler itself, and instead do as much as possible in a
+# Delayed Service Routine or DSR. If an application does not
+# make use of DSRs directly or indirectly then it is possible
+# to disable the DSR support completely, which reduces the
+# overheads of context switches and interrupt handling. Note
+# that the kernel real-time clock makes use of DSRs, as do many
+# of the device drivers. 
+#
+cdl_component CYGIMP_KERNEL_INTERRUPTS_DSRS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     Requires: CYGIMP_KERNEL_INTERRUPTS_DSRS
+};
+
+# >
+#
+cdl_interface CYGINT_KERNEL_INTERRUPTS_DSRS {
+    # Implemented by CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST, active, enabled
+    # Implemented by CYGIMP_KERNEL_INTERRUPTS_DSRS_TABLE, active, disabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires: 1 == CYGINT_KERNEL_INTERRUPTS_DSRS
+    #     CYGINT_KERNEL_INTERRUPTS_DSRS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_KERNEL_INTERRUPTS_DSRS
+    #     Requires: 1 == CYGINT_KERNEL_INTERRUPTS_DSRS
+};
+
+# Use linked lists for DSRs
+# When DSR support is enabled the kernel must keep track of all
+# the DSRs that are pending. This information can be kept in a
+# fixed-size table or in a linked list. The list implementation
+# requires that the kernel disable interrupts for a very short
+# period of time outside interrupt handlers, but there is no
+# possibility of a table overflow occurring.
+#
+cdl_component CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# Schedule DSRs in FIFO order
+# When this option is set, DSRs are scheduled
+# in the natural FIFO (first in, first out) order,
+# otherwise they are scheduled in LIFO (last in, first
+# out) order. Applications should not rely on any
+# particular order of scheduling of DSRs. LIFO
+# scheduling is kept for backward compatibility only and
+# is not recommended as it may lead to high (up to 2
+# times higher then FIFO) IRQ-to-DSR latencies at some
+# (typically rare) conditions. If unsure, leave this set.
+#
+cdl_option CYGSEM_KERNEL_INTERRUPTS_DSRS_LIST_FIFO {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Use fixed-size table for DSRs
+# When DSR support is enabled the kernel must keep track of all
+# the DSRs that are pending. This information can be kept in a
+# fixed-size table or in a linked list. The table
+# implementation involves a very small risk of overflow at
+# run-time if a given interrupt source is able to have more
+# than one pending DSR. However it has the advantage that
+# the kernel does not need to disable interrupts outside
+# interrupt handlers.
+#
+cdl_component CYGIMP_KERNEL_INTERRUPTS_DSRS_TABLE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# >
+# Number of entries in fixed-size DSR table
+# When DSR support is enabled the kernel must keep track of all
+# the DSRs that are pending. One approach involves a fixed-size
+# table, which involves a very small risk of overflow at
+# run-time. By increasing the table size it is possible to reduce
+# this risk.
+#
+cdl_option CYGNUM_KERNEL_INTERRUPTS_DSRS_TABLE_SIZE {
+    # This option is not active
+    # The parent CYGIMP_KERNEL_INTERRUPTS_DSRS_TABLE is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 32
+    # value_source default
+    # Default value: 32
+    # Legal values: 2 to 1024
+};
+
+# <
+# Chain all interrupts together
+# Interrupts can be attached to vectors either singly, or be
+# chained together. The latter is necessary if there is no way
+# of discovering which device has interrupted without
+# inspecting the device itself. It can also reduce the amount
+# of RAM needed for interrupt decoding tables and code.
+#
+cdl_option CYGIMP_KERNEL_INTERRUPTS_CHAIN {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
+    #     CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN == 0
+    #   --> 0
+};
+
+# <
+# <
+# Exception handling
+# doc: ref/kernel-exceptions.html
+# In the context of the eCos kernel exceptions are unexpected
+# events detected by the hardware, for example an attempt to
+# execute an illegal instruction. There is no relation with
+# other forms of exception, for example the catch and throw
+# facilities of languages like C++. It is possible to disable
+# all support for exceptions and thus save some memory.
+#
+cdl_component CYGPKG_KERNEL_EXCEPTIONS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGPKG_HAL_EXCEPTIONS
+    #     CYGPKG_HAL_EXCEPTIONS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGPKG_HAL_EXCEPTIONS
+    #     Requires: CYGPKG_KERNEL_EXCEPTIONS
+    # option CYGPKG_HAL_EXCEPTIONS
+    #     DefaultValue: CYGPKG_KERNEL_EXCEPTIONS
+};
+
+# >
+# Decode exception types in kernel
+# On targets where several different types of exception are
+# possible, for example executing an illegal instruction and
+# division by zero, it is possible for the kernel to do some
+# decoding of the exception type and deliver the different
+# types of exception to different handlers in the application
+# code. Alternatively the kernel can simply pass all
+# exceptions directly to application code, leaving the
+# decoding to be done by the application
+#
+cdl_option CYGSEM_KERNEL_EXCEPTIONS_DECODE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # component CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS
+    #     Requires: CYGSEM_KERNEL_EXCEPTIONS_DECODE
+};
+
+# Use global exception handlers
+# In the context of the eCos kernel exceptions are
+# unexpected events detected by the hardware, for
+# example an attempt to execute an illegal
+# instruction. If the kernel is configured
+# to support exceptions then two implementations are
+# possible. The default implementation involves a single set
+# of exception handlers that are in use for the entire
+# system. The alternative implementation allows different
+# exception handlers to be specified for each thread.
+#
+cdl_option CYGSEM_KERNEL_EXCEPTIONS_GLOBAL {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # component CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS
+    #     Requires: CYGSEM_KERNEL_EXCEPTIONS_GLOBAL
+};
+
+# <
+# Kernel schedulers
+# doc: ref/kernel-overview.html#KERNEL-OVERVIEW-SCHEDULERS
+# The eCos kernel provides a choice of schedulers. In addition
+# there are a number of configuration options to control the
+# detailed behaviour of these schedulers.
+#
+cdl_component CYGPKG_KERNEL_SCHED {
+    # There is no associated value.
+
+    # The following properties are affected by this value
+    # option CYGDBG_KERNEL_INSTRUMENT_SCHED
+    #     ActiveIf: CYGPKG_KERNEL_SCHED
+};
+
+# >
+# Number of schedulers in this configuration
+#
+cdl_interface CYGINT_KERNEL_SCHEDULER {
+    # Implemented by CYGSEM_KERNEL_SCHED_MLQUEUE, active, enabled
+    # Implemented by CYGSEM_KERNEL_SCHED_BITMAP, active, disabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires: 1 == CYGINT_KERNEL_SCHEDULER
+    #     CYGINT_KERNEL_SCHEDULER == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_KERNEL_SCHEDULER
+    #     Requires: 1 == CYGINT_KERNEL_SCHEDULER
+};
+
+# Non-zero if the active schedule only has unique priorities
+# Not all schedulers allow mutiple threads to use the same
+# priority. That property is signalled via this option, allowing
+# scheduler and tests to behave accordingly.
+#
+cdl_interface CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES {
+    # Implemented by CYGSEM_KERNEL_SCHED_BITMAP, active, disabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # component CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL
+    #     Requires:  CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES == 0 
+};
+
+# Multi-level queue scheduler
+# The multi-level queue scheduler supports multiple priority
+# levels and multiple threads at each priority level.
+# Preemption between priority levels is automatic. Timeslicing
+# within a given priority level is controlled by a separate
+# configuration option.
+#
+cdl_component CYGSEM_KERNEL_SCHED_MLQUEUE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGPRI_KERNEL_SCHED_IMPL_HXX
+    #     Calculated:   CYGSEM_KERNEL_SCHED_BITMAP  ? "<cyg/kernel/bitmap.hxx>"  : CYGSEM_KERNEL_SCHED_MLQUEUE ? "<cyg/kernel/mlqueue.hxx>" : CYGSEM_KERNEL_SCHED_LOTTERY ? "<cyg/kernel/lottery.hxx>" : "!!!-- Configuration broken - no scheduler selected --!!!"
+    # component CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL
+    #     ActiveIf:  CYGSEM_KERNEL_SCHED_MLQUEUE 
+    # option CYGDBG_KERNEL_INSTRUMENT_MLQ
+    #     ActiveIf: CYGSEM_KERNEL_SCHED_MLQUEUE
+};
+
+# >
+# Output timeslices when tracing
+# When tracing is enabled, output trace messages every
+# timeslice. This can be quite verbose so is disabled by
+# default.
+#
+cdl_option CYGDBG_KERNEL_TRACE_TIMESLICE {
+    # This option is not active
+    # ActiveIf constraint: CYGDBG_USE_TRACING
+    #     CYGDBG_USE_TRACING == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: !CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE
+    #     CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE == 0
+    #   --> 1
+    # Requires: !CYGDBG_INFRA_DEBUG_TRACE_ASSERT_FANCY
+    #     CYGDBG_INFRA_DEBUG_TRACE_ASSERT_FANCY == 0
+    #   --> 1
+};
+
+# <
+# Bitmap scheduler
+# The bitmap scheduler supports multiple priority levels but
+# only one thread can exist at each priority level. This means
+# that scheduling decisions are very simple and hence the
+# scheduler is efficient. Preemption between priority levels is
+# automatic. Timeslicing within a given priority level is
+# irrelevant since there can be only one thread at each
+# priority level.
+#
+cdl_option CYGSEM_KERNEL_SCHED_BITMAP {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: !CYGPKG_KERNEL_SMP_SUPPORT
+    #     CYGPKG_KERNEL_SMP_SUPPORT == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGPRI_KERNEL_SCHED_IMPL_HXX
+    #     Calculated:   CYGSEM_KERNEL_SCHED_BITMAP  ? "<cyg/kernel/bitmap.hxx>"  : CYGSEM_KERNEL_SCHED_MLQUEUE ? "<cyg/kernel/mlqueue.hxx>" : CYGSEM_KERNEL_SCHED_LOTTERY ? "<cyg/kernel/lottery.hxx>" : "!!!-- Configuration broken - no scheduler selected --!!!"
+    # component CYGSEM_KERNEL_SCHED_TIMESLICE
+    #     Requires: !CYGSEM_KERNEL_SCHED_BITMAP
+    # option CYGDBG_KERNEL_INSTRUMENT_BITMAP
+    #     ActiveIf: CYGSEM_KERNEL_SCHED_BITMAP
+};
+
+# Scheduler header file
+# This option sets a preprocessor symbol which names the header
+# file for the selected scheduler.  It is used internally by the
+# common scheduler code to include the correct header file.
+#
+cdl_option CYGPRI_KERNEL_SCHED_IMPL_HXX {
+    # Calculated value:   CYGSEM_KERNEL_SCHED_BITMAP  ? "<cyg/kernel/bitmap.hxx>"  : CYGSEM_KERNEL_SCHED_MLQUEUE ? "<cyg/kernel/mlqueue.hxx>" : CYGSEM_KERNEL_SCHED_LOTTERY ? "<cyg/kernel/lottery.hxx>" : "!!!-- Configuration broken - no scheduler selected --!!!"
+    #     CYGSEM_KERNEL_SCHED_BITMAP == 0
+    #     CYGSEM_KERNEL_SCHED_MLQUEUE == 1
+    #     CYGSEM_KERNEL_SCHED_LOTTERY (unknown) == 0
+    # Flavor: data
+    # Current_value: <cyg/kernel/mlqueue.hxx>
+};
+
+# Number of priority levels
+# This option controls the number of priority levels that are
+# available. For some types of scheduler including the bitmap
+# scheduler this may impose an upper bound on the number of
+# threads in the system. For other schedulers such as the
+# mlqueue scheduler the number of threads is independent from
+# the number of priority levels. Note that the lowest priority
+# level is normally used only by the idle thread, although
+# application threads can run at this priority if necessary.
+#
+cdl_component CYGNUM_KERNEL_SCHED_PRIORITIES {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 32
+    # value_source default
+    # Default value: 32
+    # Legal values: 1 to 32
+
+    # The following properties are affected by this value
+    # option CYGIMP_IDLE_THREAD_YIELD
+    #     ActiveIf: (CYGNUM_KERNEL_SCHED_PRIORITIES == 1)
+    # option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT_PRIORITY
+    #     LegalValues: 0 to  CYGNUM_KERNEL_SCHED_PRIORITIES - 1 
+};
+
+# >
+# Bitmap size
+# This option automatically defines the size of bitmap
+# used to track occupied priority levels.
+#
+cdl_option CYGNUM_KERNEL_SCHED_BITMAP_SIZE {
+    # Calculated value: "CYGNUM_KERNEL_SCHED_PRIORITIES"
+    # Flavor: data
+    # Current_value: CYGNUM_KERNEL_SCHED_PRIORITIES
+};
+
+# Dequeue highest priority threads first
+# With this option enabled, threads queued in a thread queue
+# will be dequeued in priority order, rather than first in,
+# first out (FIFO). Threads of equal priority are dequeued
+# oldest first. The only exception is the scheduler run 
+# queues where order is less important as each is already
+# sorted by priority. Note that this makes the thread queueing
+# less deterministic.
+#
+cdl_option CYGIMP_KERNEL_SCHED_SORTED_QUEUES {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# <
+# Scheduler timeslicing
+# Some schedulers including the mlqueue scheduler support
+# timeslicing. This means that the kernel will check regularly
+# whether or not there is another runnable thread with the
+# same priority, and if there is such a thread there will be
+# an automatic context switch. Not all applications require
+# timeslicing, for example because every thread performs a
+# blocking operation regularly. For these applications it is
+# possible to disable timeslicing, which reduces the overheads
+# associated with timer interrupts.
+#
+cdl_component CYGSEM_KERNEL_SCHED_TIMESLICE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: !CYGSEM_KERNEL_SCHED_BITMAP
+    #     CYGSEM_KERNEL_SCHED_BITMAP == 0
+    #   --> 1
+    # Requires: CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    #   --> 1
+};
+
+# >
+# Number of clock ticks between timeslices
+# Assuming timeslicing is enabled, how frequently should it
+# take place? The value of this option corresponds to the
+# number of clock ticks that should occur before a timeslice
+# takes place, so increasing the value reduces the frequency
+# of timeslices.
+#
+cdl_option CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 5
+    # value_source default
+    # Default value: 5
+    # Legal values: 1 to 65535
+};
+
+# Support runtime enable of timeslice per-thread
+# This option makes timslicing a per-thread runtime
+# option. When enabled, threads may have timeslicing
+# turned on or off dynamically. This is generally used
+# by higher level APIs (such as POSIX) to implement
+# differing scheduling policies.
+#
+cdl_option CYGSEM_KERNEL_SCHED_TIMESLICE_ENABLE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: false
+    #     false (unknown) == 0
+    #   --> 0
+};
+
+# <
+# Enable ASR support
+# This component controls support for Asynchronous Service
+# Routines (ASRs). This is a function that may be called
+# from the scheduler when it has just exited the scheduler
+# lock. This is primarily for use by API compatibility layers.
+#
+cdl_component CYGSEM_KERNEL_SCHED_ASR_SUPPORT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: false
+    #     false (unknown) == 0
+    #   --> 0
+};
+
+# >
+# Make ASR function global
+# This option controls whether the ASR function is shared by
+# all threads, or whether each thread may have its own ASR
+# function.
+#
+cdl_option CYGSEM_KERNEL_SCHED_ASR_GLOBAL {
+    # This option is not active
+    # The parent CYGSEM_KERNEL_SCHED_ASR_SUPPORT is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: true
+    #     true (unknown) == 0
+    #   --> 0
+};
+
+# Make ASR data global
+# This option controls whether the ASR data is shared by
+# all threads, or whether each thread may have its own ASR
+# data. This is independent of the previous option because
+# it may be useful to pass per-thread data to a shared ASR
+# function.
+#
+cdl_option CYGSEM_KERNEL_SCHED_ASR_DATA_GLOBAL {
+    # This option is not active
+    # The parent CYGSEM_KERNEL_SCHED_ASR_SUPPORT is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: true
+    #     true (unknown) == 0
+    #   --> 0
+};
+
+# <
+# <
+# SMP support
+#
+cdl_component CYGPKG_KERNEL_SMP_SUPPORT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGPKG_HAL_SMP_SUPPORT
+    #     CYGPKG_HAL_SMP_SUPPORT (unknown) == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGSEM_KERNEL_SCHED_BITMAP
+    #     Requires: !CYGPKG_KERNEL_SMP_SUPPORT
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+};
+
+# Counters and clocks
+# doc: ref/kernel-counters.html
+# The counter objects provided by the kernel provide an
+# abstraction of the clock facility that is generally provided.
+# Application code can associate alarms with counters, where an
+# alarm is identified by the number of ticks until it triggers,
+# the action to be taken on triggering, and whether or not the
+# alarm should be repeated.
+#
+cdl_component CYGPKG_KERNEL_COUNTERS {
+    # There is no associated value.
+};
+
+# >
+# Provide real-time clock
+# On all current target systems the kernel can provide a
+# real-time clock. This clock serves two purposes. First it is
+# necessary to support clock and alarm related functions.
+# Second it is needed to implement timeslicing in some of the
+# schedulers including the mlqueue scheduler. If the
+# application does not require any of these facilities then it
+# is possible to disable the real time clock support
+# completely.
+#
+cdl_option CYGVAR_KERNEL_COUNTERS_CLOCK {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGIMP_KERNEL_INTERRUPTS_DSRS
+    #     CYGIMP_KERNEL_INTERRUPTS_DSRS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # component CYGSEM_KERNEL_SCHED_TIMESLICE
+    #     Requires: CYGVAR_KERNEL_COUNTERS_CLOCK
+    # option CYGNUM_KERNEL_COUNTERS_CLOCK_ISR_PRIORITY
+    #     ActiveIf: CYGVAR_KERNEL_COUNTERS_CLOCK
+    # option CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
+    #     Requires: CYGVAR_KERNEL_COUNTERS_CLOCK
+    # option CYGFUN_KERNEL_THREADS_TIMER
+    #     Requires: CYGVAR_KERNEL_COUNTERS_CLOCK
+    # option CYGDBG_KERNEL_INSTRUMENT_CLOCK
+    #     ActiveIf: CYGVAR_KERNEL_COUNTERS_CLOCK
+    # option CYGDBG_KERNEL_INSTRUMENT_ALARM
+    #     ActiveIf: CYGVAR_KERNEL_COUNTERS_CLOCK
+    # option CYGDBG_KERNEL_INSTRUMENT_SMP
+    #     ActiveIf: CYGVAR_KERNEL_COUNTERS_CLOCK
+    # component CYGPKG_HAL_TESTS
+    #     Calculated:   "tests/context tests/basic"
+    #                           . ((!CYGINT_HAL_TESTS_NO_CACHES) ? " tests/cache" : "")
+    #                           . ((CYGPKG_HAL_BUILD_COMPILER_TESTS) ? " tests/cpp1 tests/vaargs" : "")
+    #                           . ((!CYGVAR_KERNEL_COUNTERS_CLOCK) ?   " tests/intr" : "") 
+    # option CYGSEM_LIBC_TIME_CLOCK_WORKING
+    #     Requires: CYGVAR_KERNEL_COUNTERS_CLOCK
+};
+
+# Interrupt priority for the real-time clock
+# The implementation of the kernel's real-time clock typically
+# involves installing an interrupt handler on a suitable hardware
+# timer. This option controls the priority level used for that
+# interrupt. On most platforms the value is not important because 
+# the clock ISR leaves most of the work to be done by the DSR. 
+# However some processors have interrupt controllers with special
+# requirements for the interrupt priorities, in which case
+# application developers must be able to manipulate the clock's
+# priority.
+#
+cdl_option CYGNUM_KERNEL_COUNTERS_CLOCK_ISR_PRIORITY {
+    # ActiveIf constraint: CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    #   --> 1
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0x000000E0
+    # value_source default
+    # Default value:  is_loaded(CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY) ?
+    #      	                      CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY : 1 
+    #     CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY == 0x000000E0
+    #     CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY == 0x000000E0
+    #   --> 0x000000E0
+};
+
+#
+cdl_interface CYGINT_KERNEL_COUNTERS {
+    # Implemented by CYGIMP_KERNEL_COUNTERS_SINGLE_LIST, active, enabled
+    # Implemented by CYGIMP_KERNEL_COUNTERS_MULTI_LIST, active, disabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires: 1 == CYGINT_KERNEL_COUNTERS
+    #     CYGINT_KERNEL_COUNTERS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_KERNEL_COUNTERS
+    #     Requires: 1 == CYGINT_KERNEL_COUNTERS
+};
+
+# Implement counters using a single list
+# There are two different implementations of the counter
+# objects. The first implementation stores all alarms in a
+# single linked list. The alternative implementation uses a
+# table of linked lists. A single list is more efficient in
+# terms of memory usage and is generally adequate when the
+# application only makes use of a small number of alarms.
+#
+cdl_option CYGIMP_KERNEL_COUNTERS_SINGLE_LIST {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Implement counters using a table of lists
+# There are two different implementations of the counter
+# objects. The first implementation stores all alarms in a
+# single linked list. The alternative implementation uses a
+# table of linked lists, with the size of the table being a
+# separate configurable option. For more complicated
+# operations it is better to have a table of lists since this
+# reduces the amount of computation whenever the timer goes
+# off. Assuming a table size of 8 (the default value) on
+# average the timer code will only need to check 1/8 of the
+# pending alarms instead of all of them.
+#
+cdl_component CYGIMP_KERNEL_COUNTERS_MULTI_LIST {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# >
+# Size of counter list table
+# If counters are implemented using an array of linked lists
+# then this option controls the size of the array. A larger
+# size reduces the amount of computation that needs to take
+# place whenever the timer goes off, but requires extra
+# memory.
+#
+cdl_option CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE {
+    # This option is not active
+    # The parent CYGIMP_KERNEL_COUNTERS_MULTI_LIST is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 8
+    # value_source default
+    # Default value: 8
+    # Legal values: 1 to 1024
+};
+
+# <
+# Sort the counter list
+# Sorting the counter lists reduces the amount of work that
+# has to be done when a counter tick is processed, since the
+# next alarm to expire is always at the front of the list.
+# However, it makes adding an alarm to the list more expensive
+# since a search must be done for the correct place to put it.
+# Many alarms are used to implement timeouts, which seldom trigger,
+# so it is worthwhile optimizing this case. For this reason
+# sorted list are disabled by default.
+#
+cdl_option CYGIMP_KERNEL_COUNTERS_SORT_LIST {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Measure real-time [clock] interrupt latency
+# Measure the interrupt latency as seen by the real-time clock
+# timer interrupt.  This requires hardware support, defined by
+# the HAL_CLOCK_LATENCY() macro.
+#
+cdl_option CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY
+    #     Requires: CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
+    # option CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY
+    #     DefaultValue: CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
+};
+
+# Measure real-time [clock] DSR latency
+# Measure the DSR latency as seen by the real-time clock
+# timer interrupt.  This requires hardware support, defined by
+# the HAL_CLOCK_LATENCY() macro.
+#
+cdl_option CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY == 0
+    #   --> 0
+    # Requires: CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY == 0
+    #   --> 0
+};
+
+# RTC resolution
+# This option automatically defines the tuple which is used to
+# initialize the RTC resolution, consisting of a numerator and
+# denominator. The values of the numerator and denominator are
+# defined by the HAL.
+#
+cdl_option CYGNUM_KERNEL_COUNTERS_RTC_RESOLUTION {
+    # Calculated value: "{CYGNUM_HAL_RTC_NUMERATOR, CYGNUM_HAL_RTC_DENOMINATOR}"
+    # Flavor: data
+    # Current_value: {CYGNUM_HAL_RTC_NUMERATOR, CYGNUM_HAL_RTC_DENOMINATOR}
+};
+
+# RTC period
+# This option defines the RTC period to be used in
+# setting the system clock hardware. It is essentially
+# an alias for CYGNUM_HAL_RTC_PERIOD, which is defined
+# in the HAL.
+#
+cdl_option CYGNUM_KERNEL_COUNTERS_RTC_PERIOD {
+    # Calculated value: "CYGNUM_HAL_RTC_PERIOD"
+    # Flavor: data
+    # Current_value: CYGNUM_HAL_RTC_PERIOD
+};
+
+# <
+# Thread-related options
+# There are a number of configuration options related to the
+# implementation of threads, for example whether or not the
+# eCos kernel supports per-thread data.
+#
+cdl_component CYGPKG_KERNEL_THREADS {
+    # There is no associated value.
+
+    # The following properties are affected by this value
+    # option CYGDBG_KERNEL_INSTRUMENT_THREAD
+    #     ActiveIf: CYGPKG_KERNEL_THREADS
+};
+
+# >
+# Allow per-thread timers
+# This option controls whether or not the kernel should support
+# per-thread clock and alarm related functions. Also some of
+# the synchronization primitives such as semaphore and
+# condition variable timed wait operations require per-thread
+# timer support. If none of these facilities are required then
+# the option can be disabled.
+#
+cdl_option CYGFUN_KERNEL_THREADS_TIMER {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT
+    #     Requires: CYGFUN_KERNEL_THREADS_TIMER
+    # option CYGSEM_LIBC_TIME_CLOCK_WORKING
+    #     Requires: CYGFUN_KERNEL_THREADS_TIMER
+};
+
+# Support optional name for each thread
+# Threads may optionally be supplied with a name string that is
+# used to identify them during debugging. This name is only
+# present if `this option is defined. Disabling it reduces both
+# code and data size.
+#
+cdl_option CYGVAR_KERNEL_THREADS_NAME {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Keep track of all threads using a linked list
+# Threads may optionally be placed on a housekeeping list so
+# that all threads may be located easily. This is useful mainly
+# in conjunction with source-level debugging.
+#
+cdl_option CYGVAR_KERNEL_THREADS_LIST {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGFUN_KERNEL_ALL_THREADS_STACK_CHECKING
+    #     Requires: CYGVAR_KERNEL_THREADS_LIST
+    # option CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT
+    #     Requires: CYGVAR_KERNEL_THREADS_LIST
+};
+
+# Keep track of the base of each thread's stack
+# This option makes the kernel keep track of the lower limit on
+# each thread's stack. It allows the kernel to adjust the lower
+# limit, thus making space for per-thread data. Note that it
+# does not imply any form of run-time stack overflow checking.
+#
+cdl_option CYGFUN_KERNEL_THREADS_STACK_LIMIT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # component CYGVAR_KERNEL_THREADS_DATA
+    #     Requires: CYGFUN_KERNEL_THREADS_STACK_LIMIT
+};
+
+# Check thread stacks for overflows
+# This option enables a variety of checks for stack overflow
+# including signatures at the top and base of thread stacks,
+# which are asserted for correctness whenever a thread switches.
+#
+cdl_component CYGFUN_KERNEL_THREADS_STACK_CHECKING {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_INFRA_DEBUG
+    #     CYGPKG_INFRA_DEBUG == 0
+    #   --> 0
+    # ActiveIf constraint: CYGDBG_USE_ASSERTS
+    #     CYGDBG_USE_ASSERTS == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# Check all threads whenever possible
+# This option enables more active checking of all threads for
+# wrongdoing.  In theory, checking threads other than the old and new
+# executing threads in a thread-switch is pointless, because no other
+# thread has run, so no other stack can be exceeded.  But errors such
+# as memory scribbling, dangling pointers, overlapping use of store
+# or errors accessing objects adjacent to a stack which can be very
+# hard to find can be detected this way, saving debug time.
+#
+cdl_option CYGFUN_KERNEL_ALL_THREADS_STACK_CHECKING {
+    # This option is not active
+    # The parent CYGFUN_KERNEL_THREADS_STACK_CHECKING is not active
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGVAR_KERNEL_THREADS_LIST
+    #     CYGVAR_KERNEL_THREADS_LIST == 1
+    #   --> 1
+};
+
+# Signature size in bytes, at stack top and bottom
+# This is the size of the area reserved for a signature at the top
+# and bottom of all stacks.  It also provides a buffer zone for
+# detecting overflow before external objects are corrupted, hence the
+# ability to vary it here.  But if you are short of stack, increasing
+# this value will make the overflow more, not less likely, of course.
+#
+cdl_option CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE {
+    # This option is not active
+    # The parent CYGFUN_KERNEL_THREADS_STACK_CHECKING is not active
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 32
+    # value_source default
+    # Default value: 32
+    # Legal values: 8 to 512
+};
+
+# <
+# Measure stack usage
+# This option allows measurement of each thread's stack by initializing
+# it to a predefined value at thread creation time. Later use of the
+# cyg_thread_measure_stack_usage() function allows the maximum stack
+# usage of the thread so far to be obtained. Note that this is not
+# necessarily the true maximum stack usage that the thread will ever
+# use since all that has been measured is the stack usage corresponding
+# to the code path followed this time, and not the code path that may
+# be followed in future.
+#
+cdl_component CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  0 != CYGPKG_INFRA_DEBUG 
+    #     CYGPKG_INFRA_DEBUG == 0
+    #   --> 0
+};
+
+# >
+# Output stack usage on thread exit
+# This will output the measured stack usage on the diagnostic
+# output when a thread exits.
+#
+cdl_option CYGDBG_KERNEL_THREADS_STACK_MEASUREMENT_VERBOSE_EXIT {
+    # This option is not active
+    # The parent CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# <
+# Support for per-thread data
+# doc: ref/kernel-thread-data.html
+# It is possible for the kernel to support per-thread data, in
+# other words an area of memory specific to each thread which
+# can be used to store data for that thread. This per-thread
+# data can be used by applications or by other packages such as
+# the ISO C library.
+#
+cdl_component CYGVAR_KERNEL_THREADS_DATA {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGFUN_KERNEL_THREADS_STACK_LIMIT
+    #     CYGFUN_KERNEL_THREADS_STACK_LIMIT == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBC_I18N_PER_THREAD_MB
+    #     Requires: CYGVAR_KERNEL_THREADS_DATA
+    # option CYGSEM_LIBC_I18N_PER_THREAD_MB
+    #     DefaultValue:  CYGVAR_KERNEL_THREADS_DATA != 0 
+    # option CYGSEM_LIBC_PER_THREAD_RAND
+    #     Requires: CYGVAR_KERNEL_THREADS_DATA
+    # option CYGSEM_LIBC_STRING_PER_THREAD_STRTOK
+    #     Requires: CYGVAR_KERNEL_THREADS_DATA
+    # option CYGSEM_LIBC_STRING_PER_THREAD_STRTOK
+    #     DefaultValue: CYGVAR_KERNEL_THREADS_DATA
+    # option CYGSEM_LIBM_THREAD_SAFE_COMPAT_MODE
+    #     Requires: CYGVAR_KERNEL_THREADS_DATA
+    # option CYGSEM_LIBM_THREAD_SAFE_GAMMA_FUNCTIONS
+    #     Requires: CYGVAR_KERNEL_THREADS_DATA
+    # option CYGSEM_ERROR_PER_THREAD_ERRNO
+    #     Requires: CYGVAR_KERNEL_THREADS_DATA
+};
+
+# >
+# Number of words of per-thread data
+# It is possible for the kernel to support per-thread data, in
+# other words an area of memory specific to each thread which
+# can be used to store data for that thread. This per-thread
+# data can be used by applications or by other packages such as
+# the ISO C library. This configuration option controls the
+# number of words of per-thread data that the kernel will
+# allow. In the current implementation a bitmask is used to identify
+# used per-thread data slots and so the maximum legal value must
+# remain 32.
+#
+cdl_option CYGNUM_KERNEL_THREADS_DATA_MAX {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 6
+    # value_source default
+    # Default value: 6
+    # Legal values: 4 to 32
+};
+
+# Bitmap of preallocated slots of thread data
+# Per thread data options. Per thread data support is based loosely
+# on that defined by POSIX. Each thread has an array of slots, up to
+# CYGNUM_KERNEL_THREADS_DATA_MAX, that may contain data. Some of the
+# slots have been preallocated to specific packages. Others may be
+# allocated dynamically.
+#
+cdl_component CYGNUM_KERNEL_THREADS_DATA_ALL {
+    # Calculated value: 15
+    # Flavor: data
+    # Current_value: 15
+};
+
+# >
+# Slot 0 preallocated for the kernel
+# This option defines the index of a per-thread data
+# slot which is reserved by
+# the eCos kernel
+# for private use.
+#
+cdl_option CYGNUM_KERNEL_THREADS_DATA_KERNEL {
+    # Calculated value: 0
+    # Flavor: data
+    # Current_value: 0
+};
+
+# Slot 1 preallocated for uITRON
+# This option defines the index of a per-thread data
+# slot which is reserved by
+# the uITRON compatibility layer
+# for private use.
+#
+cdl_option CYGNUM_KERNEL_THREADS_DATA_ITRON {
+    # Calculated value: 1
+    # Flavor: data
+    # Current_value: 1
+};
+
+# Slot 2 preallocated for errno
+# This option defines the index of a per-thread data
+# slot which is reserved for use by an errno variable.
+#
+cdl_option CYGNUM_KERNEL_THREADS_DATA_ERRNO {
+    # Calculated value: 2
+    # Flavor: data
+    # Current_value: 2
+};
+
+# Slot 3 preallocated for POSIX
+# This option defines the index of a per-thread data
+# slot which is reserved by
+# POSIX
+# for private use.
+#
+cdl_option CYGNUM_KERNEL_THREADS_DATA_POSIX {
+    # Calculated value: 3
+    # Flavor: data
+    # Current_value: 3
+};
+
+# <
+# <
+# Thread destructors
+# doc: ref/kernel-thread-destructors.html
+# This option enables support for registered destructor functions to
+# be called on thread exit.
+#
+cdl_component CYGPKG_KERNEL_THREADS_DESTRUCTORS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# >
+# Number of possible destructors
+# This option gives the number of possible destructors allowed.
+# Increasing this will increase the size of every
+# thread control structure if per-thread destructors are
+# enabled.
+#
+cdl_option CYGNUM_KERNEL_THREADS_DESTRUCTORS {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_THREADS_DESTRUCTORS is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 8
+    # value_source default
+    # Default value: 8
+    # Legal values: 1 to 65535
+};
+
+# Per-thread destructors
+# Enabling this option makes the thread destructors a per-thread
+# property, with each thread having its own list of destructors.
+# Disabling this option makes the thread destructor list
+# global so all threads have the same destructors.
+#
+cdl_option CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_THREADS_DESTRUCTORS is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Stack size for the idle thread
+# This configuration option specifies the stack size in bytes
+# for the idle thread. Unless the HAL is configured to use a
+# separate interrupt stack this size must be sufficient to meet
+# the requirements of all interrupt handlers - these
+# requirements are cumulative if nested interrupted are
+# enabled. Depending on the target architecture, the stack size
+# typically has to be a multiple of eight or sixteen bytes.
+# This will be overridden where it is used if the
+# architectural HAL requires a minimum stack size
+# to handle interrupts correctly.
+#
+cdl_option CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 2048
+    # value_source default
+    # Default value: 2048
+    # Legal values: 512 to 65536
+};
+
+# Maximal suspend count
+# This option provides for an assertion that the count value for
+# counted thread suspends do not exceed set limits.  This is to help
+# with debugging, to allow a runaway loop, for example, to be
+# detected more easily.
+# If the option is not defined, no assert is included.  Whether asserts
+# are themselves included depends on infrastructure configury in
+# infra.h
+#
+cdl_option CYGNUM_KERNEL_MAX_SUSPEND_COUNT_ASSERT {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 500
+    # value_source default
+    # Default value: 500
+};
+
+# Maximal wake count
+# This option provides for an assertion that the count value for
+# counted thread wakeups do not exceed set limits.  This is to
+# help with debugging, to allow a runaaway loop, for example, to
+# be detected more easily.
+# If the option is not defined, no assert is included.  Whether asserts
+# are themselves included depends on infrastructure configury in
+# infra.h
+#
+cdl_option CYGNUM_KERNEL_MAX_COUNTED_WAKE_COUNT_ASSERT {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 500
+    # value_source default
+    # Default value: 500
+};
+
+# Idle thread must always yield
+# If the scheduler configuration only has a single priority
+# level, then the idle thread must yield each time around its loop.
+#
+cdl_option CYGIMP_IDLE_THREAD_YIELD {
+    # This option is not active
+    # ActiveIf constraint: (CYGNUM_KERNEL_SCHED_PRIORITIES == 1)
+    #     CYGNUM_KERNEL_SCHED_PRIORITIES == 32
+    #   --> 0
+
+    # Calculated value: 1
+    # Flavor: bool
+    # Current value: 1
+};
+
+# <
+# Synchronization primitives
+# The eCos kernel supports a number of different
+# synchronization primitives such as mutexes, semaphores,
+# condition variables, and message boxes. There are
+# configuration options to control the exact behaviour of some
+# of these synchronization primitives.
+#
+cdl_component CYGPKG_KERNEL_SYNCH {
+    # There is no associated value.
+
+    # The following properties are affected by this value
+    # option CYGDBG_KERNEL_INSTRUMENT_MUTEX
+    #     ActiveIf: CYGPKG_KERNEL_SYNCH
+    # option CYGDBG_KERNEL_INSTRUMENT_CONDVAR
+    #     ActiveIf: CYGPKG_KERNEL_SYNCH
+    # option CYGDBG_KERNEL_INSTRUMENT_BINSEM
+    #     ActiveIf: CYGPKG_KERNEL_SYNCH
+    # option CYGDBG_KERNEL_INSTRUMENT_CNTSEM
+    #     ActiveIf: CYGPKG_KERNEL_SYNCH
+    # option CYGDBG_KERNEL_INSTRUMENT_MBOXT
+    #     ActiveIf: CYGPKG_KERNEL_SYNCH
+    # option CYGDBG_KERNEL_INSTRUMENT_FLAG
+    #     ActiveIf: CYGPKG_KERNEL_SYNCH
+};
+
+# >
+# Priority inversion protection protocols
+# doc: ref/kernel-mutexes.html
+# This component controls the protocols used to protect mutexes against
+# priority inversion. If this option is enabled it defines which
+# algorithm is used to implement this protection. At present only
+# one such algorithm is defined: "SIMPLE". The implementation
+# will only work in the mlqueue scheduler, and it does not handle the
+# rare case of nested mutexes completely correctly. However it is
+# both fast and deterministic.
+#
+cdl_component CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL {
+    # ActiveIf constraint:  CYGSEM_KERNEL_SCHED_MLQUEUE 
+    #     CYGSEM_KERNEL_SCHED_MLQUEUE == 1
+    #   --> 1
+
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 1 SIMPLE
+    # value_source default
+    # Default value: 1 SIMPLE
+    # Legal values:  "SIMPLE" 
+    # Requires:  CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES == 0 
+    #     CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES == 0
+    #   --> 1
+};
+
+# >
+# Enable priority inheritance protocol
+# This option enables priority inheritance protocol. This protocol
+# causes the owner of a mutex to be executed at the highest priority
+# of the threads waiting for access to the mutex.
+#
+cdl_option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT
+    #     DefaultValue:  CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT ?
+    #                             "INHERIT" :
+    #                             CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING ?
+    #                             "CEILING" : "NONE" 
+};
+
+# Enable priority ceiling protocol
+# This option enables priority ceiling protocol. This protocol
+# causes the owner of a mutex to be executed at a  priority
+# associated with the mutex.
+#
+cdl_component CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT_PRIORITY
+    #     ActiveIf: CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING
+    # option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT
+    #     DefaultValue:  CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT ?
+    #                             "INHERIT" :
+    #                             CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING ?
+    #                             "CEILING" : "NONE" 
+};
+
+# >
+# Default priority ceiling
+# This option defines the default priority ceiling to be
+# used if the chosen default priority inversion protocol is
+# priority ceoptioniling protocol. The default value for this is zero,
+# making all such mutexes boost threads to the maximum priority.
+#
+cdl_option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT_PRIORITY {
+    # ActiveIf constraint: CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING
+    #     CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING == 1
+    #   --> 1
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to  CYGNUM_KERNEL_SCHED_PRIORITIES - 1 
+    #     CYGNUM_KERNEL_SCHED_PRIORITIES == 32
+};
+
+# <
+# No priority inversion protocol
+# This option enables the ability to have no priority inversion protocol.
+# It is equivalent to disabling the priority inversion protocol at
+# the top level, but is necessary for the runtime and default
+# selection options.
+#
+cdl_option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_NONE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Default priority inversion protocol
+# This option defines the default inversion protocol used for mutexes that
+# are created without an explicit protocol being specified. The protocol
+# chosen by default is to use priority inheritance if it is present otherwise
+# priority ceiling, or none if neither is present.
+#
+cdl_option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT {
+    # ActiveIf constraint:  CYGINT_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_COUNT > 1 
+    #     CYGINT_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_COUNT == 3
+    #   --> 1
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value INHERIT
+    # value_source default
+    # Default value:  CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT ?
+    #                             "INHERIT" :
+    #                             CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING ?
+    #                             "CEILING" : "NONE" 
+    #     CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT == 1
+    #     CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING == 1
+    #   --> INHERIT
+    # Legal values:  "INHERIT" "CEILING" "NONE" 
+};
+
+# Specify mutex priority inversion protocol at runtime
+# This option controls whether the priority inversion protocol used by
+# a mutex can be specified when that mutex is created.
+#
+cdl_option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC {
+    # ActiveIf constraint:  CYGINT_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_COUNT > 1 
+    #     CYGINT_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_COUNT == 3
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Number of protocols selected
+#
+cdl_interface CYGINT_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_COUNT {
+    # Implemented by CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT, active, enabled
+    # Implemented by CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING, active, enabled
+    # Implemented by CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_NONE, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 3
+
+    # The following properties are affected by this value
+    # option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT
+    #     ActiveIf:  CYGINT_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_COUNT > 1 
+    # option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC
+    #     ActiveIf:  CYGINT_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_COUNT > 1 
+};
+
+# <
+# Use mboxt_plain mbox implementation
+# Use the plain mboxt implementation instead of the mboxt2
+# implementation. The mboxt2 version is designed to provide
+# semantics compatible with UITRON, the plain implementation
+# is adquate in most other situations.
+#
+cdl_option CYGIMP_MBOX_USE_MBOXT_PLAIN {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Message box blocking put support
+# doc: ref/kernel-mail-boxes.html
+# Message boxes can support three different versions of the
+# put-message operation. The first is tryput(), which will fail
+# if the message box is already full. The other two are the
+# ordinary put() function which will block if the message box
+# is full, and a timed put() operation which will block for
+# upto a certain length of time if the message box is currently
+# full. The blocking versions require extra memory in the
+# message box data structure and extra code in the other
+# message box functions, so they can be disabled if the
+# application does not require them. If this option is enabled
+# then the system will always provide the blocking put()
+# function, and it will also provide the timed put() function
+# if thread timers are enabled.
+#
+cdl_option CYGMFN_KERNEL_SYNCH_MBOXT_PUT_CAN_WAIT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Message box queue size
+# doc: ref/kernel-mail-boxes.html
+# This configuration option controls the number of messages
+# that can be queued in a message box before a non-blocking
+# put() operation will fail or a blocking put() operation will
+# block. The cost in memory is one pointer per message box for
+# each possible message.
+#
+cdl_option CYGNUM_KERNEL_SYNCH_MBOX_QUEUE_SIZE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 10
+    # value_source default
+    # Default value: 10
+    # Legal values: 1 to 65535
+};
+
+# Condition variable timed-wait support
+# doc: ref/kernel-condition-variables.html
+# This option enables the condition variable timed wait
+# facility.
+#
+cdl_option CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGFUN_KERNEL_THREADS_TIMER
+    #     CYGFUN_KERNEL_THREADS_TIMER == 1
+    #   --> 1
+};
+
+# Condition variable explicit mutex wait support
+# doc: ref/kernel-condition-variables.html
+# This option enables the condition variable explicit mutex wait
+# facility. By default condition variables in eCos are created with
+# a statically associated mutex. This option permits wait (and timed wait
+# if CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT is enabled) to provide a
+# different mutex as an argument. This makes no difference to the semantics
+# the wait operation except that a different mutex will be used during it.
+#
+cdl_option CYGMFN_KERNEL_SYNCH_CONDVAR_WAIT_MUTEX {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Avoid inlines in mqueue implementation
+# With this option disabled, the 'mqueue' message queue implementation
+# provides most of its implementation via inlines. However this can
+# adversely affect code size in application that make lots of mqueue
+# calls from different places, so enabling this option provides
+# non-inline versions to be used instead.
+#
+cdl_option CYGIMP_KERNEL_SYNCH_MQUEUE_NOT_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# <
+# Kernel instrumentation
+# doc: user-guide/kernel-instrumentation.html
+# The current release of the kernel contains an initial version
+# of instrumentation support. The various parts of the kernel
+# will invoke instrumentation routines whenever appropriate
+# events occur, and these will be stored in a circular buffer
+# for later reference.
+#
+cdl_component CYGPKG_KERNEL_INSTRUMENT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+};
+
+# >
+# Use buffer provided by the application
+# In most circumstances the kernel should provide the
+# instrumentation circular buffer itself. Occasionally
+# application code may wish to provide the buffer instead,
+# giving the application code more convenient access to the
+# buffer. This also makes it possible to put the circular
+# buffer in special areas of memory, for example a region that
+# is shared with the host.
+#
+cdl_option CYGVAR_KERNEL_INSTRUMENT_EXTERNAL_BUFFER {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Instrumentation buffer size
+# If kernel instrumentation is enabled then the instrumentation
+# data goes into a circular buffer. A larger buffer allows
+# more data to be stored, but at a significant cost in memory.
+# The value of this option corresponds to the number of entries
+# in the table, and typically each entry will require 16 bytes
+# of memory.
+#
+cdl_option CYGNUM_KERNEL_INSTRUMENT_BUFFER_SIZE {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 256
+    # value_source default
+    # Default value: 256
+    # Legal values: 16 to 0x100000
+};
+
+# Wrap instrumentation buffer
+# When the instrumentation buffer is full it can either be restarted
+# from the beginning, overwriting older data, or it can stop at the
+# end. The former is useful if you want to look at the last entries
+# made while the latter is useful if you want to look at the first
+# few.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_BUFFER_WRAP {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Perform selective instrumentation
+# The kernel can either collect all instrumentation events, or
+# it can filter out events at runtime based on a set of flags.
+# For example it would be possible to decide at runtime that
+# only scheduler and interrupt instrumentation flags are of
+# interest and that all other flags should be ignored. This
+# flag mechanism involves extra code and processor cycle
+# overhead in the instrumentation code, so it can be disabled
+# if the application developer is interested in all
+# instrumentation events.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_FLAGS {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument common scheduler operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the scheduling code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_SCHED {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_SCHED
+    #     CYGPKG_KERNEL_SCHED == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument thread operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the code that manipulates threads.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_THREAD {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_THREADS
+    #     CYGPKG_KERNEL_THREADS == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument interrupt-related operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the interrupt handling code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_INTR {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_INTERRUPTS
+    #     CYGPKG_KERNEL_INTERRUPTS == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument mutex operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the mutex code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_MUTEX {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_SYNCH
+    #     CYGPKG_KERNEL_SYNCH == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument condition variable operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the condition variable code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_CONDVAR {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_SYNCH
+    #     CYGPKG_KERNEL_SYNCH == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument binary semaphore operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the binary semaphore code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_BINSEM {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_SYNCH
+    #     CYGPKG_KERNEL_SYNCH == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument counting semaphore operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the counting semaphore code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_CNTSEM {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_SYNCH
+    #     CYGPKG_KERNEL_SYNCH == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument message box operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the message box code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_MBOXT {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_SYNCH
+    #     CYGPKG_KERNEL_SYNCH == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument event flag operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the event flag code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_FLAG {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGPKG_KERNEL_SYNCH
+    #     CYGPKG_KERNEL_SYNCH == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument clock operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the real-time clock code.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_CLOCK {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument alarm-related operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the code related to alarm operations.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_ALARM {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument SMP-related operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the code related to SMP operations.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_SMP {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument multi-level queue scheduler operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the code for the multi-level queue scheduler.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_MLQ {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGSEM_KERNEL_SCHED_MLQUEUE
+    #     CYGSEM_KERNEL_SCHED_MLQUEUE == 1
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Instrument bitmap scheduler operations
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not instrumentation support is compiled into
+# the code for the bitmap scheduler.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_BITMAP {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+    # ActiveIf constraint: CYGSEM_KERNEL_SCHED_BITMAP
+    #     CYGSEM_KERNEL_SCHED_BITMAP == 0
+    #   --> 0
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Support application-level instrumentation
+# It is possible to perform selective instrumentation at
+# run-time. It is also possible to disable instrumentation
+# in various kernel components at compile-time, thus
+# reducing the code size overheads. This option controls
+# whether or not application-level instrumentation gets
+# compiled in.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_USER {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Provide user-friendly instrumentation messages
+# Include code which will convert the instrument type field 
+# into a more human understandable string
+#
+cdl_component CYGDBG_KERNEL_INSTRUMENT_MSGS {
+    # This option is not active
+    # The parent CYGPKG_KERNEL_INSTRUMENT is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# Rebuild the header file
+# Make (using a shell script) include/cyg/kernel/instrument_desc.h in
+# your build tree; this is normally simply copied from the repository.
+# If you make a permanent change to include/instrmnt.h, such that
+# instrument_desc.h needs updating, it's up to you to first delete the
+# master file
+# ECOS_REPOSITORY/kernel/VERSION/include/instrument_desc.h
+# in your source repository, make the new version by enabling this
+# option then copy the new file
+# back from your build place to its source in
+# ECOS_REPOSITORY/kernel/VERSION/include/instrument_desc.h
+# and/or commit this to any version control system that you use.
+#
+cdl_option CYGDBG_KERNEL_INSTRUMENT_MSGS_BUILD_HEADERFILE {
+    # This option is not active
+    # The parent CYGDBG_KERNEL_INSTRUMENT_MSGS is not active
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Build the host tool to print out a dump
+# Generate a host program which can dump the instrumentation
+# data in a human readable format. You have to somehow get the
+# instrumentation buffer into a file on the host. 'Exercise for
+# the reader' as university lecturers tend to say.
+#
+cdl_component CYGDBG_KERNEL_INSTRUMENT_BUILD_HOST_DUMP {
+    # This option is not active
+    # The parent CYGDBG_KERNEL_INSTRUMENT_MSGS is not active
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# <
+# <
+# Source-level debugging support
+# If the source level debugger gdb is to be used for debugging
+# application code then it may be necessary to configure in support
+# for this in the kernel.
+#
+cdl_component CYGPKG_KERNEL_DEBUG {
+    # There is no associated value.
+};
+
+# >
+# Include GDB multi-threading debug support
+# This option enables some extra kernel code which is needed
+# to support multi-threaded source level debugging.
+#
+cdl_option CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGVAR_KERNEL_THREADS_LIST
+    #     CYGVAR_KERNEL_THREADS_LIST == 1
+    #   --> 1
+    # Requires: CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
+    #     CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
+    #     ActiveIf:  CYGSEM_HAL_ROM_MONITOR || CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT 
+};
+
+# <
+# Kernel APIs
+# The eCos kernel is implemented in C++, so a C++ interface
+# to the kernel is always available. There is also an optional
+# C API. Additional API's may be provided in future versions.
+#
+cdl_component CYGPKG_KERNEL_API {
+    # There is no associated value.
+};
+
+# >
+# Provide C API
+# The eCos kernel is implemented in C++, but there is an
+# optional C API for use by application code. This C API can be
+# disabled if the application code does not invoke the kernel
+# directly, but instead uses higher level code such as the
+# uITRON compatibility layer.
+#
+cdl_option CYGFUN_KERNEL_API_C {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+    # option CYGFUN_MEMALLOC_KAPI
+    #     DefaultValue: CYGFUN_KERNEL_API_C
+};
+
+# <
+# Kernel build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_KERNEL_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the eCos kernel. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_KERNEL_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the eCos kernel. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_KERNEL_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Kernel tests
+# This option specifies the set of tests for the eCos kernel.
+#
+cdl_component CYGPKG_KERNEL_TESTS {
+    # Calculated value: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+    #     CYGFUN_KERNEL_API_C == 1
+    #     CYGPKG_INFRA_DEBUG == 0
+    #     CYGPKG_KERNEL_INSTRUMENT == 0
+    #     CYGFUN_KERNEL_API_C == 1
+    #     CYGPKG_KERNEL_SMP_SUPPORT == 0
+    #     CYGFUN_KERNEL_API_C == 1
+    #     CYGINT_HAL_TESTS_NO_CACHES == 0
+    #     CYGFUN_KERNEL_API_C == 1
+    #     CYGFUN_KERNEL_API_C == 1
+    #     CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST == 0
+    # Flavor: data
+    # Current_value: tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2 tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0 tests/dhrystone tests/kcache1 tests/kcache2 tests/fpint_thread_switch tests/fptest tests/fpinttestf tests/fpinttestf2
+};
+
+# >
+# Suppress multi thread floating point test
+# Hardware floating point configurations that do not
+# preserve FPU context are supposed to fail multi thread FPU
+# integrity tests. Setting this option to 1 shall suppress
+# building of such tests and shall build single thread fpu
+# integrity test instead.
+#
+cdl_option CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_KERNEL_TESTS
+    #     Calculated: 
+    #                     "tests/bin_sem0 tests/bin_sem1 tests/bin_sem2 tests/bin_sem3 tests/clock0 tests/clock1 tests/clockcnv tests/clocktruth tests/cnt_sem0 tests/cnt_sem1 tests/except1 tests/flag0 tests/flag1 tests/intr0 tests/kill tests/mbox1 tests/mqueue1 tests/mutex0 tests/mutex1 tests/mutex2 tests/mutex3 tests/release tests/sched1 tests/sync2 tests/sync3 tests/thread0 tests/thread1 tests/thread2"
+    #                     . ((CYGFUN_KERNEL_API_C) ? " tests/kclock0 tests/kclock1 tests/kexcept1 tests/kflag0 tests/kflag1 tests/kintr0 tests/klock tests/kmbox1 tests/kmutex0 tests/kmutex1 tests/kmutex3 tests/kmutex4 tests/ksched1 tests/ksem0 tests/ksem1 tests/kthread0 tests/kthread1 tests/stress_threads tests/thread_gdb tests/timeslice tests/timeslice2 tests/tm_basic tests/kalarm0" : "")
+    #                     . ((!CYGPKG_INFRA_DEBUG && !CYGPKG_KERNEL_INSTRUMENT && CYGFUN_KERNEL_API_C) ? " tests/dhrystone" : "")
+    #                     . ((CYGPKG_KERNEL_SMP_SUPPORT && CYGFUN_KERNEL_API_C) ? " tests/smp" : "")
+    #                     . ((!CYGINT_HAL_TESTS_NO_CACHES && CYGFUN_KERNEL_API_C) ? " tests/kcache1 tests/kcache2" : "")
+    #                     . ((CYGFUN_KERNEL_API_C) ? (" tests/fpint_thread_switch" . (CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ? " tests/fpinttestf1" :
+    #                        " tests/fptest tests/fpinttestf tests/fpinttestf2")) : "")
+    #                 
+    # option CYGHWR_HAL_CORTEXM_FPU_SWITCH
+    #     Requires:  is_active (CYGPKG_KERNEL) implies
+    #                         CYGTST_KERNEL_SKIP_MULTI_THREAD_FP_TEST ==
+    #                         (CYGHWR_HAL_CORTEXM_FPU_SWITCH == "NONE") 
+};
+
+# <
+# <
+# <
+# Dynamic memory allocation
+# doc: ref/memalloc.html
+# This package provides memory allocator infrastructure required for
+# dynamic memory allocators, including the ISO standard malloc
+# interface. It also contains some sample implementations.
+#
+cdl_package CYGPKG_MEMALLOC {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+};
+
+# >
+# Memory allocator implementations
+# This component contains configuration options related to the 
+# various memory allocators available.
+#
+cdl_component CYGPKG_MEMALLOC_ALLOCATORS {
+    # There is no associated value.
+};
+
+# >
+# Fixed block allocator
+# This component contains configuration options related to the 
+# fixed block memory allocator.
+#
+cdl_component CYGPKG_MEMALLOC_ALLOCATOR_FIXED {
+    # There is no associated value.
+};
+
+# >
+# Make thread safe
+# With this option enabled, this allocator will be
+# made thread-safe. Additionally allocation functions
+# are made available that allow a thread to wait
+# until memory is available.
+#
+cdl_option CYGSEM_MEMALLOC_ALLOCATOR_FIXED_THREADAWARE {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Simple variable block allocator
+# This component contains configuration options related to the 
+# simple variable block memory allocator. This allocator is not
+# very fast, and in particular does not scale well with large
+# numbers of allocations. It is however very compact in terms of
+# code size and does not have very much overhead per allocation.
+#
+cdl_component CYGPKG_MEMALLOC_ALLOCATOR_VARIABLE {
+    # There is no associated value.
+};
+
+# >
+# Make thread safe
+# With this option enabled, this allocator will be
+# made thread-safe. Additionally allocation functions
+# are added that allow a thread to wait until memory
+# are made available that allow a thread to wait
+# until memory is available.
+#
+cdl_option CYGSEM_MEMALLOC_ALLOCATOR_VARIABLE_THREADAWARE {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Coalesce memory
+# The variable-block memory allocator can perform coalescing
+# of memory whenever the application code releases memory back
+# to the pool. This coalescing reduces the possibility of
+# memory fragmentation problems, but involves extra code and
+# processor cycles.
+#
+cdl_option CYGSEM_MEMALLOC_ALLOCATOR_VARIABLE_COALESCE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGIMP_MEMALLOC_MALLOC_VARIABLE_SIMPLE
+    #     Requires: CYGSEM_MEMALLOC_ALLOCATOR_VARIABLE_COALESCE
+};
+
+# <
+# Doug Lea's malloc
+# This component contains configuration options related to the 
+# port of Doug Lea's memory allocator, normally known as
+# dlmalloc. dlmalloc has a reputation for being both fast
+# and space-conserving, as well as resisting fragmentation well.
+# It is a common choice for a general purpose allocator and
+# has been used in both newlib and Linux glibc.
+#
+cdl_component CYGPKG_MEMALLOC_ALLOCATOR_DLMALLOC {
+    # There is no associated value.
+};
+
+# >
+# Debug build
+# Doug Lea's malloc implementation has substantial amounts
+# of internal checking in order to verify the operation
+# and consistency of the allocator. However this imposes
+# substantial overhead on each operation. Therefore this
+# checking may be individually disabled.
+#
+cdl_option CYGDBG_MEMALLOC_ALLOCATOR_DLMALLOC_DEBUG {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  0 != CYGDBG_USE_ASSERTS 
+    #     CYGDBG_USE_ASSERTS == 0
+    #   --> 0
+    # Requires: CYGDBG_USE_ASSERTS
+    #     CYGDBG_USE_ASSERTS == 0
+    #   --> 0
+};
+
+# Make thread safe
+# With this option enabled, this allocator will be
+# made thread-safe. Additionally allocation functions
+# are made available that allow a thread to wait
+# until memory is available.
+#
+cdl_option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_THREADAWARE {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+};
+
+# Support more than one instance
+# Having this option disabled allows important
+# implementation structures to be declared as a single
+# static instance, allowing faster access. However this
+# would fail if there is more than one instance of
+# the dlmalloc allocator class. Therefore this option can
+# be enabled if multiple instances are required. Note: as
+# a special case, if this allocator is used as the
+# implementation of malloc, and it can be determined there
+# is more than one malloc pool, then this option will be
+# silently enabled.
+#
+cdl_option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_SAFE_MULTIPLE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Use system memmove() and memset()
+# This may be used to control whether memset() and memmove()
+# are used within the implementation. The alternative is
+# to use some macro equivalents, which have been reported
+# to be faster in some circumstances. The use of "MEMCPY"
+# in the CDL option name is an anachronism and only
+# present for backwards compatibility.
+#
+cdl_option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_USE_MEMCPY {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  (0 != CYGPKG_ISOINFRA) && (0 != CYGINT_ISO_STRING_MEMFUNCS) 
+    #     CYGPKG_ISOINFRA == current
+    #     CYGINT_ISO_STRING_MEMFUNCS == 1
+    #   --> 1
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+    # Requires: CYGINT_ISO_STRING_MEMFUNCS
+    #     CYGINT_ISO_STRING_MEMFUNCS == 1
+    #   --> 1
+};
+
+# Minimum alignment of allocated blocks
+# This option controls the minimum alignment that the
+# allocated memory blocks are aligned on, specified as
+# 2^N. Note that using large mininum alignments can lead
+# to excessive memory wastage.
+#
+cdl_option CYGNUM_MEMALLOC_ALLOCATOR_DLMALLOC_ALIGNMENT {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 3
+    # value_source default
+    # Default value: 3
+    # Legal values: 3 to 10
+};
+
+# <
+# Variable block allocator with separate metadata
+# This component contains configuration options related to the 
+# variable block memory allocator with separate metadata.
+#
+cdl_component CYGPKG_MEMALLOC_ALLOCATOR_SEPMETA {
+    # There is no associated value.
+};
+
+# >
+# Make thread safe
+# With this option enabled, this allocator will be
+# made thread-safe. Additionally allocation functions
+# are made available that allow a thread to wait
+# until memory is available.
+#
+cdl_option CYGSEM_MEMALLOC_ALLOCATOR_SEPMETA_THREADAWARE {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# <
+# Kernel C API support for memory allocation
+# This option must be enabled to provide the extensions required
+# to support integration into the kernel C API.
+#
+cdl_option CYGFUN_MEMALLOC_KAPI {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: CYGFUN_KERNEL_API_C
+    #     CYGFUN_KERNEL_API_C == 1
+    #   --> 1
+};
+
+# malloc(0) returns NULL
+# This option controls the behavior of malloc(0) ( or calloc with
+# either argument 0 ). It is permitted by the standard to return
+# either a NULL pointer or a unique pointer. Enabling this option
+# forces a NULL pointer to be returned.
+#
+cdl_option CYGSEM_MEMALLOC_MALLOC_ZERO_RETURNS_NULL {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Breakpoint site when running out of memory
+# Whenever the system runs out of memory, it invokes this function
+# before either going to sleep waiting for memory to become 
+# available or returning failure.
+#
+cdl_option CYGSEM_MEMALLOC_INVOKE_OUT_OF_MEMORY {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# malloc() and supporting allocators
+# This component enables support for dynamic memory
+# allocation as supplied by the functions malloc(),
+# free(), calloc() and realloc(). As these
+# functions are often used, but can have quite an
+# overhead, disabling them here can ensure they
+# cannot even be used accidentally when static
+# allocation is preferred. Within this component are
+# various allocators that can be selected for use
+# as the underlying implementation of the dynamic
+# allocation functions.
+#
+cdl_component CYGPKG_MEMALLOC_MALLOC_ALLOCATORS {
+    # ActiveIf constraint: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# Use external heap definition
+# This option allows other components in the
+# system to override the default system
+# provision of heap memory pools. This should
+# be set to a header which provides the equivalent
+# definitions to <pkgconf/heaps.hxx>.
+#
+cdl_component CYGBLD_MEMALLOC_MALLOC_EXTERNAL_HEAP_H {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Use external implementation of joining multiple heaps
+# The default implementation of joining multiple heaps
+# is fine for the case where there are multiple disjoint
+# memory regions of the same type. However, in a system
+# there might be e.g. a small amount of internal SRAM and
+# a large amount of external DRAM. The SRAM is faster and
+# the DRAM is slower. An application can implement some 
+# heuristic to choose which pool to allocate from. This
+# heuristic can be highly application specific.
+#
+cdl_component CYGBLD_MEMALLOC_MALLOC_EXTERNAL_JOIN_H {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# malloc() allocator implementations
+#
+cdl_interface CYGINT_MEMALLOC_MALLOC_ALLOCATORS {
+    # Implemented by CYGIMP_MEMALLOC_MALLOC_VARIABLE_SIMPLE, active, disabled
+    # Implemented by CYGIMP_MEMALLOC_MALLOC_DLMALLOC, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  CYGINT_MEMALLOC_MALLOC_ALLOCATORS == 1 
+    #     CYGINT_MEMALLOC_MALLOC_ALLOCATORS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_MEMALLOC_MALLOC_ALLOCATORS
+    #     Requires:  CYGINT_MEMALLOC_MALLOC_ALLOCATORS == 1 
+};
+
+# malloc() implementation instantiation data
+# Memory allocator implementations that are capable of being
+# used underneath malloc() must be instantiated. The code
+# to do this is set in this option. It is only intended to
+# be set by the implementation, not the user.
+#
+cdl_option CYGBLD_MEMALLOC_MALLOC_IMPLEMENTATION_HEADER {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value <cyg/memalloc/dlmalloc.hxx>
+    # value_source default
+    # Default value: <cyg/memalloc/dlmalloc.hxx>
+
+    # The following properties are affected by this value
+    # option CYGIMP_MEMALLOC_MALLOC_VARIABLE_SIMPLE
+    #     Requires:  CYGBLD_MEMALLOC_MALLOC_IMPLEMENTATION_HEADER ==  "<cyg/memalloc/memvar.hxx>" 
+    # option CYGIMP_MEMALLOC_MALLOC_DLMALLOC
+    #     Requires:  CYGBLD_MEMALLOC_MALLOC_IMPLEMENTATION_HEADER ==  "<cyg/memalloc/dlmalloc.hxx>" 
+};
+
+# Simple variable block implementation
+# This causes malloc() to use the simple
+# variable block allocator.
+#
+cdl_option CYGIMP_MEMALLOC_MALLOC_VARIABLE_SIMPLE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires:  CYGBLD_MEMALLOC_MALLOC_IMPLEMENTATION_HEADER ==  "<cyg/memalloc/memvar.hxx>" 
+    #     CYGBLD_MEMALLOC_MALLOC_IMPLEMENTATION_HEADER == <cyg/memalloc/dlmalloc.hxx>
+    #   --> 0
+    # Requires: CYGSEM_MEMALLOC_ALLOCATOR_VARIABLE_COALESCE
+    #     CYGSEM_MEMALLOC_ALLOCATOR_VARIABLE_COALESCE == 1
+    #   --> 1
+};
+
+# Doug Lea's malloc implementation
+# This causes malloc() to use a version of Doug Lea's
+# malloc (dlmalloc) as the underlying implementation.
+#
+cdl_option CYGIMP_MEMALLOC_MALLOC_DLMALLOC {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGBLD_MEMALLOC_MALLOC_IMPLEMENTATION_HEADER ==  "<cyg/memalloc/dlmalloc.hxx>" 
+    #     CYGBLD_MEMALLOC_MALLOC_IMPLEMENTATION_HEADER == <cyg/memalloc/dlmalloc.hxx>
+    #   --> 1
+};
+
+# <
+# Size of the fallback dynamic memory pool in bytes
+# If *no* heaps are configured in your memory layout,
+# dynamic memory allocation by
+# malloc() and calloc() must be from a fixed-size,
+# contiguous memory pool (note here that it is the
+# pool that is of a fixed size, but malloc() is still
+# able to allocate variable sized chunks of memory
+# from it). This option is the size
+# of that pool, in bytes. Note that not all of
+# this is available for programs to
+# use - some is needed for internal information
+# about memory regions, and some may be lost to
+# ensure that memory allocation only returns
+# memory aligned on word (or double word)
+# boundaries - a very common architecture
+# constraint.
+#
+cdl_option CYGNUM_MEMALLOC_FALLBACK_MALLOC_POOL_SIZE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 16384
+    # value_source default
+    # Default value: 16384
+    # Legal values: 32 to 0x7fffffff
+};
+
+# Common memory allocator package build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_MEMALLOC_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building this package. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_MEMALLOC_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building this package. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_MEMALLOC_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Tests
+# This option specifies the set of tests for this package.
+#
+cdl_option CYGPKG_MEMALLOC_TESTS {
+    # Calculated value:  "tests/dlmalloc1 tests/dlmalloc2 tests/heaptest tests/kmemfix1 tests/kmemvar1 tests/malloc1 tests/malloc2 tests/malloc3 tests/malloc4 tests/memfix1 tests/memfix2 tests/memvar1 tests/memvar2 tests/realloc tests/sepmeta1 tests/sepmeta2" 
+    # Flavor: data
+    # Current_value: tests/dlmalloc1 tests/dlmalloc2 tests/heaptest tests/kmemfix1 tests/kmemvar1 tests/malloc1 tests/malloc2 tests/malloc3 tests/malloc4 tests/memfix1 tests/memfix2 tests/memvar1 tests/memvar2 tests/realloc tests/sepmeta1 tests/sepmeta2
+};
+
+# <
+# <
+# ISO C and POSIX infrastructure
+# eCos supports implementations of ISO C libraries and POSIX
+# implementations. This package provides infrastructure used by
+# all such implementations.
+#
+cdl_package CYGPKG_ISOINFRA {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+
+    # The following properties are affected by this value
+    # component CYGPKG_IO_SERIAL_TERMIOS
+    #     Requires: CYGPKG_ISOINFRA
+    # component CYGPKG_IO_SERIAL_TERMIOS
+    #     DefaultValue:  0 != CYGPKG_ISOINFRA && 0 != CYGPKG_IO_FILEIO &&  0 != CYGINT_ISO_ERRNO_CODES &&  0 != CYGINT_ISO_ERRNO 
+    # option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_USE_MEMCPY
+    #     Requires: CYGPKG_ISOINFRA
+    # option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_USE_MEMCPY
+    #     DefaultValue:  (0 != CYGPKG_ISOINFRA) && (0 != CYGINT_ISO_STRING_MEMFUNCS) 
+    # component CYGPKG_MEMALLOC_MALLOC_ALLOCATORS
+    #     ActiveIf: CYGPKG_ISOINFRA
+    # package CYGPKG_LIBC_I18N
+    #     Requires: CYGPKG_ISOINFRA
+    # package CYGPKG_LIBC_SETJMP
+    #     Requires: CYGPKG_ISOINFRA
+    # package CYGPKG_LIBC_SIGNALS
+    #     Requires: CYGPKG_ISOINFRA
+    # package CYGPKG_LIBC_STARTUP
+    #     Requires: CYGPKG_ISOINFRA
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGPKG_ISOINFRA
+    # package CYGPKG_LIBC_STDLIB
+    #     Requires: CYGPKG_ISOINFRA
+    # package CYGPKG_LIBC_STRING
+    #     Requires: CYGPKG_ISOINFRA
+    # package CYGPKG_LIBC_TIME
+    #     Requires: CYGPKG_ISOINFRA
+};
+
+# >
+# Startup and termination
+#
+cdl_component CYGPKG_ISO_STARTUP {
+    # There is no associated value.
+};
+
+# >
+# main() startup implementations
+# Implementations of this interface arrange for a user-supplied
+# main() to be called in an ISO compatible environment.
+#
+cdl_interface CYGINT_ISO_MAIN_STARTUP {
+    # Implemented by CYGPKG_LIBC_STARTUP, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_MAIN_STARTUP 
+    #     CYGINT_ISO_MAIN_STARTUP == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_MAIN_STARTUP
+    #     Requires:  1 >= CYGINT_ISO_MAIN_STARTUP 
+};
+
+# environ implementations
+# Implementations of this interface provide the environ
+# variable required by POSIX.
+#
+cdl_interface CYGINT_ISO_ENVIRON {
+    # Implemented by CYGPKG_LIBC_STARTUP, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_ENVIRON 
+    #     CYGINT_ISO_ENVIRON == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_ENVIRON
+    #     Requires:  1 >= CYGINT_ISO_ENVIRON 
+};
+
+# <
+# ctype.h functions
+#
+cdl_component CYGPKG_ISO_CTYPE_H {
+    # There is no associated value.
+};
+
+# >
+# Number of implementations of ctype functions
+#
+cdl_interface CYGINT_ISO_CTYPE {
+    # Implemented by CYGPKG_LIBC_I18N, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_CTYPE 
+    #     CYGINT_ISO_CTYPE == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_CTYPE
+    #     Requires:  1 >= CYGINT_ISO_CTYPE 
+    # package CYGPKG_LIBC_STDLIB
+    #     Requires: CYGINT_ISO_CTYPE
+    # option CYGFUN_LIBC_STRING_BSD_FUNCS
+    #     Requires: CYGINT_ISO_CTYPE
+};
+
+# Ctype implementation header
+#
+cdl_option CYGBLD_ISO_CTYPE_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/i18n/ctype.inl>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # option CYGPKG_LIBC_I18N_NEWLIB_CTYPE
+    #     Requires:  CYGBLD_ISO_CTYPE_HEADER ==  "<cyg/libc/i18n/newlibctype.h>" 
+    # option CYGIMP_LIBC_I18N_CTYPE_INLINES
+    #     Requires:  CYGBLD_ISO_CTYPE_HEADER ==  "<cyg/libc/i18n/ctype.inl>" 
+};
+
+# <
+# Error handling
+#
+cdl_component CYGPKG_ISO_ERRNO {
+    # There is no associated value.
+};
+
+# >
+# Number of implementations of error codes
+#
+cdl_interface CYGINT_ISO_ERRNO_CODES {
+    # Implemented by CYGPKG_ERROR, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_ERRNO_CODES 
+    #     CYGINT_ISO_ERRNO_CODES == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_ERRNO_CODES
+    #     Requires:  1 >= CYGINT_ISO_ERRNO_CODES 
+    # component CYGPKG_IO_SERIAL_TERMIOS
+    #     Requires: CYGINT_ISO_ERRNO_CODES
+    # component CYGPKG_IO_SERIAL_TERMIOS
+    #     DefaultValue:  0 != CYGPKG_ISOINFRA && 0 != CYGPKG_IO_FILEIO &&  0 != CYGINT_ISO_ERRNO_CODES &&  0 != CYGINT_ISO_ERRNO 
+    # option CYGSEM_LIBC_SIGNALS_RAISE_SETS_ERRNO
+    #     Requires: CYGINT_ISO_ERRNO_CODES
+    # option CYGSEM_LIBC_SIGNALS_SIGNAL_SETS_ERRNO
+    #     Requires: CYGINT_ISO_ERRNO_CODES
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGINT_ISO_ERRNO_CODES
+};
+
+# Error codes implementation header
+#
+cdl_option CYGBLD_ISO_ERRNO_CODES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/error/codes.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_ERROR
+    #     Requires:  CYGBLD_ISO_ERRNO_CODES_HEADER == "<cyg/error/codes.h>" 
+};
+
+# Number of implementations of errno variable
+#
+cdl_interface CYGINT_ISO_ERRNO {
+    # Implemented by CYGPKG_ERROR_ERRNO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_ERRNO 
+    #     CYGINT_ISO_ERRNO == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_ERRNO
+    #     Requires:  1 >= CYGINT_ISO_ERRNO 
+    # component CYGPKG_IO_SERIAL_TERMIOS
+    #     Requires: CYGINT_ISO_ERRNO
+    # component CYGPKG_IO_SERIAL_TERMIOS
+    #     DefaultValue:  0 != CYGPKG_ISOINFRA && 0 != CYGPKG_IO_FILEIO &&  0 != CYGINT_ISO_ERRNO_CODES &&  0 != CYGINT_ISO_ERRNO 
+    # option CYGSEM_LIBC_SIGNALS_RAISE_SETS_ERRNO
+    #     Requires: CYGINT_ISO_ERRNO
+    # option CYGSEM_LIBC_SIGNALS_SIGNAL_SETS_ERRNO
+    #     Requires: CYGINT_ISO_ERRNO
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGINT_ISO_ERRNO
+};
+
+# errno variable implementation header
+#
+cdl_option CYGBLD_ISO_ERRNO_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/error/errno.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # component CYGPKG_ERROR_ERRNO
+    #     Requires:  CYGBLD_ISO_ERRNO_HEADER == "<cyg/error/errno.h>" 
+};
+
+# <
+# Locale-related functions
+#
+cdl_component CYGPKG_ISO_LOCALE {
+    # There is no associated value.
+};
+
+# >
+# Number of implementations of locale functions
+#
+cdl_interface CYGINT_ISO_LOCALE {
+    # Implemented by CYGPKG_LIBC_I18N, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_LOCALE 
+    #     CYGINT_ISO_LOCALE == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_LOCALE
+    #     Requires:  1 >= CYGINT_ISO_LOCALE 
+};
+
+# Locale implementation header
+#
+cdl_option CYGBLD_ISO_LOCALE_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Standard I/O-related functionality
+#
+cdl_component CYGPKG_ISO_STDIO {
+    # There is no associated value.
+};
+
+# >
+# Number of implementations of stdio file types
+#
+cdl_interface CYGINT_ISO_STDIO_FILETYPES {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_FILETYPES 
+    #     CYGINT_ISO_STDIO_FILETYPES == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_FILETYPES
+    #     Requires:  1 >= CYGINT_ISO_STDIO_FILETYPES 
+};
+
+# Stdio file types implementation header
+#
+cdl_option CYGBLD_ISO_STDIO_FILETYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_FILETYPES_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# Stdio standard streams implementations
+#
+cdl_interface CYGINT_ISO_STDIO_STREAMS {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_STREAMS 
+    #     CYGINT_ISO_STDIO_STREAMS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_STREAMS
+    #     Requires:  1 >= CYGINT_ISO_STDIO_STREAMS 
+};
+
+# Stdio standard streams implementation header
+# This header file must define stdin, stdout
+# and stderr.
+#
+cdl_option CYGBLD_ISO_STDIO_STREAMS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_STREAMS_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# Number of implementations of stdio file operations
+#
+cdl_interface CYGINT_ISO_STDIO_FILEOPS {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_FILEOPS 
+    #     CYGINT_ISO_STDIO_FILEOPS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_FILEOPS
+    #     Requires:  1 >= CYGINT_ISO_STDIO_FILEOPS 
+};
+
+# Stdio file operations implementation header
+# This header controls the file system operations on a file
+# such as remove(), rename(), tmpfile(), tmpnam() and associated
+# constants.
+#
+cdl_option CYGBLD_ISO_STDIO_FILEOPS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_FILEOPS_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# Number of implementations of stdio file access  functionals
+#
+cdl_interface CYGINT_ISO_STDIO_FILEACCESS {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_FILEACCESS 
+    #     CYGINT_ISO_STDIO_FILEACCESS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_FILEACCESS
+    #     Requires:  1 >= CYGINT_ISO_STDIO_FILEACCESS 
+    # option CYGSEM_LIBC_EXIT_CALLS_FFLUSH
+    #     Requires: CYGINT_ISO_STDIO_FILEACCESS
+    # option CYGSEM_LIBC_EXIT_CALLS_FFLUSH
+    #     DefaultValue:  0 != CYGINT_ISO_STDIO_FILEACCESS 
+};
+
+# Stdio file access implementation header
+# This header controls the file access operations
+# such as fclose(), fflush(), fopen(), freopen(), setbuf(),
+# setvbuf(), and associated constants.
+#
+cdl_option CYGBLD_ISO_STDIO_FILEACCESS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_FILEACCESS_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# Number of implementations of stdio formatted I/O
+#
+cdl_interface CYGINT_ISO_STDIO_FORMATTED_IO {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_FORMATTED_IO 
+    #     CYGINT_ISO_STDIO_FORMATTED_IO == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_FORMATTED_IO
+    #     Requires:  1 >= CYGINT_ISO_STDIO_FORMATTED_IO 
+};
+
+# Stdio formatted I/O implementation header
+#
+cdl_option CYGBLD_ISO_STDIO_FORMATTED_IO_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_FORMATTED_IO_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# Number of implementations of stdio character I/O
+#
+cdl_interface CYGINT_ISO_STDIO_CHAR_IO {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_CHAR_IO 
+    #     CYGINT_ISO_STDIO_CHAR_IO == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_CHAR_IO
+    #     Requires:  1 >= CYGINT_ISO_STDIO_CHAR_IO 
+};
+
+# Stdio character I/O implementation header
+#
+cdl_option CYGBLD_ISO_STDIO_CHAR_IO_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_CHAR_IO_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# Number of implementations of stdio direct I/O
+#
+cdl_interface CYGINT_ISO_STDIO_DIRECT_IO {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_DIRECT_IO 
+    #     CYGINT_ISO_STDIO_DIRECT_IO == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_DIRECT_IO
+    #     Requires:  1 >= CYGINT_ISO_STDIO_DIRECT_IO 
+};
+
+# Stdio direct I/O implementation header
+#
+cdl_option CYGBLD_ISO_STDIO_DIRECT_IO_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_DIRECT_IO_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# Number of implementations of stdio file positioning
+#
+cdl_interface CYGINT_ISO_STDIO_FILEPOS {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_FILEPOS 
+    #     CYGINT_ISO_STDIO_FILEPOS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_FILEPOS
+    #     Requires:  1 >= CYGINT_ISO_STDIO_FILEPOS 
+};
+
+# Stdio file positioning implementation header
+#
+cdl_option CYGBLD_ISO_STDIO_FILEPOS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_FILEPOS_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# Number of implementations of stdio error handling
+#
+cdl_interface CYGINT_ISO_STDIO_ERROR {
+    # Implemented by CYGPKG_LIBC_STDIO, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STDIO_ERROR 
+    #     CYGINT_ISO_STDIO_ERROR == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_ERROR
+    #     Requires:  1 >= CYGINT_ISO_STDIO_ERROR 
+};
+
+# Stdio error handling implementation header
+#
+cdl_option CYGBLD_ISO_STDIO_ERROR_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdio/stdio.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  CYGBLD_ISO_STDIO_ERROR_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+};
+
+# POSIX fd-related function implementations
+#
+cdl_interface CYGINT_ISO_STDIO_POSIX_FDFUNCS {
+    # Implemented by CYGFUN_LIBC_STDIO_OPEN_POSIX_FDFUNCS, inactive, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >=  CYGINT_ISO_STDIO_POSIX_FDFUNCS 
+    #     CYGINT_ISO_STDIO_POSIX_FDFUNCS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDIO_POSIX_FDFUNCS
+    #     Requires:  1 >=  CYGINT_ISO_STDIO_POSIX_FDFUNCS 
+};
+
+# POSIX fd-related function implementation header
+#
+cdl_option CYGBLD_ISO_STDIO_POSIX_FDFUNCS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Standard general utility functions
+#
+cdl_component CYGPKG_ISO_STDLIB {
+    # There is no associated value.
+};
+
+# >
+# String conversion function implementations
+#
+cdl_interface CYGINT_ISO_STDLIB_STRCONV {
+    # Implemented by CYGPKG_LIBC_STDLIB, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_STDLIB_STRCONV 
+    #     CYGINT_ISO_STDLIB_STRCONV == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDLIB_STRCONV
+    #     Requires:  1 >= CYGINT_ISO_STDLIB_STRCONV 
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGINT_ISO_STDLIB_STRCONV
+};
+
+# String conversion function implementation header
+#
+cdl_option CYGBLD_ISO_STDLIB_STRCONV_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdlib/atox.inl>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # option CYGIMP_LIBC_STDLIB_INLINE_ATOX
+    #     Requires:  CYGBLD_ISO_STDLIB_STRCONV_HEADER ==  "<cyg/libc/stdlib/atox.inl>" 
+};
+
+# String to FP conversion function implementations
+#
+cdl_interface CYGINT_ISO_STDLIB_STRCONV_FLOAT {
+    # Implemented by CYGFUN_LIBC_strtod, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_STDLIB_STRCONV_FLOAT 
+    #     CYGINT_ISO_STDLIB_STRCONV_FLOAT == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDLIB_STRCONV_FLOAT
+    #     Requires:  1 >= CYGINT_ISO_STDLIB_STRCONV_FLOAT 
+    # option CYGSEM_LIBC_STDIO_SCANF_FLOATING_POINT
+    #     Requires: CYGINT_ISO_STDLIB_STRCONV_FLOAT
+    # option CYGSEM_LIBC_STDIO_SCANF_FLOATING_POINT
+    #     DefaultValue:  0 != CYGPKG_LIBM &&
+    #                                 0 != CYGINT_ISO_STDLIB_STRCONV_FLOAT 
+};
+
+# String to FP conversion function implementation header
+#
+cdl_option CYGBLD_ISO_STDLIB_STRCONV_FLOAT_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Random number generator implementations
+#
+cdl_interface CYGINT_ISO_RAND {
+    # Implemented by CYGIMP_LIBC_RAND_SIMPLEST, active, disabled
+    # Implemented by CYGIMP_LIBC_RAND_SIMPLE1, active, enabled
+    # Implemented by CYGIMP_LIBC_RAND_KNUTH1, active, disabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_RAND 
+    #     CYGINT_ISO_RAND == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_RAND
+    #     Requires:  1 >= CYGINT_ISO_RAND 
+};
+
+# Random number generator implementation header
+#
+cdl_option CYGBLD_ISO_RAND_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Malloc implementations
+#
+cdl_interface CYGINT_ISO_MALLOC {
+    # Implemented by CYGPKG_MEMALLOC_MALLOC_ALLOCATORS, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_MALLOC 
+    #     CYGINT_ISO_MALLOC == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_MALLOC
+    #     Requires:  1 >= CYGINT_ISO_MALLOC 
+    # component CYGPKG_IO_SERIAL_TERMIOS
+    #     Requires: CYGINT_ISO_MALLOC
+    # option CYGSEM_LIBC_STDIO_SETVBUF_MALLOC
+    #     Requires: CYGINT_ISO_MALLOC
+    # option CYGSEM_LIBC_STDIO_SETVBUF_MALLOC
+    #     DefaultValue:  0 != CYGINT_ISO_MALLOC 
+    # component CYGPKG_LIBC_STDIO_OPEN
+    #     Requires: CYGINT_ISO_MALLOC
+    # component CYGPKG_LIBC_STDIO_OPEN
+    #     DefaultValue:  0 != CYGINT_ISO_MALLOC 
+    # option CYGFUN_LIBC_STRING_STRDUP
+    #     ActiveIf: CYGINT_ISO_MALLOC
+};
+
+# Malloc implementation header
+#
+cdl_option CYGBLD_ISO_MALLOC_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Mallinfo() implementations
+#
+cdl_interface CYGINT_ISO_MALLINFO {
+    # Implemented by CYGPKG_MEMALLOC_MALLOC_ALLOCATORS, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_MALLINFO 
+    #     CYGINT_ISO_MALLINFO == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_MALLINFO
+    #     Requires:  1 >= CYGINT_ISO_MALLINFO 
+};
+
+# Mallinfo() implementation header
+#
+cdl_option CYGBLD_ISO_MALLINFO_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Program exit functionality implementations
+#
+cdl_interface CYGINT_ISO_EXIT {
+    # Implemented by CYGPKG_LIBC_STARTUP, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_EXIT 
+    #     CYGINT_ISO_EXIT == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_EXIT
+    #     Requires:  1 >= CYGINT_ISO_EXIT 
+    # option CYGFUN_INFRA_DUMMY_ABORT
+    #     Requires: !CYGINT_ISO_EXIT
+    # option CYGFUN_INFRA_DUMMY_ABORT
+    #     DefaultValue:  CYGINT_ISO_EXIT == 0 
+};
+
+# Program exit functionality implementation header
+#
+cdl_option CYGBLD_ISO_EXIT_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Program environment implementations
+#
+cdl_interface CYGINT_ISO_STDLIB_ENVIRON {
+    # Implemented by CYGPKG_LIBC_STDLIB, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_STDLIB_ENVIRON 
+    #     CYGINT_ISO_STDLIB_ENVIRON == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDLIB_ENVIRON
+    #     Requires:  1 >= CYGINT_ISO_STDLIB_ENVIRON 
+};
+
+# Program environment implementation header
+#
+cdl_option CYGBLD_ISO_STDLIB_ENVIRON_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# system() implementations
+#
+cdl_interface CYGINT_ISO_STDLIB_SYSTEM {
+    # Implemented by CYGPKG_LIBC_STDLIB, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_STDLIB_SYSTEM 
+    #     CYGINT_ISO_STDLIB_SYSTEM == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDLIB_SYSTEM
+    #     Requires:  1 >= CYGINT_ISO_STDLIB_SYSTEM 
+};
+
+# system() implementation header
+#
+cdl_option CYGBLD_ISO_STDLIB_SYSTEM_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# bsearch() implementations
+#
+cdl_interface CYGINT_ISO_BSEARCH {
+    # Implemented by CYGPKG_LIBC_STDLIB, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_BSEARCH 
+    #     CYGINT_ISO_BSEARCH == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_BSEARCH
+    #     Requires:  1 >= CYGINT_ISO_BSEARCH 
+};
+
+# bsearch() implementation header
+#
+cdl_option CYGBLD_ISO_BSEARCH_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# qsort() implementations
+#
+cdl_interface CYGINT_ISO_QSORT {
+    # Implemented by CYGPKG_LIBC_STDLIB, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_STDLIB_QSORT 
+    #     CYGINT_ISO_STDLIB_QSORT (unknown) == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+};
+
+# qsort() implementation header
+#
+cdl_option CYGBLD_ISO_QSORT_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# abs()/labs() implementations
+#
+cdl_interface CYGINT_ISO_ABS {
+    # Implemented by CYGPKG_LIBC_STDLIB, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_STDLIB_ABS 
+    #     CYGINT_ISO_STDLIB_ABS (unknown) == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_TIME
+    #     Requires: CYGINT_ISO_ABS
+};
+
+# abs()/labs() implementation header
+#
+cdl_option CYGBLD_ISO_STDLIB_ABS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdlib/abs.inl>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # option CYGIMP_LIBC_STDLIB_INLINE_ABS
+    #     Requires:  CYGBLD_ISO_STDLIB_ABS_HEADER ==  "<cyg/libc/stdlib/abs.inl>" 
+};
+
+# div()/ldiv() implementations
+#
+cdl_interface CYGINT_ISO_DIV {
+    # Implemented by CYGPKG_LIBC_STDLIB, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_STDLIB_DIV 
+    #     CYGINT_ISO_STDLIB_DIV (unknown) == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_TIME
+    #     Requires: CYGINT_ISO_DIV
+};
+
+# div()/ldiv() implementation header
+#
+cdl_option CYGBLD_ISO_STDLIB_DIV_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/stdlib/div.inl>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # option CYGIMP_LIBC_STDLIB_INLINE_DIV
+    #     Requires:  CYGBLD_ISO_STDLIB_DIV_HEADER ==  "<cyg/libc/stdlib/div.inl>" 
+};
+
+# Header defining the implementation's MB_CUR_MAX
+#
+cdl_option CYGBLD_ISO_STDLIB_MB_CUR_MAX_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # interface CYGINT_LIBC_I18N_MB_REQUIRED
+    #     Requires:  CYGBLD_ISO_STDLIB_MB_CUR_MAX_HEADER ==  "<cyg/libc/i18n/mb.h>" 
+};
+
+# Multibyte character implementations
+#
+cdl_interface CYGINT_ISO_STDLIB_MULTIBYTE {
+    # Implemented by CYGPKG_LIBC_I18N, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_STDLIB_MULTIBYTE 
+    #     CYGINT_ISO_STDLIB_MULTIBYTE == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STDLIB_MULTIBYTE
+    #     Requires:  1 >= CYGINT_ISO_STDLIB_MULTIBYTE 
+};
+
+# Multibyte character implementation header
+#
+cdl_option CYGBLD_ISO_STDLIB_MULTIBYTE_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# String functions
+#
+cdl_component CYGPKG_ISO_STRING {
+    # There is no associated value.
+};
+
+# >
+# Number of implementations of strerror() function
+#
+cdl_interface CYGINT_ISO_STRERROR {
+    # Implemented by CYGPKG_ERROR_STRERROR, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STRERROR 
+    #     CYGINT_ISO_STRERROR == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STRERROR
+    #     Requires:  1 >= CYGINT_ISO_STRERROR 
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGINT_ISO_STRERROR
+};
+
+# strerror() implementation header
+#
+cdl_option CYGBLD_ISO_STRERROR_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/error/strerror.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # option CYGPKG_ERROR_STRERROR
+    #     Requires:  CYGBLD_ISO_STRERROR_HEADER == "<cyg/error/strerror.h>" 
+};
+
+# memcpy() implementation header
+#
+cdl_option CYGBLD_ISO_MEMCPY_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# memset() implementation header
+#
+cdl_option CYGBLD_ISO_MEMSET_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Number of implementations of strtok_r() function
+#
+cdl_interface CYGINT_ISO_STRTOK_R {
+    # Implemented by CYGPKG_LIBC_STRING, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STRTOK_R 
+    #     CYGINT_ISO_STRTOK_R == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STRTOK_R
+    #     Requires:  1 >= CYGINT_ISO_STRTOK_R 
+};
+
+# strtok_r() implementation header
+#
+cdl_option CYGBLD_ISO_STRTOK_R_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/string/string.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STRING
+    #     Requires:  CYGBLD_ISO_STRTOK_R_HEADER ==  "<cyg/libc/string/string.h>" 
+};
+
+# Number of implementations of locale-specific string  functions
+# This covers locale-dependent string functions such as strcoll()
+# and strxfrm().
+#
+cdl_interface CYGINT_ISO_STRING_LOCALE_FUNCS {
+    # Implemented by CYGPKG_LIBC_STRING, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STRING_LOCALE_FUNCS 
+    #     CYGINT_ISO_STRING_LOCALE_FUNCS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STRING_LOCALE_FUNCS
+    #     Requires:  1 >= CYGINT_ISO_STRING_LOCALE_FUNCS 
+};
+
+# Locale-specific string functions' implementation  header
+# This covers locale-dependent string functions such as strcoll()
+# and strxfrm().
+#
+cdl_option CYGBLD_ISO_STRING_LOCALE_FUNCS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/string/string.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STRING
+    #     Requires:  CYGBLD_ISO_STRING_LOCALE_FUNCS_HEADER ==  "<cyg/libc/string/string.h>" 
+};
+
+# Number of implementations of BSD string functions
+#
+cdl_interface CYGINT_ISO_STRING_BSD_FUNCS {
+    # Implemented by CYGFUN_LIBC_STRING_BSD_FUNCS, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STRING_BSD_FUNCS 
+    #     CYGINT_ISO_STRING_BSD_FUNCS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STRING_BSD_FUNCS
+    #     Requires:  1 >= CYGINT_ISO_STRING_BSD_FUNCS 
+    # option CYGFUN_LIBC_TIME_POSIX
+    #     Requires: CYGINT_ISO_STRING_BSD_FUNCS
+};
+
+# BSD string functions' implementation header
+#
+cdl_option CYGBLD_ISO_STRING_BSD_FUNCS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/string/bsdstring.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # option CYGFUN_LIBC_STRING_BSD_FUNCS
+    #     Requires:  CYGBLD_ISO_STRING_BSD_FUNCS_HEADER ==  "<cyg/libc/string/bsdstring.h>" 
+};
+
+# Number of implementations of other mem*() functions
+#
+cdl_interface CYGINT_ISO_STRING_MEMFUNCS {
+    # Implemented by CYGPKG_LIBC_STRING, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STRING_MEMFUNCS 
+    #     CYGINT_ISO_STRING_MEMFUNCS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STRING_MEMFUNCS
+    #     Requires:  1 >= CYGINT_ISO_STRING_MEMFUNCS 
+    # option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_USE_MEMCPY
+    #     Requires: CYGINT_ISO_STRING_MEMFUNCS
+    # option CYGIMP_MEMALLOC_ALLOCATOR_DLMALLOC_USE_MEMCPY
+    #     DefaultValue:  (0 != CYGPKG_ISOINFRA) && (0 != CYGINT_ISO_STRING_MEMFUNCS) 
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGINT_ISO_STRING_MEMFUNCS
+};
+
+# Other mem*() functions' implementation header
+#
+cdl_option CYGBLD_ISO_STRING_MEMFUNCS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/string/string.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STRING
+    #     Requires:  CYGBLD_ISO_STRING_MEMFUNCS_HEADER ==  "<cyg/libc/string/string.h>" 
+};
+
+# Number of implementations of other ISO C str*()  functions
+# This covers the other str*() functions defined by ISO C.
+#
+cdl_interface CYGINT_ISO_STRING_STRFUNCS {
+    # Implemented by CYGPKG_LIBC_STRING, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_STRING_STRFUNCS 
+    #     CYGINT_ISO_STRING_STRFUNCS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_STRING_STRFUNCS
+    #     Requires:  1 >= CYGINT_ISO_STRING_STRFUNCS 
+    # option CYGFUN_INFRA_DUMMY_STRLEN
+    #     Requires: !CYGINT_ISO_STRING_STRFUNCS
+    # option CYGFUN_INFRA_DUMMY_STRLEN
+    #     DefaultValue:  CYGINT_ISO_STRING_STRFUNCS == 0 
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGINT_ISO_STRING_STRFUNCS
+    # package CYGPKG_LIBC_STDLIB
+    #     Requires: CYGINT_ISO_STRING_STRFUNCS
+};
+
+# Other ISO C str*() functions' implementation  header
+# This covers the other str*() functions defined by ISO C.
+#
+cdl_option CYGBLD_ISO_STRING_STRFUNCS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/string/string.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STRING
+    #     Requires:  CYGBLD_ISO_STRING_STRFUNCS_HEADER ==  "<cyg/libc/string/string.h>" 
+};
+
+# <
+# Clock and time functionality
+#
+cdl_component CYGPKG_ISO_TIME {
+    # There is no associated value.
+};
+
+# >
+# time_t implementation header
+#
+cdl_option CYGBLD_ISO_TIME_T_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# clock_t implementation header
+#
+cdl_option CYGBLD_ISO_CLOCK_T_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# struct timeval implementation header
+#
+cdl_option CYGBLD_ISO_STRUCTTIMEVAL_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# fnmatch implementation header
+#
+cdl_option CYGBLD_ISO_FNMATCH_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Number of implementations of POSIX timer types
+#
+cdl_interface CYGINT_ISO_POSIX_TIMER_TYPES {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_POSIX_TIMER_TYPES 
+    #     CYGINT_ISO_POSIX_TIMER_TYPES == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_POSIX_TIMER_TYPES
+    #     Requires:  1 >= CYGINT_ISO_POSIX_TIMER_TYPES 
+};
+
+# POSIX timer types implementation header
+#
+cdl_option CYGBLD_ISO_POSIX_TIMER_TYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Number of implementations of POSIX clock types
+#
+cdl_interface CYGINT_ISO_POSIX_CLOCK_TYPES {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_POSIX_CLOCK_TYPES 
+    #     CYGINT_ISO_POSIX_CLOCK_TYPES == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_POSIX_CLOCK_TYPES
+    #     Requires:  1 >= CYGINT_ISO_POSIX_CLOCK_TYPES 
+};
+
+# POSIX clock types implementation header
+#
+cdl_option CYGBLD_ISO_POSIX_CLOCK_TYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Number of implementations of ISO C types
+#
+cdl_interface CYGINT_ISO_C_TIME_TYPES {
+    # Implemented by CYGPKG_LIBC_TIME, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_C_TIME_TYPES 
+    #     CYGINT_ISO_C_TIME_TYPES == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_C_TIME_TYPES
+    #     Requires:  1 >= CYGINT_ISO_C_TIME_TYPES 
+};
+
+# ISO C time types implementation header
+#
+cdl_option CYGBLD_ISO_C_TIME_TYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/time/time.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_TIME
+    #     Requires:  CYGBLD_ISO_C_TIME_TYPES_HEADER == "<cyg/libc/time/time.h>" 
+};
+
+# Number of implementations of POSIX timers
+#
+cdl_interface CYGINT_ISO_POSIX_TIMERS {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_POSIX_TIMERS 
+    #     CYGINT_ISO_POSIX_TIMERS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_POSIX_TIMERS
+    #     Requires:  1 >= CYGINT_ISO_POSIX_TIMERS 
+};
+
+# POSIX timer implementation header
+#
+cdl_option CYGBLD_ISO_POSIX_TIMERS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Number of implementations of POSIX clocks
+#
+cdl_interface CYGINT_ISO_POSIX_CLOCKS {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_POSIX_CLOCKS 
+    #     CYGINT_ISO_POSIX_CLOCKS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_POSIX_CLOCKS
+    #     Requires:  1 >= CYGINT_ISO_POSIX_CLOCKS 
+};
+
+# POSIX clocks implementation header
+#
+cdl_option CYGBLD_ISO_POSIX_CLOCKS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Number of implementations of ISO C clock functions
+#
+cdl_interface CYGINT_ISO_C_CLOCK_FUNCS {
+    # Implemented by CYGPKG_LIBC_TIME, active, enabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 1
+    # Requires:  1 >= CYGINT_ISO_C_CLOCK_FUNCS 
+    #     CYGINT_ISO_C_CLOCK_FUNCS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_C_CLOCK_FUNCS
+    #     Requires:  1 >= CYGINT_ISO_C_CLOCK_FUNCS 
+};
+
+# ISO C clock functions' implementation header
+#
+cdl_option CYGBLD_ISO_C_CLOCK_FUNCS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/time/time.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_TIME
+    #     Requires:  CYGBLD_ISO_C_CLOCK_FUNCS_HEADER ==  "<cyg/libc/time/time.h>" 
+};
+
+# Number of implementations of tzset() function
+#
+cdl_interface CYGINT_ISO_TZSET {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_TZSET 
+    #     CYGINT_ISO_TZSET == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_TZSET
+    #     Requires:  1 >= CYGINT_ISO_TZSET 
+};
+
+# tzset() implementation header
+#
+cdl_option CYGBLD_ISO_TZSET_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Signal functionality
+#
+cdl_component CYGPKG_ISO_SIGNAL {
+    # There is no associated value.
+};
+
+# >
+# Number of implementations of signal numbers
+#
+cdl_interface CYGINT_ISO_SIGNAL_NUMBERS {
+    # Implemented by CYGPKG_LIBC_SIGNALS, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_SIGNAL_NUMBERS 
+    #     CYGINT_ISO_SIGNAL_NUMBERS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_SIGNAL_NUMBERS
+    #     Requires:  1 >= CYGINT_ISO_SIGNAL_NUMBERS 
+    # option CYGSEM_IO_SERIAL_TERMIOS_USE_SIGNALS
+    #     Requires: CYGINT_ISO_SIGNAL_NUMBERS
+    # option CYGSEM_IO_SERIAL_TERMIOS_USE_SIGNALS
+    #     DefaultValue:  CYGINT_ISO_SIGNAL_NUMBERS != 0 &&  CYGINT_ISO_SIGNAL_IMPL != 0 
+};
+
+# Signal numbering implementation header
+# This header provides the mapping of signal
+# names (e.g. SIGBUS) to numbers.
+#
+cdl_option CYGBLD_ISO_SIGNAL_NUMBERS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/signals/signal.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_SIGNALS
+    #     Requires:  CYGBLD_ISO_SIGNAL_NUMBERS_HEADER ==  "<cyg/libc/signals/signal.h>" 
+};
+
+# Number of signal implementations
+#
+cdl_interface CYGINT_ISO_SIGNAL_IMPL {
+    # Implemented by CYGPKG_LIBC_SIGNALS, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_SIGNAL_IMPL 
+    #     CYGINT_ISO_SIGNAL_IMPL == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_SIGNAL_IMPL
+    #     Requires:  1 >= CYGINT_ISO_SIGNAL_IMPL 
+    # option CYGSEM_IO_SERIAL_TERMIOS_USE_SIGNALS
+    #     Requires: CYGINT_ISO_SIGNAL_IMPL
+    # option CYGSEM_IO_SERIAL_TERMIOS_USE_SIGNALS
+    #     DefaultValue:  CYGINT_ISO_SIGNAL_NUMBERS != 0 &&  CYGINT_ISO_SIGNAL_IMPL != 0 
+};
+
+# Signals implementation header
+#
+cdl_option CYGBLD_ISO_SIGNAL_IMPL_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/signals/signal.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_SIGNALS
+    #     Requires:  CYGBLD_ISO_SIGNAL_IMPL_HEADER ==  "<cyg/libc/signals/signal.h>" 
+};
+
+# POSIX real time signals feature test macro
+# This defines the POSIX feature test macro
+# that indicates that the POSIX real time signals
+# are present.
+#
+cdl_interface CYGINT_POSIX_REALTIME_SIGNALS {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_POSIX_REALTIME_SIGNALS 
+    #     CYGINT_POSIX_REALTIME_SIGNALS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_POSIX_REALTIME_SIGNALS
+    #     Requires:  1 >= CYGINT_POSIX_REALTIME_SIGNALS 
+};
+
+# <
+# Non-local jumps functionality
+#
+cdl_component CYGPKG_ISO_SETJMP {
+    # There is no associated value.
+};
+
+# >
+# setjmp() / longjmp() implementations
+#
+cdl_interface CYGINT_ISO_SETJMP {
+    # Implemented by CYGPKG_LIBC_SETJMP, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires:  1 >= CYGINT_ISO_SETJMP 
+    #     CYGINT_ISO_SETJMP == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_SETJMP
+    #     Requires:  1 >= CYGINT_ISO_SETJMP 
+};
+
+# setjmp() / longjmp() implementation header
+#
+cdl_option CYGBLD_ISO_SETJMP_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # The inferred value should not be edited directly.
+    inferred_value 1 <cyg/libc/setjmp/setjmp.h>
+    # value_source inferred
+    # Default value: 0 0
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_SETJMP
+    #     Requires:  CYGBLD_ISO_SETJMP_HEADER == "<cyg/libc/setjmp/setjmp.h>" 
+};
+
+# sigsetjmp() / siglongjmp() implementations
+#
+cdl_interface CYGINT_ISO_SIGSETJMP {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_SIGSETJMP 
+    #     CYGINT_ISO_SIGSETJMP == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_SIGSETJMP
+    #     Requires:  1 >= CYGINT_ISO_SIGSETJMP 
+};
+
+# sigsetjmp() / siglongjmp() implementation header
+#
+cdl_option CYGBLD_ISO_SIGSETJMP_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Assertions implementation header
+#
+cdl_option CYGBLD_ISO_ASSERT_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# POSIX file control
+# This covers the POSIX file control definitions,
+# normally found in <fcntl.h>
+#
+cdl_component CYGPKG_ISO_POSIX_FCNTL {
+    # There is no associated value.
+};
+
+# >
+# POSIX open flags implementation header
+#
+cdl_option CYGBLD_ISO_OFLAG_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# POSIX fcntl() implementations
+#
+cdl_interface CYGINT_ISO_FCNTL {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_FCNTL 
+    #     CYGINT_ISO_FCNTL == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_FCNTL
+    #     Requires:  1 >= CYGINT_ISO_FCNTL 
+};
+
+# POSIX fcntl() implementation header
+#
+cdl_option CYGBLD_ISO_FCNTL_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# POSIX file open implementations
+#
+cdl_interface CYGINT_ISO_OPEN {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_OPEN 
+    #     CYGINT_ISO_OPEN == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_OPEN
+    #     Requires:  1 >= CYGINT_ISO_OPEN 
+};
+
+# POSIX file open implementation header
+#
+cdl_option CYGBLD_ISO_OPEN_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# <sys/stat.h> definitions implementation header
+#
+cdl_option CYGBLD_ISO_STAT_DEFS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# POSIX directory reading implementation
+#
+cdl_interface CYGINT_ISO_DIRENT {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_DIRENT 
+    #     CYGINT_ISO_DIRENT == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_DIRENT
+    #     Requires:  1 >= CYGINT_ISO_DIRENT 
+};
+
+# <dirent.h> definitions implementation header
+#
+cdl_option CYGBLD_ISO_DIRENT_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# POSIX <sys/types.h> contents
+# This covers the types required by POSIX to be in
+# <sys/types.h>
+#
+cdl_component CYGPKG_ISO_POSIX_TYPES {
+    # There is no associated value.
+};
+
+# >
+# POSIX thread types implementations
+#
+cdl_interface CYGINT_ISO_PTHREADTYPES {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_PTHREADTYPES 
+    #     CYGINT_ISO_PTHREADTYPES == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_PTHREADTYPES
+    #     Requires:  1 >= CYGINT_ISO_PTHREADTYPES 
+    # interface CYGINT_ISO_PMUTEXTYPES
+    #     Requires:  1 >= CYGINT_ISO_PTHREADTYPES 
+};
+
+# POSIX thread types implementation header
+#
+cdl_option CYGBLD_ISO_PTHREADTYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# POSIX mutex types implementations
+#
+cdl_interface CYGINT_ISO_PMUTEXTYPES {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_PTHREADTYPES 
+    #     CYGINT_ISO_PTHREADTYPES == 0
+    #   --> 1
+};
+
+# POSIX mutex types implementation header
+#
+cdl_option CYGBLD_ISO_PMUTEXTYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# ssize_t implementation header
+#
+cdl_option CYGBLD_ISO_SSIZE_T_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Filesystem types implementation header
+#
+cdl_option CYGBLD_ISO_FSTYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# gid_t, pid_t, uid_t implementation header
+#
+cdl_option CYGBLD_ISO_SCHEDTYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Non-POSIX <sys/types.h> contents
+# This covers the extra types required by non-POSIX
+# packages to be in <sys/types.h>. These would normally
+# only be visible if _POSIX_SOURCE is not defined.
+#
+cdl_component CYGPKG_ISO_EXTRA_TYPES {
+    # There is no associated value.
+};
+
+# >
+# BSD compatible types
+#
+cdl_interface CYGINT_ISO_BSDTYPES {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_BSDTYPES 
+    #     CYGINT_ISO_BSDTYPES == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_BSDTYPES
+    #     Requires:  1 >= CYGINT_ISO_BSDTYPES 
+};
+
+# BSD types header
+#
+cdl_option CYGBLD_ISO_BSDTYPES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Utsname structure
+#
+cdl_component CYGPKG_ISO_UTSNAME {
+    # There is no associated value.
+};
+
+# >
+# Utsname header
+#
+cdl_option CYGBLD_ISO_UTSNAME_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# POSIX scheduler
+#
+cdl_component CYGPKG_ISO_SCHED {
+    # There is no associated value.
+};
+
+# >
+# POSIX scheduler implementations
+#
+cdl_interface CYGINT_ISO_SCHED_IMPL {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_SCHED_IMPL 
+    #     CYGINT_ISO_SCHED_IMPL == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_SCHED_IMPL
+    #     Requires:  1 >= CYGINT_ISO_SCHED_IMPL 
+};
+
+# POSIX scheduler implementation header
+#
+cdl_option CYGBLD_ISO_SCHED_IMPL_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# POSIX semaphores
+#
+cdl_component CYGPKG_ISO_SEMAPHORES {
+    # There is no associated value.
+};
+
+# >
+# POSIX semaphore implementations
+#
+cdl_interface CYGINT_ISO_SEMAPHORES {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_SEMAPHORES 
+    #     CYGINT_ISO_SEMAPHORES == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_SEMAPHORES
+    #     Requires:  1 >= CYGINT_ISO_SEMAPHORES 
+};
+
+# POSIX semaphore implementation header
+#
+cdl_option CYGBLD_ISO_SEMAPHORES_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# POSIX message queues
+#
+cdl_component CYGPKG_ISO_MQUEUE {
+    # There is no associated value.
+};
+
+# >
+# Implementations
+#
+cdl_interface CYGINT_ISO_MQUEUE {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_MQUEUE 
+    #     CYGINT_ISO_MQUEUE == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_MQUEUE
+    #     Requires:  1 >= CYGINT_ISO_MQUEUE 
+    # option CYGNUM_ISO_MQUEUE_OPEN_MAX
+    #     ActiveIf: CYGINT_ISO_MQUEUE
+    # option CYGNUM_ISO_MQUEUE_PRIO_MAX
+    #     ActiveIf: CYGINT_ISO_MQUEUE
+};
+
+# Implementation header
+#
+cdl_option CYGBLD_ISO_MQUEUE_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Maximum number of open message queues
+#
+cdl_option CYGNUM_ISO_MQUEUE_OPEN_MAX {
+    # This option is not active
+    # ActiveIf constraint: CYGINT_ISO_MQUEUE
+    #     CYGINT_ISO_MQUEUE == 0
+    #   --> 0
+
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value:  CYGNUM_POSIX_MQUEUE_OPEN_MAX > 0 ? CYGNUM_POSIX_MQUEUE_OPEN_MAX : 0 
+    #     CYGNUM_POSIX_MQUEUE_OPEN_MAX (unknown) == 0
+    #     CYGNUM_POSIX_MQUEUE_OPEN_MAX (unknown) == 0
+    #   --> 0 0
+};
+
+# Maximum number of message priorities
+#
+cdl_option CYGNUM_ISO_MQUEUE_PRIO_MAX {
+    # This option is not active
+    # ActiveIf constraint: CYGINT_ISO_MQUEUE
+    #     CYGINT_ISO_MQUEUE == 0
+    #   --> 0
+
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 1 65535
+    # value_source default
+    # Default value: 1 65535
+};
+
+# <
+# POSIX threads
+#
+cdl_component CYGPKG_ISO_PTHREAD {
+    # There is no associated value.
+};
+
+# >
+# POSIX pthread implementations
+#
+cdl_interface CYGINT_ISO_PTHREAD_IMPL {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_PTHREAD_IMPL 
+    #     CYGINT_ISO_PTHREAD_IMPL == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_PTHREAD_IMPL
+    #     Requires:  1 >= CYGINT_ISO_PTHREAD_IMPL 
+};
+
+# POSIX pthread implementation header
+#
+cdl_option CYGBLD_ISO_PTHREAD_IMPL_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# POSIX mutex/cond var implementations
+#
+cdl_interface CYGINT_ISO_PTHREAD_MUTEX {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_PTHREAD_MUTEX 
+    #     CYGINT_ISO_PTHREAD_MUTEX == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_PTHREAD_MUTEX
+    #     Requires:  1 >= CYGINT_ISO_PTHREAD_MUTEX 
+};
+
+# POSIX mutex/cond var implementation header
+#
+cdl_option CYGBLD_ISO_PTHREAD_MUTEX_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Limits
+#
+cdl_component CYGPKG_ISO_LIMITS {
+    # There is no associated value.
+};
+
+# >
+# POSIX pthread limits implementations
+#
+cdl_interface CYGINT_ISO_POSIX_LIMITS {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_POSIX_LIMITS 
+    #     CYGINT_ISO_POSIX_LIMITS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_POSIX_LIMITS
+    #     Requires:  1 >= CYGINT_ISO_POSIX_LIMITS 
+};
+
+# POSIX pthread limits implementation header
+#
+cdl_option CYGBLD_ISO_POSIX_LIMITS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# OPEN_MAX implementation header
+#
+cdl_option CYGBLD_ISO_OPEN_MAX_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# LINK_MAX implementation header
+#
+cdl_option CYGBLD_ISO_LINK_MAX_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# NAME_MAX implementation header
+#
+cdl_option CYGBLD_ISO_NAME_MAX_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# PATH_MAX implementation header
+#
+cdl_option CYGBLD_ISO_PATH_MAX_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# POSIX termios
+#
+cdl_component CYGPKG_ISO_TERMIOS {
+    # There is no associated value.
+};
+
+# >
+# POSIX termios implementations
+#
+cdl_interface CYGINT_ISO_TERMIOS {
+    # Implemented by CYGPKG_IO_SERIAL_TERMIOS, active, disabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_TERMIOS 
+    #     CYGINT_ISO_TERMIOS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_TERMIOS
+    #     Requires:  1 >= CYGINT_ISO_TERMIOS 
+};
+
+# POSIX termios implementation header
+#
+cdl_option CYGBLD_ISO_TERMIOS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Dynamic load API
+#
+cdl_component CYGPKG_ISO_DLFCN {
+    # There is no associated value.
+};
+
+# >
+# Dynamic load implementations
+#
+cdl_interface CYGINT_ISO_DLFCN {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+    # Requires:  1 >= CYGINT_ISO_DLFCN 
+    #     CYGINT_ISO_DLFCN == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_DLFCN
+    #     Requires:  1 >= CYGINT_ISO_DLFCN 
+};
+
+# Dynamic load implementation header
+#
+cdl_option CYGBLD_ISO_DLFCN_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# UNIX standard functions
+#
+cdl_component CYGPKG_ISO_UNISTD {
+    # There is no associated value.
+};
+
+# >
+# POSIX timer operations implementations
+#
+cdl_interface CYGINT_ISO_POSIX_TIMER_OPS {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_POSIX_TIMER_OPS 
+    #     CYGINT_ISO_POSIX_TIMER_OPS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_POSIX_TIMER_OPS
+    #     Requires:  1 >= CYGINT_ISO_POSIX_TIMER_OPS 
+};
+
+# POSIX timer operations implementation header
+#
+cdl_option CYGBLD_ISO_POSIX_TIMER_OPS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# POSIX sleep() implementations
+#
+cdl_interface CYGINT_ISO_POSIX_SLEEP {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_POSIX_SLEEP 
+    #     CYGINT_ISO_POSIX_SLEEP == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_POSIX_SLEEP
+    #     Requires:  1 >= CYGINT_ISO_POSIX_SLEEP 
+};
+
+# POSIX sleep() implementation header
+#
+cdl_option CYGBLD_ISO_POSIX_SLEEP_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# select()/poll() functions
+#
+cdl_component CYGPKG_ISO_SELECT {
+    # There is no associated value.
+};
+
+# >
+# select() implementations
+#
+cdl_interface CYGINT_ISO_SELECT {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_SELECT 
+    #     CYGINT_ISO_SELECT == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_SELECT
+    #     Requires:  1 >= CYGINT_ISO_SELECT 
+};
+
+# select() implementation header
+#
+cdl_option CYGBLD_ISO_SELECT_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# poll() implementations
+#
+cdl_interface CYGINT_ISO_POLL {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  1 >= CYGINT_ISO_POLL 
+    #     CYGINT_ISO_POLL == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_POLL
+    #     Requires:  1 >= CYGINT_ISO_POLL 
+};
+
+# poll() implementation header
+#
+cdl_option CYGBLD_ISO_POLL_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# NetDB utility functions
+#
+cdl_component CYGPKG_ISO_NETDB {
+    # There is no associated value.
+};
+
+# >
+# DNS implementations
+#
+cdl_interface CYGINT_ISO_DNS {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: bool
+    # Current value: 0
+    # Requires:  1 >= CYGINT_ISO_DNS 
+    #     CYGINT_ISO_DNS == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_DNS
+    #     Requires:  1 >= CYGINT_ISO_DNS 
+};
+
+# DNS implementation header
+#
+cdl_option CYGBLD_ISO_DNS_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Protocol network database implementations
+#
+cdl_interface CYGINT_ISO_NETDB_PROTO {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: bool
+    # Current value: 0
+    # Requires:  1 >= CYGINT_ISO_NETDB_PROTO 
+    #     CYGINT_ISO_NETDB_PROTO == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_NETDB_PROTO
+    #     Requires:  1 >= CYGINT_ISO_NETDB_PROTO 
+};
+
+# Protocol network database implementation header
+#
+cdl_option CYGBLD_ISO_NETDB_PROTO_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# Services network database implementations
+#
+cdl_interface CYGINT_ISO_NETDB_SERV {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: bool
+    # Current value: 0
+    # Requires:  1 >= CYGINT_ISO_NETDB_SERV 
+    #     CYGINT_ISO_NETDB_SERV == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_ISO_NETDB_SERV
+    #     Requires:  1 >= CYGINT_ISO_NETDB_SERV 
+};
+
+# Services network database implementation header
+#
+cdl_option CYGBLD_ISO_NETDB_SERV_HEADER {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 0 0
+    # value_source default
+    # Default value: 0 0
+};
+
+# <
+# Build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_ISOINFRA_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the ISO C and POSIX infrastructure package.
+# These flags are used in addition to the set of global flags.
+#
+cdl_option CYGPKG_ISOINFRA_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the ISO C and POSIX infrastructure package.
+# These flags are removed from the set of global flags
+# if present.
+#
+cdl_option CYGPKG_ISOINFRA_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# <
+# <
+# ISO C library
+# doc: ref/libc.html
+# The packages under this package enable compatibility with the ISO C
+# standard - ISO/IEC 9899:1990. This allows the user application to use
+# well known standard C library functions, and in eCos starts a thread
+# to invoke the user function main(). This package is a top-level placeholder
+# to contain the implementations.
+#
+cdl_package CYGPKG_LIBC {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+
+    # The following properties are affected by this value
+    # component CYGNUM_LIBM_COMPATIBILITY
+    #     Requires: CYGPKG_LIBC
+};
+
+# >
+# ISO C library internationalization functions
+# doc: ref/libc.html
+# This package provides internationalization functions specified by the
+# ISO C standard - ISO/IEC 9899:1990. These include locale-related
+# functionality and <ctype.h> functionality.
+#
+cdl_package CYGPKG_LIBC_I18N {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires: CYGPKG_LIBC_I18N
+};
+
+# >
+# Supported locales
+# These options determine which locales other than the "C" locale
+# are supported and hence contribute to the size of the executable.
+#
+cdl_component CYGPKG_LIBC_I18N_LOCALES {
+    # There is no associated value.
+};
+
+# >
+# Support for multiple locales required
+#
+cdl_interface CYGINT_LIBC_I18N_MB_REQUIRED {
+    # Implemented by CYGFUN_LIBC_I18N_LOCALE_C_SJIS, active, disabled
+    # Implemented by CYGFUN_LIBC_I18N_LOCALE_C_JIS, active, disabled
+    # Implemented by CYGFUN_LIBC_I18N_LOCALE_C_EUCJP, active, disabled
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 0 0
+    # Requires:  CYGBLD_ISO_STDLIB_MB_CUR_MAX_HEADER ==  "<cyg/libc/i18n/mb.h>" 
+    #     CYGBLD_ISO_STDLIB_MB_CUR_MAX_HEADER == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+};
+
+# C-SJIS locale support
+# This option controls if the "C-SJIS" locale will be
+# supported by setlocale().  The locale is a hybrid locale
+# that is mostly the "C" locale with Japanese SJIS multibyte
+# support added.
+#
+cdl_option CYGFUN_LIBC_I18N_LOCALE_C_SJIS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGNUM_LIBC_I18N_MAX_LOCALE_NAME_SIZE
+    #     LegalValues:  (CYGFUN_LIBC_I18N_LOCALE_C_EUCJP ? 8 :  (CYGFUN_LIBC_I18N_LOCALE_C_SJIS ? 7 :   (CYGFUN_LIBC_I18N_LOCALE_C_JIS ? 6 : 2))) to 0x7fffffff 
+    # option CYGNUM_LIBC_I18N_MAX_LOCALE_NAME_SIZE
+    #     DefaultValue:  (CYGFUN_LIBC_I18N_LOCALE_C_EUCJP ? 8 :  (CYGFUN_LIBC_I18N_LOCALE_C_SJIS ? 7 :   (CYGFUN_LIBC_I18N_LOCALE_C_JIS ? 6 : 2)))  
+};
+
+# C-JIS locale support
+# This option controls if the "C-JIS" locale will be
+# supported by setlocale().  The locale is a hybrid locale
+# that is mostly the "C" locale with Japanese JIS multibyte
+# support added.
+#
+cdl_option CYGFUN_LIBC_I18N_LOCALE_C_JIS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGNUM_LIBC_I18N_MAX_LOCALE_NAME_SIZE
+    #     LegalValues:  (CYGFUN_LIBC_I18N_LOCALE_C_EUCJP ? 8 :  (CYGFUN_LIBC_I18N_LOCALE_C_SJIS ? 7 :   (CYGFUN_LIBC_I18N_LOCALE_C_JIS ? 6 : 2))) to 0x7fffffff 
+    # option CYGNUM_LIBC_I18N_MAX_LOCALE_NAME_SIZE
+    #     DefaultValue:  (CYGFUN_LIBC_I18N_LOCALE_C_EUCJP ? 8 :  (CYGFUN_LIBC_I18N_LOCALE_C_SJIS ? 7 :   (CYGFUN_LIBC_I18N_LOCALE_C_JIS ? 6 : 2)))  
+};
+
+# C-EUCJP locale support
+# This option controls if the "C-EUCJP" locale will be
+# supported by setlocale().  The locale is a hybrid locale
+# that is mostly the "C" locale with Japanese EUCJP multibyte
+# support added.
+#
+cdl_option CYGFUN_LIBC_I18N_LOCALE_C_EUCJP {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGNUM_LIBC_I18N_MAX_LOCALE_NAME_SIZE
+    #     LegalValues:  (CYGFUN_LIBC_I18N_LOCALE_C_EUCJP ? 8 :  (CYGFUN_LIBC_I18N_LOCALE_C_SJIS ? 7 :   (CYGFUN_LIBC_I18N_LOCALE_C_JIS ? 6 : 2))) to 0x7fffffff 
+    # option CYGNUM_LIBC_I18N_MAX_LOCALE_NAME_SIZE
+    #     DefaultValue:  (CYGFUN_LIBC_I18N_LOCALE_C_EUCJP ? 8 :  (CYGFUN_LIBC_I18N_LOCALE_C_SJIS ? 7 :   (CYGFUN_LIBC_I18N_LOCALE_C_JIS ? 6 : 2)))  
+};
+
+# <
+# Newlib's ctype implementation
+# This option enables the implementation of the ctype functions
+# that comes with newlib. It is table driven and therefore
+# exhibits different performance characteristics. It also offers
+# a limited amount of binary compatibility
+# with newlib so that programs linked against newlib ctype/locale
+# do not need to be recompiled when linked with eCos.
+#
+cdl_option CYGPKG_LIBC_I18N_NEWLIB_CTYPE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires:  CYGBLD_ISO_CTYPE_HEADER ==  "<cyg/libc/i18n/newlibctype.h>" 
+    #     CYGBLD_ISO_CTYPE_HEADER == <cyg/libc/i18n/ctype.inl>
+    #   --> 0
+};
+
+# Per-thread multibyte state
+# This option controls whether the multibyte character
+# handling functions mblen(), mbtowc(), and wctomb(),
+# have their state recorded on a per-thread
+# basis rather than global. If this option is
+# disabled, some per-thread space can be saved.
+# Enabling this option will use three slots
+# of kernel per-thread data. You should ensure you
+# have enough slots configured for all your
+# per-thread data.
+#
+cdl_option CYGSEM_LIBC_I18N_PER_THREAD_MB {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  CYGVAR_KERNEL_THREADS_DATA != 0 
+    #     CYGVAR_KERNEL_THREADS_DATA == 1
+    #   --> 1
+    # Requires: CYGVAR_KERNEL_THREADS_DATA
+    #     CYGVAR_KERNEL_THREADS_DATA == 1
+    #   --> 1
+};
+
+# Size of locale name strings
+# This option controls the maximum size of
+# locale names and is used, among other things
+# to instantiate a static string used
+# as a return value from the
+# setlocale() function. When requesting the
+# current locale settings with LC_ALL, a string
+# must be constructed to contain this data, rather
+# than just returning a constant string. This
+# string data is stored in the static string.
+# This depends on the length of locale names,
+# hence this option. If just the C locale is
+# present, this option can be set as low as 2.
+#
+cdl_option CYGNUM_LIBC_I18N_MAX_LOCALE_NAME_SIZE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 2
+    # value_source default
+    # Default value:  (CYGFUN_LIBC_I18N_LOCALE_C_EUCJP ? 8 :  (CYGFUN_LIBC_I18N_LOCALE_C_SJIS ? 7 :   (CYGFUN_LIBC_I18N_LOCALE_C_JIS ? 6 : 2)))  
+    #     CYGFUN_LIBC_I18N_LOCALE_C_EUCJP == 0
+    #     CYGFUN_LIBC_I18N_LOCALE_C_SJIS == 0
+    #     CYGFUN_LIBC_I18N_LOCALE_C_JIS == 0
+    #   --> 2
+    # Legal values:  (CYGFUN_LIBC_I18N_LOCALE_C_EUCJP ? 8 :  (CYGFUN_LIBC_I18N_LOCALE_C_SJIS ? 7 :   (CYGFUN_LIBC_I18N_LOCALE_C_JIS ? 6 : 2))) to 0x7fffffff 
+    #     CYGFUN_LIBC_I18N_LOCALE_C_EUCJP == 0
+    #     CYGFUN_LIBC_I18N_LOCALE_C_SJIS == 0
+    #     CYGFUN_LIBC_I18N_LOCALE_C_JIS == 0
+};
+
+# Inline versions of <ctype.h> functions
+# This option chooses whether the simple character
+# classification and conversion functions (e.g.
+# isupper(), isalpha(), toupper(), etc.)
+# from <ctype.h> are available as inline
+# functions. This may improve performance and as
+# the functions are small, may even improve code
+# size.
+#
+cdl_option CYGIMP_LIBC_I18N_CTYPE_INLINES {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGBLD_ISO_CTYPE_HEADER ==  "<cyg/libc/i18n/ctype.inl>" 
+    #     CYGBLD_ISO_CTYPE_HEADER == <cyg/libc/i18n/ctype.inl>
+    #   --> 1
+};
+
+# C library i18n functions build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBC_I18N_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBC_I18N_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBC_I18N_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# C library i18n function tests
+# This option specifies the set of tests for the C library
+# i18n functions.
+#
+cdl_option CYGPKG_LIBC_I18N_TESTS {
+    # Calculated value:  "tests/ctype tests/setlocale tests/i18nmb" 
+    # Flavor: data
+    # Current_value: tests/ctype tests/setlocale tests/i18nmb
+};
+
+# <
+# <
+# ISO C library setjmp/longjmp functions
+# doc: ref/libc.html
+# This package provides non-local jumps based on setjmp() and
+# longjmp() in <setjmp.h> as specified by the ISO C
+# standard - ISO/IEC 9899:1990.
+#
+cdl_package CYGPKG_LIBC_SETJMP {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+    # Requires:  CYGBLD_ISO_SETJMP_HEADER == "<cyg/libc/setjmp/setjmp.h>" 
+    #     CYGBLD_ISO_SETJMP_HEADER == <cyg/libc/setjmp/setjmp.h>
+    #   --> 1
+};
+
+# >
+# C library setjmp build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBC_SETJMP_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building this package. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBC_SETJMP_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building this package. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBC_SETJMP_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# C library setjmp tests
+# This option specifies the set of tests for this package.
+#
+cdl_option CYGPKG_LIBC_SETJMP_TESTS {
+    # Calculated value:  "tests/setjmp" 
+    # Flavor: data
+    # Current_value: tests/setjmp
+};
+
+# <
+# <
+# ISO C library signal functions
+# doc: ref/libc.html
+# This component controls signal functionality,
+# as implemented in ISO/IEC 9899:1990 chapter 7.7 with
+# the signal() and raise() functions. As well as
+# allowing a program to send itself signals, it is
+# also possible to cause hardware exceptions to
+# be signalled to the program in a similar way.
+#
+cdl_package CYGPKG_LIBC_SIGNALS {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires:  CYGBLD_ISO_SIGNAL_NUMBERS_HEADER ==  "<cyg/libc/signals/signal.h>" 
+    #     CYGBLD_ISO_SIGNAL_NUMBERS_HEADER == <cyg/libc/signals/signal.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_SIGNAL_IMPL_HEADER ==  "<cyg/libc/signals/signal.h>" 
+    #     CYGBLD_ISO_SIGNAL_IMPL_HEADER == <cyg/libc/signals/signal.h>
+    #   --> 1
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+};
+
+# >
+# Thread safe signals
+# Because signal handlers are global, and not
+# thread-specific (as mandated by POSIX 1003.1)
+# it is possible for multiple threads to clash
+# and corrupt data if setting the same signal
+# handler at the same time. With this option
+# enabled, a kernel mutex will be used to protect
+# the shared data.
+#
+cdl_option CYGSEM_LIBC_SIGNALS_THREAD_SAFE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+};
+
+# Hardware exceptions cause signals
+# This causes hardware exceptions like
+# arithmetic exceptions (e.g. divide by zero)
+# or bad memory accesses to be passed through as
+# signals. It is thus possible for a program to
+# handle these exceptions in a generic way using
+# the appropriate signal handlers. The details of
+# exactly which exceptions are passed through
+# under what circumstances depend on the
+# underlying HAL implementation. Consequently it
+# must be remembered that signal handlers cannot
+# be guaranteed to be invoked in the expected
+# circumstances if you do not know about the
+# underlying HAL implementation - it is possible
+# that the architecture is unable to detect that
+# exception.
+#
+cdl_component CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGSEM_KERNEL_EXCEPTIONS_GLOBAL
+    #     CYGSEM_KERNEL_EXCEPTIONS_GLOBAL == 1
+    #   --> 1
+    # Requires: CYGSEM_KERNEL_EXCEPTIONS_DECODE
+    #     CYGSEM_KERNEL_EXCEPTIONS_DECODE == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGPKG_LIBC_SIGNALS_TESTS
+    #     Calculated:  
+    #                     "tests/signal1"
+    #                     . ((CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS) ? " tests/signal2" : "")
+    #                 
+};
+
+# >
+# Chain old exception handlers
+# When hardware exceptions are generated, it
+# is possible to chain into the old kernel exception
+# handler before calling any registered signal
+# handler. If this is not required, disable this
+# option and only the signal handler will be
+# called when this exception occurs. Disabling
+# this option will also save some space and code
+# usage.
+#
+cdl_option CYGSEM_LIBC_SIGNALS_CHAIN_HWEXCEPTIONS {
+    # This option is not active
+    # The parent CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Inline versions of functions
+# Some functions can be made inline instead of
+# being function calls. These can be set here.
+#
+cdl_component CYGPKG_LIBC_SIGNALS_INLINE {
+    # There is no associated value.
+};
+
+# >
+# raise()
+# Enabling this option makes raise() an inline function.
+#
+cdl_option CYGIMP_LIBC_SIGNALS_RAISE_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# signal()
+# Enabling this option makes signal() an inline function.
+#
+cdl_option CYGIMP_LIBC_SIGNALS_SIGNAL_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# <
+# Error handling
+# You may or may not want errno to be set by
+# certain functions. Not using errno could save
+# both space, code, and avoid worrying about
+# interactions between multiple threads when
+# setting it.
+#
+cdl_component CYGPKG_LIBC_SIGNALS_ERROR_HANDLING {
+    # There is no associated value.
+};
+
+# >
+# Bad signal fatal
+# Enabling this option will cause an assertion
+# failure if the signal handling code is
+# passed a bad signal. Otherwise an error will
+# be returned, or in the case of a
+# hardware-generated exception it will be silently
+# ignored.
+#
+cdl_option CYGSEM_LIBC_SIGNALS_BAD_SIGNAL_FATAL {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGDBG_USE_ASSERTS
+    #     CYGDBG_USE_ASSERTS == 0
+    #   --> 0
+};
+
+# raise() sets errno
+# You may or may not want errno to be set by
+# raise() on error conditions. Not using errno
+# could save both space, code, and avoid worrying
+# about interactions between multiple threads when
+# setting it. Strictly ISO C does not mandate
+# that errno be set by raise().
+#
+cdl_option CYGSEM_LIBC_SIGNALS_RAISE_SETS_ERRNO {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGINT_ISO_ERRNO
+    #     CYGINT_ISO_ERRNO == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_ERRNO_CODES
+    #     CYGINT_ISO_ERRNO_CODES == 1
+    #   --> 1
+};
+
+# signal() sets errno
+# You may or may not want errno to be set by
+# signal() on error conditions. Not using errno
+# could save both space, code, and avoid worrying
+# about interactions between multiple threads when
+# setting it. Strictly ISO C mandates
+# that errno be set by signal().
+#
+cdl_option CYGSEM_LIBC_SIGNALS_SIGNAL_SETS_ERRNO {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGINT_ISO_ERRNO
+    #     CYGINT_ISO_ERRNO == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_ERRNO_CODES
+    #     CYGINT_ISO_ERRNO_CODES == 1
+    #   --> 1
+};
+
+# <
+# Tracing
+# These options control the trace output for the C
+# library internal signal implementation.
+#
+cdl_component CYGPKG_LIBC_SIGNALS_TRACING {
+    # There is no associated value.
+};
+
+# >
+# Default trace level for raise()
+# This gives the default tracing level for the
+# raise() function. Higher numbers are more
+# verbose.
+#
+cdl_option CYGNUM_LIBC_SIGNALS_RAISE_TRACE_LEVEL {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+};
+
+# Default hardware exception handler trace level
+# This gives the default tracing level for the
+# hardware exception handler function (if enabled).
+# Higher numbers are more verbose.
+#
+cdl_option CYGNUM_LIBC_SIGNALS_HWHANDLER_TRACE_LEVEL {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+};
+
+# <
+# C library signal functions build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBC_SIGNALS_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBC_SIGNALS_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBC_SIGNALS_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# C library signal function tests
+# This option specifies the set of tests for the C library
+# signal functions.
+#
+cdl_option CYGPKG_LIBC_SIGNALS_TESTS {
+    # Calculated value:  
+    #                     "tests/signal1"
+    #                     . ((CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS) ? " tests/signal2" : "")
+    #                 
+    #     CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS == 0
+    # Flavor: data
+    # Current_value: tests/signal1
+};
+
+# <
+# <
+# ISO environment startup/termination
+# doc: ref/c-library-startup.html
+# This package manages the control of the
+# environment (in the general sense) that an
+# application would require for full ISO C / POSIX
+# compatibility, including a main() entry point
+# supplied with arguments and an environment
+# (as retrievable by the getenv() function).
+# It also includes at the other end of things,
+# what happens when main() returns or exit() is
+# called.
+#
+cdl_package CYGPKG_LIBC_STARTUP {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+    # Requires:  CYGINT_LIBC_STARTUP_CONTEXT == 1 
+    #     CYGINT_LIBC_STARTUP_CONTEXT == 1
+    #   --> 1
+};
+
+# >
+# main() can be invoked elsewhere
+# Implementors of this interface show that they
+# allow main() to be invoked elsewhere.
+#
+cdl_interface CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: bool
+    # Current value: 0
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBC_STARTUP_MAIN_INITCONTEXT
+    #     DefaultValue:  0 == CYGPKG_KERNEL && 0 == 
+    #                                 CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE 
+    # component CYGSEM_LIBC_STARTUP_MAIN_THREAD
+    #     DefaultValue:  0 != CYGPKG_KERNEL && 0 ==  CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE 
+    # option CYGSEM_LIBC_STARTUP_MAIN_OTHER
+    #     DefaultValue:  0 !=  CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE 
+    # option CYGSEM_LIBC_STARTUP_MAIN_OTHER
+    #     Requires: CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE
+};
+
+# Arguments to main()
+# This option allows the setting of the arguments
+# to the main function. This only has any effect
+# when cyg_iso_c_start() is used to start the
+# ISO C compatibility. This will automatically
+# invoke main() in an ISO C compatible fashion.
+# This option is in fact used as argv, and so is
+# an n-tuple of string constants. The final
+# entry must be NULL. Conventionally if argv[0]
+# is supplied, it is used to inform the program
+# of its name.
+#
+cdl_option CYGDAT_LIBC_ARGUMENTS {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "{(char *)\"\", (char *)NULL}"
+    # value_source default
+    # Default value: "{(char *)\"\", (char *)NULL}"
+};
+
+# Startup context for main()
+# This component describes the options available for
+# what context main() is invoked in, such as in a thread
+# etc.
+#
+cdl_component CYGPKG_LIBC_STARTUP_CONTEXT {
+    # There is no associated value.
+};
+
+# >
+# Startup context implementors
+#
+cdl_interface CYGINT_LIBC_STARTUP_CONTEXT {
+    # Implemented by CYGSEM_LIBC_STARTUP_MAIN_INITCONTEXT, active, disabled
+    # Implemented by CYGSEM_LIBC_STARTUP_MAIN_THREAD, active, enabled
+    # Implemented by CYGSEM_LIBC_STARTUP_MAIN_OTHER, active, disabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STARTUP
+    #     Requires:  CYGINT_LIBC_STARTUP_CONTEXT == 1 
+};
+
+# Invoked from initialization context
+# With this option selected, main() will be
+# called via cyg_user_start() (unless the program
+# overrides the default cyg_user_start()). This
+# means it is run in the context of the system
+# initialization code, without the eCos kernel
+# scheduler running, and using the startup stack.
+# This means that any functions that may require 
+# interactions with a running kernel will not
+# work (including libc functions, if configured
+# to be thread safe for example), so you should
+# restrict yourself to only calling fully
+# re-entrant functions from within main() in
+# this case.
+#
+cdl_option CYGSEM_LIBC_STARTUP_MAIN_INITCONTEXT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  0 == CYGPKG_KERNEL && 0 == 
+    #                                 CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE 
+    #     CYGPKG_KERNEL == current
+    #     CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE == 0
+    #   --> 0
+};
+
+# Invoked as eCos thread
+# With this option selected, main() is invoked from an eCos
+# thread.
+#
+cdl_component CYGSEM_LIBC_STARTUP_MAIN_THREAD {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  0 != CYGPKG_KERNEL && 0 ==  CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE 
+    #     CYGPKG_KERNEL == current
+    #     CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE == 0
+    #   --> 1
+    # Requires: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBC_INVOKE_DEFAULT_STATIC_CONSTRUCTORS
+    #     Requires:  CYGSEM_LIBC_STARTUP_MAIN_THREAD ||  (CYGSEM_LIBC_STARTUP_MAIN_OTHER && CYGPKG_POSIX_PTHREAD) 
+};
+
+# >
+# System provides stack for main()'s thread
+# This option controls whether the stack of
+# main()'s thread is provided by the application or
+# provided by the system. When disabled, the
+# application must declare a pointer variable
+# cyg_libc_main_stack which is a pointer to an
+# appropriately aligned region of memory. The
+# application must also declare a variable of
+# type `int' called cyg_libc_main_stack_size
+# which contains the size of the stack in bytes.
+# This must be a multiple of 8.
+#
+cdl_option CYGSEM_LIBC_MAIN_STACK_FROM_SYSTEM {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Priority of main()'s thread
+# This option is used to provide the thread
+# priority which main()'s thread runs at. Be
+# sure to check that this number is appropriate
+# for the kernel scheduler chosen. Different
+# kernel schedulers impose different restrictions
+# on the usable priorities.
+#
+cdl_option CYGNUM_LIBC_MAIN_THREAD_PRIORITY {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 10
+    # value_source default
+    # Default value: 10
+    # Legal values: 0 to 0x7fffffff
+};
+
+# <
+# Invoked elsewhere
+# With this option selected, main() must be
+# invoked by a separate package, or by the user.
+#
+cdl_option CYGSEM_LIBC_STARTUP_MAIN_OTHER {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  0 !=  CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE 
+    #     CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE == 0
+    #   --> 0
+    # Requires: CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE
+    #     CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE == 0
+    #   --> 0
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBC_INVOKE_DEFAULT_STATIC_CONSTRUCTORS
+    #     Requires:  CYGSEM_LIBC_STARTUP_MAIN_THREAD ||  (CYGSEM_LIBC_STARTUP_MAIN_OTHER && CYGPKG_POSIX_PTHREAD) 
+};
+
+# <
+# Don't allow main()'s stack size to be set
+# This interface describes whether the stack size
+# value set in this package is supported by the
+# implementation that invokes main. If not, that
+# option is disabled.
+#
+cdl_interface CYGINT_LIBC_STARTUP_MAIN_NO_STACK_SIZE {
+    # Implemented by CYGSEM_LIBC_STARTUP_MAIN_INITCONTEXT, active, disabled
+    # This value cannot be modified here.
+    # Flavor: bool
+    # Current value: 0
+
+    # The following properties are affected by this value
+    # option CYGNUM_LIBC_MAIN_DEFAULT_STACK_SIZE
+    #     ActiveIf: !CYGINT_LIBC_STARTUP_MAIN_NO_STACK_SIZE
+};
+
+# main()'s default thread stack size
+# This option sets the size of the stack used
+# in the context that invokes main(). For example,
+# with an eCos kernel, when the cyg_iso_c_start()
+# function is used to invoke the user-supplied
+# main() function in an ISO C compatible fashion,
+# a separate thread is created to call main().
+# This option controls the size of that thread's
+# stack, which is allocated in the BSS. It
+# must be a multiple of 8. Note, a low number
+# here may be overriden by the HAL if there is
+# a minimum requirement to process interrupts
+# etc. This option cannot be set if the implementation
+# that invokes main() does not use it.
+#
+cdl_option CYGNUM_LIBC_MAIN_DEFAULT_STACK_SIZE {
+    # ActiveIf constraint: !CYGINT_LIBC_STARTUP_MAIN_NO_STACK_SIZE
+    #     CYGINT_LIBC_STARTUP_MAIN_NO_STACK_SIZE == 0
+    #   --> 1
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 8192
+    # value_source default
+    # Default value: 8192
+    # Legal values: 16 to 0x7fffffff
+};
+
+# Include atexit() function
+# This option enables the use of the atexit()
+# function, and ensure that the atexit handlers
+# are invoked from within exit() as defined in
+# the ISO C standard.
+#
+cdl_component CYGFUN_LIBC_ATEXIT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# >
+# Number of functions atexit() supports
+# This option sets the number of functions
+# that atexit() has room for. In other words,
+# the number of separate atexit() calls that
+# can be made before calling exit() or returning
+# from main() ( in an environment controlled by
+# cyg_iso_c_start() ). For strict compliance
+# with the ISO C standard this should be at
+# least 32.
+#
+cdl_option CYGNUM_LIBC_ATEXIT_HANDLERS {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 32
+    # value_source default
+    # Default value: 32
+    # Legal values: 1 to 0x7fffffff
+};
+
+# <
+# Make exit() call fflush()
+# This option will ensure that all output
+# streams are flushed when exitting using
+# exit() as prescribed by the ISO C standard.
+#
+cdl_option CYGSEM_LIBC_EXIT_CALLS_FFLUSH {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  0 != CYGINT_ISO_STDIO_FILEACCESS 
+    #     CYGINT_ISO_STDIO_FILEACCESS == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_STDIO_FILEACCESS
+    #     CYGINT_ISO_STDIO_FILEACCESS == 1
+    #   --> 1
+};
+
+# _exit() stops all threads
+# If this option is enabled then _exit(),
+# which is called from exit() which itself is
+# called on return from main(), stops the eCos
+# scheduler. For strict POSIX 1003.1
+# compatibility this would be the normal
+# behaviour. To allow the thread to simply
+# exit, without affecting other threads, simply
+# leave this option disabled. If there is no eCos
+# scheduler, then _exit() simply loops
+# irrespective of the setting of this option.
+#
+cdl_option CYGSEM_LIBC_EXIT_STOPS_SYSTEM {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+};
+
+# Default environment
+# This option allows the setting of the default
+# contents of the environment. This is in fact
+# the contents of the global environment pointer
+# char **environ defined by POSIX 1003.1. Strings
+# must be of the form NAME=VALUE, and the final
+# entry must be NULL.
+#
+cdl_option CYGDAT_LIBC_DEFAULT_ENVIRONMENT {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value "{ NULL }"
+    # value_source default
+    # Default value: "{ NULL }"
+};
+
+# Invoke default static constructors
+# This option causes the C library to call
+# static constructors with default priority
+# from within the context of the main() thread,
+# working with the co-operation of the HAL.
+# This may be needed for environments that
+# expect static constructors to be run in a
+# thread context. Note that this uses an object
+# with priority 65534. Therefore do not use
+# priority 65534 for any other static objects
+# with this option enabled.
+#
+cdl_option CYGSEM_LIBC_INVOKE_DEFAULT_STATIC_CONSTRUCTORS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
+    #     CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG == 0
+    #   --> 0
+    # Requires:  CYGSEM_LIBC_STARTUP_MAIN_THREAD ||  (CYGSEM_LIBC_STARTUP_MAIN_OTHER && CYGPKG_POSIX_PTHREAD) 
+    #     CYGSEM_LIBC_STARTUP_MAIN_THREAD == 1
+    #     CYGSEM_LIBC_STARTUP_MAIN_OTHER == 0
+    #     CYGPKG_POSIX_PTHREAD (unknown) == 0
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
+    #     Requires: CYGSEM_LIBC_INVOKE_DEFAULT_STATIC_CONSTRUCTORS
+};
+
+# ISO environment startup/termination build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBC_STARTUP_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building this package. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBC_STARTUP_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building this package. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBC_STARTUP_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# ISO environment startup/termination tests
+# This option specifies the set of tests for this package.
+#
+cdl_option CYGPKG_LIBC_STARTUP_TESTS {
+    # Calculated value:  "tests/atexit" 
+    # Flavor: data
+    # Current_value: tests/atexit
+};
+
+# <
+# <
+# ISO C library standard input/output functions
+# doc: ref/libc.html
+# This package provides standard input/output functions associated
+# with the header file <stdio.h> as specified by the
+# ISO C standard - ISO/IEC 9899:1990.
+#
+cdl_package CYGPKG_LIBC_STDIO {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_IO
+    #     CYGPKG_IO == current
+    #   --> 1
+    # Requires: CYGPKG_LIBC_I18N
+    #     CYGPKG_LIBC_I18N == current
+    #   --> 1
+    # Requires:  (CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE == "\"/dev/ttydiag\"" ?  CYGPKG_IO_SERIAL_HALDIAG : 1) 
+    #     CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE == "\"/dev/tty0\""
+    #     CYGPKG_IO_SERIAL_HALDIAG == 1
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_FILETYPES_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_FILETYPES_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_FILEACCESS_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_FILEACCESS_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_FILEPOS_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_FILEPOS_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_FILEOPS_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_FILEOPS_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_FORMATTED_IO_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_FORMATTED_IO_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_CHAR_IO_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_CHAR_IO_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_DIRECT_IO_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_DIRECT_IO_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_ERROR_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_ERROR_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STDIO_STREAMS_HEADER ==  "<cyg/libc/stdio/stdio.h>" 
+    #     CYGBLD_ISO_STDIO_STREAMS_HEADER == <cyg/libc/stdio/stdio.h>
+    #   --> 1
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+    # Requires: CYGINT_ISO_ERRNO_CODES
+    #     CYGINT_ISO_ERRNO_CODES == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_ERRNO
+    #     CYGINT_ISO_ERRNO == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_STRERROR
+    #     CYGINT_ISO_STRERROR == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_STRING_STRFUNCS
+    #     CYGINT_ISO_STRING_STRFUNCS == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_STRING_MEMFUNCS
+    #     CYGINT_ISO_STRING_MEMFUNCS == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_STDLIB_STRCONV
+    #     CYGINT_ISO_STDLIB_STRCONV == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBM_USE_STDERR
+    #     Requires: CYGPKG_LIBC_STDIO
+};
+
+# >
+# Inline versions of <stdio.h> functions
+# This option chooses whether some of the
+# particularly simple functions from
+# <stdio.h> are available as inline
+# functions. This may improve performance, and as
+# the functions are small, may even improve code
+# size.
+#
+cdl_option CYGIMP_LIBC_STDIO_INLINES {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Permitted number of open files
+# This option controls the guaranteed minimum
+# number of simultaneously open files. The ISO
+# C standard requires it to be defined (para
+# 7.9.1), and if strictly compliant, it must be
+# at least 8 (para 7.9.3). In practice it can be
+# as low as 3 - for stdin, stdout and stderr.
+#
+cdl_option FOPEN_MAX {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 8
+    # value_source default
+    # Default value: 8
+    # Legal values: 3 to 0x7fffffff
+};
+
+# Maximum length of filename
+# This option defines the maximum allowed size of
+# a filename in characters. The ISO C standard
+# requires it to be defined (para 7.9.1).
+#
+cdl_option FILENAME_MAX {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 16
+    # value_source default
+    # Default value: 16
+    # Legal values: 1 to 0x7fffffff
+};
+
+# Maximum length of filenames for temporary files
+# This option defines the maximum allowed size of
+# filenames for temporary files as generated by
+# tmpnam(). It is measured in characters, and the
+# ISO C standard requires it to be defined (para 
+# 7.9.1).
+#
+cdl_option L_tmpnam {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 16
+    # value_source default
+    # Default value: 16
+    # Legal values: 4 to 0x7fffffff
+};
+
+# Unique file names generated by tmpnam()
+# This option defines the minimum number of
+# unique file names generated by tmpnam(). The
+# ISO C standard requires it to be defined (para
+# 7.9.1) and for ISO compliance it should be at least
+# 25. Note that TMP_MAX names may not be generated
+# if L_tmpnam is too small.
+#
+cdl_option TMP_MAX {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 25
+    # value_source default
+    # Default value: 25
+    # Legal values: 1 to 0x7fffffff
+};
+
+# Buffered I/O
+# This option controls whether input/output
+# through the <stdio.h> functions is buffered.
+# This may save some memory per file. It
+# is equivalent to putting every file into
+# non-buffered mode (_IONBF) through setvbuf(),
+# except now it can never be altered back to
+# buffered mode. Disabling buffering is strictly 
+# non-compliant with the ISO C standard.
+#
+cdl_component CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option BUFSIZ
+    #     Calculated: CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO ? CYGNUM_LIBC_STDIO_BUFSIZE : 0
+    # option CYGPKG_LIBC_STDIO_FILEIO
+    #     Requires: CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
+};
+
+# >
+# Default buffer size
+# This option defines the default size of buffer
+# used with calls to setbuf(), and is the default
+# size for buffered streams that have not had
+# either setbuf() or setvbuf() invoked on them.
+# It is exactly equivalent to the standard
+# constant BUFSIZ, except that it is 0 if
+# CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO is disabled.
+# The ISO C standard requires this to be defined
+# (para 7.9.1), and says it must be at least 256
+# (para 7.9.2).
+#
+cdl_option CYGNUM_LIBC_STDIO_BUFSIZE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 256
+    # value_source default
+    # Default value: 256
+    # Legal values: 1 to 0x7fffffff
+
+    # The following properties are affected by this value
+    # option BUFSIZ
+    #     Calculated: CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO ? CYGNUM_LIBC_STDIO_BUFSIZE : 0
+};
+
+# setbuf()/setvbuf() allows dynamic setting
+# This option controls whether I/O buffers are
+# implemented dynamically within the stdio
+# implementation. Otherwise they will be static,
+# and cannot be changed by setbuf()/setvbuf(). If
+# they are static (i.e. this option is disabled),
+# any attempt to use an arbitrary buffer size, or
+# to pass a user-supplied buffer to setbuf() or
+# setvbuf() will fail - the buffer is implemented
+# internally as a static array taking the size
+# of the configuration option BUFSIZ. The only
+# exception is if a user buffer is not supplied,
+# and the buffer size requested is less than
+# BUFSIZ. In this case, the buffer will
+# be configured to only use that amount of
+# buffering. However the unused memory left over
+# will NOT be freed. If this option is enabled,
+# then setvbuf() can be used to assign a user supplied
+# buffer to the stream.
+# Either setting can be considered to
+# be compliant with the ISO C standard.
+#
+cdl_option CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBC_STDIO_SETVBUF_MALLOC
+    #     Requires: CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF
+    # option CYGPKG_LIBC_STDIO_FILEIO
+    #     Requires: CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF
+};
+
+# setbuf()/setvbuf() uses malloc()
+# This option controls whether buffers set by setbuf() and
+# setvbuf() may be allocated using malloc().
+#
+cdl_option CYGSEM_LIBC_STDIO_SETVBUF_MALLOC {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  0 != CYGINT_ISO_MALLOC 
+    #     CYGINT_ISO_MALLOC == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_MALLOC
+    #     CYGINT_ISO_MALLOC == 1
+    #   --> 1
+    # Requires: CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF
+    #     CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF == 1
+    #   --> 1
+};
+
+# <
+# Default buffer size (BUFSIZ)
+#
+cdl_option BUFSIZ {
+    # Calculated value: CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO ? CYGNUM_LIBC_STDIO_BUFSIZE : 0
+    #     CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO == 1
+    #     CYGNUM_LIBC_STDIO_BUFSIZE == 256
+    # Flavor: data
+    # Current_value: 256
+};
+
+# Support for ungetc()
+# This option controls whether ungetc() is
+# supported. If not, then some space can be
+# saved, and speed is improved. Note that you
+# MUST have this defined if you want to use the
+# scanf() family of functions.
+#
+cdl_option CYGFUN_LIBC_STDIO_ungetc {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Dynamic opening/closing of files
+# fopen() and fclose() use dynamic memory
+# allocation routines to allocate memory for
+# new FILE structure pointers. If a malloc
+# implementation is available, this option
+# may be enabled to use
+# fopen() and fclose(). If disabled, only the
+# default console streams - stdin, stdout and
+# stderr - will be available.
+#
+cdl_component CYGPKG_LIBC_STDIO_OPEN {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  0 != CYGINT_ISO_MALLOC 
+    #     CYGINT_ISO_MALLOC == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_MALLOC
+    #     CYGINT_ISO_MALLOC == 1
+    #   --> 1
+};
+
+# >
+# POSIX fdopen/fileno functions
+# This identifies to the rest of the system
+# whether the POSIX fdopen() and
+# fileno() functions are implemented.
+#
+cdl_option CYGFUN_LIBC_STDIO_OPEN_POSIX_FDFUNCS {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_LIBC_STDIO_FILEIO
+    #     CYGPKG_LIBC_STDIO_FILEIO == 0
+    #   --> 0
+
+    # Calculated value: 1
+    # Flavor: bool
+    # Current value: 1
+};
+
+# <
+# Default console device
+# This option allows you to choose the
+# default console device. In the current
+# implementation, all these devices begin
+# with the prefix /dev/ and are followed by
+# the name of a device. The name of the device
+# depends on the device drivers you have
+# configured in your system. For example,
+# /dev/ttydiag could be the HAL diagnostic output
+# pseudo-device, or /dev/tty0 could be your
+# first serial driver, depending on your
+# configuration.
+#
+cdl_option CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE {
+    # Flavor: data
+    user_value "\"/dev/tty0\""
+    # value_source user
+    # Default value:  CYGDAT_IO_SERIAL_TTY_CONSOLE ? CYGDAT_IO_SERIAL_TTY_CONSOLE : "\"/dev/null\"" 
+    #     CYGDAT_IO_SERIAL_TTY_CONSOLE == "\"/dev/ttydiag\""
+    #     CYGDAT_IO_SERIAL_TTY_CONSOLE == "\"/dev/ttydiag\""
+    #   --> "\"/dev/ttydiag\""
+
+    # The following properties are affected by this value
+    # package CYGPKG_LIBC_STDIO
+    #     Requires:  (CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE == "\"/dev/ttydiag\"" ?  CYGPKG_IO_SERIAL_HALDIAG : 1) 
+};
+
+# Floating point support
+# This component allows floating point support
+# to be enabled in certain standard I/O
+# functions.
+#
+cdl_component CYGPKG_LIBC_STDIO_FLOATING_POINT {
+    # There is no associated value.
+};
+
+# >
+# printf() family
+# This option enables the use of floating point
+# number output in the printf() family (i.e.
+# printf(), sprintf(), vprintf(), etc.) of
+# functions. A substantial amount of code space
+# can be saved if this option is disabled. If it
+# is disabled then floating point specifiers
+# (%e, %f, %g) are ignored, and nothing is
+# output.
+#
+cdl_option CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  0 != CYGPKG_LIBM 
+    #     CYGPKG_LIBM == current
+    #   --> 1
+    # Requires: CYGPKG_LIBM
+    #     CYGPKG_LIBM == current
+    #   --> 1
+};
+
+# scanf() family
+# This option enables the use of floating point
+# number conversion in the scanf() family (i.e.
+# scanf(), sscanf(), vscanf(), etc.) of
+# functions. A substantial amount of code space
+# can be saved if this option is disabled. If it
+# is disabled then floating point specifiers
+# (%e, %f, %g) are ignored, and nothing is
+# converted.
+#
+cdl_option CYGSEM_LIBC_STDIO_SCANF_FLOATING_POINT {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  0 != CYGPKG_LIBM &&
+    #                                 0 != CYGINT_ISO_STDLIB_STRCONV_FLOAT 
+    #     CYGPKG_LIBM == current
+    #     CYGINT_ISO_STDLIB_STRCONV_FLOAT == 1
+    #   --> 1
+    # Requires: CYGPKG_LIBM
+    #     CYGPKG_LIBM == current
+    #   --> 1
+    # Requires: CYGINT_ISO_STDLIB_STRCONV_FLOAT
+    #     CYGINT_ISO_STDLIB_STRCONV_FLOAT == 1
+    #   --> 1
+};
+
+# <
+# Long long support
+# This option allows various functions in the C Standard I/O
+# library to support the 'long long' datatype. Doing so
+# will come with a noticeable code size penalty however.
+#
+cdl_option CYGFUN_LIBC_STDIO_LONGLONG {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGFUN_LIBC_STDLIB_CONV_LONGLONG
+    #     CYGFUN_LIBC_STDLIB_CONV_LONGLONG == 1
+    #   --> 1
+};
+
+# Thread safe I/O streams
+# doc: ref/libc-thread-safety.html
+# This option controls whether standard I/O streams
+# are thread-safe. Having this option set allows
+# the streams to be locked when accessed by
+# multiple threads simultaneously.
+#
+cdl_option CYGSEM_LIBC_STDIO_THREAD_SAFE_STREAMS {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# C99 compliant snprintf() family
+# This option allows C99 compliant implementation of 
+# snprintf() family (i.e. snprintf(), vsnprintf()) 
+# of functions. C99 compliant snprintf() functions
+# return the number of characters that would have been written 
+# to a sufficiently sized buffer (excluding the '\0'). 
+# If this option is disabled, the functions simply return 
+# the number of bytes that have been written to the buffer.
+#
+cdl_option CYGIMP_LIBC_STDIO_C99_SNPRINTF {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Enable use of FILEIO package for IO operations.
+# This CDL exists to control how the standard I/O functions
+# interface to the underlying I/O system. Either using the
+# File I/O package, or the generic I/O package which is used
+# by fewer devices.
+#
+cdl_option CYGPKG_LIBC_STDIO_FILEIO {
+    # This option is not active
+    # ActiveIf constraint: CYGPKG_IO_FILEIO
+    #     CYGPKG_IO_FILEIO (unknown) == 0
+    #   --> 0
+
+    # Calculated value: 1
+    # Flavor: bool
+    # Current value: 1
+    # Requires: CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
+    #     CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO == 1
+    #   --> 1
+    # Requires: CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF
+    #     CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGFUN_LIBC_STDIO_OPEN_POSIX_FDFUNCS
+    #     ActiveIf: CYGPKG_LIBC_STDIO_FILEIO
+};
+
+# C library stdio functions build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBC_STDIO_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBC_STDIO_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBC_STDIO_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# C library stdio function tests
+# This option specifies the set of tests for the C library
+# stdio functions.
+#
+cdl_option CYGPKG_LIBC_STDIO_TESTS {
+    # Calculated value:  
+    #                     "tests/sprintf1 tests/sprintf2 tests/snprintf tests/sscanf tests/stdiooutput " 
+    #                     . ((CYGPKG_IO_FILEIO && CYGPKG_FS_RAM) ? "tests/fileio " : "")
+    #                 
+    #     CYGPKG_IO_FILEIO (unknown) == 0
+    #     CYGPKG_FS_RAM (unknown) == 0
+    # Flavor: data
+    # Current_value: tests/sprintf1 tests/sprintf2 tests/snprintf tests/sscanf tests/stdiooutput 
+};
+
+# <
+# <
+# ISO C library general utility functions
+# doc: ref/libc.html
+# This package provides general utility functions in <stdlib.h>
+# as specified by the ISO C standard - ISO/IEC 9899:1990.
+#
+cdl_package CYGPKG_LIBC_STDLIB {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+    # Requires: CYGINT_ISO_CTYPE
+    #     CYGINT_ISO_CTYPE == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_STRING_STRFUNCS
+    #     CYGINT_ISO_STRING_STRFUNCS == 1
+    #   --> 1
+};
+
+# >
+# Inline versions of <stdlib.h> functions
+# This option chooses whether some of the
+# particularly simple standard utility functions
+# from <stdlib.h> are available as inline
+# functions. This may improve performance, and as
+# the functions are small, may even improve code
+# size.
+#
+cdl_component CYGIMP_LIBC_STDLIB_INLINES {
+    # There is no associated value.
+};
+
+# >
+# abs() / labs()
+#
+cdl_option CYGIMP_LIBC_STDLIB_INLINE_ABS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGBLD_ISO_STDLIB_ABS_HEADER ==  "<cyg/libc/stdlib/abs.inl>" 
+    #     CYGBLD_ISO_STDLIB_ABS_HEADER == <cyg/libc/stdlib/abs.inl>
+    #   --> 1
+};
+
+# div() / ldiv()
+#
+cdl_option CYGIMP_LIBC_STDLIB_INLINE_DIV {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGBLD_ISO_STDLIB_DIV_HEADER ==  "<cyg/libc/stdlib/div.inl>" 
+    #     CYGBLD_ISO_STDLIB_DIV_HEADER == <cyg/libc/stdlib/div.inl>
+    #   --> 1
+};
+
+# atof() / atoi() / atol()
+#
+cdl_option CYGIMP_LIBC_STDLIB_INLINE_ATOX {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGBLD_ISO_STDLIB_STRCONV_HEADER ==  "<cyg/libc/stdlib/atox.inl>" 
+    #     CYGBLD_ISO_STDLIB_STRCONV_HEADER == <cyg/libc/stdlib/atox.inl>
+    #   --> 1
+};
+
+# <
+# Random number generation
+# These options control the behaviour of the
+# functions rand(), srand() and rand_r()
+#
+cdl_component CYGPKG_LIBC_RAND {
+    # There is no associated value.
+};
+
+# >
+# Per-thread random seed
+# doc: ref/libc-thread-safety.html
+# This option controls whether the pseudo-random
+# number generation functions rand() and srand()
+# have their state recorded on a per-thread
+# basis rather than global. If this option is
+# disabled, some per-thread space can be saved.
+# Note there is also a POSIX-standard rand_r()
+# function to achieve a similar effect with user
+# support. Enabling this option will use one slot
+# of kernel per-thread data. You should ensure you
+# have enough slots configured for all your
+# per-thread data.
+#
+cdl_option CYGSEM_LIBC_PER_THREAD_RAND {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGVAR_KERNEL_THREADS_DATA
+    #     CYGVAR_KERNEL_THREADS_DATA == 1
+    #   --> 1
+};
+
+# Random number seed
+# This selects the initial random number seed for
+# rand()'s pseudo-random number generator. For
+# strict ISO standard compliance, this should be 1,
+# as per section 7.10.2.2 of the standard.
+#
+cdl_option CYGNUM_LIBC_RAND_SEED {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Legal values: 0 to 0x7fffffff
+};
+
+# Tracing level
+# Trace verbosity level for debugging the rand(),
+# srand() and rand_r() functions. Increase this
+# value to get additional trace output.
+#
+cdl_option CYGNUM_LIBC_RAND_TRACE_LEVEL {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+};
+
+# Simplest implementation
+# This provides a very simple implementation of rand()
+# that does not perform well with randomness in the
+# lower significant bits. However it is exceptionally
+# fast. It uses the sample algorithm from the ISO C
+# standard itself.
+#
+cdl_option CYGIMP_LIBC_RAND_SIMPLEST {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Simple implementation #1
+# This provides a very simple implementation of rand()
+# based on the simplest implementation above. However
+# it does try to work around the lack of randomness
+# in the lower significant bits, at the expense of a
+# little speed.
+#
+cdl_option CYGIMP_LIBC_RAND_SIMPLE1 {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Knuth implementation #1
+# This implements a slightly more complex algorithm
+# published in Donald E. Knuth's Art of Computer
+# Programming Vol.2 section 3.6 (p.185 in the 3rd ed.).
+# This produces better random numbers than the
+# simplest approach but is slower.
+#
+cdl_option CYGIMP_LIBC_RAND_KNUTH1 {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# <
+# Provides strtod()
+# This option allows use of the utility function
+# strtod() (and consequently atof()) to convert
+# from string to double precision floating point
+# numbers. Disabling this option removes the
+# dependency on the math library package.
+#
+cdl_option CYGFUN_LIBC_strtod {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  0 != CYGPKG_LIBM 
+    #     CYGPKG_LIBM == current
+    #   --> 1
+    # Requires: CYGPKG_LIBM
+    #     CYGPKG_LIBM == current
+    #   --> 1
+};
+
+# Provides long long conversion functions
+# Enabling this option will provide support for the strtoll(),
+# strtoull() and atoll() conversion functions, which are
+# the long long variants of the standard versions of these
+# functions. Supporting this requires extra code and compile
+# time.
+#
+cdl_option CYGFUN_LIBC_STDLIB_CONV_LONGLONG {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+
+    # The following properties are affected by this value
+    # option CYGFUN_LIBC_STDIO_LONGLONG
+    #     Requires: CYGFUN_LIBC_STDLIB_CONV_LONGLONG
+};
+
+# bsearch() tracing level
+# Trace verbosity level for debugging the <stdlib.h>
+# binary search function bsearch(). Increase this
+# value to get additional trace output.
+#
+cdl_option CYGNUM_LIBC_BSEARCH_TRACE_LEVEL {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+};
+
+# qsort() tracing level
+# Trace verbosity level for debugging the <stdlib.h>
+# quicksort function qsort(). Increase this value
+# to get additional trace output.
+#
+cdl_option CYGNUM_LIBC_QSORT_TRACE_LEVEL {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+};
+
+# C library stdlib build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBC_STDLIB_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building this package. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBC_STDLIB_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building this package. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBC_STDLIB_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# C library stdlib tests
+# This option specifies the set of tests for this package.
+#
+cdl_option CYGPKG_LIBC_STDLIB_TESTS {
+    # Calculated value:  "tests/abs tests/atoi tests/atol tests/bsearch tests/div tests/getenv tests/labs tests/ldiv tests/qsort tests/rand1 tests/rand2 tests/rand3 tests/rand4 tests/srand tests/strtol tests/strtoul" 
+    # Flavor: data
+    # Current_value: tests/abs tests/atoi tests/atol tests/bsearch tests/div tests/getenv tests/labs tests/ldiv tests/qsort tests/rand1 tests/rand2 tests/rand3 tests/rand4 tests/srand tests/strtol tests/strtoul
+};
+
+# <
+# <
+# ISO C library string functions
+# doc: ref/libc.html
+# This package provides string functions specified by the
+# ISO C standard - ISO/IEC 9899:1990.
+#
+cdl_package CYGPKG_LIBC_STRING {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires:  CYGBLD_ISO_STRING_LOCALE_FUNCS_HEADER ==  "<cyg/libc/string/string.h>" 
+    #     CYGBLD_ISO_STRING_LOCALE_FUNCS_HEADER == <cyg/libc/string/string.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STRING_MEMFUNCS_HEADER ==  "<cyg/libc/string/string.h>" 
+    #     CYGBLD_ISO_STRING_MEMFUNCS_HEADER == <cyg/libc/string/string.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STRING_STRFUNCS_HEADER ==  "<cyg/libc/string/string.h>" 
+    #     CYGBLD_ISO_STRING_STRFUNCS_HEADER == <cyg/libc/string/string.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_STRTOK_R_HEADER ==  "<cyg/libc/string/string.h>" 
+    #     CYGBLD_ISO_STRTOK_R_HEADER == <cyg/libc/string/string.h>
+    #   --> 1
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+};
+
+# >
+# Inline versions of <string.h> functions
+# This option chooses whether some of the
+# particularly simple string functions from
+# <string.h> are available as inline
+# functions. This may improve performance, and as
+# the functions are small, may even improve code
+# size.
+#
+cdl_option CYGIMP_LIBC_STRING_INLINES {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Optimize string functions for code size
+# This option tries to reduce string function
+# code size at the expense of execution speed. The
+# same effect can be produced if the code is
+# compiled with the -Os option to the compiler.
+#
+cdl_option CYGIMP_LIBC_STRING_PREFER_SMALL_TO_FAST {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Provide BSD compatibility functions
+# Enabling this option causes various compatibility functions
+# commonly found in the BSD UNIX operating system to be included.
+# These are functions such as bzero, bcmp, bcopy, bzero, strcasecmp,
+# strncasecmp, index, rindex and swab.
+#
+cdl_option CYGFUN_LIBC_STRING_BSD_FUNCS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGBLD_ISO_STRING_BSD_FUNCS_HEADER ==  "<cyg/libc/string/bsdstring.h>" 
+    #     CYGBLD_ISO_STRING_BSD_FUNCS_HEADER == <cyg/libc/string/bsdstring.h>
+    #   --> 1
+    # Requires: CYGINT_ISO_CTYPE
+    #     CYGINT_ISO_CTYPE == 1
+    #   --> 1
+};
+
+# strtok
+# These options control the behaviour of the
+# strtok() and strtok_r() string tokenization
+# functions.
+#
+cdl_component CYGPKG_LIBC_STRING_STRTOK {
+    # There is no associated value.
+};
+
+# >
+# Per-thread strtok()
+# This option controls whether the string function
+# strtok() has its state recorded on a per-thread
+# basis rather than global. If this option is
+# disabled, some per-thread space can be saved.
+# Note there is also a POSIX-standard strtok_r()
+# function to achieve a similar effect with user
+# support. Enabling this option will use one slot
+# of kernel per-thread data. You should ensure you
+# have enough slots configured for all your
+# per-thread data.
+#
+cdl_option CYGSEM_LIBC_STRING_PER_THREAD_STRTOK {
+    # ActiveIf constraint: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: CYGVAR_KERNEL_THREADS_DATA
+    #     CYGVAR_KERNEL_THREADS_DATA == 1
+    #   --> 1
+    # Requires: CYGVAR_KERNEL_THREADS_DATA
+    #     CYGVAR_KERNEL_THREADS_DATA == 1
+    #   --> 1
+};
+
+# Tracing level
+# Trace verbosity level for debugging the <string.h>
+# functions strtok() and strtok_r(). Increase this
+# value to get additional trace output.
+#
+cdl_option CYGNUM_LIBC_STRING_STRTOK_TRACE_LEVEL {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+};
+
+# <
+# strdup
+# This option indicates whether strdup() is to be supported.
+#
+cdl_option CYGFUN_LIBC_STRING_STRDUP {
+    # ActiveIf constraint: CYGINT_ISO_MALLOC
+    #     CYGINT_ISO_MALLOC == 1
+    #   --> 1
+
+    # Calculated value: 1
+    # Flavor: bool
+    # Current value: 1
+};
+
+# Provide strnlen() GNU extension
+# This option controls support for the strnlen() function.
+# (This is a GNU extension, not part of ANSI C.)
+#
+cdl_option CYGFUN_LIBC_STRING_GNU_STRNLEN {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# C library string functions build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBC_STRING_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBC_STRING_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBC_STRING_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# C library string function tests
+# This option specifies the set of tests for the C library
+# string functions.
+#
+cdl_option CYGPKG_LIBC_STRING_TESTS {
+    # Calculated value:  "tests/memchr tests/memcmp1 tests/memcmp2 tests/memcpy1 tests/memcpy2 tests/memmove1 tests/memmove2 tests/memset tests/strcat1 tests/strcat2 tests/strchr tests/strcmp1 tests/strcmp2 tests/strcoll1 tests/strcoll2 tests/strcpy1 tests/strcpy2 tests/strcspn tests/strcspn tests/strlen tests/strncat1 tests/strncat2 tests/strncpy1 tests/strncpy2 tests/strpbrk tests/strrchr tests/strspn tests/strstr tests/strtok tests/strxfrm1 tests/strxfrm2 tests/strnlen" 
+    # Flavor: data
+    # Current_value: tests/memchr tests/memcmp1 tests/memcmp2 tests/memcpy1 tests/memcpy2 tests/memmove1 tests/memmove2 tests/memset tests/strcat1 tests/strcat2 tests/strchr tests/strcmp1 tests/strcmp2 tests/strcoll1 tests/strcoll2 tests/strcpy1 tests/strcpy2 tests/strcspn tests/strcspn tests/strlen tests/strncat1 tests/strncat2 tests/strncpy1 tests/strncpy2 tests/strpbrk tests/strrchr tests/strspn tests/strstr tests/strtok tests/strxfrm1 tests/strxfrm2 tests/strnlen
+};
+
+# <
+# <
+# ISO C library date and time functions
+# doc: ref/libc.html
+# This package provides time functions specified by the
+# ISO C standard - ISO/IEC 9899:1990.
+#
+cdl_package CYGPKG_LIBC_TIME {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires:  CYGBLD_ISO_C_TIME_TYPES_HEADER == "<cyg/libc/time/time.h>" 
+    #     CYGBLD_ISO_C_TIME_TYPES_HEADER == <cyg/libc/time/time.h>
+    #   --> 1
+    # Requires:  CYGBLD_ISO_C_CLOCK_FUNCS_HEADER ==  "<cyg/libc/time/time.h>" 
+    #     CYGBLD_ISO_C_CLOCK_FUNCS_HEADER == <cyg/libc/time/time.h>
+    #   --> 1
+    # Requires: CYGPKG_ISOINFRA
+    #     CYGPKG_ISOINFRA == current
+    #   --> 1
+    # Requires: CYGINT_ISO_DIV
+    #     CYGINT_ISO_DIV == 1
+    #   --> 1
+    # Requires: CYGINT_ISO_ABS
+    #     CYGINT_ISO_ABS == 1
+    #   --> 1
+};
+
+# >
+# Working clock() function
+# This option controls whether clock() will
+# actually try and determine the process time
+# usage. With this option disabled, clock() does
+# not disappear, but will permanently return
+# (clock_t)-1 as mandated by the ISO C standard.
+#
+cdl_option CYGSEM_LIBC_TIME_CLOCK_WORKING {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGFUN_KERNEL_THREADS_TIMER
+    #     CYGFUN_KERNEL_THREADS_TIMER == 1
+    #   --> 1
+    # Requires: CYGVAR_KERNEL_COUNTERS_CLOCK
+    #     CYGVAR_KERNEL_COUNTERS_CLOCK == 1
+    #   --> 1
+};
+
+# Working time() function
+# This option controls whether time() will
+# actually try and determine the current calendar
+# time. With this option disabled, time() does
+# not disappear, but will permanently return
+# (time_t)-1 as mandated by the ISO C standard.
+#
+cdl_option CYGSEM_LIBC_TIME_TIME_WORKING {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGPKG_IO_WALLCLOCK
+    #     CYGPKG_IO_WALLCLOCK == current
+    #   --> 1
+};
+
+# Working cyg_libc_time_settime() function
+# This option controls whether cyg_libc_time_settime()
+# will actually try and set the current calendar
+# time. With this option disabled,
+# cyg_libc_time_settime() does not disappear, but
+# will permanently return an error.
+#
+cdl_option CYGSEM_LIBC_TIME_SETTIME_WORKING {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGPKG_IO_WALLCLOCK
+    #     CYGPKG_IO_WALLCLOCK == current
+    #   --> 1
+};
+
+# POSIX time functions
+# Enabling this option allows the use of the
+# following functions defined in POSIX 1003.1:
+# asctime_r(), ctime_r(), gmtime_r(), strptime(), and
+# localtime_r().
+#
+cdl_option CYGFUN_LIBC_TIME_POSIX {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGINT_ISO_STRING_BSD_FUNCS
+    #     CYGINT_ISO_STRING_BSD_FUNCS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGIMP_LIBC_TIME_ASCTIME_R_INLINE
+    #     Requires: CYGFUN_LIBC_TIME_POSIX
+    # option CYGIMP_LIBC_TIME_CTIME_R_INLINE
+    #     Requires: CYGFUN_LIBC_TIME_POSIX
+    # option CYGIMP_LIBC_TIME_GMTIME_R_INLINE
+    #     Requires: CYGFUN_LIBC_TIME_POSIX
+    # option CYGIMP_LIBC_TIME_LOCALTIME_R_INLINE
+    #     Requires: CYGFUN_LIBC_TIME_POSIX
+    # option CYGPKG_LIBC_TIME_TESTS
+    #     Calculated:  
+    #                     "tests/asctime tests/clock tests/ctime tests/gmtime tests/localtime tests/mktime tests/strftime tests/time " 
+    #                     . (CYGFUN_LIBC_TIME_POSIX ? "tests/strptime" : "")
+    #                 
+};
+
+# Single UNIX extensions
+# Enabling this option allows the use of
+# certain additional conversion specifiers
+# in the strftime function.
+#
+cdl_option CYGFUN_LIBC_TIME_SUS_EXTNS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Time zone offsets
+# These options control the default STandarD (STD)
+# and Daylight Savings Time (DST)
+# time offsets so that dates can be set correctly
+# for the local environment.
+#
+cdl_component CYGPKG_LIBC_TIME_ZONES {
+    # There is no associated value.
+};
+
+# >
+# Default Daylight Savings Time state
+# This option controls whether the initial
+# time environment is set up as STD, DST or
+# unknown. Use the value 1 for DST, 0 for STD, 
+# and (-1) for unknown. This can also be set at
+# runtime using the cyg_libc_time_setdst()
+# function.
+#
+cdl_option CYGNUM_LIBC_TIME_DST_DEFAULT_STATE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value -1
+    # value_source default
+    # Default value: -1
+    # Legal values: -1 to 1
+};
+
+# Default Standard Time offset
+# This option controls the offset from UTC in
+# seconds when in local Standard Time. This
+# value can be positive or negative. It
+# can also be set at run time using the
+# cyg_libc_time_setzoneoffsets() function.
+#
+cdl_option CYGNUM_LIBC_TIME_STD_DEFAULT_OFFSET {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: -90000 to 90000
+};
+
+# Default Daylight Savings Time offset
+# This option controls the offset from UTC in
+# seconds when in local Daylight Savings Time. This
+# value can be positive or negative. It
+# can also be set at run time using the
+# cyg_libc_time_setzoneoffsets() function.
+#
+cdl_option CYGNUM_LIBC_TIME_DST_DEFAULT_OFFSET {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 3600
+    # value_source default
+    # Default value: 3600
+    # Legal values: -90000 to 90000
+};
+
+# <
+# Inline functions
+# These options control whether certain functions
+# are available in inline form. This may lead to
+# faster code at the expense of code space. But for
+# some functions, or some functions with constant
+# arguments, it may in fact lead to smaller code.
+#
+cdl_component CYGPKG_LIBC_TIME_INLINES {
+    # There is no associated value.
+};
+
+# >
+# asctime()
+# Allow the asctime() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_ASCTIME_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# ctime()
+# Allow the ctime() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_CTIME_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# difftime()
+# Allow the difftime() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_DIFFTIME_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# gmtime()
+# Allow the gmtime() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_GMTIME_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# localtime()
+# Allow the localtime() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_LOCALTIME_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# mktime()
+# Allow the mktime() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_MKTIME_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# asctime_r()
+# Allow the asctime_r() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_ASCTIME_R_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGFUN_LIBC_TIME_POSIX
+    #     CYGFUN_LIBC_TIME_POSIX == 1
+    #   --> 1
+};
+
+# ctime_r()
+# Allow the ctime_r() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_CTIME_R_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGFUN_LIBC_TIME_POSIX
+    #     CYGFUN_LIBC_TIME_POSIX == 1
+    #   --> 1
+};
+
+# gmtime_r()
+# Allow the gmtime_r() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_GMTIME_R_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGFUN_LIBC_TIME_POSIX
+    #     CYGFUN_LIBC_TIME_POSIX == 1
+    #   --> 1
+};
+
+# localtime_r()
+# Allow the localtime_r() function to be inlined
+#
+cdl_option CYGIMP_LIBC_TIME_LOCALTIME_R_INLINE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGFUN_LIBC_TIME_POSIX
+    #     CYGFUN_LIBC_TIME_POSIX == 1
+    #   --> 1
+};
+
+# <
+# clock() tracing level
+# Trace verbosity level for debugging the clock()
+# function. Increase this value to get
+# additional trace output when tracing is enabled.
+#
+cdl_option CYGNUM_LIBC_TIME_CLOCK_TRACE_LEVEL {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+};
+
+# C library time functions build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBC_TIME_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBC_TIME_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value -Wno-format
+    # value_source default
+    # Default value: -Wno-format
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the C library. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBC_TIME_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# C library time and date function tests
+# This option specifies the set of tests for the C library
+# time and date functions.
+#
+cdl_option CYGPKG_LIBC_TIME_TESTS {
+    # Calculated value:  
+    #                     "tests/asctime tests/clock tests/ctime tests/gmtime tests/localtime tests/mktime tests/strftime tests/time " 
+    #                     . (CYGFUN_LIBC_TIME_POSIX ? "tests/strptime" : "")
+    #                 
+    #     CYGFUN_LIBC_TIME_POSIX == 1
+    # Flavor: data
+    # Current_value: tests/asctime tests/clock tests/ctime tests/gmtime tests/localtime tests/mktime tests/strftime tests/time tests/strptime
+};
+
+# <
+# <
+# <
+# Math library
+# doc: ref/libc.html
+# ISO standard floating point mathematical library
+# containing many useful functions for mathematical
+# calculations.
+#
+cdl_package CYGPKG_LIBM {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT
+    #     Requires: CYGPKG_LIBM
+    # option CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT
+    #     DefaultValue:  0 != CYGPKG_LIBM 
+    # option CYGSEM_LIBC_STDIO_SCANF_FLOATING_POINT
+    #     Requires: CYGPKG_LIBM
+    # option CYGSEM_LIBC_STDIO_SCANF_FLOATING_POINT
+    #     DefaultValue:  0 != CYGPKG_LIBM &&
+    #                                 0 != CYGINT_ISO_STDLIB_STRCONV_FLOAT 
+    # option CYGFUN_LIBC_strtod
+    #     Requires: CYGPKG_LIBM
+    # option CYGFUN_LIBC_strtod
+    #     DefaultValue:  0 != CYGPKG_LIBM 
+};
+
+# >
+# Compatibility mode
+# These options deal with behaviour related to
+# the various compatibility modes - POSIX, IEEE,
+# X/OPEN and SVID.
+#
+cdl_component CYGPKG_LIBM_COMPATIBILITY {
+    # There is no associated value.
+};
+
+# >
+#
+cdl_interface CYGINT_LIBM_COMPAT {
+    # Implemented by CYGSEM_LIBM_COMPAT_IEEE_ONLY, active, disabled
+    # Implemented by CYGNUM_LIBM_COMPATIBILITY, active, enabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires: 1 == CYGINT_LIBM_COMPAT
+    #     CYGINT_LIBM_COMPAT == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_LIBM_COMPAT
+    #     Requires: 1 == CYGINT_LIBM_COMPAT
+};
+
+# IEEE-only
+# The math library can be hard-coded to only
+# behave in one compatibility mode - IEEE. This
+# cannot be changed at run-time. IEEE mode is the
+# most minimal of the compatibility modes, and so
+# this will best help code size and speed, as well
+# as omitting the code for other compatibility
+# modes. If not defined, the math library can be
+# set at run-time to any of the supported
+# compatibility modes.
+#
+cdl_component CYGSEM_LIBM_COMPAT_IEEE_ONLY {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBM_USE_STDERR
+    #     Requires: !CYGSEM_LIBM_COMPAT_IEEE_ONLY
+    # option CYGSEM_LIBM_THREAD_SAFE_COMPAT_MODE
+    #     Requires: !CYGSEM_LIBM_COMPAT_IEEE_ONLY
+};
+
+# >
+# Inline IEEE754 API wrappers
+# IEEE754 API functions are just wrappers for
+# core functions. This introduces indirection which can can be
+# avoided by inlining. This will also prevent GCC from rendering
+# these functions as builtin. The HAL can override for a set of functions
+# by providing a list of builtin functions.
+#
+cdl_option CYGSEM_LIBM_IEEE_API_INLINE {
+    # This option is not active
+    # The parent CYGSEM_LIBM_COMPAT_IEEE_ONLY is disabled
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# <
+# Default mode
+# If you want to have support for more than one
+# compatibility mode settable at run-time, rather
+# than hard-coded IEEE mode, this component lets
+# you choose which mode should be the default.
+#
+cdl_component CYGNUM_LIBM_COMPATIBILITY {
+    # Flavor: booldata
+    # No user value, uncomment the following line to provide one.
+    # user_value 1 POSIX
+    # value_source default
+    # Default value: 1 POSIX
+    # Legal values:  "POSIX" "IEEE" "XOPEN" "SVID" 
+    # Requires: CYGPKG_LIBC
+    #     CYGPKG_LIBC == current
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGNUM_LIBM_COMPAT_DEFAULT
+    #     Calculated:   CYGNUM_LIBM_COMPATIBILITY == "POSIX" ? "CYGNUM_LIBM_COMPAT_POSIX" : CYGNUM_LIBM_COMPATIBILITY == "IEEE"  ? "CYGNUM_LIBM_COMPAT_IEEE" : CYGNUM_LIBM_COMPATIBILITY == "XOPEN" ? "CYGNUM_LIBM_COMPAT_XOPEN" : CYGNUM_LIBM_COMPATIBILITY == "SVID"  ? "CYGNUM_LIBM_COMPAT_SVID" : "<undefined>"  
+    # option CYGNUM_LIBM_COMPAT_DEFAULT
+    #     Calculated:   CYGNUM_LIBM_COMPATIBILITY == "POSIX" ? "CYGNUM_LIBM_COMPAT_POSIX" : CYGNUM_LIBM_COMPATIBILITY == "IEEE"  ? "CYGNUM_LIBM_COMPAT_IEEE" : CYGNUM_LIBM_COMPATIBILITY == "XOPEN" ? "CYGNUM_LIBM_COMPAT_XOPEN" : CYGNUM_LIBM_COMPATIBILITY == "SVID"  ? "CYGNUM_LIBM_COMPAT_SVID" : "<undefined>"  
+    # option CYGNUM_LIBM_COMPAT_DEFAULT
+    #     Calculated:   CYGNUM_LIBM_COMPATIBILITY == "POSIX" ? "CYGNUM_LIBM_COMPAT_POSIX" : CYGNUM_LIBM_COMPATIBILITY == "IEEE"  ? "CYGNUM_LIBM_COMPAT_IEEE" : CYGNUM_LIBM_COMPATIBILITY == "XOPEN" ? "CYGNUM_LIBM_COMPAT_XOPEN" : CYGNUM_LIBM_COMPATIBILITY == "SVID"  ? "CYGNUM_LIBM_COMPAT_SVID" : "<undefined>"  
+    # option CYGNUM_LIBM_COMPAT_DEFAULT
+    #     Calculated:   CYGNUM_LIBM_COMPATIBILITY == "POSIX" ? "CYGNUM_LIBM_COMPAT_POSIX" : CYGNUM_LIBM_COMPATIBILITY == "IEEE"  ? "CYGNUM_LIBM_COMPAT_IEEE" : CYGNUM_LIBM_COMPATIBILITY == "XOPEN" ? "CYGNUM_LIBM_COMPAT_XOPEN" : CYGNUM_LIBM_COMPATIBILITY == "SVID"  ? "CYGNUM_LIBM_COMPAT_SVID" : "<undefined>"  
+    # option CYGOPT_LIBM_COMPAT_POSIX_IEEE
+    #     ActiveIf:  CYGNUM_LIBM_COMPATIBILITY == "POSIX" 
+};
+
+# >
+# Numeric representation
+# This option automatically defines the default compatibility
+# mode for numeric representation in terms of the values used
+# to set that mode at run-time.
+#
+cdl_option CYGNUM_LIBM_COMPAT_DEFAULT {
+    # Calculated value:   CYGNUM_LIBM_COMPATIBILITY == "POSIX" ? "CYGNUM_LIBM_COMPAT_POSIX" : CYGNUM_LIBM_COMPATIBILITY == "IEEE"  ? "CYGNUM_LIBM_COMPAT_IEEE" : CYGNUM_LIBM_COMPATIBILITY == "XOPEN" ? "CYGNUM_LIBM_COMPAT_XOPEN" : CYGNUM_LIBM_COMPATIBILITY == "SVID"  ? "CYGNUM_LIBM_COMPAT_SVID" : "<undefined>"  
+    #     CYGNUM_LIBM_COMPATIBILITY == POSIX
+    #     CYGNUM_LIBM_COMPATIBILITY == POSIX
+    #     CYGNUM_LIBM_COMPATIBILITY == POSIX
+    #     CYGNUM_LIBM_COMPATIBILITY == POSIX
+    # Flavor: data
+    # Current_value: CYGNUM_LIBM_COMPAT_POSIX
+};
+
+# POSIX return NaN for out-of-domain argument.
+# Later POSIX specification states that functions
+# may return either NaN (like IEEE), or implementation defined
+# value when argument is out of domain. For backward compatibility
+# default value is set to 0.
+#
+cdl_option CYGOPT_LIBM_COMPAT_POSIX_IEEE {
+    # ActiveIf constraint:  CYGNUM_LIBM_COMPATIBILITY == "POSIX" 
+    #     CYGNUM_LIBM_COMPATIBILITY == POSIX
+    #   --> 1
+
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# <
+# SVID3-style scalb()
+# SVID3 defined the scalb() function as double
+# scalb(double, double) rather than double
+# scalb(double, int) which is used by IBM, DEC, and
+# probably others. Enabling this option chooses
+# the (double, double) version. Note there is a
+# function double scalbn(double, int) which is
+# unaffected by this choice.
+#
+cdl_option CYGFUN_LIBM_SVID3_scalb {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Reduce namespace pollution
+# If you do not want to use either the X/Open or
+# SVID3 compatibility modes, you may want to define
+# this option to reduce the chance of namespace
+# pollution. This is particularly likely to occur
+# here as these standards define symbols with
+# names that often appear in applications, such as
+# exception, DOMAIN, OVERFLOW, etc. If your
+# application also used these names, it may cause
+# problems.
+#
+cdl_option CYGSYM_LIBM_NO_XOPEN_SVID_NAMESPACE_POLLUTION {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+};
+
+# Output to stderr for math errors
+# The SVID3 standard says that error
+# messages should be output on the stderr console
+# output stream. This option allows this ability
+# to be explicitly controlled. However, this still
+# only has an effect in SVID3 compatibility mode.
+#
+cdl_option CYGSEM_LIBM_USE_STDERR {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: !CYGSEM_LIBM_COMPAT_IEEE_ONLY
+    #     CYGSEM_LIBM_COMPAT_IEEE_ONLY == 0
+    #   --> 1
+    # Requires: CYGPKG_LIBC_STDIO
+    #     CYGPKG_LIBC_STDIO == current
+    #   --> 1
+};
+
+# <
+# Thread safety
+# This option controls whether the C library has
+# support for thread safe operation in general.
+# This requires eCos kernel support for per-thread
+# data, and adjustment of the stack limit.
+#
+cdl_component CYGPKG_LIBM_THREAD_SAFETY {
+    # There is no associated value.
+};
+
+# >
+# Compatibility mode setting
+# This option makes the setting of the compatiblity
+# mode be a per-thread property. This directly
+# implies that it also becomes thread-safe.
+#
+cdl_option CYGSEM_LIBM_THREAD_SAFE_COMPAT_MODE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: !CYGSEM_LIBM_COMPAT_IEEE_ONLY
+    #     CYGSEM_LIBM_COMPAT_IEEE_ONLY == 0
+    #   --> 1
+    # Requires: CYGVAR_KERNEL_THREADS_DATA
+    #     CYGVAR_KERNEL_THREADS_DATA == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGNUM_LIBM_COMPATMODE_TRACE_LEVEL
+    #     Requires: CYGSEM_LIBM_THREAD_SAFE_COMPAT_MODE
+};
+
+# gamma() and lgamma()
+# This option makes the gamma() and lgamma()
+# functions be thread-safe. Note that these
+# functions are identical - they take the log of
+# the absolute value of their argument. The sign
+# of the argument is stored in a variable called
+# signgam. Enabling this option makes signgam
+# a per-thread variable. Note there are also
+# gamma_r() and lgamma_r() alternatives that
+# allow signgam to be passed in by reference as
+# an argument.
+#
+cdl_option CYGSEM_LIBM_THREAD_SAFE_GAMMA_FUNCTIONS {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGVAR_KERNEL_THREADS_DATA
+    #     CYGVAR_KERNEL_THREADS_DATA == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGNUM_LIBM_SIGNGAM_TRACE_LEVEL
+    #     Requires: CYGSEM_LIBM_THREAD_SAFE_GAMMA_FUNCTIONS
+};
+
+# <
+# Tracing output levels in math library
+# Tracing support is useful for debugging. Some
+# Math library modules can be configured with
+# different levels of tracing verbosity. These
+# levels can be configured here.
+#
+cdl_component CYGPKG_LIBM_TRACE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Requires: CYGDBG_USE_TRACING
+    #     CYGDBG_USE_TRACING == 0
+    #   --> 0
+};
+
+# >
+# Compatibility mode get/set
+# Trace level for debugging the getting and
+# setting of the compatibility mode when it is
+# configured to be thread-safe.
+#
+cdl_option CYGNUM_LIBM_COMPATMODE_TRACE_LEVEL {
+    # This option is not active
+    # The parent CYGPKG_LIBM_TRACE is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+    # Requires: CYGSEM_LIBM_THREAD_SAFE_COMPAT_MODE
+    #     CYGSEM_LIBM_THREAD_SAFE_COMPAT_MODE == 0
+    #   --> 0
+};
+
+# signgam variable access
+# Trace level for debugging all accesses to the
+# signgam variable in thread-safe mode.
+#
+cdl_option CYGNUM_LIBM_SIGNGAM_TRACE_LEVEL {
+    # This option is not active
+    # The parent CYGPKG_LIBM_TRACE is disabled
+
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+    # Requires: CYGSEM_LIBM_THREAD_SAFE_GAMMA_FUNCTIONS
+    #     CYGSEM_LIBM_THREAD_SAFE_GAMMA_FUNCTIONS == 0
+    #   --> 0
+};
+
+# <
+# Bessel function limit of significance
+# For the Bessel functions (j0(), j1(), jn(),
+# y0(), y1(), yn()) this option defines the
+# maximum absolute value of the ordinate
+# before we assume total loss of significance.
+# This number must be a floating-point number (e.g.
+# contains a decimal point), and should be
+# large.
+#
+cdl_option CYGNUM_LIBM_X_TLOSS {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 1.41484755040569E+16
+    # value_source default
+    # Default value: 1.41484755040569E+16
+    # Legal values: 1 to 1e308
+};
+
+# Complex
+# Complex library provides support for some basic operations
+# on complex numbers as well as mathematical functions in
+# complex domain.
+#
+cdl_component CYGPKG_COMPLEX {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+};
+
+# Math library build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_LIBM_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the math library. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_LIBM_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value -fno-strict-aliasing
+    # value_source default
+    # Default value:  "-fno-strict-aliasing" .  ((!CYGPKG_HAL_I386 && !CYGPKG_HAL_SYNTH_I386) ? "" : " -ffloat-store") 
+    #     CYGPKG_HAL_I386 (unknown) == 0
+    #     CYGPKG_HAL_SYNTH_I386 (unknown) == 0
+    #   --> -fno-strict-aliasing
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the math library. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_LIBM_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Math library tests
+# this option specifies the set of tests for the math library.
+#
+cdl_option CYGPKG_LIBM_TESTS {
+    # Calculated value:  "tests/vectors/acos tests/vectors/asin              tests/vectors/cos tests/vectors/cosh                         tests/vectors/sin tests/vectors/sinh                         tests/vectors/atan tests/vectors/atan2                       tests/vectors/tan tests/vectors/tanh                         tests/vectors/sqrt tests/vectors/pow                         tests/vectors/ceil tests/vectors/floor                       tests/vectors/fabs tests/vectors/fmod                        tests/vectors/frexp tests/vectors/ldexp                      tests/vectors/exp tests/vectors/log tests/vectors/log10       tests/vectors/acosf tests/vectors/asinf                      tests/vectors/cosf tests/vectors/coshf                       tests/vectors/sinf tests/vectors/sinhf                       tests/vectors/atanf tests/vectors/atan2f                     tests/vectors/tanf tests/vectors/tanhf                       tests/vectors/hypotf tests/vectors/sqrtf tests/vectors/powf  tests/vectors/floorf tests/vectors/ceilf                     tests/vectors/fabsf tests/vectors/fmodf                      tests/vectors/frexpf tests/vectors/ldexpf                    tests/vectors/expf tests/vectors/logf tests/vectors/log10f "
+    #                 
+    # Flavor: data
+    # Current_value: tests/vectors/acos tests/vectors/asin              tests/vectors/cos tests/vectors/cosh                         tests/vectors/sin tests/vectors/sinh                         tests/vectors/atan tests/vectors/atan2                       tests/vectors/tan tests/vectors/tanh                         tests/vectors/sqrt tests/vectors/pow                         tests/vectors/ceil tests/vectors/floor                       tests/vectors/fabs tests/vectors/fmod                        tests/vectors/frexp tests/vectors/ldexp                      tests/vectors/exp tests/vectors/log tests/vectors/log10       tests/vectors/acosf tests/vectors/asinf                      tests/vectors/cosf tests/vectors/coshf                       tests/vectors/sinf tests/vectors/sinhf                       tests/vectors/atanf tests/vectors/atan2f                     tests/vectors/tanf tests/vectors/tanhf                       tests/vectors/hypotf tests/vectors/sqrtf tests/vectors/powf  tests/vectors/floorf tests/vectors/ceilf                     tests/vectors/fabsf tests/vectors/fmodf                      tests/vectors/frexpf tests/vectors/ldexpf                    tests/vectors/expf tests/vectors/logf tests/vectors/log10f 
+};
+
+# <
+# <
+# Wallclock device
+# The wallclock device provides real time stamps, as opposed
+# to the eCos kernel timers which typically just count the
+# number of clock ticks since the hardware was powered up.
+# Depending on the target platform this device may involve
+# interacting with a suitable clock chip, or it may be
+# emulated by using the kernel timers.
+#
+cdl_package CYGPKG_IO_WALLCLOCK {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+
+    # The following properties are affected by this value
+    # option CYGSEM_LIBC_TIME_TIME_WORKING
+    #     Requires: CYGPKG_IO_WALLCLOCK
+    # option CYGSEM_LIBC_TIME_SETTIME_WORKING
+    #     Requires: CYGPKG_IO_WALLCLOCK
+};
+
+# >
+# Number of wallclock hardware implementations
+#
+cdl_interface CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # option CYGPKG_WALLCLOCK_EMULATE
+    #     DefaultValue:  0 == CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS 
+    # option CYGIMP_WALLCLOCK_NONE
+    #     DefaultValue:  !CYGPKG_KERNEL && 0 == CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS 
+};
+
+# Number of wallclock implementations
+#
+cdl_interface CYGINT_WALLCLOCK_IMPLEMENTATIONS {
+    # Implemented by CYGPKG_WALLCLOCK_EMULATE, active, enabled
+    # Implemented by CYGIMP_WALLCLOCK_NONE, active, disabled
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 1
+    # Requires: 1 == CYGINT_WALLCLOCK_IMPLEMENTATIONS
+    #     CYGINT_WALLCLOCK_IMPLEMENTATIONS == 1
+    #   --> 1
+
+    # The following properties are affected by this value
+    # interface CYGINT_WALLCLOCK_IMPLEMENTATIONS
+    #     Requires: 1 == CYGINT_WALLCLOCK_IMPLEMENTATIONS
+};
+
+# Wallclock driver supports set/get mode
+#
+cdl_interface CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED {
+    # No options implement this inferface
+    # This value cannot be modified here.
+    # Flavor: data
+    # Current_value: 0
+
+    # The following properties are affected by this value
+    # option CYGSEM_WALLCLOCK_MODE
+    #     DefaultValue:  CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED ?  "set_get" : "init_get" 
+    # option CYGSEM_WALLCLOCK_MODE
+    #     Requires:  CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED ||  CYGSEM_WALLCLOCK_MODE == "init_get" 
+};
+
+# Wallclock mode
+# The wallclock driver can be used in one of two
+# modes. Set/get mode allows time to be kept during power
+# off (assuming there's a battery backed clock). Init/get
+# mode is slightly smaller and can be used when there is no
+# battery backed clock - in this mode time 0 is the time of
+# the board power up.
+#
+cdl_option CYGSEM_WALLCLOCK_MODE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value init_get
+    # value_source default
+    # Default value:  CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED ?  "set_get" : "init_get" 
+    #     CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED == 0
+    #   --> init_get
+    # Legal values:  "init_get" "set_get" 
+    # Requires:  CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED ||  CYGSEM_WALLCLOCK_MODE == "init_get" 
+    #     CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED == 0
+    #     CYGSEM_WALLCLOCK_MODE == init_get
+    #   --> 1
+
+    # The following properties are affected by this value
+    # option CYGSEM_WALLCLOCK_MODE
+    #     Requires:  CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED ||  CYGSEM_WALLCLOCK_MODE == "init_get" 
+    # option CYGSEM_WALLCLOCK_SET_GET_MODE
+    #     Calculated:  CYGSEM_WALLCLOCK_MODE == "set_get" ? 1 : 0 
+};
+
+# Wallclock set/get mode
+#
+cdl_option CYGSEM_WALLCLOCK_SET_GET_MODE {
+    # Calculated value:  CYGSEM_WALLCLOCK_MODE == "set_get" ? 1 : 0 
+    #     CYGSEM_WALLCLOCK_MODE == init_get
+    # Flavor: bool
+    # Current value: 0
+};
+
+# Wallclock implementation
+# Implementations of the wallclock device.
+#
+cdl_component CYGPKG_IO_WALLCLOCK_IMPLEMENTATION {
+    # There is no associated value.
+};
+
+# >
+# Wallclock emulator
+# When this option is enabled, a wallclock device will be
+# emulated using the kernel real-time clock.
+#
+cdl_option CYGPKG_WALLCLOCK_EMULATE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value:  0 == CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS 
+    #     CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS == 0
+    #   --> 1
+    # Requires: CYGPKG_KERNEL
+    #     CYGPKG_KERNEL == current
+    #   --> 1
+};
+
+# No wallclock
+# Disables the wallclock.
+#
+cdl_option CYGIMP_WALLCLOCK_NONE {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value:  !CYGPKG_KERNEL && 0 == CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS 
+    #     CYGPKG_KERNEL == current
+    #     CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS == 0
+    #   --> 0
+};
+
+# <
+# Wallclock build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_IO_WALLCLOCK_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the wallclock device. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_IO_WALLCLOCK_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the wallclock device. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_IO_WALLCLOCK_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Wallclock tests
+# This option specifies the set of tests for the
+# wallclock device.
+#
+cdl_option CYGPKG_IO_WALLCLOCK_TESTS {
+    # Calculated value:  CYGPKG_KERNEL ? "tests/wallclock tests/wallclock2" : "" 
+    #     CYGPKG_KERNEL == current
+    # Flavor: data
+    # Current_value: tests/wallclock tests/wallclock2
+};
+
+# <
+# <
+# Common error code support
+# This package contains the common list of error and
+# status codes. It is held centrally to allow
+# packages to interchange error codes and status
+# codes in a common way, rather than each package
+# having its own conventions for error/status
+# reporting. The error codes are modelled on the
+# POSIX style naming e.g. EINVAL etc. This package
+# also provides the standard strerror() function to
+# convert error codes to textual representation, as
+# well as an implementation of the errno idiom.
+#
+cdl_package CYGPKG_ERROR {
+    # Packages cannot be added or removed, nor can their version be changed,
+    # simply by editing their value. Instead the appropriate configuration
+    # should be used to perform these actions.
+
+    # This value cannot be modified here.
+    # Flavor: booldata
+    # Current value: 1 current
+    # Requires:  CYGBLD_ISO_ERRNO_CODES_HEADER == "<cyg/error/codes.h>" 
+    #     CYGBLD_ISO_ERRNO_CODES_HEADER == <cyg/error/codes.h>
+    #   --> 1
+
+    # The following properties are affected by this value
+    # package CYGPKG_IO
+    #     Requires: CYGPKG_ERROR
+    # package CYGPKG_IO_SERIAL
+    #     Requires: CYGPKG_ERROR
+    # package CYGPKG_IO_SERIAL_CORTEXM_STM32
+    #     Requires: CYGPKG_ERROR
+};
+
+# >
+# errno variable
+# This package controls the behaviour of the
+# errno variable (or more strictly, expression)
+# from <errno.h>.
+#
+cdl_component CYGPKG_ERROR_ERRNO {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGBLD_ISO_ERRNO_HEADER == "<cyg/error/errno.h>" 
+    #     CYGBLD_ISO_ERRNO_HEADER == <cyg/error/errno.h>
+    #   --> 1
+};
+
+# >
+# Per-thread errno
+# This option controls whether the standard error
+# code reporting variable errno is a per-thread
+# variable, rather than global.
+#
+cdl_option CYGSEM_ERROR_PER_THREAD_ERRNO {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires: CYGVAR_KERNEL_THREADS_DATA
+    #     CYGVAR_KERNEL_THREADS_DATA == 1
+    #   --> 1
+};
+
+# Tracing level
+# Trace verbosity level for debugging the errno
+# retrieval mechanism in errno.cxx. Increase this
+# value to get additional trace output.
+#
+cdl_option CYGNUM_ERROR_ERRNO_TRACE_LEVEL {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value 0
+    # value_source default
+    # Default value: 0
+    # Legal values: 0 to 1
+};
+
+# <
+# strerror function
+# This package controls the presence and behaviour of the
+# strerror() function from <string.h>
+#
+cdl_option CYGPKG_ERROR_STRERROR {
+    # Flavor: bool
+    # No user value, uncomment the following line to provide one.
+    # user_value 1
+    # value_source default
+    # Default value: 1
+    # Requires:  CYGBLD_ISO_STRERROR_HEADER == "<cyg/error/strerror.h>" 
+    #     CYGBLD_ISO_STRERROR_HEADER == <cyg/error/strerror.h>
+    #   --> 1
+};
+
+# Error package build options
+# Package specific build options including control over
+# compiler flags used only in building this package,
+# and details of which tests are built.
+#
+cdl_component CYGPKG_ERROR_OPTIONS {
+    # There is no associated value.
+};
+
+# >
+# Additional compiler flags
+# This option modifies the set of compiler flags for
+# building the error package. These flags are used in addition
+# to the set of global flags.
+#
+cdl_option CYGPKG_ERROR_CFLAGS_ADD {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# Suppressed compiler flags
+# This option modifies the set of compiler flags for
+# building the error package. These flags are removed from
+# the set of global flags if present.
+#
+cdl_option CYGPKG_ERROR_CFLAGS_REMOVE {
+    # Flavor: data
+    # No user value, uncomment the following line to provide one.
+    # user_value ""
+    # value_source default
+    # Default value: ""
+};
+
+# <
+# <
+# <
+
diff --git a/firmware/ecosenv.sh b/firmware/ecosenv.sh
new file mode 100644
index 0000000..a3cc4ff
--- /dev/null
+++ b/firmware/ecosenv.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+
+I4EZS_USER_CONFIG="${HOME}/.config/i4ezs/i4ezs-ecosenv-stm32.sh"
+
+ # allow user override
+if [[ -f "$I4EZS_USER_CONFIG" ]]; then
+	source "$I4EZS_USER_CONFIG"
+elif [ -e ~/i4ezs-ecosenv-stm32.sh ]; then
+	echo "WARNING: Found old i4ezs config file at ~/i4ezs-ecosenv-stm32.sh. Please migrate to $I4EZS_USER_CONFIG."
+	source ~/i4ezs-ecosenv-stm32.sh
+else
+	EZS_BASE=/proj/i4ezs/stm32/
+fi
+
+# Ensure that EZS_BASE is exported.
+export EZS_BASE
+
+
+#################### NO CHANGES BELOW SHOULD BE NEEDED ####################
+
+EZS_UID=$$ ; export EZS_UID
+EZS_COMPILER_DIR=$EZS_BASE/gcc-arm-none-eabi ; export EZS_COMPILER_DIR
+EZS_TOOLS_DIR=$EZS_BASE/tools; export EZS_TOOLS_DIR
+EZS_CMAKE_MODULE_DIR=$EZS_BASE/tools ; export EZS_CMAKE_MODULE_DIR
+EZS_LIBOPENCM3_DIR=$EZS_BASE/libopencm3 ; export EZS_LIBOPENCM3_DIR
+ECOS_BASE_DIR=$EZS_BASE/ecos
+ECOS_REPOSITORY=$ECOS_BASE_DIR/packages ; export ECOS_REPOSITORY
+
+PATH=$EZS_TOOLS_DIR:$EZS_COMPILER_DIR/bin:$PATH; export PATH
diff --git a/firmware/gcbuf.c b/firmware/gcbuf.c
new file mode 100644
index 0000000..119ec08
--- /dev/null
+++ b/firmware/gcbuf.c
@@ -0,0 +1,47 @@
+#include "gcbuf.h"
+#include <stdint.h>
+#include <stdlib.h>
+#include <cyg/hal/hal_arch.h>
+#include <libopencm3/cm3/sync.h>
+
+int initBuffer(gcbuf* buf, gcode* array, uint16_t size) {
+	if (size == 0) return ERR_BUFFER_INV_SIZE;
+	buf->size = size;
+	buf->array = array;
+	buf->arrayEnd = buf->array + size;
+	buf->count = 0;
+	buf->nextToRead = buf->array;
+	buf->nextToWrite = buf->array;
+	return 0;
+}
+
+gcode* readIntoBuffer(gcbuf* buf, char string[]) {
+	while (1) {
+		mutex_lock(&(buf->lock));
+		if (buf->count < buf->size) {
+			gcode* ret = buf->nextToWrite;
+			readGcode(buf->nextToWrite, string);
+			(buf->nextToWrite)++;
+			(buf->count)++;
+			if (buf->nextToWrite >= buf->arrayEnd) buf->nextToWrite = buf->array;
+			mutex_unlock(&(buf->lock));
+			return ret;
+		}
+		mutex_unlock(&(buf->lock));
+	}
+}
+
+gcode* readFromBuffer(gcbuf* buf) {
+	while (1) {
+		mutex_lock(&(buf->lock));
+		if (buf->count > 0) {
+			gcode* ret = buf->nextToRead;
+			(buf->nextToRead)++;
+			(buf->count)--;
+			if (buf->nextToRead >= buf->arrayEnd) buf->nextToRead = buf->array;
+			mutex_unlock(&(buf->lock));
+			return ret;
+		}
+		mutex_unlock(&(buf->lock));
+	}
+}
diff --git a/firmware/gcbuf.h b/firmware/gcbuf.h
new file mode 100644
index 0000000..7a5535c
--- /dev/null
+++ b/firmware/gcbuf.h
@@ -0,0 +1,32 @@
+#ifndef HEADER_BUFFER
+#define HEADER_BUFFER
+
+#include <stdint.h>
+#include <cyg/hal/hal_arch.h>
+#include <libopencm3/cm3/sync.h>
+#include "gcode.h"
+
+typedef struct {
+	uint16_t size;
+	gcode* array;
+	gcode* arrayEnd;
+	mutex_t lock;
+	uint16_t volatile count;
+	gcode* volatile nextToRead;
+	gcode* volatile nextToWrite;
+} gcbuf;
+
+// Buffers must not have size 0
+#define ERR_BUFFER_INV_SIZE 1
+
+// Initializes a buffer on memory at array, so it can manage `size` gcodes
+// Returns 0 on success, an error code otherwise
+int initBuffer(gcbuf* buf, gcode* array, uint16_t size);
+
+// Use readGcode from gcode.c to fill the first available gcode with new info. Blocks if full until a gcode is available
+gcode* readIntoBuffer(gcbuf* buf, char string[]);
+
+// Get a gcode from the buffer. Blocks if empty until a gcode is available
+gcode* readFromBuffer(gcbuf* buf);
+
+#endif
diff --git a/firmware/gcode.c b/firmware/gcode.c
new file mode 100644
index 0000000..6b335b0
--- /dev/null
+++ b/firmware/gcode.c
@@ -0,0 +1,64 @@
+#include "gcode.h"
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+
+int readIntValueFromString(char* string) {
+	int ret = 0;
+	bool minus = *string == '-';
+	if (minus) string++;
+	while (*string != 0) ret = ret * 10 + (*(string++) - '0');
+	return minus ? -ret : ret;
+}
+double readDoubleValueFromString(char* string) {
+	double ret = 0;
+	uint32_t decimalDiv = 0;
+	bool minus = *string == '-';
+	if (minus) string++;
+	while (*string != 0) {
+		if (*string == '.') {
+			decimalDiv = 1;
+			string++;
+		} else {
+			ret = ret * 10 + (*(string++) - '0');
+			decimalDiv *= 10;
+		}
+	}
+	if (decimalDiv > 1) ret /= decimalDiv;
+	return minus ? -ret : ret;
+}
+
+int readGcode(gcode* gc, char string[]) {
+	// TODO Mcodes and Line numbers and checksums
+
+	gc->operationId = 0;
+	gc->paramCount = 0;
+	
+	char* hasIgnoreChar = strchr(string, ';');
+	if (hasIgnoreChar == NULL) hasIgnoreChar = strchr(string, '\n');
+	if (hasIgnoreChar != NULL) *hasIgnoreChar = 0;
+	
+	char* block = strtok(string, " ");
+	gc->operationCategory = *block;
+	int operationId = readIntValueFromString(block+1);
+	if (operationId < 0 || operationId > 999) return ERR_GCODE_OP_INV;
+	gc->operationId = operationId;
+	
+	while ((block = strtok(NULL, " ")) != NULL) {
+		gc->paramKeys[gc->paramCount] = *block;
+		gc->paramValues[gc->paramCount] = readDoubleValueFromString(block+1);
+		(gc->paramCount)++;
+	}
+
+	return 0;
+}
+
+double* getGcodeParam(gcode* gc, char key) {
+	uint8_t i = 0;
+	while (i < gc->paramCount) {
+		if (gc->paramKeys[i] == key) return (double*) &(gc->paramValues[i]);
+		i++;
+	}
+	return NULL;
+}
diff --git a/firmware/gcode.h b/firmware/gcode.h
new file mode 100644
index 0000000..f7eda57
--- /dev/null
+++ b/firmware/gcode.h
@@ -0,0 +1,26 @@
+#ifndef HEADER_GCODE
+#define HEADER_GCODE
+
+#include <stdint.h>
+
+typedef struct {
+	char volatile operationCategory;
+	uint16_t volatile operationId;
+	uint8_t volatile paramCount;
+	char volatile paramKeys[16];
+	double volatile paramValues[16];
+} gcode;
+
+// Gcodes must start with G
+#define ERR_GCODE_NO_G 1
+// Gcode operation ID negative or too high (0 to 999)
+#define ERR_GCODE_OP_INV 2
+
+// Reads a gcode from a string, can be finished by a newline. This does not check whether the gcode is semantically valid, only syntactically
+// Returns 0 on success, or an error code as defined above otherwise
+int readGcode(gcode* gc, char string[]);
+
+// Get a pointer to the parameter saved under the given key in a gcode, or NULL if it was not specified
+double* getGcodeParam(gcode* gc, char key);
+
+#endif
diff --git a/firmware/hello.c b/firmware/hello.c
new file mode 100644
index 0000000..657701b
--- /dev/null
+++ b/firmware/hello.c
@@ -0,0 +1,618 @@
+#include <cyg/hal/hal_arch.h>
+#include <cyg/kernel/kapi.h>
+#include <cyg/infra/diag.h>
+
+/*#include <libopencm3/stm32/f4/gpio.h>*/
+#include <libopencm3/stm32/gpio.h>
+#include <libopencm3/stm32/rcc.h>
+#include <libopencm3/stm32/adc.h>
+#include <libopencm3/cm3/nvic.h>
+#include <libopencm3/stm32/exti.h>
+#include <libopencm3/cm3/sync.h>
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <iso646.h>
+
+#include "ezs_adc.h"
+#include "ezs_dac.h"
+#include "ezs_gpio.h"
+#include "ezs_io.h"
+#include "ezs_delay.h"
+#include "ezs_counter.h"
+#include "ezs_serial.h"
+
+// libDIY includes
+#include "diy_gpio.h"
+#include "diy_adc.h"
+#include "diy_tim.h"
+#include "diy_int.h"
+#include "diy_gparser.h"
+
+#include "motor.h"
+#include "axis.h"
+#include "gcbuf.h"
+#include "gcode.h"
+
+#define GCBUF_SIZE 512
+#define STACKSIZE CYGNUM_HAL_STACK_SIZE_MINIMUM+1024
+
+/* Serial buffer data */
+#define SERIAL_BUFFER_LENGTH 128
+static char s_serial_buffer[SERIAL_BUFFER_LENGTH];
+static uint8_t s_serial_position;
+static volatile uint8_t serial_input;   // Save a received character
+static volatile uint8_t s_com_finished; // Flag to see if a command has completed
+
+/* Serial ISR data */
+#define SERIAL_IRQ CYGNUM_HAL_INTERRUPT_UART2
+static cyg_interrupt serial_intr;
+static cyg_handle_t serial_isr_handle;
+
+static void serial_dsr_handler(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
+static cyg_uint32 serial_isr_handler(cyg_vector_t vector, cyg_addrword_t data);
+
+#define X_AXIS_PORT GPIOD
+#define X_AXIS_PIN1 GPIO0
+#define X_AXIS_PIN2 GPIO1
+#define X_AXIS_PIN3 GPIO2
+#define X_AXIS_PIN4 GPIO3
+#define X_ENDSTOP_PORT GPIOB
+#define X_ENDSTOP_PIN GPIO0
+
+#define Y_AXIS_PORT GPIOD
+#define Y_AXIS_PIN1 GPIO4
+#define Y_AXIS_PIN2 GPIO5
+#define Y_AXIS_PIN3 GPIO6
+#define Y_AXIS_PIN4 GPIO7
+#define Y_ENDSTOP_PORT GPIOB
+#define Y_ENDSTOP_PIN GPIO1
+
+#define Z_AXIS_PORT GPIOB
+#define Z_AXIS_PIN1 GPIO3
+#define Z_AXIS_PIN2 GPIO4
+#define Z_AXIS_PIN3 GPIO5
+#define Z_AXIS_PIN4 GPIO6
+#define Z_ENDSTOP_PORT GPIOC
+#define Z_ENDSTOP_PIN GPIO5
+
+#define E_AXIS_PORT GPIOA
+#define E_AXIS_PIN1 GPIO4
+#define E_AXIS_PIN2 GPIO5
+#define E_AXIS_PIN3 GPIO6
+#define E_AXIS_PIN4 GPIO7
+
+#define TEMP_SENSOR_PORT GPIOC
+#define TEMP_SENSOR_PIN GPIO1
+#define TEMP_HOTEND_PORT GPIOA
+#define TEMP_HOTEND_PIN GPIO1
+#define TEMP_R 1e5
+#define TEMP_B 4267
+#define TEMP_T 25
+#define TEMP_TOLERANCE 5
+#define TEMP_EXP_FACTOR 0.1 
+#define TEMP_DANGER 150.0
+#define TEMP_KP 5.0
+#define TEMP_KI 0.0
+#define TEMP_KI_LIMIT 1000
+#define TEMP_KD 0.0
+
+static void setup_motor_gpio(uint32_t port, uint16_t pin0, uint16_t pin1, uint16_t pin2, uint16_t pin3) {
+    diy_gpio_config_t stepper_pin_config;
+    stepper_pin_config.port = port;
+    stepper_pin_config.mode = GPIO_MODE_OUTPUT;
+    stepper_pin_config.type = GPIO_OTYPE_PP;
+    stepper_pin_config.speed = GPIO_OSPEED_50MHZ;
+    stepper_pin_config.pull_up_down = GPIO_PUPD_NONE;
+    stepper_pin_config.alt_func = 0;
+
+    diy_gpio_init(&stepper_pin_config, pin0 | pin1 | pin2 | pin3);
+    diy_gpio_clear_pins(port, pin1 | pin2 | pin3);
+    diy_gpio_set_pins(port, pin0);
+}
+
+static void setup_endstop_gpio(uint32_t port, uint16_t pin) {
+    diy_gpio_config_t config;
+	config.port = port;
+	config.mode = GPIO_MODE_INPUT;
+	config.pull_up_down = GPIO_PUPD_PULLDOWN;
+	diy_gpio_init(&config, pin);
+}
+
+static cyg_uint8 	stack_axis[STACKSIZE];
+static cyg_handle_t handle_axis;
+static cyg_thread   threaddata_axis;
+static axis axis_x;
+static axis axis_y;
+static axis axis_z;
+static axis axis_e;
+static volatile bool allAxesFinished;
+static volatile bool axisReady;
+void thread_axis(cyg_addrword_t arg)
+{
+	ezs_printf("// Initializing X Axis...\n");
+	
+	motor mot_x;
+	setup_motor_gpio(X_AXIS_PORT, X_AXIS_PIN1, X_AXIS_PIN2, X_AXIS_PIN3, X_AXIS_PIN4);
+	setup_endstop_gpio(X_ENDSTOP_PORT, X_ENDSTOP_PIN);
+	setMotorValues_28BYJ48(&mot_x, X_AXIS_PORT, X_AXIS_PIN1, X_AXIS_PIN2, X_AXIS_PIN3, X_AXIS_PIN4);
+	setAxisValues_T25(&axis_x, &mot_x, 20);
+	axis_x.mmPerStep *= 1.01875;
+	axis_x.stepsPerMm /= 1.01875;
+	axis_x.maxMmPerMin = 600.0;
+	axis_x.endstopPort = X_ENDSTOP_PORT;
+	axis_x.endstopPin = X_ENDSTOP_PIN;
+	
+	ezs_printf("// Initializing Y Axis...\n");
+	
+	motor mot_y;
+	setup_motor_gpio(Y_AXIS_PORT, Y_AXIS_PIN1, Y_AXIS_PIN2, Y_AXIS_PIN3, Y_AXIS_PIN4);
+	setup_endstop_gpio(Y_ENDSTOP_PORT, Y_ENDSTOP_PIN);
+	setMotorValues_28BYJ48(&mot_y, Y_AXIS_PORT, Y_AXIS_PIN1, Y_AXIS_PIN2, Y_AXIS_PIN3, Y_AXIS_PIN4);
+	setAxisValues_T25(&axis_y, &mot_y, 20);
+	axis_y.mmPerStep *= 1.0125;
+	axis_y.stepsPerMm /= 1.0125;
+	axis_y.maxMmPerMin = 600.0; // could actually be 680
+	axis_y.homePos = 100.0;
+	axis_y.endstopPort = Y_ENDSTOP_PORT;
+	axis_y.endstopPin = Y_ENDSTOP_PIN;
+	
+	ezs_printf("// Initializing Z Axis...\n");
+	
+	motor mot_z;
+	setup_motor_gpio(Z_AXIS_PORT, Z_AXIS_PIN1, Z_AXIS_PIN2, Z_AXIS_PIN3, Z_AXIS_PIN4);
+	setup_endstop_gpio(Z_ENDSTOP_PORT, Z_ENDSTOP_PIN);
+	setMotorValues_28BYJ48(&mot_z, Z_AXIS_PORT, Z_AXIS_PIN1, Z_AXIS_PIN2, Z_AXIS_PIN3, Z_AXIS_PIN4);
+	setAxisValues_M5(&axis_z, &mot_z);
+	axis_z.maxMmPerMin = 10.0;
+	axis_z.isReversed = true;
+	axis_z.endstopPort = Z_ENDSTOP_PORT;
+	axis_z.endstopPin = Z_ENDSTOP_PIN;
+	
+	ezs_printf("// Initializing Extruder Axis...\n");
+	
+	motor mot_e;
+	setup_motor_gpio(E_AXIS_PORT, E_AXIS_PIN1, E_AXIS_PIN2, E_AXIS_PIN3, E_AXIS_PIN4);
+	setMotorValues_28BYJ48(&mot_e, E_AXIS_PORT, E_AXIS_PIN1, E_AXIS_PIN2, E_AXIS_PIN3, E_AXIS_PIN4);
+	setAxisValues_extruderBolt(&axis_e, &mot_e);
+	axis_e.maxMmPerMin = 60.0;
+	axis_e.mmPerStep /= 1.064516129;
+	axis_e.stepsPerMm *= 1.064516129;
+	axis_e.isReversed = true;
+	
+	ezs_printf("// Axes ready.\n");
+	axisReady = true;
+
+	uint32_t wait_x = 1e6;
+	uint32_t wait_y = 1e6;
+	uint32_t wait_z = 1e6;
+	uint32_t wait_e = 1e6;
+
+    while(1) {
+    	if (wait_x == 0 || wait_x == 1e6) wait_x = updateAxis(&axis_x);
+		uint32_t minimumWait = wait_x;
+		if (wait_y == 0 || wait_y == 1e6) wait_y = updateAxis(&axis_y);
+		if (wait_y < minimumWait) minimumWait = wait_y;
+		if (wait_z == 0 || wait_z == 1e6) wait_z = updateAxis(&axis_z);
+		if (wait_z < minimumWait) minimumWait = wait_z;
+		if (wait_e == 0 || wait_e == 1e6) wait_e = updateAxis(&axis_e);
+		if (wait_e < minimumWait) minimumWait = wait_e;
+		
+		if (wait_x != 1e6) wait_x -= minimumWait;
+		if (wait_y != 1e6) wait_y -= minimumWait;
+		if (wait_z != 1e6) wait_z -= minimumWait;
+		if (wait_e != 1e6) wait_e -= minimumWait;
+		
+		allAxesFinished = axisIsFinished(&axis_x) && axisIsFinished(&axis_y) && axisIsFinished(&axis_z) && axisIsFinished(&axis_e);
+		ezs_delay_us(minimumWait);
+    }
+}
+
+static cyg_uint8 	stack_hotend[STACKSIZE];
+static cyg_handle_t handle_hotend;
+static cyg_thread   threaddata_hotend;
+static volatile double targetTemp;
+static volatile double lastTemp;
+static uint8_t tempInToleranceFor;
+static volatile bool tempIsStable;
+void thread_hotend(cyg_addrword_t arg)
+{
+	double pidErrorSum = 0;
+	double pidLastError = 0;
+	uint32_t avg = 0;
+	
+	ezs_printf("// Initializing thermistor...\n");
+	
+	uint16_t adc_pin = TEMP_SENSOR_PIN;
+    diy_gpio_config_t adc_pin_config;
+    adc_pin_config.port = TEMP_SENSOR_PORT;
+    adc_pin_config.mode = GPIO_MODE_ANALOG;
+    adc_pin_config.type = 0; // Not necessary
+    adc_pin_config.speed = GPIO_OSPEED_50MHZ; // Not Necessary
+    adc_pin_config.pull_up_down = GPIO_PUPD_NONE;
+    adc_pin_config.alt_func = 0;
+    
+    diy_gpio_init(&adc_pin_config, adc_pin);
+    // Init ADC
+    diy_adc_config_t adc_config;
+    uint8_t channels[1] = {ADC_CHANNEL11};
+    adc_config.adc = ADC1;
+    adc_config.sample_time = ADC_SMPR_SMP_3CYC; // Sample ADC channel every 3 cycles
+    adc_config.prescaler = 0; // APB2 clock is 100MHz
+    
+    diy_adc_init(&adc_config, channels, 1);
+    ezs_delay_us(3e3); // Wait 3ms for adc stabilization
+    
+    ezs_printf("// Initializing Hotend PWM...\n");
+    
+    diy_gpio_config_t config;
+	config.port = (uint32_t) TEMP_HOTEND_PORT;
+	config.mode = GPIO_MODE_AF;
+	config.pull_up_down = GPIO_PUPD_NONE;
+	config.alt_func = GPIO_AF1;
+	diy_gpio_init(&config, TEMP_HOTEND_PIN);
+	
+	diy_tim_config_t tim_config;
+    tim_config.timer = (uint32_t) TIM2;
+    tim_config.clock_div = TIM_CR1_CKD_CK_INT ;
+    tim_config.alignment = TIM_CR1_CMS_EDGE ;
+    tim_config.count_direction = TIM_CR1_DIR_UP;
+    tim_config.period = 1000;
+	diy_tim_init(&tim_config);
+	
+	diy_tim_channel_config_t timchan_config;
+    timchan_config.channel = TIM_OC2;
+    timchan_config.mode = TIM_OCM_PWM1;
+    timchan_config.polarity = TIM_CCER_CCxNP_HIGH;
+    timchan_config.compare_value = 0;
+	diy_tim_channel_init(&timchan_config, (uint32_t) TIM2);
+	
+	diy_tim_start((uint32_t) TIM2);
+	diy_tim_channel_start((uint32_t) TIM2, TIM_OC2);
+	
+    ezs_printf("// Temperature Control ready.\n");
+    
+    while (!axisReady) {}
+    ezs_printf("// Ready.\nstart\n");
+	
+	while (1) {
+		uint16_t destination[1];
+		diy_adc_read(ADC1, channels, destination, 1);
+		if (avg == 0) avg = destination[0];
+		else avg = avg * (1.0 - TEMP_EXP_FACTOR) + destination[0] * TEMP_EXP_FACTOR;
+		
+		double resistance = (TEMP_R * 4096.0) / avg - TEMP_R;
+		double tempInvert = (1 / 295.15) + (1.0 / TEMP_B) * log(resistance / TEMP_R);
+		double temp = 1 / tempInvert;
+		double result = (temp-295.15)+TEMP_T;
+		double e = targetTemp - result;
+    
+		uint16_t pwm = 0;
+		if (result < TEMP_DANGER) {
+			pidErrorSum += e;
+			if (pidErrorSum > TEMP_KI_LIMIT) pidErrorSum = TEMP_KI_LIMIT;
+			else if (pidErrorSum < -TEMP_KI_LIMIT) pidErrorSum = -TEMP_KI_LIMIT;
+			double prop_part = TEMP_KP * e;
+			double int_part = TEMP_KI * pidErrorSum;
+			double diff_part = TEMP_KD * (e - pidLastError);
+			int pid = prop_part + int_part + diff_part;
+			if (pid > 300) pid = 300;
+			else if (pid < 0) pid = 0;
+			pwm = pid;
+		} else {
+			pidErrorSum = 0;
+		}
+		pidLastError = e;
+		diy_tim_channel_set_compare_value((uint32_t) TIM2, TIM_OC2, pwm);
+
+		// If absolute temperature error has been <= TEMP_TOLERANCE for 10s, it's stable
+		if (fabs(e) <= TEMP_TOLERANCE) {
+			if (!tempIsStable) {
+				tempInToleranceFor++;
+				if (tempInToleranceFor >= 100) tempIsStable = true;
+			}
+		} else {
+			tempInToleranceFor = 0;
+			tempIsStable = false;
+		}
+		lastTemp = result;
+		ezs_delay_us(1e5);
+	}
+}
+
+static cyg_uint8 	stack_gcodereader[STACKSIZE];
+static cyg_handle_t handle_gcodereader;
+static cyg_thread   threaddata_gcodereader;
+static gcbuf buffer;
+static gcode gcarray[GCBUF_SIZE];
+void thread_gcodereader(cyg_addrword_t arg)
+{
+    while(1){
+        if(s_com_finished){
+        	gcode* gc = readIntoBuffer(&buffer, s_serial_buffer);
+        	ezs_printf("// Reading Gcode %c%d\n", gc->operationCategory, gc->operationId);
+		    s_com_finished = 0;
+		    if (gc->operationCategory == 'G' &&
+		    	((gc->operationId >= 0 && gc->operationId <= 3) ||
+		    	(gc->operationId >= 28 && gc->operationId <= 32))) {
+		    	// Commands G0 to G3 and G28 to G32 are buffered, recieve another command right away
+				ezs_printf("ok\n");
+		    }
+		}
+    }
+}
+
+static cyg_uint8 	stack_gcodeexecutor[STACKSIZE];
+static cyg_handle_t handle_gcodeexecutor;
+static cyg_thread   threaddata_gcodeexecutor;
+static bool relativeMoveMode;
+static double lastFeedRate;
+void thread_gcodeexecutor(cyg_addrword_t arg)
+{
+	while (1) {
+		gcode* gc = readFromBuffer(&buffer);
+		ezs_printf("// Executing Gcode %c%d\n", gc->operationCategory, gc->operationId);
+	
+		if (gc->operationCategory == 'G') {
+			if (gc->operationId == 0 || gc->operationId == 1) {
+				// G0 & G1: Move (just interpret them the same way)
+				// Implementation differences:
+				// - No feed rate acceleration (is instantly set to target speed)
+				// - No endpoint sensing
+				double* xParam = getGcodeParam(gc, 'X');
+				double* yParam = getGcodeParam(gc, 'Y');
+				double* zParam = getGcodeParam(gc, 'Z');
+				double* eParam = getGcodeParam(gc, 'E');
+				double* fParam = getGcodeParam(gc, 'F');
+			
+				double	xTarget = axis_x.lastPosMm,
+						yTarget = axis_y.lastPosMm,
+						zTarget = axis_z.lastPosMm, 
+						xRel = 0.0, yRel = 0.0, zRel = 0.0, eRel = 0.0,
+						mmPerMin = lastFeedRate;
+			
+				if (relativeMoveMode) {
+					if (xParam != NULL) {
+						xRel = *xParam;
+						xTarget += xRel;
+					}
+					if (yParam != NULL) {
+						yRel = *yParam;
+						yTarget += yRel;
+					}
+					if (zParam != NULL) {
+						zRel = *zParam;
+						zTarget += zRel;
+					}
+				} else {
+					if (xParam != NULL) {
+						xRel = *xParam - xTarget;
+						xTarget = *xParam;
+					}
+					if (yParam != NULL) {
+						yRel = *yParam - yTarget;
+						yTarget = *yParam;
+					}
+					if (zParam != NULL) {
+						zRel = *zParam - zTarget;
+						zTarget = *zParam;
+					}
+				}
+			
+				if (eParam != NULL) {
+					eRel = *eParam;
+				}
+			
+				if (fParam != NULL) {
+					mmPerMin = *fParam;
+					lastFeedRate = mmPerMin;
+				}
+			
+				double vectorLength = sqrt(xRel * xRel + yRel * yRel + zRel * zRel);
+				if (vectorLength == 0.0) vectorLength = 0.0001;
+				double xSpeed = fabs(mmPerMin * (xRel / vectorLength));
+				double ySpeed = fabs(mmPerMin * (yRel / vectorLength));
+				double zSpeed = fabs(mmPerMin * (zRel / vectorLength));
+				double eSpeed = fabs(mmPerMin * (eRel / vectorLength));
+			
+				double lowestFactor = 1.0;
+				if (xRel != 0.0) {
+					double factor = axis_x.maxMmPerMin / xSpeed;
+					if (factor < lowestFactor) lowestFactor = factor;
+				}
+				if (yRel != 0.0) {
+					double factor = axis_y.maxMmPerMin / ySpeed;
+					if (factor < lowestFactor) lowestFactor = factor;
+				}
+				if (zRel != 0.0) {
+					double factor = axis_z.maxMmPerMin / zSpeed;
+					if (factor < lowestFactor) lowestFactor = factor;
+				}
+				if (eRel != 0.0) {
+					double factor = axis_e.maxMmPerMin / eSpeed;
+					if (factor < lowestFactor) lowestFactor = factor;
+				}
+			
+				if (xRel != 0.0) setAxisTarget(&axis_x, xTarget, xSpeed * lowestFactor);
+				if (yRel != 0.0) setAxisTarget(&axis_y, yTarget, ySpeed * lowestFactor);
+				if (zRel != 0.0) setAxisTarget(&axis_z, zTarget, zSpeed * lowestFactor);
+				if (eRel != 0.0) setAxisTarget(&axis_e, eRel, eSpeed * lowestFactor);
+			
+				allAxesFinished = false;
+				while (!allAxesFinished) {}
+			} else if (gc->operationId == 4) {
+				// G4: Dwell
+				double* param = getGcodeParam(gc, 'P');
+				if (param != NULL) {
+					ezs_delay_us((uint32_t)param * 1e3);
+				} else {
+					double* param = getGcodeParam(gc, 'S');
+					if (param != NULL) {
+						ezs_delay_us((uint32_t)param * 1e6);
+					}
+				}
+				ezs_printf("ok\n");
+			} else if (gc->operationId == 10) {
+				// G10: Retract
+				setAxisTarget(&axis_e, -5, axis_e.maxMmPerMin);
+				allAxesFinished = false;
+				while (!allAxesFinished) {}
+				ezs_printf("ok\n");
+			} else if (gc->operationId == 11) {
+				// G11: Unretract
+				setAxisTarget(&axis_e, 5, axis_e.maxMmPerMin);
+				allAxesFinished = false;
+				while (!allAxesFinished) {}
+				ezs_printf("ok\n");
+			} else if (gc->operationId == 28) {
+				// G28: Move to Home
+				bool homeX = getGcodeParam(gc, 'X') != NULL;
+				bool homeY = getGcodeParam(gc, 'Y') != NULL;
+				bool homeZ = getGcodeParam(gc, 'Z') != NULL;
+				bool homeAll = gc->paramCount == 0;
+				if (homeAll || homeX) homeAxis(&axis_x);
+				if (homeAll || homeY) homeAxis(&axis_y);
+				if (homeAll || homeZ) homeAxis(&axis_z);
+			} else if (gc->operationId == 90) {
+				// G90: Set to Absolute Positioning
+				relativeMoveMode = false;
+				ezs_printf("ok\n");
+			} else if (gc->operationId == 91) {
+				// G90: Set to Relative Positioning
+				relativeMoveMode = true;
+				ezs_printf("ok\n");
+			} else {
+				ezs_printf("!! Unsupported Gcode %c%d\n", gc->operationCategory, gc->operationId);
+			}
+		} else if (gc->operationCategory == 'M') {
+			if (gc->operationId == 82) {
+				// M82: Set Extruder axis to absolute
+				axis_e.isRelative = false;
+				ezs_printf("ok\n");
+			} else if (gc->operationId == 83) {
+				// M82: Set Extruder axis to relative
+				axis_e.isRelative = true;
+				ezs_printf("ok\n");
+			} else if (gc->operationId == 104) {
+				// M104: Set Extruder temperature
+				targetTemp = *getGcodeParam(gc, 'S');
+				ezs_printf("ok\n");
+			} else if (gc->operationId == 105) {
+				// M105: Get Extruder temperature
+				ezs_printf("ok T:%.1f B:-300.0\n", lastTemp);
+			} else if (gc->operationId == 109) {
+				// M109: Set Extruder temperature and wait
+				targetTemp = *getGcodeParam(gc, 'S');
+				tempIsStable = false;
+				while (!tempIsStable) {}
+				ezs_printf("ok\n");
+			} else if (gc->operationId == 114) {
+				// M114: Get current position
+				ezs_printf("ok C: X:%.2f Y:%.2f Z:%.2f E:%.2f\n",
+							axis_x.lastPosMm, axis_y.lastPosMm, axis_z.lastPosMm, axis_e.lastPosMm);
+			} else if (gc->operationId == 117) {
+				// M114: Get zero position
+				// All axes count the total steps walked since the last home. When homed, it will save
+				// the result to the lastHomeRest attribute. This helps diagnosing step loss
+				ezs_printf("ok C: X:%d Y:%d Z:%d E:%d\n",
+							axis_x.lastHomeRest, axis_y.lastHomeRest, axis_z.lastHomeRest, axis_e.lastHomeRest);
+			} else {
+				ezs_printf("!! Unsupported Gcode %c%d\n", gc->operationCategory, gc->operationId);
+			}
+		} else if (gc->operationCategory == 'T') {
+			if (gc->operationId == 0) {
+				// T0: Activate Extruder and wait for temperature stabilisation
+				targetTemp = 100;
+				tempIsStable = false;
+				while (!tempIsStable) {}
+				ezs_printf("ok\n");
+			} else {
+				// T[any other number]: Deactivate Extruder and wait for temperature stabilisation
+				targetTemp = 0;
+				tempIsStable = false;
+				while (!tempIsStable) {}
+				ezs_printf("ok\n");
+			}
+		} else {
+			ezs_printf("!! Unsupported Gcode %c%d\n", gc->operationCategory, gc->operationId);
+		}
+	}
+}
+
+void cyg_user_start(void)
+{
+    ezs_counter_init();
+    ezs_serial_init();
+    ezs_gpio_init();
+    ezs_dac_init();
+    
+    ezs_printf("// Hello, this is diyprint.\n");
+    
+    ezs_printf("// Initializing gcode buffer...\n");
+    
+    initBuffer(&buffer, gcarray, GCBUF_SIZE);
+    allAxesFinished = true;
+    relativeMoveMode = false;
+    lastFeedRate = 1e4;
+    targetTemp = 100.0;
+    axisReady = false;
+    
+    ezs_printf("// Creating threads...\n");
+
+    cyg_thread_create(7, &thread_axis, 0, "axis", stack_axis, STACKSIZE, &handle_axis, &threaddata_axis);
+    cyg_thread_create(11, &thread_hotend, 0, "hotend", stack_hotend, STACKSIZE, &handle_hotend, &threaddata_hotend);
+	cyg_thread_create(11, &thread_gcodeexecutor, 0, "gcode exec", stack_gcodeexecutor, STACKSIZE, &handle_gcodeexecutor, &threaddata_gcodeexecutor);
+	cyg_thread_create(11, &thread_gcodereader, 0, "gcode read", stack_gcodereader, STACKSIZE, &handle_gcodereader, &threaddata_gcodereader);
+    
+    ezs_printf("// Creating serial interrupt...\n");
+    
+	cyg_interrupt_create(SERIAL_IRQ,
+                         1,
+                         0,
+                         serial_isr_handler,
+                         serial_dsr_handler,
+                         &serial_isr_handle,
+                         &serial_intr);
+
+    cyg_interrupt_attach(serial_isr_handle);
+    cyg_interrupt_unmask(SERIAL_IRQ);
+    
+    ezs_printf("// Starting threads...\n");
+
+    cyg_thread_resume(handle_axis);
+    cyg_thread_resume(handle_hotend);
+	cyg_thread_resume(handle_gcodereader);
+	cyg_thread_resume(handle_gcodeexecutor);
+	
+	// hotend ready thread is also responsible for sending "start" when all systems are ready
+}
+
+// ISR for reading from serial port
+static cyg_uint32 serial_isr_handler(cyg_vector_t vector, cyg_addrword_t data){
+    if(ezs_serial_char_available()){
+        serial_input = ezs_serial_getc();
+        cyg_interrupt_acknowledge(vector);
+        return CYG_ISR_HANDLED | CYG_ISR_CALL_DSR;
+    }
+    else{
+        return CYG_ISR_CALL_DSR;
+    }
+}
+
+static void serial_dsr_handler(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data){
+    if(s_serial_position >= SERIAL_BUFFER_LENGTH){
+        s_serial_position = 0;
+    }
+
+    s_serial_buffer[s_serial_position] = serial_input;
+    if(serial_input == '\n'){
+        s_serial_position = 0;
+        s_com_finished = 1;
+    }
+    else{
+        s_serial_position++;
+    }
+
+}
diff --git a/firmware/libDIY/drivers/include/diy_adc.h b/firmware/libDIY/drivers/include/diy_adc.h
new file mode 100644
index 0000000..ed6dbd3
--- /dev/null
+++ b/firmware/libDIY/drivers/include/diy_adc.h
@@ -0,0 +1,51 @@
+#ifndef DIY_ADC_H_INCLUDED
+#define DIY_ADC_H_INCLUDED
+
+/* When using with the STM32F411E-DISCO the pins/channels:
+ * PA0/0
+ * PA4/4
+ * PA5/5
+ * PA6/6
+ * PA7/7
+ * PC0/11
+ * PC3/13
+ * PC4/14
+ * may already be used or are not available due to other peripherals.
+ * Pins/channels:
+ * PA1/1
+ * PA2/2
+ * PA3/3
+ * PB0/8
+ * PB1/9
+ * PC1/11
+ * PC2/12
+ * PC5/15
+ * should be available.
+ * Channel 16 and 17 are internal channels. Channel 18 is only for V_Bat.
+ */
+
+/*! \brief Structure to configure the ADC. Use the ADC define from libDIY/drivers/
+ * include/diy_adc.h for the adc value and sample_time. Use an Integer for the
+ * prescaler
+ */
+typedef struct {
+    uint32_t adc;
+    uint8_t sample_time;
+    uint32_t prescaler;
+} diy_adc_config_t;
+
+/*! \brief Initialize the on-board ADC.
+ * \param adc_config Struct containing the configuration of the ADC register
+ * \param channels Channel to be configured
+ * \param len_channels Number of channels in channels
+ */
+void diy_adc_init(diy_adc_config_t* adc_config, uint8_t channels[], uint8_t len_channels);
+
+/*! \brief Reads the current ADC value from the channels.
+ * \param adc ADC peripheral
+ * \param channels Channels that should be read
+ * \param sample_val Array where the adc values are stored
+ * \param len_channels Number of channels to be read, sample_val and channels should be of same size
+ */
+void diy_adc_read(uint32_t adc, uint8_t channels[], uint16_t sample_val[], uint8_t len_channels);
+#endif // DIY_ADC_H_INCLUDED
diff --git a/firmware/libDIY/drivers/include/diy_gpio.h b/firmware/libDIY/drivers/include/diy_gpio.h
new file mode 100644
index 0000000..aa5a19b
--- /dev/null
+++ b/firmware/libDIY/drivers/include/diy_gpio.h
@@ -0,0 +1,75 @@
+#ifndef DIY_GPIO_H_INCLUDED
+#define DIY_GPIO_H_INCLUDED
+#include <stdint.h>
+
+/*!
+ * \defgroup gpio DIY GPIO Library
+ */
+/**
+ * \file diy_gpio.h DIY GPIO Library
+ * \ingroup gpio
+ * \brief Configure and use gpio pins
+ */
+
+/*!\brief Structure for initializing the GPIO Pins. For port, mode, type, speed
+ * and pull_up_down use the definitons from libDIY/drivers/include/diy_gpio.h.
+ * For alt_func see the STM32F411 data sheet and use an Interger from 0 to 15.
+ * \param port: GPIOA ... GPIOH
+ * \param mode: GPIO_MODE_OUTPUT (Pin as Output)
+ *              GPIO_MODE_INPUT (Pin as Input)
+                GPIO_MODE_AF (Use Alternate function as described by alt_func, see data sheet)
+                GPIO_MODE_ANALOG (Use for ADC)
+ * \param type: GPIO_TYPE_PP (Use PushPull configuration) 
+                GPIO_TYPE_OD (Use open drain configuration) https://electronics.stackexchange.com/questions/28091/push-pull-open-drain-pull-up-pull-down 
+ * \param speed: GPIO_OSPEED_2MHZ, ..., GPIO_OSPEED_50MHZ 
+ * \param pull_up_down: GPIO_PUPD_NONE, GPIO_PUPD_PULLUP, GPIO_PUPD_PULLDOWN
+ * \param alt_func: GPIO_AF0 ... GPIO_AF15
+ */
+typedef struct {
+    uint32_t port;
+    uint8_t mode;
+    uint8_t type;
+    uint8_t speed;
+    uint8_t pull_up_down;
+    uint8_t alt_func;
+} diy_gpio_config_t;
+
+/*!\brief Initialize the pins on one port with the same configuration
+ * \param gpio_config Struct containing the port register configuration
+ * \param pins Bitmask of the pins, if you want to use more than one pin OR-link
+ * them (GPIO1 | GPIO2 ...).
+ */
+void diy_gpio_init(diy_gpio_config_t* gpio_config, uint16_t pins);
+
+/*!\brief Sets pins to high logic level
+ * \param port Port with the pins
+ * \param pin Bitmask of the pins
+ */
+void diy_gpio_set_pins(uint32_t port, uint16_t pin);
+
+/*!\brief Sets pins to low logic level
+ * \param port Port with the pins
+ * \param pin Bitmask of the pins
+ */
+void diy_gpio_clear_pins(uint32_t port, uint16_t pin);
+
+/*!\brief Inverts the pins logic level
+ * \param port Port with the pins
+ * \param pin Bitmask of the pins
+ */
+void diy_gpio_toggle_pins(uint32_t port, uint16_t pin);
+
+/*!\brief Reads the current output status of one pin
+ * \param port Port with the pins
+ * \param pin Bitmask of the pins
+ * \returns 1 if pin is set to high, 0 otherwise
+ */
+uint8_t diy_gpio_read_pin_out(uint32_t port, uint16_t pin);
+
+/*!\brief Reads the current logic levef of one pin
+ * \param port Port with the pin
+ * \param pin Bitmask of the pin
+ * \returns 1 if pin is pulled high, 0 otherweise
+ */
+uint8_t diy_gpio_read_pin(uint32_t port, uint16_t pin);
+#endif //DIY_GPIO_H_INCLUDED
diff --git a/firmware/libDIY/drivers/include/diy_int.h b/firmware/libDIY/drivers/include/diy_int.h
new file mode 100644
index 0000000..89b41a2
--- /dev/null
+++ b/firmware/libDIY/drivers/include/diy_int.h
@@ -0,0 +1,12 @@
+#ifndef DIY_INT_H_INCLUDED
+#define DIY_INT_H_INCLUDED
+
+#include <stdint.h>
+#include <libopencm3/cm3/nvic.h>
+#include <libopencm3/stm32/exti.h>
+
+/*
+ *
+ */
+void diy_init_button_int(uint32_t pin, enum exti_trigger_type trigger, uint8_t priority);
+#endif // DIY_INT_H_INCLUDED
diff --git a/firmware/libDIY/drivers/include/diy_tim.h b/firmware/libDIY/drivers/include/diy_tim.h
new file mode 100644
index 0000000..38f46a5
--- /dev/null
+++ b/firmware/libDIY/drivers/include/diy_tim.h
@@ -0,0 +1,95 @@
+#ifndef DIY_TIM_H_INCLUDED
+#define DIY_TIM_H_INCLUDED
+#include <stdint.h>
+#include "libopencm3/stm32/timer.h"
+
+// Channel Polarity Definitions
+#define TIM_CCER_CCxNP_LOW 0
+#define TIM_CCER_CCxNP_HIGH 1
+
+/*! \brief Structure for configuring a timer. Use the definitions in libDIY/drivers
+ * include/diy_tim.h for timer, clock_div, alignment and count_direction. Use an
+ * integer for period
+ */
+typedef struct {
+    uint32_t timer;
+    uint32_t clock_div;
+    uint32_t alignment;
+    uint32_t count_direction;
+    uint32_t period;
+} diy_tim_config_t;
+
+/*! \brief Structure for configuring a channel. Use definitions in libDIY/drivers
+ *  include/diy_tim.h for channel, mode and polarity. Use an integer for prescaler,
+ *  repetition_counter and compare_value.
+ */
+
+typedef struct {
+    uint8_t channel;
+    uint8_t mode;
+    uint32_t prescaler;
+    uint32_t repetition_counter;
+    uint8_t polarity;
+    uint32_t compare_value;
+} diy_tim_channel_config_t;
+
+/* Timers available:
+ * TIM2
+ * TIM3
+ * TIM4
+ * TIM5 ! If you use the ezs_counter, do not use TIM5 !
+ * TIM9
+ * TIM10
+ * TIM11
+ * ! TIM 1 is an advanced timer and can not be used with this interface ! 
+ */
+
+/*! \brief Initialize a timer peripheral and starts the timer's counter
+ * \param tim_config Struct containing the configuration of the timer's register
+ */
+void diy_tim_init(diy_tim_config_t* tim_config);
+
+/* Channels and pins for
+ * TIM2: (PA0, PA5, PA15)/CH1, (PA1, PB3)/CH2, (PA2, PB10)/CH3, PA3/CH4
+ * TIM3: (PA6, PB4, PC6)/CH1, (PA7, PB5, PC7)/CH2, (PB0, PC8)/CH3, (PB1, PC9)/CH4, 
+ * TIM4: (PB6, PD12)/CH1, (PB7, PD13)/CH2, (PB8, PD14)/CH3, (PB9, PD15)/CH4
+ * TIM5: PA0/CH1, PA1/CH1, PA2/CH3, PA3/CH4
+ * TIM9: PA2/CH1, PA3/CH2
+ * TIM10: PB8/CH1
+ * TIM11: PB9/CH1
+ */
+/*! \brief Initialize a timer output channel and enables it's output
+ * \param channel_config Struct containing the configuration of the channel's register
+ * \param timer Timer peripheral of the channel
+ */
+void diy_tim_channel_init(diy_tim_channel_config_t* channel_config, uint32_t timer);
+
+/*!  \brief Starts the timer's counter
+ * \param timer Timer peripheral 
+ */
+void diy_tim_start(uint32_t timer);
+
+/*!  \brief Stops the timer's counter
+ * \param timer Timer peripheral 
+ */
+void diy_tim_stop(uint32_t timer);
+
+/*!  \brief Starts the channel's output
+ * \param timer Timer peripheral 
+ * \param channel Channel ID
+ */
+void diy_tim_channel_start(uint32_t timer, enum tim_oc_id channel);
+
+/*!  \brief Stops the channel's output
+ * \param timer Timer peripheral 
+ * \param channel Channel ID
+ */
+void diy_tim_channel_stop(uint32_t timer, enum tim_oc_id channel);
+
+/*! \brief Sets the channel's capture compare value 
+ * \param timer Timer peripheral 
+ * \param channel Channel ID
+ * \param compare_value New capture compare value
+ */
+void diy_tim_channel_set_compare_value(uint32_t timer, enum tim_oc_id channel, uint32_t compare_value);
+#endif // DIY_TIM_H_INCLUDED
diff --git a/firmware/libDIY/drivers/src/diy_adc.c b/firmware/libDIY/drivers/src/diy_adc.c
new file mode 100644
index 0000000..c7f9aa5
--- /dev/null
+++ b/firmware/libDIY/drivers/src/diy_adc.c
@@ -0,0 +1,47 @@
+#include <libopencm3/stm32/rcc.h>
+#include <libopencm3/stm32/adc.h>
+
+#include "diy_adc.h"
+#include "diy_gpio.h"
+
+/*
+ * Function for initializing the onboard ADC and the channels with linked
+ * pins. The function assumes that the GPIO Pins have already been configured
+ * for ADC use.
+ */
+void diy_adc_init(diy_adc_config_t* adc_config, uint8_t channels[], uint8_t len_channels){
+    // Activate Clock for ADC, STM32F411E only has one ADC, so no selection is necessary
+    rcc_periph_clock_enable(RCC_ADC1);
+    // Power off ADC during setup (necessary?)
+    adc_power_off(adc_config->adc);
+    // Turn of scanning mode
+    adc_disable_scan_mode(adc_config->adc);
+    // Set sample time for channels
+    uint8_t i;
+    // Alternative: adc_set_sample_time_on_all_channels(adc, time)
+    for(i = 0; i < len_channels; i++){
+        adc_set_sample_time(adc_config->adc, channels[i], adc_config->sample_time);
+    }
+    // Power on ADC after setup
+    adc_power_on(adc_config->adc);
+    // ADC should be ready after 3 ms
+}
+
+/*
+ * Function to read out a set of up to 16 channels and return their 
+ * values in array of the same order as the input array's channels
+ */
+void diy_adc_read(uint32_t adc, uint8_t channels[], uint16_t sample_val[], uint8_t len_channels){
+    /* adc_read_regular returns uin32_t, but only lower 16 bits are used when
+    * only one ADC is present or more ADC2 is available and dual mode is on.
+    */
+    // Set channels to be sampled in the step
+    adc_set_regular_sequence(adc, len_channels, channels);
+    // Start sampling channels and wait for finish
+    uint8_t i;
+    for(i = 0;i < len_channels;i++){
+        adc_start_conversion_regular(adc);
+        while(!adc_eoc(adc)); // Flag set after each channels conversion
+        sample_val[i] =  (uint16_t) adc_read_regular(adc);
+    }
+}
diff --git a/firmware/libDIY/drivers/src/diy_gpio.c b/firmware/libDIY/drivers/src/diy_gpio.c
new file mode 100644
index 0000000..5a1fbfe
--- /dev/null
+++ b/firmware/libDIY/drivers/src/diy_gpio.c
@@ -0,0 +1,103 @@
+#include "diy_gpio.h"
+#include <libopencm3/stm32/rcc.h>
+#include <libopencm3/stm32/gpio.h>
+
+static enum rcc_periph_clken diy_gpio_get_rcc_periph(uint32_t port){
+    enum rcc_periph_clken rcc_periph;
+
+    switch(port){
+        case GPIOA: rcc_periph = RCC_GPIOA;
+               break;
+        case GPIOB: rcc_periph = RCC_GPIOB;
+               break;
+        case GPIOC: rcc_periph = RCC_GPIOC;
+               break;
+        case GPIOD: rcc_periph = RCC_GPIOD;
+               break;
+        case GPIOE: rcc_periph = RCC_GPIOE;
+               break;
+        case GPIOH: rcc_periph = RCC_GPIOH;
+               break;
+        default: rcc_periph = 0xFFFF;
+                 break;
+    }
+    return rcc_periph;
+}
+
+void diy_gpio_init(diy_gpio_config_t* gpio_config, uint16_t pins){
+    // Get RCC define based on Port
+    enum rcc_periph_clken rcc_periph;
+    rcc_periph = diy_gpio_get_rcc_periph(gpio_config->port); 
+    if(rcc_periph == 0xFFFF){
+        return;
+    }
+    else{
+        // Activate clock for Port
+    rcc_periph_clock_enable(rcc_periph);
+    }
+
+    // Set GPIO port registers MODER, PUPDR
+    gpio_mode_setup(gpio_config->port,
+                    gpio_config->mode,
+                    gpio_config->pull_up_down,
+                    pins);
+
+    // Depending on pin mode set other registers
+    switch(gpio_config->mode){
+        // Set GPIO port registers OTYPER, OSPEEDR for output mode
+        case GPIO_MODE_OUTPUT: gpio_set_output_options(gpio_config->port,
+                                                  gpio_config->type,
+                                                  gpio_config->speed,
+                                                  pins);
+                         gpio_clear(gpio_config->port, pins);
+                         break;
+         // Set GPIO port register AFRL for alternative function mode
+        case GPIO_MODE_AF:    gpio_set_af(gpio_config->port,
+                                     gpio_config->alt_func,
+                                     pins);
+                         break;
+        default:         break;
+    }
+}
+
+/* Wrapper function for libopencm3 set pin function to have a unified 
+ * interface. For multiple pins OR-link them (GPIO1 | GPIO2 ...).
+ */
+void diy_gpio_set_pins(uint32_t port, uint16_t pin){
+    gpio_set(port, pin);
+}
+
+/* Wrapper function for libopencm3 clear pin function to have a unified 
+ * interface. For multiple pins OR-link them (GPIO1 | GPIO2 ...).
+ */
+void diy_gpio_clear_pins(uint32_t port, uint16_t pin){
+    gpio_clear(port, pin);
+}
+
+/* Wrapper function for libopencm3 toggle pin function to have a unified 
+ * interface. For multiple pins OR-link them (GPIO1 | GPIO2 ...).
+ */
+void diy_gpio_toggle_pins(uint32_t port, uint16_t pin){
+    gpio_toggle(port, pin);
+}
+
+/* Function to query the state of one output pin
+ * 1 if pin is set, 0 otherwise
+ */
+uint8_t diy_gpio_read_pin_out(uint32_t port, uint16_t pin){
+    uint16_t odr_reg = 0;
+    odr_reg = (uint16_t) GPIO_ODR(port);
+    if(odr_reg & pin){
+        return (uint8_t) 1;
+    }
+    return (uint8_t) 0;
+}
+
+uint8_t diy_gpio_read_pin(uint32_t port, uint16_t pin){
+    uint16_t idr_reg = 0;
+    idr_reg = gpio_port_read(port);
+    if(idr_reg & pin){
+        return (uint8_t) 1;
+    }
+    return (uint8_t) 0;
+}
diff --git a/firmware/libDIY/drivers/src/diy_int.c b/firmware/libDIY/drivers/src/diy_int.c
new file mode 100644
index 0000000..db90807
--- /dev/null
+++ b/firmware/libDIY/drivers/src/diy_int.c
@@ -0,0 +1,24 @@
+#include "diy_int.h"
+#include <libopencm3/stm32/rcc.h>
+#include <libopencm3/stm32/gpio.h>
+
+static uint8_t get_pin_interrupt(uint32_t pin){
+    switch(pin){
+    case GPIO0: return NVIC_EXTI0_IRQ;
+    default: return UINT8_MAX;
+    }
+}
+
+void diy_init_button_int(uint32_t pin, enum exti_trigger_type trigger, uint8_t priority){
+
+    uint8_t interrupt = get_pin_interrupt(pin);
+    if(interrupt == UINT32_MAX){
+        return;
+    }
+    nvic_enable_irq(NVIC_EXTI0_IRQ);
+    // Activate interrupt for pin
+    exti_select_source(EXTI0, GPIOA);
+    // Change trigger mode
+    exti_set_trigger(EXTI0, EXTI_TRIGGER_BOTH);
+    exti_enable_request(EXTI0);
+}
diff --git a/firmware/libDIY/drivers/src/diy_tim.c b/firmware/libDIY/drivers/src/diy_tim.c
new file mode 100644
index 0000000..cfe9b26
--- /dev/null
+++ b/firmware/libDIY/drivers/src/diy_tim.c
@@ -0,0 +1,89 @@
+#include "diy_tim.h"
+#include "libopencm3/stm32/rcc.h"
+/* \brief Private function for determining the peripheral clock for the Timer.
+ */
+static enum rcc_periph_clken diy_tim_get_rcc_periph(uint32_t timer){
+    enum rcc_periph_clken rcc_periph;
+    switch(timer){
+        case TIM2: rcc_periph = RCC_TIM2;
+                   break;
+        case TIM3: rcc_periph = RCC_TIM3;
+                   break;
+        case TIM4: rcc_periph = RCC_TIM4;
+                   break;
+        case TIM5: rcc_periph = RCC_TIM5;
+                   break;
+        case TIM9: rcc_periph = RCC_TIM9;
+                   break;
+        case TIM10: rcc_periph = RCC_TIM10;
+                    break;
+        case TIM11: rcc_periph = RCC_TIM11;
+                    break;
+        default: rcc_periph = 0xFFFF;
+                 break;
+    }
+    return rcc_periph;
+}
+
+/* \brief Initialize one of the available timers. TIM1 is an advanced timer that
+ * can not be used with this interface. The timer will always run in upadte
+ * master mode. Preload is always enabled.
+ */
+void diy_tim_init(diy_tim_config_t* tim_config){
+    enum rcc_periph_clken rcc_periph;
+    rcc_periph = diy_tim_get_rcc_periph(tim_config->timer);
+    if(rcc_periph == 0xFFFF){
+        return;
+    }
+    else{ // Activate clock for timer
+        rcc_periph_clock_enable(rcc_periph);
+    }
+    timer_set_mode(tim_config->timer,
+                   tim_config->clock_div,
+                   tim_config->alignment,
+                   tim_config->count_direction);
+    timer_set_period(tim_config->timer,
+                     tim_config->period);
+    timer_set_master_mode(tim_config->timer, TIM_CR2_MMS_UPDATE);
+    timer_enable_preload(tim_config->timer);
+    // Start timer
+    timer_enable_counter(tim_config->timer);
+}
+
+void diy_tim_channel_init(diy_tim_channel_config_t* channel_config, uint32_t timer){
+    timer_set_oc_mode(timer, 
+                      (enum tim_oc_id) channel_config->channel, 
+                      (enum tim_oc_mode) channel_config->mode);
+    if(channel_config->polarity == TIM_CCER_CCxNP_HIGH){
+        timer_set_oc_polarity_high(timer, channel_config->channel);
+    }
+    if(channel_config->polarity == TIM_CCER_CCxNP_LOW){
+        timer_set_oc_polarity_low(timer, channel_config->channel);
+    }
+    timer_set_oc_value(timer, 
+                       channel_config->channel, 
+                       channel_config->compare_value);
+    timer_enable_oc_preload(timer, channel_config->channel);
+    // Enable channel output
+    timer_enable_oc_output(timer, channel_config->channel);
+}
+
+void diy_tim_start(uint32_t timer){
+    timer_enable_counter(timer);
+}
+
+void diy_tim_stop(uint32_t timer){
+    timer_disable_counter(timer);
+}
+
+void diy_tim_channel_start(uint32_t timer, enum tim_oc_id channel){
+    timer_enable_oc_output(timer, channel);
+}
+
+void diy_tim_channel_stop(uint32_t timer, enum tim_oc_id channel){
+    timer_disable_oc_output(timer, channel);
+}
+
+void diy_tim_channel_set_compare_value(uint32_t timer, enum tim_oc_id channel, uint32_t compare_value){
+    timer_set_oc_value(timer, channel, compare_value);
+}
diff --git a/firmware/libDIY/include/diy_ds18b20.h b/firmware/libDIY/include/diy_ds18b20.h
new file mode 100644
index 0000000..8ee3016
--- /dev/null
+++ b/firmware/libDIY/include/diy_ds18b20.h
@@ -0,0 +1,17 @@
+#ifndef DIY_DS18B20_H_INCLUDED
+#define DIY_DS18B20_H_INCLUDED
+
+#include <stdint.h>
+
+
+/* Defines */
+
+/* \brief Initialize the pins for Rx and Tx, also sends a test master reset to 
+ * check if the sensor is connected.
+ */
+void diy_ds18b20_init(diy_ds18b20_t* ds18b20_sensor);
+
+void diy_ds18b20_read_temp(diy_ds18b20_t* ds18b20_sensor);
+
+float diy_ds18b20_dig_to_cel(uint16_t dig_sensor_val);
+#endif // DIY_DS18B20_H_INCLUDED
diff --git a/firmware/libDIY/include/diy_gparser.h b/firmware/libDIY/include/diy_gparser.h
new file mode 100644
index 0000000..128e1a2
--- /dev/null
+++ b/firmware/libDIY/include/diy_gparser.h
@@ -0,0 +1,12 @@
+#ifndef DIY_GPARSER_H_INCLUDED
+#define DIY_GPARSER_H_INCLUDED
+
+
+typedef struct {
+    uint8_t code;
+    uint16_t feed_speed;
+    uint16_t x_pos;
+}g_code_t;
+
+uint8_t diy_parse_g_code(char* command_string, g_code_t* g_code);
+#endif // DIY_GPARSER_H_INCLUDED
diff --git a/firmware/libDIY/src/diy_ds18b20.c b/firmware/libDIY/src/diy_ds18b20.c
new file mode 100644
index 0000000..f5d67cd
--- /dev/null
+++ b/firmware/libDIY/src/diy_ds18b20.c
@@ -0,0 +1,19 @@
+#include "diy_ds18b20.h"
+#include "diy_gpio.h"
+
+#include "ezs_delay.h"
+
+#include "libopencm3/stm32/gpio.h"
+
+
+
+void diy_ds18b20_init(diy_ds18b20_t* sensor){
+}
+
+
+/* See data sheet page 18 for order of operation */
+void diy_ds18b20_read_temp(diy_ds18b20_t* sensor){
+}
+
+float diy_ds18b20_dig_to_cel(uint16_t sensor_val_dig){
+}
diff --git a/firmware/libDIY/src/diy_gparser.c b/firmware/libDIY/src/diy_gparser.c
new file mode 100644
index 0000000..04c4e50
--- /dev/null
+++ b/firmware/libDIY/src/diy_gparser.c
@@ -0,0 +1,6 @@
+#include "diy_parser.h"
+
+
+uint8_t diy_parse_g_code(char* command_string, g_code_t* g_code){
+}
+
diff --git a/firmware/libEZS/drivers/i386/ezs_adc.c b/firmware/libEZS/drivers/i386/ezs_adc.c
new file mode 100644
index 0000000..d5676fc
--- /dev/null
+++ b/firmware/libEZS/drivers/i386/ezs_adc.c
@@ -0,0 +1,20 @@
+
+/*!
+ * @file ezs_adc.c
+ * @brief A very simple AD converter, based on Fail*
+ * @author Martin Hoffmann 
+ * \ingroup adc 
+ */
+#include <stdint.h>
+#include "ezs_dac.h"
+
+static volatile uint8_t ezs_adc_in_register;
+/*!
+ * \brief Get a value from the ADC
+ */
+uint8_t ezs_adc_read(void){
+  return ezs_adc_in_register;
+}
+
+
+
diff --git a/firmware/libEZS/drivers/i386/ezs_counter.c b/firmware/libEZS/drivers/i386/ezs_counter.c
new file mode 100644
index 0000000..a4ad16c
--- /dev/null
+++ b/firmware/libEZS/drivers/i386/ezs_counter.c
@@ -0,0 +1,144 @@
+#define EZS_HPET_ADDR  0xFED00000
+
+#include "ezs_counter.h"
+#include <stdio.h>
+#include <stdint.h>
+
+typedef struct hpetReg {
+  uint64_t  GCAP_ID;    /* General capabilities */
+  uint64_t  rsv1;
+  uint64_t  GEN_CONF;   /* General configuration */
+  uint64_t  rsv2;
+  uint64_t  GINTR_STA;    /* General Interrupt status */
+  uint64_t  rsv3[25];
+  uint64_t  MAIN_CNT;   /* Main counter */
+  uint64_t  rsv4;
+  uint64_t  TIM0_CONF;    /* Timer 0 config and cap */
+#define     TIM_CONF 0
+#define     Tn_INT_ENB_CNF 4
+  uint64_t  TIM0_COMP;    /* Timer 0 comparator */
+#define     TIM_COMP 8
+  uint64_t  rsv5[2];
+  uint64_t  TIM1_CONF;    /* Timer 1 config and cap */
+  uint64_t  TIM1_COMP;    /* Timer 1 comparator */
+  uint64_t  rsv6[2];
+  uint64_t  TIM2_CONF;    /* Timer 2 config and cap */
+  uint64_t  TIM2_COMP;    /* Timer 2 comparator */
+  uint64_t  rsv7[2];
+} hpetReg;
+typedef struct  hpetReg hpetReg_t;
+
+volatile hpetReg_t *hpet = (volatile hpetReg_t *) EZS_HPET_ADDR;
+
+static uint64_t hpet_divisor = 0;
+static uint32_t hpet_period = 0;
+static bool use_hpet = true;
+
+
+uint32_t ezs_hpet_period_fs(void)
+{
+  return hpet->GCAP_ID >> 32;
+}
+
+bool ezs_hpet_init(void)
+{
+  uint64_t test = hpet->GCAP_ID;
+  uint64_t gcap = hpet->GCAP_ID;
+
+  hpet_period = (gcap & 0xffffffff00000000ULL) >> 32;
+
+  if( hpet_period > 0x5f5e100 ){
+    use_hpet = false;
+    printf("HPET invalid, using Time Stamp Counter\n");
+    return false;
+  } else {
+    use_hpet = true;
+  }
+
+  uint8_t rev_id = gcap & 0xFF;
+  uint8_t num_timers = (gcap >> 8) & 0x1F;
+  uint8_t counter_size = (gcap >> 13) & 0x1;
+  uint16_t vendor_id = (gcap >> 16) & 0xFFFF;
+
+  hpet_divisor = 1000000000ULL / hpet_period; // 10e9 fs == 1 us
+
+  printf("HPET enabled\n");
+  /* enable HPET */
+  hpet->GEN_CONF = 0x1;
+}
+
+uint64_t ezs_hpet_read(void)
+{
+  uint64_t cnt = hpet->MAIN_CNT;
+  //printf("CNT: 0x%llx\n", cnt);
+  return cnt;
+}
+
+uint64_t ezs_hpet_resolution_us(void)
+{
+  return 1;
+}
+
+uint64_t ezs_hpet_read_us(void)
+{
+  return ezs_hpet_read() / hpet_divisor;
+}
+
+/* Timestamp counter implementation */
+
+#ifndef BOCHS_CPU_MHZ
+#error Bochs CPU Speed not defined
+#endif
+
+static inline unsigned long long getticks(void)
+{
+  unsigned int lo, hi;
+  // RDTSC copies contents of 64-bit TSC into EDX:EAX
+  asm volatile("rdtsc" : "=a" (lo), "=d" (hi));
+  return (unsigned long long)hi << 32 | lo;
+}
+
+cyg_uint64 ezs_rdtsc_get_us(void) {
+  return getticks() / (BOCHS_CPU_MHZ);
+}
+
+void ezs_tsc_init(void){
+  printf("Using time stamp counter, cpu running @ %d MHz\n", BOCHS_CPU_MHZ);
+}
+
+static volatile uint32_t FAILBOCHSID = 0;
+
+/* EZS API implementation */
+void ezs_counter_init(void)
+{
+  if (FAILBOCHSID == 42) { // We run in Fail*
+    ezs_tsc_init();
+    use_hpet = false;
+  } else { // not in Fail* try using HPET
+    if ( ! ezs_hpet_init() ) { // HPET not accurate enough fall back to TSC
+      ezs_tsc_init();
+      use_hpet = false;
+    }
+  }
+}
+
+
+cyg_uint64 ezs_counter_get(void)
+{
+  if(use_hpet){
+    return ezs_hpet_read_us();
+  } else {
+    return ezs_rdtsc_get_us();
+  }
+}
+
+cyg_uint64 ezs_counter_resolution_us(void)
+{
+  return ezs_hpet_resolution_us();
+}
+
+cyg_uint64 ezs_counter_resolution_ps(void)
+{
+  return ezs_hpet_resolution_us() * 1000000;
+}
+
diff --git a/firmware/libEZS/drivers/i386/ezs_dac.c b/firmware/libEZS/drivers/i386/ezs_dac.c
new file mode 100644
index 0000000..f3cff12
--- /dev/null
+++ b/firmware/libEZS/drivers/i386/ezs_dac.c
@@ -0,0 +1,19 @@
+
+/*!
+ * @file ezs_dac.c
+ * @brief A very simple DA converter, based on Fail*
+ * @author Martin Hoffmann 
+ * \ingroup dac 
+ */
+#include <stdint.h>
+#include "ezs_dac.h"
+
+static volatile uint8_t ezs_dac_out_register;
+
+/*!
+ * \brief Write a value to the DAC
+ */
+void ezs_dac_write(uint8_t value){
+  ezs_dac_out_register = value;
+}
+
diff --git a/firmware/libEZS/drivers/i386/ezs_fb.c b/firmware/libEZS/drivers/i386/ezs_fb.c
new file mode 100644
index 0000000..7bbebc3
--- /dev/null
+++ b/firmware/libEZS/drivers/i386/ezs_fb.c
@@ -0,0 +1,88 @@
+#include "ezs_fb.h"
+
+typedef struct {
+	int x;
+	int y;
+} cursor_t;
+
+static cursor_t cursor; 
+void ezs_fb_init(void)
+{
+    CYG_FB_ON(FRAMEBUF);
+    CYG_FB_FILL_BLOCK(FRAMEBUF, 0, 0, FB_WIDTH, FB_HEIGHT, 0);
+	cursor.x = 0;
+	cursor.y = 0;
+}
+
+
+void ezs_fb_fill_block(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 width,cyg_ucount16 height,cyg_fb_colour color)
+{
+	CYG_FB_FILL_BLOCK(FRAMEBUF, x, y, width, height, color);
+}
+
+
+void ezs_fb_hline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len, cyg_fb_colour color)
+{
+	CYG_FB_WRITE_HLINE(FRAMEBUF, x, y, len, color);
+}
+
+
+void ezs_fb_vline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len, cyg_fb_colour color)
+{
+
+	CYG_FB_WRITE_VLINE(FRAMEBUF, x, y, len, color);
+}
+
+void ezs_fb_clear(cyg_fb_colour color)
+{
+	ezs_fb_fill_block(0, 0, FB_WIDTH, FB_HEIGHT, color);
+}
+
+
+void ezs_fb_print_char( int ch, cyg_ucount16 x, cyg_ucount16 y, cyg_fb_colour color){
+	int i, j;
+	for (i = ch*8; i < (ch*8)+8; i++){
+		unsigned char row = g_8x8_font[i];
+		for (j = 0; j < 8; j++){
+			if((row & (0x80 >> j)) != 0){
+				ezs_fb_fill_block(x+j, y+(i-ch*8), 1, 1, color);
+			}
+		}
+	}
+	
+}
+
+void ezs_fb_print_string(char*c,  cyg_fb_colour color){
+	ezs_fb_print_string_cur(c, cursor.x, cursor.y, color);
+}
+
+void ezs_fb_print_string_cur(char* c, cyg_ucount16 x, cyg_ucount16 y, cyg_fb_colour color){
+	char* ch = c;
+	
+	while(*ch != '\0'){
+		if(*ch == '\n'){
+			ezs_fb_newline();
+		}else{
+			ezs_fb_print_char((*ch)+0, x , y, color);
+			x = x+8;
+			if( x >= FB_WIDTH - 8){
+				y += 8;
+				x = 0;
+			}
+		}
+		ch++;
+	}
+	cursor.x = x;
+	cursor.y = y;
+}
+
+void ezs_fb_newline(void){
+	cursor.x = 0;
+	cursor.y += 8;
+}
+
+void ezs_fb_setpos(cyg_ucount16 x, cyg_ucount16 y){
+	cursor.x = x;
+	cursor.y = y;
+}
+
diff --git a/firmware/libEZS/drivers/i386/ezs_keycodes.c b/firmware/libEZS/drivers/i386/ezs_keycodes.c
new file mode 100644
index 0000000..3b7ff90
--- /dev/null
+++ b/firmware/libEZS/drivers/i386/ezs_keycodes.c
@@ -0,0 +1,22 @@
+
+#include "ezs_keycodes.h"
+#include <assert.h>
+#include <stdio.h>
+
+#define NUMBER_OF_KEYCODES 89
+unsigned char char_of_key[] = {
+  0, 0, '1', '2', '3', '4', '5', '6', '7', '8',
+  '9', '0', 225, 39, '\b', 0, 'q', 'w', 'e', 'r',
+  't', 'z', 'u', 'i', 'o', 'p', 129, '+', '\n', 0,
+  'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 148,
+  132, '^', 0, '#', 'y', 'x', 'c', 'v', 'b', 'n',
+  'm', ',', '.', '-', 0, '*', 0, ' ', 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, '-', 0, 0, 0, '+', 0,
+  0, 0, 0, 0, 0, 0, '<', 0, 0 };
+
+unsigned char ezs_get_char_from_keycode(unsigned char code) {
+  assert(code < NUMBER_OF_KEYCODES);
+
+  return char_of_key[code];
+}
diff --git a/firmware/libEZS/drivers/i386/ezs_tracer.cpp b/firmware/libEZS/drivers/i386/ezs_tracer.cpp
new file mode 100644
index 0000000..635b57a
--- /dev/null
+++ b/firmware/libEZS/drivers/i386/ezs_tracer.cpp
@@ -0,0 +1,34 @@
+#include <pkgconf/system.h>
+#include <cyg/io/io.h>
+#include <cyg/error/codes.h>
+#include <stdint.h>
+#include <stdio.h>
+
+//! The magic tracer variable Fail* is listening on.
+volatile unsigned ezs_tracer_register;
+
+//! No Time triggered kernel -> normal event triggered ecos:
+#ifndef SMLPKG_TTKERNEL
+#include <cyg/kernel/kernel.hxx> 	// C Kernel-API
+extern "C" {
+#include <cyg/kernel/kapi.h> 	// C Kernel-API
+}
+class Cyg_Thread;
+
+
+extern "C" void ezs_instrument(Cyg_Thread* current, Cyg_Thread* next) {
+    // Get priority from next thread
+	int prio = next->get_priority();
+	if(prio > 32) prio = 32;
+
+    // Write priority to tracer register
+    ezs_tracer_register = prio;
+}
+
+#else
+#include <sml/ttkernel/task.hxx>
+extern "C" void ezs_instrument(TT_Task* current, TT_Task* next){
+    ezs_tracer_register = next->get_id();
+}
+#endif
+
diff --git a/firmware/libEZS/drivers/stm32f4/ezs_counter.cpp b/firmware/libEZS/drivers/stm32f4/ezs_counter.cpp
new file mode 100644
index 0000000..040767d
--- /dev/null
+++ b/firmware/libEZS/drivers/stm32f4/ezs_counter.cpp
@@ -0,0 +1,62 @@
+#include "ezs_counter.h"
+#include "math.h"
+
+#include <libopencm3/stm32/f4/memorymap.h>
+#include <libopencm3/cm3/common.h>
+#include <libopencm3/stm32/f4/rcc.h>
+#include <libopencm3/stm32/f4/gpio.h>
+#include <libopencm3/stm32/timer.h>
+
+#include <stdint.h>
+
+extern "C" {
+
+static cyg_resolution_t resolution;
+static cyg_uint32 res_ps;
+
+#define PRESCALER 0
+#define RCCCLOCK 42 /*MHz*/
+
+// CPU SPEED is 84MHz
+// RCC CLOCK is CPUSPEED / 2 = 42MHz
+// timer increment frequency is RCC CLOCK / (PRESCALER+1)
+// counter will overflow after (PRESCALER+1) * 102sec
+
+void ezs_counter_init(void) {
+	rcc_periph_clock_enable(RCC_TIM5);
+
+	timer_set_mode(TIM5, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
+	timer_continuous_mode(TIM5);
+	timer_set_period(TIM5, 0xFFFFFFFF);
+	timer_set_prescaler(TIM5, PRESCALER);
+	timer_enable_preload(TIM5);
+
+	timer_enable_counter(TIM5);
+	
+	resolution.dividend = 1000L*(PRESCALER+1);
+	resolution.divisor =  RCCCLOCK;
+	res_ps = (PRESCALER+1) * 1000000L / RCCCLOCK;
+}
+
+cyg_uint32 ezs_counter_get(void) {
+	return timer_get_counter(TIM5);
+}
+
+cyg_resolution_t ezs_counter_get_resolution(void){
+	return resolution;
+}
+
+cyg_uint32 ezs_counter_resolution_ps(void) {
+	return res_ps;
+}
+
+#ifdef SMLPKG_TTKERNEL
+cyg_resolution_t ttEcos_get_resolution(void) {
+  cyg_resolution_t res;
+  res.dividend = SMLNUM_TTKERNEL_RTC_NUMERATOR;
+  res.divisor = SMLNUM_TTKERNEL_RTC_DENOMINATOR;
+
+  return res;
+}
+#endif
+}
diff --git a/firmware/libEZS/drivers/stm32f4/ezs_dac.cpp b/firmware/libEZS/drivers/stm32f4/ezs_dac.cpp
new file mode 100644
index 0000000..3983771
--- /dev/null
+++ b/firmware/libEZS/drivers/stm32f4/ezs_dac.cpp
@@ -0,0 +1,132 @@
+/*!
+ * @file ezs_dac.c
+ * @brief A C wrapper for the stm32 pwm driver
+ * @author Florian Jung
+ * \ingroup dac 
+ */
+
+#define EZS_PWM  CYGHWR_HAL_STM32_PIN_ALTFN_OUT(D,15, 2, PUSHPULL,NONE,LOW)
+
+#include <cyg/hal/hal_arch.h>
+
+#include <libopencm3/stm32/f4/memorymap.h>
+#include <libopencm3/cm3/common.h>
+#include <libopencm3/stm32/f4/rcc.h>
+#include <libopencm3/stm32/f4/gpio.h>
+#include <libopencm3/stm32/timer.h>
+
+#include <stdint.h>
+
+
+/// The timer ticks per microsecond.  Can be adjusting by measuring
+/// pwm on o-scope
+#define PWM_TIMER_TICKS_PER_MICROSECOND 84.0
+
+/// PWM Frequency, default is 62 kHz
+#define PWM_FREQUENCY_kHz 162.0
+
+/// PWM Period, set automatically by the options above
+#define PWM_PERIOD ((1.0/PWM_FREQUENCY_kHz) * 1000.0 \
+                    * PWM_TIMER_TICKS_PER_MICROSECOND / 2)
+
+
+/*
+                                --- FTFM (with edits) ---
+Bullet points are the steps needed.
+Pulse width modulation mode allows you to generate a signal with a frequency determined
+by the value of the TIMx_ARR register (the period) and a duty cycle determined by the value of the
+TIMx_CCRx register (the output compare value).
+  -- Set TIMx_ARR to desired frequency
+  -- Set TIMx_CCRx to desired duty cycle
+The PWM mode can be selected independently on each channel (one PWM per OCx
+output) by writing 110 (PWM mode 1) or ‘111 (PWM mode 2) in the OCxM bits in the
+TIMx_CCMRx register.
+  -- Write PWM Mode 1 or PWM Mode 2 to OCxM bits in TIMx_CCMRx register
+You must enable the corresponding preload register by setting the
+OCxPE bit in the TIMx_CCMRx register, and eventually the auto-reload preload register by
+setting the ARPE bit in the TIMx_CR1 register.
+  -- Set corresponding OCxPE bit in TIMx_CCMRx register
+  -- Set ARPE bit in TIMx_CR1
+As the preload registers are transferred to the shadow registers only when an update event
+occurs, before starting the counter, you have to initialize all the registers by setting the UG
+bit in the TIMx_EGR register.
+  -- set UG bit in TIMx_EGR register
+OCx polarity is software programmable using the CCxP bit in the TIMx_CCER register. It
+can be programmed as active high or active low. OCx output is enabled by the CCxE bit in
+the TIMx_CCER register. Refer to the TIMx_CCERx register description for more details.
+  -- set desired polarity in TIMx_CCER
+  -- set CCxE bit in TIMx_CCER  (enable output)
+*/
+static void pwm_init(uint32_t timer, uint8_t channel, uint32_t period) {
+// function stolen from somewhere on stackoverflow
+
+  // Convert channel number to internal rep
+  enum tim_oc_id chan;
+  switch (channel) {
+    case 1:   chan = TIM_OC1; break;
+    case 2:   chan = TIM_OC2; break;
+    case 3:   chan = TIM_OC3; break;
+    case 4:   chan = TIM_OC4; break;
+    default: chan = TIM_OC4; break;
+  }
+
+  // Timer Base Configuration
+  // timer_reset(timer);
+  timer_set_mode(timer, TIM_CR1_CKD_CK_INT, // clock division
+                        TIM_CR1_CMS_EDGE,   // Center-aligned mode selection
+                        TIM_CR1_DIR_UP);    // TIMx_CR1 DIR: Direction
+  timer_continuous_mode(timer);             // Disables TIM_CR1_OPM (One pulse mode)
+  timer_set_period(timer, period);                    // Sets TIMx_ARR
+  timer_set_prescaler(timer, 1);               // Adjusts speed of timer
+  timer_set_clock_division(timer, 0);            // Adjusts speed of timer
+  timer_set_master_mode(timer, TIM_CR2_MMS_UPDATE);   // Master Mode Selection
+  timer_enable_preload(timer);                        // Set ARPE bit in TIMx_CR1
+
+  // Channel-specific settings
+  timer_set_oc_value(timer, chan, 0);             // sets TIMx_CCRx
+  timer_set_oc_mode(timer, chan, TIM_OCM_PWM1);   // Sets PWM Mode 1
+  timer_enable_oc_preload(timer, chan);           // Sets OCxPE in TIMx_CCMRx
+  timer_set_oc_polarity_high(timer, chan);        // set desired polarity in TIMx_CCER
+  timer_enable_oc_output(timer, chan);             // set CCxE bit in TIMx_CCER  (enable output)
+
+  // Initialize all counters in the register
+  switch (timer) {
+    case TIM1:  TIM1_EGR |= TIM_EGR_UG; break;
+    case TIM2:  TIM2_EGR |= TIM_EGR_UG; break;
+    case TIM3:  TIM3_EGR |= TIM_EGR_UG; break;
+    case TIM4:  TIM4_EGR |= TIM_EGR_UG; break;
+    case TIM5:  TIM5_EGR |= TIM_EGR_UG; break;
+    case TIM6:  TIM6_EGR |= TIM_EGR_UG; break;
+    case TIM7:  TIM7_EGR |= TIM_EGR_UG; break;
+    case TIM8:  TIM8_EGR |= TIM_EGR_UG; break;
+    }
+}
+
+static void pwm_setup(void) {
+  rcc_periph_clock_enable(RCC_TIM4);
+  //pwm_init(TIM4, 1, PWM_PERIOD);
+  pwm_init(TIM4, 2, PWM_PERIOD);
+  pwm_init(TIM4, 3, PWM_PERIOD);
+  pwm_init(TIM4, 4, PWM_PERIOD);
+
+  // LED channels = PD12..15
+  rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPDEN);
+
+  gpio_mode_setup(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE,
+                  GPIO13 | GPIO14 | GPIO15);
+  // AF2 = TIM4_CH1..4
+  gpio_set_af(GPIOD, GPIO_AF2, GPIO13 | GPIO14 | GPIO15);
+  timer_enable_counter(TIM4);
+}
+
+extern "C" void ezs_dac_init() {
+	pwm_setup();
+	CYGHWR_HAL_STM32_GPIO_SET(EZS_PWM);
+}
+
+extern "C" void ezs_dac_write(uint8_t value) {
+	timer_set_oc_value(TIM4, TIM_OC2, value*PWM_PERIOD / 256);
+	timer_set_oc_value(TIM4, TIM_OC3, value*PWM_PERIOD / 256);
+	timer_set_oc_value(TIM4, TIM_OC4, value*PWM_PERIOD / 256);
+}
+
diff --git a/firmware/libEZS/drivers/stm32f4/ezs_gpio.c b/firmware/libEZS/drivers/stm32f4/ezs_gpio.c
new file mode 100644
index 0000000..8001a14
--- /dev/null
+++ b/firmware/libEZS/drivers/stm32f4/ezs_gpio.c
@@ -0,0 +1,14 @@
+#include <cyg/hal/hal_arch.h>
+#include "ezs_gpio.h"
+
+#define EZS_GPIO CYGHWR_HAL_STM32F4DISCOVERY_LED1
+
+void ezs_gpio_init(void)
+{
+	CYGHWR_HAL_STM32_GPIO_SET(EZS_GPIO);
+}
+
+void ezs_gpio_set(bool enable)
+{
+	CYGHWR_HAL_STM32_GPIO_OUT(EZS_GPIO, enable!=0);
+}
diff --git a/firmware/libEZS/drivers/stm32f4/ezs_serial.cpp b/firmware/libEZS/drivers/stm32f4/ezs_serial.cpp
new file mode 100644
index 0000000..cad6ae7
--- /dev/null
+++ b/firmware/libEZS/drivers/stm32f4/ezs_serial.cpp
@@ -0,0 +1,84 @@
+#include <stdio.h>
+#include <cyg/hal/hal_io.h>
+
+#include <pkgconf/io_serial_cortexm_stm32.h>
+#include <pkgconf/io_serial.h>
+
+#include <cyg/io/ttyio.h>
+#include <cyg/io/io.h>
+
+#include "ezs_serial.h"
+
+#ifdef EZS_DUMB_SERIAL
+	// we expect tty0 = UART2 to be configured as polled IO (bufsize=0) in ECOS
+	#if (CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL1_BUFSIZE != 0)
+	#error "buffersize UART2 aka /dev/ser1 must be 0 but it isn't! (see also: EZS_DUMB_SERIAL)"
+	#endif
+#else // i.e. if !EZS_DUMB_SERIAL
+	#if (CYGNUM_IO_SERIAL_CORTEXM_STM32_SERIAL1_BUFSIZE == 0)
+	#error "buffersize UART2 aka /dev/ser1 must be nonzero but it isn't! (see also: EZS_DUMB_SERIAL)"
+	#endif
+#endif
+
+
+extern "C" {
+
+#ifdef EZS_DUMB_SERIAL
+void ezs_serial_init(void) {
+	// enable the rxne interrupt generation.
+
+	uint32_t cr1;
+	HAL_READ_UINT32(CYGHWR_HAL_STM32_UART2 + CYGHWR_HAL_STM32_UART_CR1, cr1);
+	HAL_WRITE_UINT32(CYGHWR_HAL_STM32_UART2 + CYGHWR_HAL_STM32_UART_CR1, cr1 | CYGHWR_HAL_STM32_UART_CR1_RXNEIE);
+}
+#else // i.e. if !EZS_DUMB_SERIAL
+static cyg_io_handle_t handle;
+
+void ezs_serial_init(void) {
+	// open /dev/ser1
+	printf("lookup = %d\n", cyg_io_lookup("/dev/ser1", &handle));
+}
+#endif
+
+#ifdef EZS_DUMB_SERIAL
+void ezs_serial_putc(uint8_t c) {
+	cyg_uint32 stat;
+	const CYG_ADDRWORD base = CYGHWR_HAL_STM32_UART2;
+	do
+	{
+		HAL_READ_UINT32(base + CYGHWR_HAL_STM32_UART_SR, stat);
+	} while ((stat & CYGHWR_HAL_STM32_UART_SR_TC) == 0);
+
+	HAL_WRITE_UINT32( base + CYGHWR_HAL_STM32_UART_DR, c);
+}
+
+uint8_t ezs_serial_getc(void) {
+	// get a byte from the data register
+	const CYG_ADDRWORD base = CYGHWR_HAL_STM32_UART2; 
+	cyg_uint32 c;
+	HAL_READ_UINT32( base + CYGHWR_HAL_STM32_UART_DR, c);
+	return c;
+}
+
+uint8_t ezs_serial_char_available(void) {
+	cyg_uint32 stat;
+	const CYG_ADDRWORD base = CYGHWR_HAL_STM32_UART2; 
+	HAL_READ_UINT32(base + CYGHWR_HAL_STM32_UART_SR, stat);
+	
+	return (stat & CYGHWR_HAL_STM32_UART_SR_RXNE ) ? 1 : 0;
+}
+#else
+uint8_t ezs_serial_blocking_getc(void) {
+	char buf;
+	cyg_uint32 len=1;
+	cyg_io_read(handle, &buf, &len);
+	return buf;
+}
+
+void ezs_serial_putc(uint8_t c)
+{
+	putchar(c);
+}
+#endif
+
+}
diff --git a/firmware/libEZS/include/ezs_adc.h b/firmware/libEZS/include/ezs_adc.h
new file mode 100644
index 0000000..b0a1645
--- /dev/null
+++ b/firmware/libEZS/include/ezs_adc.h
@@ -0,0 +1,25 @@
+#ifndef EZS_ADC_H_INCLUDED
+#define EZS_ADC_H_INCLUDED
+
+/*!
+ * @file ezs_adc.h
+ * @brief A very simple AD converter, based on Fail*
+ * @author Martin Hoffmann
+ * \ingroup dac
+ */
+
+#include <stdint.h>
+
+/*!
+ * \brief Get a value from the ADC.
+ */
+uint8_t ezs_adc_read(void);
+
+/*!
+ * \brief Get a value from the ADC.
+ *
+ * This is a synonym for ezs_adc_read();
+ */
+uint8_t ezs_adc_read(void);
+
+#endif // EZS_ADC_H_INCLUDED
diff --git a/firmware/libEZS/include/ezs_common.h b/firmware/libEZS/include/ezs_common.h
new file mode 100644
index 0000000..c6454a4
--- /dev/null
+++ b/firmware/libEZS/include/ezs_common.h
@@ -0,0 +1,26 @@
+#ifndef EZS_COMMON_H_INCLUDED
+#define EZS_COMMON_H_INCLUDED
+
+/*!
+ * @file ezs_common.h
+ * @brief common functions for EZS
+ * @author Florian Franzmann
+ * \ingroup common
+ */
+
+#include <stdint.h>
+
+
+
+/*!
+ * \brief returns the low byte of value
+ */
+uint8_t ezs_low_byte(uint16_t value);
+
+/*!
+ * \brief returns the high byte of value
+ */
+uint8_t ezs_high_byte(uint16_t value);
+
+
+#endif // EZS_COMMON_H_INCLUDED
diff --git a/firmware/libEZS/include/ezs_counter.h b/firmware/libEZS/include/ezs_counter.h
new file mode 100644
index 0000000..41a06fc
--- /dev/null
+++ b/firmware/libEZS/include/ezs_counter.h
@@ -0,0 +1,68 @@
+#ifndef EZS_COUNTER_H_INCLUDED
+#define EZS_COUNTER_H_INCLUDED
+
+#include <pkgconf/system.h>
+#include <cyg/infra/cyg_type.h>
+
+#ifndef SMLPKG_TTKERNEL
+#include <cyg/kernel/kapi.h>
+#else
+#include <sml/ttkernel/c_api.h>
+#include <pkgconf/ttkernel.h>
+
+typedef struct
+{
+	cyg_uint32 dividend;
+	cyg_uint32 divisor;
+} cyg_resolution_t;
+#endif
+/*!
+ * @file ezs_counter.h
+ * @brief A simple counter interface. Implemented for tricore and for fail*
+ * @authors Martin Hoffmann, Tobias Klaus
+ * \ingroup counter
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*!
+ * \brief This function has to be called exactly once so ezs_counter_get()
+ *        yields meaningfull results.
+ */
+void ezs_counter_init(void);
+
+/**
+ * \brief Read the current counter value from the hardware counter.
+ * @return counter value for time resolution
+ *
+ * \see ezs_counter_get_resolution
+ */
+cyg_uint32 ezs_counter_get(void);
+
+/**
+ * \brief Get the resolution of the counter referenced by ezs_counter_get()
+ * @return resolution represented by a struct comprised of .dividend and .divsior
+ *         each as cyg_uint32 types. dividend/divisor gives the nanoseconds per ticks.
+ *
+ * \see <http://ecos.sourceware.org/docs-latest/ref/kernel-clocks.html>
+ **/
+
+cyg_resolution_t ezs_counter_get_resolution(void);
+
+/**
+ * \brief Returns the current time resolution of the hardware counter.
+ * @return tick resolution in picoseconds
+ */
+cyg_uint32 ezs_counter_resolution_ps(void);
+
+#ifdef SMLPKG_TTKERNEL
+cyg_resolution_t ttEcos_get_resolution(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // EZS_COUNTER_H_INCLUDED
diff --git a/firmware/libEZS/include/ezs_dac.h b/firmware/libEZS/include/ezs_dac.h
new file mode 100644
index 0000000..8ede635
--- /dev/null
+++ b/firmware/libEZS/include/ezs_dac.h
@@ -0,0 +1,33 @@
+#ifndef EZS_DAC_H_INCLUDED
+#define EZS_DAC_H_INCLUDED
+
+/*!
+ * @file ezs_dac.h
+ * @brief A very simple DA converter. Implemented for tricore and for fail*
+ * @authors Martin Hoffmann, Tobias Klaus
+ * \ingroup dac
+ */
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Initializes the DAC. This function has to be called exactly once
+ *        so ezs_dac_write() exhibits defined behaviour.
+ */
+void ezs_dac_init(void);
+
+/*!
+ * \brief Write a value to the DAC.
+ */
+void ezs_dac_write(uint8_t value);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // EZS_DAC_H_INCLUDED
diff --git a/firmware/libEZS/include/ezs_delay.h b/firmware/libEZS/include/ezs_delay.h
new file mode 100644
index 0000000..3295fcb
--- /dev/null
+++ b/firmware/libEZS/include/ezs_delay.h
@@ -0,0 +1,29 @@
+/*!
+ * @file ezs_delay.h
+ * delays the execution of the program
+ *
+ * \ingroup hw
+ *  @brief EZS delay
+ *  @author Florian Jung
+ */
+
+#ifndef __DELAY_H_
+#define __DELAY_H_
+#include <cyg/infra/cyg_type.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/**
+ *  Delays execution for the desired amount of microseconds
+ *  @param microseconds How many microseconds to wait
+ *  @note ezs_counter_init() must have been called prior to use!
+ */
+void ezs_delay_us(cyg_uint32 microseconds);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/firmware/libEZS/include/ezs_fb.h b/firmware/libEZS/include/ezs_fb.h
new file mode 100644
index 0000000..3047acd
--- /dev/null
+++ b/firmware/libEZS/include/ezs_fb.h
@@ -0,0 +1,135 @@
+/*!
+ * @file ezs_fb.h
+ * @brief eCos framebuffer helper
+ * @author Martin Hoffmann
+ * \ingroup hw
+ * Some helper functions for the eCos framebuffer driver.
+ * \note You can still use the eCos functions directly, of course
+ *
+ */
+
+#ifndef __FB_H_
+#define __FB_H_
+
+#include <cyg/infra/cyg_type.h>
+#include <cyg/infra/diag.h>
+#include <cyg/hal/hal_arch.h>
+#include <string.h>
+#include <stdio.h>
+#include "ezs_io_fel.h"
+
+#define FRAMEBUF fb0
+#define FB_WIDTH    CYG_FB_WIDTH(FRAMEBUF)
+#define FB_HEIGHT   CYG_FB_HEIGHT(FRAMEBUF)
+
+#define CYG_FB_HEIGHT(a) 600
+#define CYG_FB_WIDTH(a) 800
+
+#define CYG_FB_DEFAULT_PALETTE_BLACK        0x00
+#define CYG_FB_DEFAULT_PALETTE_BLUE         0x01
+#define CYG_FB_DEFAULT_PALETTE_GREEN        0x02
+#define CYG_FB_DEFAULT_PALETTE_CYAN         0x03
+#define CYG_FB_DEFAULT_PALETTE_RED          0x04
+#define CYG_FB_DEFAULT_PALETTE_MAGENTA      0x05
+#define CYG_FB_DEFAULT_PALETTE_BROWN        0x06
+#define CYG_FB_DEFAULT_PALETTE_LIGHTGREY    0x07
+#define CYG_FB_DEFAULT_PALETTE_LIGHTGRAY    0x07
+#define CYG_FB_DEFAULT_PALETTE_DARKGREY     0x08
+#define CYG_FB_DEFAULT_PALETTE_DARKGRAY     0x08
+#define CYG_FB_DEFAULT_PALETTE_LIGHTBLUE    0x09
+#define CYG_FB_DEFAULT_PALETTE_LIGHTGREEN   0x0A
+#define CYG_FB_DEFAULT_PALETTE_LIGHTCYAN    0x0B
+#define CYG_FB_DEFAULT_PALETTE_LIGHTRED     0x0C
+#define CYG_FB_DEFAULT_PALETTE_LIGHTMAGENTA 0x0D
+#define CYG_FB_DEFAULT_PALETTE_YELLOW       0x0E
+#define CYG_FB_DEFAULT_PALETTE_WHITE        0x0F
+
+
+#define FB_FONT_SMILE 1
+
+/*!
+ *  \brief Initialize the framebuffer. Call this function exactly once before
+ *  using any of the other framebuffer related functions.
+ */
+void ezs_fb_init(void);
+
+/*!
+ *  \brief Fill block.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param width Width of the box.
+ *  \param height Height of the box.
+ *  \param color Color.
+ */
+void ezs_fb_fill_block(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 width,
+                       cyg_ucount16 height, cyg_fb_colour color);
+
+/*!
+ *  \brief Draw horizontal line.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param len length of the line.
+ *  \param color Color.
+ */
+void ezs_fb_hline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len,
+                  cyg_fb_colour color);
+
+/*!
+ *  \brief Draw vertical line.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param len length of the line.
+ *  \param color Color.
+ */
+void ezs_fb_vline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len,
+                  cyg_fb_colour color);
+
+/*!
+ *  \brief Clear the framebuffer.
+ *  \param color Color.
+ */
+void ezs_fb_clear(cyg_fb_colour color);
+
+/*  and so on.. see: http://ecos.sourceware.org/docs-latest/ref/framebuf-drawing.html   */
+
+/*!
+ * \brief Prints a character at a given position.
+ * \param c Character to print.
+ * \param x X-Axis position.
+ * \param y Y-Axis position.
+ * \param color Color.
+ */
+void ezs_fb_print_char(int c, cyg_ucount16 x, cyg_ucount16 y,
+                       cyg_fb_colour color);
+
+/*!
+ * \brief Prints a string at a given position.
+ * \param c Pointer to null terminated string.
+ * \param x X-Axis position.
+ * \param y Y-Axis position.
+ * \param color Color.
+ */
+void ezs_fb_print_string_cur(char* c, cyg_ucount16 x, cyg_ucount16 y,
+                             cyg_fb_colour color);
+
+/*!
+ * \brief Prints a string.
+ * \param c Pointer to null terminated string.
+ * \param color String color.
+ */
+void ezs_fb_print_string(char* c, cyg_fb_colour color);
+
+/*!
+ * \brief Sets the cursor to a new line.
+ */
+void ezs_fb_newline(void);
+
+/*!
+ * \brief Sets the cursor to an arbitrary position.
+ * \param x X-axis position (0 .. FB_WIDTH)
+ * \param y Y-axis position (0 .. FB_HEIGHT)
+ */
+void ezs_fb_setpos(cyg_ucount16 x, cyg_ucount16 y);
+
+#endif
+
diff --git a/firmware/libEZS/include/ezs_fft.h b/firmware/libEZS/include/ezs_fft.h
new file mode 100644
index 0000000..39095aa
--- /dev/null
+++ b/firmware/libEZS/include/ezs_fft.h
@@ -0,0 +1,42 @@
+#ifndef EZS_DSP_FFT_H
+#define EZS_DSP_FFT_H
+
+
+/**
+ * \defgroup dsp Digital Signal Processing (DSP)
+ */
+
+/**
+ * \file ezs_fft.h Fast fourier transformation
+ * \ingroup dsp
+ * \brief calculates the power density spectrum of in[]
+ */
+
+
+
+/**
+ * \brief Calculates the PDS of a given time domain signal
+ * \param in input, time domain signal.
+ * \param out output, out[0] to out[length / 2 - 1] contains the power density spectrum of in[] in dB
+ * \param length of in[]. Must be a power of 2. The size of out[] must be at least length / 2 - 1.
+ *
+ * \note Be careful, only rudimentary error checking is performed.
+ * \see http://en.wikipedia.org/wiki/Spectral_density
+ */
+void ezs_power_density_spectrum(float in[], float out[], int length);
+
+/**
+ * \brief Calculates the PDS of a given time domain signal
+ * \param in input, time domain signal.
+ * \param out output, contains the power density spectrum of in[] in dB.
+ * \param length of in[]. Must be a power of 2. The size of out[] must be at least length/2 - 1.
+ *
+ * This is a convenience function that calls ezs_power_density_spectrum().
+ *
+ * \note Be careful, only rudimentary error checking is performed.
+ * \see http://en.wikipedia.org/wiki/Spectral_density
+ */
+void ezs_easy_pds(cyg_uint32 in[], float out[], int length);
+
+
+#endif // EZS_DSP_FFT_H
diff --git a/firmware/libEZS/include/ezs_gcd.h b/firmware/libEZS/include/ezs_gcd.h
new file mode 100644
index 0000000..76aabd1
--- /dev/null
+++ b/firmware/libEZS/include/ezs_gcd.h
@@ -0,0 +1,24 @@
+#ifndef EZS_MATH_GCD_H
+#define EZS_MATH_GCD_H
+/**
+ * \defgroup math Math stuff
+ */
+
+/**
+ * \file ezs_gcd.h
+ * \ingroup math
+ * \brief Greatest common divisor implementation
+ */
+
+
+/**
+ * \brief calculates the greatest common divisor of a and b
+ */
+int ezs_greatest_common_divisor(int a, int b);
+
+/**
+ * \brief calculates the lowest common multiple of a and b
+ */
+int ezs_lowest_common_multiple(int a, int b);
+
+#endif // EZS_MATH_GCD_H
diff --git a/firmware/libEZS/include/ezs_gpio.h b/firmware/libEZS/include/ezs_gpio.h
new file mode 100644
index 0000000..9532d97
--- /dev/null
+++ b/firmware/libEZS/include/ezs_gpio.h
@@ -0,0 +1,24 @@
+#ifndef EZS_GPIO_H_INCLUDED
+#define EZS_GPIO_H_INCLUDED
+
+#include <stdbool.h>
+/**
+ * \file ezs_gpio.h
+ * \ingroup hw
+ * \brief Access to General Purpose Input/Output pins
+ */
+
+/**
+ * \brief Call this function exactly once to initialize the GPIO system.
+ * As long as this function has not been called, calls to other functions in
+ * this module have undefined behaviour.
+ */
+void ezs_gpio_init(void);
+
+/**
+ * \brief Sets the GPIO pin to high (enabled == true) or low (enabled ==
+ * false).
+ */
+void ezs_gpio_set(bool /* enabled */);
+
+#endif // EZS_GPIO_H_INCLUDED
diff --git a/firmware/libEZS/include/ezs_interpolation.h b/firmware/libEZS/include/ezs_interpolation.h
new file mode 100644
index 0000000..c1dab00
--- /dev/null
+++ b/firmware/libEZS/include/ezs_interpolation.h
@@ -0,0 +1,13 @@
+#ifndef EZS_INTERPOLATION_H
+#define EZS_INTERPOLATION_H
+
+/**
+ * \file ezs_interpolation.h
+ * \ingroup dsp
+ * \brief performs linear resampling of in[] and writes the result to out[]
+ * @see http://en.wikipedia.org/wiki/Sample_rate_conversion
+ * @see http://en.wikipedia.org/wiki/Linear_interpolation
+ */
+void ezs_resample_linear(float in[], size_t in_length, float out[],
+                         size_t out_length);
+#endif // EZS_INTERPOLATION_H
diff --git a/firmware/libEZS/include/ezs_io.h b/firmware/libEZS/include/ezs_io.h
new file mode 100644
index 0000000..4a1e2db
--- /dev/null
+++ b/firmware/libEZS/include/ezs_io.h
@@ -0,0 +1,27 @@
+#ifndef EZS_IO_H_INCLUDED
+#define EZS_IO_H_INCLUDED
+
+#include <cyg/infra/cyg_type.h>
+
+#define ezs_printf printf
+
+#define print_measurement ezs_print_measurement
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/**
+ * \file ezs_io.h
+ * \brief Input/Output primitives
+ */
+
+/**
+ * \brief print value annotated with timestamp. The exact means of printing are
+ * subject to the underlying hardware.
+ */
+void ezs_print_measurement(cyg_uint32 timestamp, cyg_uint32 value);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // EZS_IO_H_INCLUDED
diff --git a/firmware/libEZS/include/ezs_io_fel.h b/firmware/libEZS/include/ezs_io_fel.h
new file mode 100644
index 0000000..8a11ce7
--- /dev/null
+++ b/firmware/libEZS/include/ezs_io_fel.h
@@ -0,0 +1,127 @@
+#ifndef __EZS_IO_FEL_H__
+#define __EZS_IO_FEL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FB_BLACK 0
+#define FB_WHITE ((16*4)-1)
+
+#include <stdio.h>
+#include <cyg/infra/cyg_type.h>
+
+#define FRAMEBUF fb0
+#define FB_WIDTH    CYG_FB_WIDTH(FRAMEBUF)
+#define FB_HEIGHT   CYG_FB_HEIGHT(FRAMEBUF)
+
+#define CYG_FB_HEIGHT(a) 600
+#define CYG_FB_WIDTH(a)  800
+
+#define CYG_FB_DEFAULT_PALETTE_BLACK        0x00
+#define CYG_FB_DEFAULT_PALETTE_BLUE         0x01
+#define CYG_FB_DEFAULT_PALETTE_GREEN        0x02
+#define CYG_FB_DEFAULT_PALETTE_CYAN         0x03
+#define CYG_FB_DEFAULT_PALETTE_RED          0x04
+#define CYG_FB_DEFAULT_PALETTE_MAGENTA      0x05
+#define CYG_FB_DEFAULT_PALETTE_BROWN        0x06
+#define CYG_FB_DEFAULT_PALETTE_LIGHTGREY    0x07
+#define CYG_FB_DEFAULT_PALETTE_LIGHTGRAY    0x07
+#define CYG_FB_DEFAULT_PALETTE_DARKGREY     0x08
+#define CYG_FB_DEFAULT_PALETTE_DARKGRAY     0x08
+#define CYG_FB_DEFAULT_PALETTE_LIGHTBLUE    0x09
+#define CYG_FB_DEFAULT_PALETTE_LIGHTGREEN   0x0A
+#define CYG_FB_DEFAULT_PALETTE_LIGHTCYAN    0x0B
+#define CYG_FB_DEFAULT_PALETTE_LIGHTRED     0x0C
+#define CYG_FB_DEFAULT_PALETTE_LIGHTMAGENTA 0x0D
+#define CYG_FB_DEFAULT_PALETTE_YELLOW       0x0E
+#define CYG_FB_DEFAULT_PALETTE_WHITE        0x0F
+
+typedef unsigned char cyg_fb_colour;
+
+void ezs_fel_serial_init(void);
+
+void ezs_printf(const char* fmt, ...)
+#ifdef __GNUC__
+          __attribute__ (( format( printf, 1, 2 ) ))
+#endif
+;
+
+void ezs_log_file(const char* file, const char* fmt, ...)
+#ifdef __GNUC__
+          __attribute__ (( format( printf, 2, 3 ) ))
+#endif
+;
+
+
+/*!
+ *  \brief Initialize the framebuffer. Call this function exactly once before
+ *  using any of the other framebuffer related functions.
+ */
+void ezs_fb_init(void);
+
+
+/*!
+ *  \brief Fill block.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param width Width of the box.
+ *  \param height Height of the box.
+ *  \param color Color.
+ */
+void ezs_fb_fill_block(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 width,
+                       cyg_ucount16 height, cyg_fb_colour color);
+
+/*!
+ *  \brief Draw horizontal line.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param len length of the line.
+ *  \param color Color.
+ */
+void ezs_fb_hline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len,
+                  cyg_fb_colour color);
+
+/*!
+ *  \brief Draw vertical line.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param len length of the line.
+ *  \param color Color.
+ */
+void ezs_fb_vline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len,
+                  cyg_fb_colour color);
+
+/*!
+ *  \brief Clear the framebuffer.
+ *  \param color Color.
+ */
+void ezs_fb_clear(cyg_fb_colour color);
+
+/*  and so on.. see: http://ecos.sourceware.org/docs-latest/ref/framebuf-drawing.html   */
+
+/*!
+ * \brief Prints a character at a given position.
+ * \param c Character to print.
+ * \param x X-Axis position.
+ * \param y Y-Axis position.
+ * \param color Color.
+ */
+void ezs_fb_print_char(int c, cyg_ucount16 x, cyg_ucount16 y,
+                       cyg_fb_colour color);
+
+/*!
+ * \brief Prints a string at a given position.
+ * \param c Pointer to null terminated string.
+ * \param x X-Axis position.
+ * \param y Y-Axis position.
+ * \param color Color.
+ */
+void ezs_fb_print_string(char* c, cyg_ucount16 x, cyg_ucount16 y,
+                             cyg_fb_colour color);
+///////////////////// TERMINAL FOO //////////////////////////
+
+#ifdef __cplusplus
+}
+#endif
+#endif // __EZS_IO_FEL_H__
diff --git a/firmware/libEZS/include/ezs_keycodes.h b/firmware/libEZS/include/ezs_keycodes.h
new file mode 100644
index 0000000..c9cdf8c
--- /dev/null
+++ b/firmware/libEZS/include/ezs_keycodes.h
@@ -0,0 +1,16 @@
+#ifndef __KEYCODES_H__
+#define __KEYCODES_H__
+/**
+ * @file ezs_keycodes.h
+ *
+ * @brief Keyboard keycodes.
+ * @author Martin Hoffmann
+ */
+
+
+/**
+ *  Get character from keyboard code.
+ */
+unsigned char ezs_get_char_from_keycode(unsigned char code);
+
+#endif
diff --git a/firmware/libEZS/include/ezs_plot.h b/firmware/libEZS/include/ezs_plot.h
new file mode 100644
index 0000000..25528c5
--- /dev/null
+++ b/firmware/libEZS/include/ezs_plot.h
@@ -0,0 +1,27 @@
+#ifndef EZS_PLOT_H
+#define EZS_PLOT_H
+#include <cyg/infra/cyg_type.h>
+#include "ezs_io_fel.h"
+/**
+ * \defgroup plot Graph plotting
+ */
+
+
+/**
+ * \file ezs_plot.h
+ * \ingroup plot
+ * \brief Helper function to plot a <b>time domain signal</b>
+ */
+
+/**
+ * \brief Plots a <b>time signal</b> of given length to framebuffer
+ *
+ * @param data  A pointer of data values
+ * @param length The size of the data array
+ * @param foreground The foreground color: e.g. FB_WHITE
+ * @param background The background color: e.g. FB_BLACK
+ */
+void ezs_plot(cyg_uint32 data[], size_t length, cyg_fb_colour foreground,
+              cyg_fb_colour background);
+
+#endif // EZS_PLOT_H
diff --git a/firmware/libEZS/include/ezs_plot_pds.h b/firmware/libEZS/include/ezs_plot_pds.h
new file mode 100644
index 0000000..7ce9ffd
--- /dev/null
+++ b/firmware/libEZS/include/ezs_plot_pds.h
@@ -0,0 +1,18 @@
+#ifndef EZS_PLOT_PDS_H
+#define EZS_PLOT_PDS_H
+#include "ezs_io_fel.h"
+
+/**
+ * \file ezs_plot_pds.h
+ * \ingroup plot
+ * \brief plot an previously calculated <b>power density spectrum</b>
+ *
+ * @param spectrum The caculated pds data
+ * @param length The length of the pds array
+ * @param foreground The framebuffer foreground color
+ * @param background The framebuffer background color
+ */
+void ezs_plot_pds(float spectrum[], int length, cyg_fb_colour foreground,
+                  cyg_fb_colour background);
+
+#endif // EZS_PLOT_PDS_H
diff --git a/firmware/libEZS/include/ezs_sensor.h b/firmware/libEZS/include/ezs_sensor.h
new file mode 100644
index 0000000..f99faf7
--- /dev/null
+++ b/firmware/libEZS/include/ezs_sensor.h
@@ -0,0 +1,39 @@
+#ifndef EZS_SENSOR_H_INCLUDED
+#define EZS_SENSOR_H_INCLUDED
+
+#include <inttypes.h>
+
+//alias to map slide prototypes to implementation
+#define ezs_adc_init ezs_sensors_init
+
+/*!
+ * \brief This function has to be called exactly once so get_sensor_(a|b|c)_value()
+ *        and ezs_adc_get yield meaningfull results.
+ */
+void ezs_sensors_init(void);
+
+/**
+ * \brief Returns the current value of sensor A.
+ * @return the value of the sensor.
+ */
+uint16_t get_sensor_a_value(void);
+
+/**
+ * \brief Returns the current value of sensor B.
+ * @return the value of the sensor.
+ */
+uint16_t get_sensor_b_value(void);
+
+/**
+ * \brief Returns the current value of sensor C.
+ * @return the value of the sensor.
+ */
+uint16_t get_sensor_c_value(void);
+
+/**
+ * \brief Returns the current value of the ezs ADC.
+ * @return the value of the sensor.
+ */
+uint8_t ezs_adc_get(void);
+
+#endif
diff --git a/firmware/libEZS/include/ezs_serial.h b/firmware/libEZS/include/ezs_serial.h
new file mode 100644
index 0000000..9ecb780
--- /dev/null
+++ b/firmware/libEZS/include/ezs_serial.h
@@ -0,0 +1,51 @@
+#ifndef EZS_SERIAL_H_INCLUDED
+#define EZS_SERIAL_H_INCLUDED
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \file ezs_serial.h
+ * \ingroup hw
+ * \brief Functions for using the SERIAL interface.
+ */
+
+/**
+ * \brief initializes the SERIAL interface. Call this function exactly once
+ * before using any other function provided by this module.
+ */
+void ezs_serial_init(void);
+
+
+
+#ifdef EZS_DUMB_SERIAL
+/**
+ * \brief writes a single byte to the UART hardware register
+ */
+void ezs_serial_putc(uint8_t /* c */);
+
+/**
+ * \brief reads a single byte from the UART hardware register
+ */
+uint8_t ezs_serial_getc(void);
+
+/**
+ * \brief tells whether a byte is available on the UART
+ */
+uint8_t ezs_serial_char_available(void);
+#else
+
+/**
+ * \brief reads a single byte from the UART input buffer, blocking if no byte is available.
+ */
+uint8_t ezs_serial_blocking_getc(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // EZS_SERIAL_H_INCLUDED
diff --git a/firmware/libEZS/include/ezs_stopwatch.h b/firmware/libEZS/include/ezs_stopwatch.h
new file mode 100644
index 0000000..a9be9d7
--- /dev/null
+++ b/firmware/libEZS/include/ezs_stopwatch.h
@@ -0,0 +1,42 @@
+/*!
+ * @file ezs_stopwatch.h
+ * A stopwatch for time measurement and
+ * WCET generation.
+ *
+ * \ingroup hw
+ *  @brief EZS time measurement and WCET generation
+ *  @author Martin Hoffmann
+ */
+
+#ifndef __STOPWATCH_H_
+#define __STOPWATCH_H_
+#include <cyg/infra/cyg_type.h>
+
+/**
+ *  Start stop watch.
+ *  @param state Pointer to a state variable
+ */
+void ezs_watch_start(cyg_uint32* state);
+
+/**
+ *  Stop watch and return time in timer's ticks.
+ *  @param state Pointer to a state variable
+ *  @see ezs_watch_start
+ */
+cyg_uint32 ezs_watch_stop(cyg_uint32* state);
+
+/**
+ *  Waits actively for WCET simulation.
+ *
+ *  @param wcetticks Maximum amount of ticks to wait actively.
+ *              Beware! Too small amounts of ticks may be undetectable.
+ *              Thus this function may not support small granularities.
+ *  @peram percentage Percentage of the proportion of wcetticks from which the actual execution time ticks will be randomly chosen. Values above 100 are mapped to 100.
+ *
+ * \see ezs_counter_get_resolution()
+ */
+void ezs_lose_time(cyg_uint32 wcetticks, cyg_uint8 percentage);
+
+
+#endif
+
diff --git a/firmware/libEZS/include/ezs_trace.h b/firmware/libEZS/include/ezs_trace.h
new file mode 100644
index 0000000..3c5056c
--- /dev/null
+++ b/firmware/libEZS/include/ezs_trace.h
@@ -0,0 +1,14 @@
+#ifndef EZS_TRACER_H
+#define EZS_TRACER_H
+
+/**
+ * \file ezs_trace.h
+ * \brief Functions for execution tracing.
+ */
+
+/**
+ * \brief initializes execution tracing
+ */
+int ezs_trace_init(void);
+
+#endif
diff --git a/firmware/libEZS/include/ezs_window.h b/firmware/libEZS/include/ezs_window.h
new file mode 100644
index 0000000..c70b8e4
--- /dev/null
+++ b/firmware/libEZS/include/ezs_window.h
@@ -0,0 +1,28 @@
+#ifndef EZS_DSP_WINDOW_H
+#define EZS_DSP_WINDOW_H
+
+/**
+ * \file ezs_window.h
+ * \ingroup dsp
+ * \brief Various FFT window implementations
+ * \author Florian Franzmann
+ * \note only for internal use.
+ */
+
+/**
+ * \brief This function calculates the weights for a rectangulage window
+ * \return always returns 1.0
+ */
+float ezs_rect_window(float alpha, int position, int length);
+
+/**
+ * \brief This function calculates the weights for a blackman window
+ */
+float ezs_blackman_window(float alpha, int position, int length);
+
+/*!
+ * \brief This function calculates the weights for a hamming window
+ */
+float ezs_hamming_window(float alpha, int position, int length);
+
+#endif // EZS_DSP_WINDOW_H
diff --git a/firmware/libEZS/src/ezs_common.c b/firmware/libEZS/src/ezs_common.c
new file mode 100644
index 0000000..cb81469
--- /dev/null
+++ b/firmware/libEZS/src/ezs_common.c
@@ -0,0 +1,10 @@
+#include "ezs_common.h"
+
+uint8_t ezs_low_byte(uint16_t value) {
+    return (uint8_t) (value & 0xFF);
+}
+
+uint8_t ezs_high_byte(uint16_t value) {
+    return (uint8_t) ((value & 0xFF00) >> 8);
+}
+
diff --git a/firmware/libEZS/src/ezs_dac.c b/firmware/libEZS/src/ezs_dac.c
new file mode 100644
index 0000000..2c3295e
--- /dev/null
+++ b/firmware/libEZS/src/ezs_dac.c
@@ -0,0 +1,21 @@
+/*!
+ * @file ezs_dac.c
+ * @brief A very simple DA converter, based on Fail*
+ * @author Martin Hoffmann
+ * \ingroup dac
+ */
+#include <stdint.h>
+#include "ezs_dac.h"
+
+static volatile uint8_t ezs_dac_out_register;
+
+/*!
+ * \brief Write a value to the DAC
+ */
+void ezs_dac_write(uint8_t value) {
+    ezs_dac_out_register = value;
+}
+
+void ezs_dac_init() {
+}
+
diff --git a/firmware/libEZS/src/ezs_delay.c b/firmware/libEZS/src/ezs_delay.c
new file mode 100644
index 0000000..67eb966
--- /dev/null
+++ b/firmware/libEZS/src/ezs_delay.c
@@ -0,0 +1,24 @@
+#include <pkgconf/system.h>
+
+#ifndef SMLPKG_TTKERNEL
+#include <cyg/kernel/kapi.h>
+#endif
+
+#include <stdlib.h>
+
+#include "ezs_delay.h"
+#include "ezs_counter.h"
+
+void ezs_delay_us(cyg_uint32 microseconds)
+{
+	cyg_uint32 start = ezs_counter_get();
+	cyg_uint32 waitticks = ((cyg_uint64)microseconds) * 1000000L / ezs_counter_resolution_ps();
+
+	#ifndef SMLPKG_TTKERNEL
+	if (microseconds >= 1000 /* 1ms */)
+		cyg_thread_delay(microseconds / 1000);
+	#endif
+
+	while (ezs_counter_get()-start < waitticks);
+}
+
diff --git a/firmware/libEZS/src/ezs_fb.c b/firmware/libEZS/src/ezs_fb.c
new file mode 100644
index 0000000..1a1493a
--- /dev/null
+++ b/firmware/libEZS/src/ezs_fb.c
@@ -0,0 +1,93 @@
+#include "libEZS/include/ezs_fb.h"
+typedef struct {
+    int x;
+    int y;
+} cursor_t;
+
+static cursor_t cursor;
+void ezs_fb_init(void) {
+    CYG_FB_ON(FRAMEBUF);
+    CYG_FB_FILL_BLOCK(FRAMEBUF, 0, 0, FB_WIDTH, FB_HEIGHT, 0);
+    cursor.x = 0;
+    cursor.y = 0;
+}
+
+
+void ezs_fb_fill_block(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 width,
+                       cyg_ucount16 height, cyg_fb_colour color) {
+    CYG_FB_FILL_BLOCK(FRAMEBUF, x, y, width, height, color);
+}
+
+
+void ezs_fb_hline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len,
+                  cyg_fb_colour color) {
+    CYG_FB_WRITE_HLINE(FRAMEBUF, x, y, len, color);
+}
+
+
+void ezs_fb_vline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len,
+                  cyg_fb_colour color) {
+
+    CYG_FB_WRITE_VLINE(FRAMEBUF, x, y, len, color);
+}
+
+void ezs_fb_clear(cyg_fb_colour color) {
+    ezs_fb_fill_block(0, 0, FB_WIDTH, FB_HEIGHT, color);
+}
+
+
+void ezs_fb_print_char( int ch, cyg_ucount16 x, cyg_ucount16 y,
+                        cyg_fb_colour color) {
+    int i, j;
+
+    for (i = ch * 8; i < (ch * 8) + 8; i++) {
+        unsigned char row = g_8x8_font[i];
+
+        for (j = 0; j < 8; j++) {
+            if ((row & (0x80 >> j)) != 0) {
+                ezs_fb_fill_block(x + j, y + (i - ch * 8), 1, 1, color);
+            }
+        }
+    }
+
+}
+
+void ezs_fb_print_string(char* c,  cyg_fb_colour color) {
+    ezs_fb_print_string_cur(c, cursor.x, cursor.y, color);
+}
+
+void ezs_fb_print_string_cur(char* c, cyg_ucount16 x, cyg_ucount16 y,
+                             cyg_fb_colour color) {
+    char* ch = c;
+
+    while (*ch != '\0') {
+        if (*ch == '\n') {
+            ezs_fb_newline();
+        }
+        else {
+            ezs_fb_print_char((*ch) + 0, x , y, color);
+            x = x + 8;
+
+            if ( x >= FB_WIDTH - 8) {
+                y += 8;
+                x = 0;
+            }
+        }
+
+        ch++;
+    }
+
+    cursor.x = x;
+    cursor.y = y;
+}
+
+void ezs_fb_newline(void) {
+    cursor.x = 0;
+    cursor.y += 8;
+}
+
+void ezs_fb_setpos(cyg_ucount16 x, cyg_ucount16 y) {
+    cursor.x = x;
+    cursor.y = y;
+}
+
diff --git a/firmware/libEZS/src/ezs_fft.c b/firmware/libEZS/src/ezs_fft.c
new file mode 100644
index 0000000..c42549e
--- /dev/null
+++ b/firmware/libEZS/src/ezs_fft.c
@@ -0,0 +1,219 @@
+/****************************************************************************
+* rfft(float X[],int N)                                                     *
+*     A real-valued, in-place, split-radix FFT program                      *
+*     Decimation-in-time, cos/sin in second loop                            *
+*     Input: float X[1]...X[N] (NB Fortran style: 1st pt X[1] not X[0]!)    *
+*     Length is N=2**M (i.e. N must be power of 2--no error checking)       *
+*     Output in X[1]...X[N], in order:                                      *
+*           [Re(0), Re(1),..., Re(N/2), Im(N/2-1),..., Im(1)]               *
+*                                                                           *
+* Original Fortran code by Sorensen; published in H.V. Sorensen, D.L. Jones,*
+* M.T. Heideman, C.S. Burrus (1987) Real-valued fast fourier transform      *
+* algorithms.  IEEE Trans on Acoustics, Speech, & Signal Processing, 35,    *
+* 849-863.  Adapted to C by Bill Simpson, 1995  wsimpson@uwinnipeg.ca       *
+****************************************************************************/
+
+#include <math.h>
+#include <assert.h>
+#include <string.h>
+#include <float.h>
+#include "ezs_fft.h"
+#include "ezs_window.h"
+
+#define EZS_ADC_MAXIMUM 255.0f
+
+void rfft(float X[], int N) {
+    assert(log(N) / log(2.0) == floor(log(N) / log(2.0)));
+    int I, I0, I1, I2, I3, I4, I5, I6, I7, I8, IS, ID;
+    int J, K, M, N2, N4, N8;
+    float A, A3, CC1, SS1, CC3, SS3, E, R1, XT;
+    float T1, T2, T3, T4, T5, T6;
+
+    M = (int)(log(N) / log(2.0));           /* N=2^M */
+
+    /* ----Digit reverse counter--------------------------------------------- */
+    J = 1;
+
+    for (I = 1; I < N; I++) {
+        if (I < J) {
+            XT    = X[J];
+            X[J]  = X[I];
+            X[I]  = XT;
+        }
+
+        K = N / 2;
+
+        while (K < J) {
+            J -= K;
+            K /= 2;
+        }
+
+        J += K;
+    }
+
+    /* ----Length two butterflies--------------------------------------------- */
+    IS = 1;
+    ID = 4;
+
+    do {
+        for (I0 = IS; I0 <= N; I0 += ID) {
+            I1    = I0 + 1;
+            R1    = X[I0];
+            X[I0] = R1 + X[I1];
+            X[I1] = R1 - X[I1];
+        }
+
+        IS = 2 * ID - 1;
+        ID = 4 * ID;
+    }
+    while (IS < N);
+
+    /* ----L shaped butterflies----------------------------------------------- */
+    N2 = 2;
+
+    for (K = 2; K <= M; K++) {
+        N2    = N2 * 2;
+        N4    = N2 / 4;
+        N8    = N2 / 8;
+        E     = (float) 6.2831853071719586f / N2;
+        IS    = 0;
+        ID    = N2 * 2;
+
+        do {
+            for (I = IS; I < N; I += ID) {
+                I1 = I + 1;
+                I2 = I1 + N4;
+                I3 = I2 + N4;
+                I4 = I3 + N4;
+                T1 = X[I4] + X[I3];
+                X[I4] = X[I4] - X[I3];
+                X[I3] = X[I1] - T1;
+                X[I1] = X[I1] + T1;
+
+                if (N4 != 1) {
+                    I1 += N8;
+                    I2 += N8;
+                    I3 += N8;
+                    I4 += N8;
+                    T1 = (X[I3] + X[I4]) * .7071067811865475244f;
+                    T2 = (X[I3] - X[I4]) * .7071067811865475244f;
+                    X[I4] = X[I2] - T1;
+                    X[I3] = -X[I2] - T1;
+                    X[I2] = X[I1] - T2;
+                    X[I1] = X[I1] + T2;
+                }
+            }
+
+            IS = 2 * ID - N2;
+            ID = 4 * ID;
+        }
+        while (IS < N);
+
+        A = E;
+
+        for (J = 2; J <= N8; J++) {
+            A3 = 3.0 * A;
+            CC1   = cos(A);
+            SS1   = sin(A);  /*typo A3--really A?*/
+            CC3   = cos(A3); /*typo 3--really A3?*/
+            SS3   = sin(A3);
+            A = (float)J * E;
+            IS = 0;
+            ID = 2 * N2;
+
+            do {
+                for (I = IS; I < N; I += ID) {
+                    I1 = I + J;
+                    I2 = I1 + N4;
+                    I3 = I2 + N4;
+                    I4 = I3 + N4;
+                    I5 = I + N4 - J + 2;
+                    I6 = I5 + N4;
+                    I7 = I6 + N4;
+                    I8 = I7 + N4;
+                    T1 = X[I3] * CC1 + X[I7] * SS1;
+                    T2 = X[I7] * CC1 - X[I3] * SS1;
+                    T3 = X[I4] * CC3 + X[I8] * SS3;
+                    T4 = X[I8] * CC3 - X[I4] * SS3;
+                    T5 = T1 + T3;
+                    T6 = T2 + T4;
+                    T3 = T1 - T3;
+                    T4 = T2 - T4;
+                    T2 = X[I6] + T6;
+                    X[I3] = T6 - X[I6];
+                    X[I8] = T2;
+                    T2    = X[I2] - T3;
+                    X[I7] = -X[I2] - T3;
+                    X[I4] = T2;
+                    T1    = X[I1] + T5;
+                    X[I6] = X[I1] - T5;
+                    X[I1] = T1;
+                    T1    = X[I5] + T4;
+                    X[I5] = X[I5] - T4;
+                    X[I2] = T1;
+                }
+
+                IS = 2 * ID - N2;
+                ID = 4 * ID;
+            }
+            while (IS < N);
+        }
+    }
+
+    return;
+}
+
+float db(float real, float imag) {
+    float square = real * real + imag * imag;
+
+    if (square == 0.0f) {
+        square = FLT_MIN * 10.0f;
+    }
+
+    float ret = 10.0f * log(square) / log(10.0f);
+    return ret;
+}
+
+void ezs_power_density_spectrum(float in[], float out[], int length) {
+    assert(length > 0);
+    assert(log((float) length) / log(2.0f) == floor(log((float) length) / log(
+                2.0f)));
+
+    {
+        int i;
+
+        for (i = 0; i < length; ++i) {
+            out[i] = ezs_blackman_window(0.16f, i, length) * in[i];
+        }
+    }
+    rfft(&out[-1], length);
+    float scale = (float) length / 2.0f;
+    {
+        int i;
+
+        for (i = 0; i < length; ++i) {
+            int second = length - i - 1;
+            assert(second < length);
+            assert(0 <= second);
+            out[i] = db(out[i] / scale, out[length - i - 1] / scale);
+        }
+    }
+}
+
+void ezs_easy_pds(cyg_uint32 in[], float out[], int length) {
+    float in_f[length];
+
+    {
+        int i = 0;
+
+        for (i = 0; i < length; ++i) {
+            in_f[i] = (((float) in[i]) - (EZS_ADC_MAXIMUM / 2.0f)) / EZS_ADC_MAXIMUM;
+        }
+    }
+
+    float tmp[length];
+    ezs_power_density_spectrum(in_f, tmp, length);
+
+    memcpy(out, tmp, (length / 2) * sizeof(float));
+}
+
diff --git a/firmware/libEZS/src/ezs_gcd.c b/firmware/libEZS/src/ezs_gcd.c
new file mode 100644
index 0000000..6029589
--- /dev/null
+++ b/firmware/libEZS/src/ezs_gcd.c
@@ -0,0 +1,20 @@
+#include "ezs_gcd.h"
+#include <math.h>
+#include <stdlib.h>
+
+int ezs_greatest_common_divisor(int a, int b) {
+    a = abs(a);
+    b = abs(b);
+
+    while (b != 0) {
+        int tmp = b;
+        b = a % b;
+        a = tmp;
+    }
+
+    return a;
+}
+
+int ezs_lowest_common_multiple(int a, int b) {
+    return abs(a * b) / ezs_greatest_common_divisor(a, b);
+}
diff --git a/firmware/libEZS/src/ezs_impure_ptr.c b/firmware/libEZS/src/ezs_impure_ptr.c
new file mode 100644
index 0000000..2bcce4e
--- /dev/null
+++ b/firmware/libEZS/src/ezs_impure_ptr.c
@@ -0,0 +1 @@
+struct _reent* _impure_ptr = 0;
diff --git a/firmware/libEZS/src/ezs_interpolation.c b/firmware/libEZS/src/ezs_interpolation.c
new file mode 100644
index 0000000..17022d5
--- /dev/null
+++ b/firmware/libEZS/src/ezs_interpolation.c
@@ -0,0 +1,82 @@
+#include "ezs_gcd.h"
+#include <stddef.h>
+#include <assert.h>
+
+float linear_interpolation(float first, float second, float alpha) {
+    float ret = (1.0f - alpha) * first + alpha * second;
+    printf("%f * %f + %f * %f = %f\n", 1.0f - alpha, first, alpha, second, ret);
+    return ret;
+}
+
+void ezs_resample_linear(float in[], size_t in_length, float out[],
+                         size_t out_length) {
+    size_t lcm = ezs_lowest_common_multiple(in_length, out_length);
+    size_t size = lcm + 1;
+    float tmp[size];
+
+
+    {
+        size_t in_stride = size / (in_length - 1);
+        size_t i = 0;
+
+        for (i = 0; i < in_length - 1; ++i) {
+            size_t j = 0;
+
+            for (j = 0; j < in_stride; ++j) {
+                float alpha = ((float) (j)) / ((float) in_stride - 1);
+
+                size_t first_position = i;
+                size_t second_position = i + 1;
+
+                size_t target_position = i * in_stride + j;
+                assert(target_position < size);
+
+                tmp[target_position] = linear_interpolation(in[first_position],
+                                       in[second_position], alpha);
+            }
+        }
+
+        tmp[size - 1] = in[in_length - 1];
+    }
+
+    {
+        size_t out_stride = lcm / (out_length - 1);
+        size_t i = 0;
+
+        for (i = 0; i < out_length; ++i) {
+            size_t source_position = i * out_stride;
+            assert(source_position < size);
+
+            out[i] = tmp[source_position];
+        }
+
+        out[out_length - 1] = tmp[size - 1];
+    }
+}
+
+/*
+int main()
+{
+#define IN_LENGTH 512
+#define OUT_LENGTH 320
+	float input[IN_LENGTH];
+	{
+		int i;
+		for (i = 0; i < IN_LENGTH; ++i) {
+			input[i] = i + 1;
+		}
+	}
+	float output[OUT_LENGTH];
+
+	ezs_resample_linear(input, IN_LENGTH, output, OUT_LENGTH);
+	int i;
+	for (i = 0; i < IN_LENGTH; ++i) {
+		printf("%f ", input[i]);
+	}
+	printf("\n");
+	for (i = 0; i < OUT_LENGTH; ++i) {
+		printf("%f ", output[i]);
+	}
+	printf("\n");
+}
+*/
diff --git a/firmware/libEZS/src/ezs_io.c b/firmware/libEZS/src/ezs_io.c
new file mode 100644
index 0000000..cea6a14
--- /dev/null
+++ b/firmware/libEZS/src/ezs_io.c
@@ -0,0 +1,8 @@
+#include "ezs_io.h"
+#include <stdio.h>
+#include "ezs_counter.h"
+
+void ezs_print_measurement(cyg_uint32 timestamp, cyg_uint32 value) {
+    printf("time: %u value: %u\n", (unsigned int)timestamp, (unsigned int)value);
+}
+
diff --git a/firmware/libEZS/src/ezs_io_fel.c b/firmware/libEZS/src/ezs_io_fel.c
new file mode 100644
index 0000000..2ca55ea
--- /dev/null
+++ b/firmware/libEZS/src/ezs_io_fel.c
@@ -0,0 +1,112 @@
+#include "ezs_io_fel.h"
+
+#define EZSMAGIC "5c63"
+#define EZSINITMAGIC "1a44"
+
+
+void ezs_fel_serial_init() {
+	printf("%s:INIT\n", EZSINITMAGIC);
+}
+
+
+void ezs_printf(const char *fmt, ...) {
+	printf("%s:MSG\n", EZSMAGIC);
+	va_list args;
+	va_start(args, fmt);
+	vprintf(fmt, args);
+	va_end(args);
+	printf("\n%s:ENDMSG:PTY\n", EZSMAGIC);
+}
+
+void ezs_log_file(const char *file, const char *fmt, ...) {
+	printf("%s:MSG\n", EZSMAGIC);
+	va_list args;
+	va_start(args, fmt);
+	vprintf(fmt, args);
+	va_end(args);
+	printf("\n%s:ENDMSG:FILE:%s\n", EZSMAGIC, file);
+}
+
+
+/*!
+ *  \brief Initialize the framebuffer. Call this function exactly once before
+ *  using any of the other framebuffer related functions.
+ */
+void ezs_fb_init(void) {
+	printf("%s:RPC:GUI:init()\n", EZSMAGIC);
+}
+
+
+/*!
+ *  \brief Fill block.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param width Width of the box.
+ *  \param height Height of the box.
+ *  \param color Color.
+ */
+void ezs_fb_fill_block(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 width,
+                       cyg_ucount16 height, cyg_fb_colour color) {
+	printf("%s:RPC:GUI:fill_block(%d, %d, %d, %d, %d)\n", EZSMAGIC, x, y, width, height, color);
+}
+
+/*!
+ *  \brief Draw horizontal line.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param len length of the line.
+ *  \param color Color.
+ */
+void ezs_fb_hline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len,
+                  cyg_fb_colour color) {
+	printf("%s:RPC:GUI:hline(%d, %d, %d, %d)\n", EZSMAGIC, x, y, len, color);
+}
+
+/*!
+ *  \brief Draw vertical line.
+ *  \param x X-Axis start position.
+ *  \param y Y-Axis start position.
+ *  \param len length of the line.
+ *  \param color Color.
+ */
+void ezs_fb_vline(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 len,
+                  cyg_fb_colour color) {
+	printf("%s:RPC:GUI:vline(%d, %d, %d, %d)\n", EZSMAGIC, x, y, len, color);
+}
+
+/*!
+ *  \brief Clear the framebuffer.
+ *  \param color Color.
+ */
+void ezs_fb_clear(cyg_fb_colour color) {
+	printf("%s:RPC:GUI:clear(%d)\n", EZSMAGIC, color);
+}
+
+/*  and so on.. see: http://ecos.sourceware.org/docs-latest/ref/framebuf-drawing.html   */
+
+/*!
+ * \brief Prints a character at a given position.
+ * \param c Character to print.
+ * \param x X-Axis position.
+ * \param y Y-Axis position.
+ * \param color Color.
+ */
+void ezs_fb_print_char(int c, cyg_ucount16 x, cyg_ucount16 y,
+                       cyg_fb_colour color) {
+	printf("%s:RPC:GUI:print_char(\"%c\", %d, %d, %d)\n", EZSMAGIC, c, x, y, color);
+}
+
+/*!
+ * \brief Prints a string at a given position.
+ * \param c Pointer to null terminated string.
+ * \param x X-Axis position.
+ * \param y Y-Axis position.
+ * \param color Color.
+ */
+void ezs_fb_print_string(char* c, cyg_ucount16 x, cyg_ucount16 y,
+                             cyg_fb_colour color) {
+	// TODO: escaping for newlines here...
+	printf("%s:RPC:GUI:print_string_cur(\"%s\", %d, %d, %d)\n", EZSMAGIC, c, x, y, color);
+}
+
+///////////////////// TERMINAL FOO //////////////////////////
diff --git a/firmware/libEZS/src/ezs_plot.c b/firmware/libEZS/src/ezs_plot.c
new file mode 100644
index 0000000..c86cb39
--- /dev/null
+++ b/firmware/libEZS/src/ezs_plot.c
@@ -0,0 +1,147 @@
+#include "ezs_plot.h"
+#include "ezs_io_fel.h"
+#include <stdio.h>
+#include <math.h>
+#include <assert.h>
+
+
+void ezs_plot(cyg_uint32 data[], size_t length, cyg_fb_colour foreground,
+              cyg_fb_colour background) {
+    ezs_fb_clear(background);
+    {
+        size_t i = 0;
+        size_t step = FB_WIDTH/ length;
+        for (i = 1; i < length; ++i) {
+            assert(data[i] < 256);
+            cyg_ucount16 y = (((int) data[i]) * FB_HEIGHT) / 500;
+
+            ezs_fb_vline(i*step, FB_HEIGHT - y, 4, foreground);
+        }
+    }
+}
+
+void ezs_plot_drawCoordSystem(void) {
+    // y-axis
+    ezs_fb_vline(1, 0, FB_HEIGHT, CYG_FB_DEFAULT_PALETTE_BLACK);
+    ezs_fb_hline(0, 1, 3, CYG_FB_DEFAULT_PALETTE_BLACK);
+
+    // x-axis
+    ezs_fb_hline(0, FB_HEIGHT - 2, FB_WIDTH, CYG_FB_DEFAULT_PALETTE_BLACK);
+    ezs_fb_vline(FB_WIDTH - 2, FB_HEIGHT - 3, 3, CYG_FB_DEFAULT_PALETTE_BLACK);
+}
+
+void ezs_plot_markXaxis(short numberOfMarks) {
+
+    int delta = (FB_WIDTH - 1) / (numberOfMarks + 1);
+    int shift = delta + 1;
+
+    int i;
+
+    for (i = 0; i < numberOfMarks; ++i) {
+        ezs_fb_vline(shift, FB_HEIGHT - 4, 3, CYG_FB_DEFAULT_PALETTE_BLACK);
+        shift += delta;
+    }
+}
+
+void ezs_plot_markYaxis(short numberOfMarks) {
+
+    int delta = (FB_HEIGHT - 1) / (numberOfMarks + 1);
+    int shift = FB_HEIGHT - 1 - delta;
+
+    int i;
+
+    for (i = 0; i < numberOfMarks + 1; ++i) {
+        ezs_fb_hline(0, shift, 3, CYG_FB_DEFAULT_PALETTE_BLACK);
+        shift -= delta;
+    }
+}
+
+void ezs_plot_drawBarOnCoordSystem(float upperBound, float lowerBound,
+                                 float inputArray[], int sizeOfArray) {
+
+    // Clear FrameBuffer
+    ezs_fb_clear(CYG_FB_DEFAULT_PALETTE_WHITE);
+
+    // Flag for bufferOverflow/Underflow
+    bool overflow;
+    bool underflow;
+
+    // Define max / min Area Y-Axis
+    int maxValueY = FB_HEIGHT - ((FB_HEIGHT - 1) / 11) * 10 - 1; //=21
+    int minValueY = FB_HEIGHT - 1; //=239
+    int area = minValueY - maxValueY; //=218
+
+    // Define half block width
+    int halfBlockWidth = ((FB_WIDTH - 1) / (sizeOfArray + 1)) / 3;
+
+    // Temp variables for scaling
+    assert(upperBound > lowerBound);
+    float scaleTo = upperBound - lowerBound;
+    float offset = 0 - lowerBound;
+    float scaledValue;
+    int scaledValueInt;
+
+    // Bar drawing loop
+    int delta = (FB_WIDTH - 1) / (sizeOfArray + 1);
+    int shift = delta + 1;
+    int i;
+
+    for (i = 0; i < sizeOfArray; ++i) {
+
+        scaledValue = (inputArray[i] + offset) / scaleTo;
+
+        // Overflow check!
+        if (scaledValue > 1.0) {
+            scaledValue = 1.0;
+            overflow = true;
+        }
+        else {
+            overflow = false;
+        }
+
+        // Underflow check!
+        if (scaledValue < 0.0) {
+            scaledValue = 0.0;
+            underflow = true;
+        }
+        else {
+            underflow = false;
+        }
+
+        scaledValueInt = scaledValue * area;
+
+        if (!overflow) {
+            if (!underflow) {
+                ezs_fb_fill_block(shift - halfBlockWidth, minValueY - scaledValueInt,
+                                  halfBlockWidth * 2, scaledValueInt, CYG_FB_DEFAULT_PALETTE_BLUE);
+            }
+            else {
+                ezs_fb_fill_block(shift - halfBlockWidth, minValueY, halfBlockWidth * 2, 2,
+                                  CYG_FB_DEFAULT_PALETTE_YELLOW);
+            }
+        }
+        else {
+            ezs_fb_fill_block(shift - halfBlockWidth, minValueY - scaledValueInt,
+                              halfBlockWidth * 2, scaledValueInt, CYG_FB_DEFAULT_PALETTE_RED);
+        }
+
+        shift += delta;
+    }
+
+    // Draw coord system
+    ezs_plot_drawCoordSystem();
+    ezs_plot_markYaxis(10);
+    ezs_plot_markXaxis(sizeOfArray);
+
+    /*!
+    *  \brief Fill block.
+    *  \param x X-Axis start position.
+    *  \param y Y-Axis start position.
+    *  \param width Width of the box.
+    *  \param height Height of the box.
+    *  \param color Color.
+    */
+//void ezs_fb_fill_block(cyg_ucount16 x, cyg_ucount16 y, cyg_ucount16 width,cyg_ucount16 height,cyg_fb_colour color);
+
+
+}
diff --git a/firmware/libEZS/src/ezs_plot_pds.c b/firmware/libEZS/src/ezs_plot_pds.c
new file mode 100644
index 0000000..2a87ba9
--- /dev/null
+++ b/firmware/libEZS/src/ezs_plot_pds.c
@@ -0,0 +1,51 @@
+#include "ezs_plot_pds.h"
+
+#include "ezs_io_fel.h"
+
+//#include <cyg/infra/cyg_type.h>
+//#include <cyg/io/framebuf.h>
+
+#include <assert.h>
+#include <stddef.h>
+
+static void plot_spectrum(float* spectrum, int length,
+                          cyg_ucount16 widget_x, cyg_ucount16 widget_y,
+                          cyg_ucount16 widget_width, cyg_ucount16 widget_height,
+                          cyg_fb_colour widget_color) {
+    assert(widget_x + widget_width <= FB_WIDTH);
+    assert(widget_y + widget_height <= FB_HEIGHT);
+
+    int bar_width = widget_width / length;
+    int bar_unit = widget_height / 140;
+    {
+        int i;
+
+        for (i = 0; i < length; ++i) {
+            int x = i * bar_width + widget_x;
+            assert(x < widget_x + widget_width);
+            assert(x >= widget_x);
+
+            int width = bar_width;
+            assert(width >= 0);
+
+            int height = bar_unit * (spectrum[i] + 140.0f);
+            assert(height >= 0);
+
+            int y = widget_y + widget_height - height;
+            assert(y <= widget_y + widget_height);
+            assert(y >= widget_y);
+
+
+            ezs_fb_fill_block(x, y, width, height, widget_color);
+        }
+    }
+}
+
+void ezs_plot_pds(float spectrum[], int length, cyg_fb_colour foreground,
+                  cyg_fb_colour background) {
+    assert(length <= FB_WIDTH);
+
+    ezs_fb_clear(background);
+    plot_spectrum(spectrum, length, 0, 0, FB_WIDTH, FB_HEIGHT, foreground);
+}
+
diff --git a/firmware/libEZS/src/ezs_sensor.c b/firmware/libEZS/src/ezs_sensor.c
new file mode 100644
index 0000000..60dd85c
--- /dev/null
+++ b/firmware/libEZS/src/ezs_sensor.c
@@ -0,0 +1,78 @@
+#include <math.h>
+#include <stdlib.h>
+
+#include "ezs_sensor.h"
+#include "ezs_counter.h"
+
+static const unsigned int SENSOR_FREQ[]   = {   10,   40,   8 };
+static const float SENSOR_NOISE_PERCENT[] = { 0.1, 0.1, 0.1 };
+
+#define SENSOR_COUNT (sizeof SENSOR_FREQ / sizeof SENSOR_FREQ[0])
+
+static float SENSOR_OMEGA[SENSOR_COUNT];
+static float SENSOR_NOISE[SENSOR_COUNT];
+static const float AMPLITUDE = UINT16_MAX / 4;
+
+void ezs_sensors_init(void) {
+	ezs_counter_init();
+
+	unsigned int i;
+	for (i = 0; i < SENSOR_COUNT; ++i) {
+		SENSOR_OMEGA[i] = 2. * M_PI * SENSOR_FREQ[i];
+		SENSOR_NOISE[i] = AMPLITUDE * SENSOR_NOISE_PERCENT[i];
+	}
+}
+
+static uint16_t get_sensor_value(unsigned int sensor_id, cyg_uint32 ticks) {
+
+	cyg_resolution_t resolution = ezs_counter_get_resolution();
+
+	float time = (ticks * (float) resolution.dividend) / (resolution.divisor * 1e9f);
+
+	float res = sinf(SENSOR_OMEGA[sensor_id] * time);
+	res *= AMPLITUDE; // Amplify.
+
+	int16_t noise = 0;
+	if (SENSOR_NOISE[sensor_id] != 0.0) {
+		noise = rand()
+			% ((int) (SENSOR_NOISE[sensor_id] * 2)) // Cap to the sensor noise factor
+			- SENSOR_NOISE[sensor_id];              // Shift into the signed value
+	}
+
+	uint16_t value =
+		res                // The result as signed value
+		+ (UINT16_MAX / 2) // Scale up to unsigned value.
+		+ noise;           // Add the noise, skrillex style.
+
+	return value;
+}
+
+uint16_t get_sensor_a_value(void) {
+	cyg_uint32 ticks = ezs_counter_get();
+	return get_sensor_value(0, ticks);
+}
+
+uint16_t get_sensor_b_value(void) {
+	cyg_uint32 ticks = ezs_counter_get();
+	return get_sensor_value(1, ticks);
+}
+
+uint16_t get_sensor_c_value(void) {
+	cyg_uint32 ticks = ezs_counter_get();
+	return get_sensor_value(2, ticks);
+}
+
+uint8_t ezs_adc_get() {
+	cyg_uint32 ticks = ezs_counter_get();
+
+	uint64_t val_a = get_sensor_value(0, ticks);
+	uint64_t val_b = get_sensor_value(1, ticks);
+
+  //scale to 8bit
+  uint8_t ret = ((val_a+val_b)*UINT8_MAX )/(2*UINT16_MAX);
+  return ret;
+}
+
+uint8_t ezs_adc_read(void) {
+  return ezs_adc_get();
+}
diff --git a/firmware/libEZS/src/ezs_stopwatch.c b/firmware/libEZS/src/ezs_stopwatch.c
new file mode 100644
index 0000000..2b05b84
--- /dev/null
+++ b/firmware/libEZS/src/ezs_stopwatch.c
@@ -0,0 +1,16 @@
+#include "ezs_stopwatch.h"
+#include "ezs_counter.h"
+#include <stdlib.h>
+
+void ezs_watch_start(cyg_uint32* state) {
+    *state = ezs_counter_get();
+}
+
+cyg_uint32 ezs_watch_stop(cyg_uint32* state) {
+    return  ezs_counter_get() - (*state);
+}
+
+
+void ezs_lose_time(cyg_uint32 wcet, cyg_uint8 percentage) {
+}
+
diff --git a/firmware/libEZS/src/ezs_tracer.cpp b/firmware/libEZS/src/ezs_tracer.cpp
new file mode 100644
index 0000000..abc5f84
--- /dev/null
+++ b/firmware/libEZS/src/ezs_tracer.cpp
@@ -0,0 +1,49 @@
+#include <pkgconf/system.h>
+#include <cyg/io/io.h>
+#include <cyg/error/codes.h>
+#include <stdint.h>
+#include <stdio.h>
+#include "ezs_counter.h"
+#include "ezs_io_fel.h"
+
+#ifndef TASKLOG_LEN
+// Providing a default
+#define TASKLOG_LEN 256
+#endif
+static volatile struct { cyg_uint32 timestamp; cyg_uint32 id;} tasklog[TASKLOG_LEN];
+volatile int tasklog_index = TASKLOG_LEN;
+
+#define TRACE_FILE "tracefile"
+//! No Time triggered kernel -> normal event triggered ecos:
+#ifndef SMLPKG_TTKERNEL
+#include <cyg/kernel/kernel.hxx> // C Kernel-API
+extern "C" {
+#include <cyg/kernel/kapi.h> // C Kernel-API
+}
+class Cyg_Thread;
+
+
+extern "C" void ezs_instrument(Cyg_Thread* current, Cyg_Thread* next) {
+	int id = next->get_priority(); // abuse the priority (which must be unique) as sort-of thread-id
+#else
+#include <sml/ttkernel/task.hxx>
+extern "C" void ezs_instrument(TT_Task* current, TT_Task* next){
+	int id = next->get_id();
+#endif
+	if (tasklog_index < TASKLOG_LEN)
+	{
+		tasklog[tasklog_index].timestamp = ezs_counter_get();
+		tasklog[tasklog_index].id = id;
+		tasklog_index++;
+
+		if (tasklog_index == TASKLOG_LEN)
+		{
+			int i;
+			ezs_log_file(TRACE_FILE, "# time\tthreadid\n");
+			for (i=0; i<TASKLOG_LEN; i++)
+				ezs_log_file(TRACE_FILE, "%i\t%i\n", tasklog[i].timestamp, tasklog[i].id);
+			ezs_log_file(TRACE_FILE, "# end of tasklog\n");
+		}
+	}
+}
+
diff --git a/firmware/libEZS/src/ezs_window.c b/firmware/libEZS/src/ezs_window.c
new file mode 100644
index 0000000..017a5ea
--- /dev/null
+++ b/firmware/libEZS/src/ezs_window.c
@@ -0,0 +1,34 @@
+#include "ezs_window.h"
+#include <math.h>
+
+#ifndef M_PI
+#define M_PI	3.14159265358979323846f	/* pi */
+#endif
+
+#include <assert.h>
+
+float ezs_rect_window(float alpha, int position, int length) {
+    return 1.0f;
+}
+
+float ezs_blackman_window(float alpha, int position, int length) {
+    assert(length > 0);
+    assert(position >= 0);
+    assert(position < length);
+    assert(alpha >= 0.0f);
+    assert(1.0f >= alpha);
+
+    float a[3] = {(1.0f - alpha) / 2.0f, 0.5f, alpha / 2.0f};
+    return a[0]
+           - a[1] * cos((2.0f * M_PI * ((float) position)) / ((float) (length - 1)))
+           + a[2] * cos((4.0f * M_PI * ((float) position)) / ((float) (length - 1)));
+}
+
+float ezs_hamming_window(float alpha, int position, int length) {
+    assert(length > 0);
+    assert(position >= 0);
+    assert(position < length);
+
+    return 0.54f - 0.46f * cos((2.0f * M_PI * (float) position) / (float) (
+                                   length - 1));
+}
diff --git a/firmware/motor.c b/firmware/motor.c
new file mode 100644
index 0000000..61ecdcb
--- /dev/null
+++ b/firmware/motor.c
@@ -0,0 +1,83 @@
+#include "axis.h"
+#include "motor.h"
+#include "diy_gpio.h"
+#include "ezs_io.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+uint8_t const phases_28BYJ48[8][4] = { // [phase][pin]
+// -------- pins ----------
+// Winding    A  B  A  B
+// Motor Pin  1  2  3  4
+// Color      Bl Pi Ye Or
+  {           1, 1, 0, 0},
+  {           0, 1, 0, 0},
+  {           0, 1, 1, 0},
+  {           0, 0, 1, 0},
+  {           0, 0, 1, 1},
+  {           0, 0, 0, 1},
+  {           1, 0, 0, 1},
+  {           1, 0, 0, 0}
+};
+
+void setMotorValues_28BYJ48(motor* motor, uint32_t port, uint16_t pin0, uint16_t pin1, uint16_t pin2, uint16_t pin3) {
+	motor->port = port;
+	motor->pins[0] = pin0;
+	motor->pins[1] = pin1;
+	motor->pins[2] = pin2;
+	motor->pins[3] = pin3;
+	motor->phases = &(phases_28BYJ48[0]);
+	motor->phasesCount = 8;
+	motor->stepsPerRevo = 64;
+	motor->gearRatio = 64;
+	motor->stepsLeft = 0;
+	motor->currentSpeed = 1e6;
+	motor->currentTopSpeed = 0;
+	motor->currentPhase = 0;
+}
+
+void setMotorMotion(motor* motor, int32_t steps, uint16_t speed) {
+	motor->currentSpeed = MOTOR_BOTTOMSPEED;
+	motor->currentTopSpeed = 1e6 / speed;
+	if (motor->currentTopSpeed < motor->currentSpeed) motor->currentSpeed = motor->currentTopSpeed;
+	motor->stepsLeft = steps;
+}
+
+uint32_t updateMotor(motor* motor) {
+	if (motor->stepsLeft == 0) return 1e6;
+	
+	int8_t dir = (motor->stepsLeft > 0) - (motor->stepsLeft < 0);
+    uint8_t toClear = 0;
+    uint8_t toSet = 0;
+    motor->currentPhase = (motor->currentPhase + dir + motor->phasesCount) % motor->phasesCount;
+    if (dir == 1) motor->stepsLeft--;
+    else motor->stepsLeft++;
+    
+    uint8_t pin = 0;
+    while (pin < 4) {
+    	if (motor->phases[motor->currentPhase][pin] == 0)
+    		toClear |= motor->pins[pin];
+    	else
+    		toSet |= motor->pins[pin];
+    	pin++;
+    }
+    
+	diy_gpio_clear_pins(motor->port, toClear);
+	diy_gpio_set_pins(motor->port, toSet);
+	
+	if (motor->currentTopSpeed > MOTOR_BOTTOMSPEED) { // requires acceleration
+		uint32_t speedPerStep = (MOTOR_BOTTOMSPEED - motor->currentTopSpeed) / 10;
+		if ((MOTOR_BOTTOMSPEED - motor->currentTopSpeed) % 10 != 0) speedPerStep++; // it's basically ceil()
+		if (motor->stepsLeft <= 10) {
+			if (motor->stepsLeft + 1 == (MOTOR_BOTTOMSPEED - motor->currentSpeed) / speedPerStep) {
+				motor->currentSpeed += speedPerStep;
+				if (motor->currentSpeed < MOTOR_BOTTOMSPEED) motor->currentSpeed = MOTOR_BOTTOMSPEED;
+			}
+		} else if (motor->currentSpeed > motor->currentTopSpeed) {
+			motor->currentSpeed -= speedPerStep;
+			if (motor->currentSpeed > motor->currentTopSpeed) motor->currentSpeed = motor->currentTopSpeed;
+		}
+	}
+	
+	return motor->currentSpeed;
+}
diff --git a/firmware/motor.h b/firmware/motor.h
new file mode 100644
index 0000000..f468831
--- /dev/null
+++ b/firmware/motor.h
@@ -0,0 +1,32 @@
+#ifndef HEADER_MOTOR
+#define HEADER_MOTOR
+
+#include <stdint.h>
+
+#define MOTOR_BOTTOMSPEED (int)2e5
+
+uint8_t const phases_28BYJ48[8][4];
+
+typedef struct {
+	uint32_t port;
+	uint16_t pins[4];
+	const uint8_t (*phases)[4];
+	uint8_t phasesCount;
+	uint8_t stepsPerRevo;
+	uint8_t gearRatio;
+	int volatile stepsLeft;
+	uint32_t volatile currentSpeed;
+	uint32_t volatile currentTopSpeed;
+	uint8_t currentPhase;
+} motor;
+
+// Sets default values for motors used in the ToyRep
+void setMotorValues_28BYJ48(motor* motor, uint32_t port, uint16_t pin0, uint16_t pin1, uint16_t pin2, uint16_t pin3);
+
+// Speed in steps per second
+void setMotorMotion(motor* motor, int32_t steps, uint16_t speed);
+
+// Returns time for which the motor thread should wait
+uint32_t updateMotor(motor* motor);
+
+#endif
diff --git a/firmware/myLibEZS/exclude b/firmware/myLibEZS/exclude
new file mode 100644
index 0000000..fa04264
--- /dev/null
+++ b/firmware/myLibEZS/exclude
@@ -0,0 +1,4 @@
+ezs_plot_pds*
+ezs_plot*
+ezs_stopwatch*
+ezs_fb*
diff --git a/firmware/system.odg b/firmware/system.odg
new file mode 100644
index 0000000000000000000000000000000000000000..de1dd087e1a3d3db122246be56605102550d0f25
GIT binary patch
literal 13827
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

literal 0
HcmV?d00001

diff --git a/firmware/test.c b/firmware/test.c
new file mode 100644
index 0000000..fcb091c
--- /dev/null
+++ b/firmware/test.c
@@ -0,0 +1,12 @@
+#include "gcode.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+
+int main(int argc, char** argv) {
+	char test[] = "G1 X123.456 Y666";
+	gcode gc;
+	readGcode(&gc, test);
+	printf("%f, %f\n", *getGcodeParam(&gc, 'X'), *getGcodeParam(&gc, 'Y'));
+	return 0;
+}
diff --git a/pinmap.ods b/pinmap.ods
new file mode 100644
index 0000000000000000000000000000000000000000..442f39325ac65f434ae0c5c987618d5a7ce57e87
GIT binary patch
literal 10369
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

literal 0
HcmV?d00001

diff --git a/pinmap.pdf b/pinmap.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..54a0688767cf5de1d1594fb550b66c44784be030
GIT binary patch
literal 19210
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

literal 0
HcmV?d00001

-- 
GitLab