aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2013-06-15 15:58:20 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2013-06-15 15:58:20 +0000
commit7c68ef157d009f9932ac47ba21ba5d74e321623f (patch)
tree6c2442ca44cd090656ec3059ffb959f3d747e18d /tools
parent076746af63d317f8e96766b9137a65679f60463f (diff)
parente0d850113610f3efa0c0ac4946901f683e5e7332 (diff)
downloadChibiOS-7c68ef157d009f9932ac47ba21ba5d74e321623f.tar.gz
ChibiOS-7c68ef157d009f9932ac47ba21ba5d74e321623f.tar.bz2
ChibiOS-7c68ef157d009f9932ac47ba21ba5d74e321623f.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@5854 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'tools')
-rw-r--r--tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch10
-rw-r--r--tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch10
-rw-r--r--tools/gencfg/.project39
-rw-r--r--tools/gencfg/config.fmpp10
-rw-r--r--tools/gencfg/fmpp.sh7
-rw-r--r--tools/gencfg/lib/libcode.ftl316
-rw-r--r--tools/gencfg/lib/liblicense.ftl58
-rw-r--r--tools/gencfg/lib/libstm32f4xx.ftl144
-rw-r--r--tools/gencfg/lib/libutils.ftl109
-rw-r--r--tools/gencfg/processors/boards/stm32f4xx/config.fmpp5
-rw-r--r--tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl139
-rw-r--r--tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl327
-rw-r--r--tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl28
-rw-r--r--tools/gencfg/processors/hal/stm32f4xx/config.fmpp5
-rw-r--r--tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl66
-rw-r--r--tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl72
-rw-r--r--tools/gencfg/processors/processors.xml14
-rw-r--r--tools/gencfg/readme.txt14
-rw-r--r--tools/gencfg/run.bat1
-rw-r--r--tools/gencfg/schema/boards/abstract_board.xsd68
-rw-r--r--tools/gencfg/schema/boards/stm32f4xx_board.xsd89
-rw-r--r--tools/gencfg/schema/common/doc.xsd108
-rw-r--r--tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd214
-rw-r--r--tools/gencfg/schema/hal/abstract_adc_cfg.xsd51
-rw-r--r--tools/gencfg/schema/hal/abstract_cfg.xsd344
-rw-r--r--tools/gencfg/schema/hal/abstract_driver_cfg.xsd12
-rw-r--r--tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd432
-rw-r--r--tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd29
-rw-r--r--tools/gencfg/xml/stm32f0board.xml665
-rw-r--r--tools/gencfg/xml/stm32f4board.xml1190
-rw-r--r--tools/gencfg/xml/stm32f4xx_cfg.xml52
31 files changed, 4628 insertions, 0 deletions
diff --git a/tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch b/tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch
new file mode 100644
index 000000000..0a4fc898b
--- /dev/null
+++ b/tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
+<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${workspace}"/>
+<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/bin/bash"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="incremental,"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="fmpp.sh"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${project_loc}"/>
+</launchConfiguration>
diff --git a/tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch b/tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch
new file mode 100644
index 000000000..abf46ff08
--- /dev/null
+++ b/tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
+<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${workspace}"/>
+<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="true"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${project_loc}\run.bat"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="incremental,"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${project_loc}"/>
+</launchConfiguration>
diff --git a/tools/gencfg/.project b/tools/gencfg/.project
new file mode 100644
index 000000000..9872c4eef
--- /dev/null
+++ b/tools/gencfg/.project
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>_Configuration Tool</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>LaunchConfigHandle</key>
+ <value>&lt;project&gt;/.externalToolBuilders/FMPP Builder (Windows).launch</value>
+ </dictionary>
+ <dictionary>
+ <key>incclean</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>LaunchConfigHandle</key>
+ <value>&lt;project&gt;/.externalToolBuilders/FMPP Builder (Linux).launch</value>
+ </dictionary>
+ <dictionary>
+ <key>incclean</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/tools/gencfg/config.fmpp b/tools/gencfg/config.fmpp
new file mode 100644
index 000000000..0f34b0a03
--- /dev/null
+++ b/tools/gencfg/config.fmpp
@@ -0,0 +1,10 @@
+# Change the next line to point to the processor you want to use. Processors
+# are identified by a file named "config.fmpp" under the "processors" root
+# directory.
+inheritConfiguration: processors/boards/stm32f4xx/config.fmpp
+
+# Settings common to all processors. Do not change the following lines.
+freemarkerLinks: {
+ lib: ./lib
+}
+logFile: ./log.fmpp
diff --git a/tools/gencfg/fmpp.sh b/tools/gencfg/fmpp.sh
new file mode 100644
index 000000000..b98398702
--- /dev/null
+++ b/tools/gencfg/fmpp.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+JAVA_HOME=/usr/lib/jvm/java-6-sun
+export JAVA_HOME
+PATH=$PATH:$JAVA_HOME/bin
+export PATH
+fmpp -C config.fmpp
+
diff --git a/tools/gencfg/lib/libcode.ftl b/tools/gencfg/lib/libcode.ftl
new file mode 100644
index 000000000..45b94a320
--- /dev/null
+++ b/tools/gencfg/lib/libcode.ftl
@@ -0,0 +1,316 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+
+<#--
+ -- Coding style global settings.
+ -->
+[#assign indentation = " " /]
+[#assign fields_align = 24 /]
+[#assign define_value_align = 36 /]
+[#assign comments_align = 48 /]
+[#assign boundary = 80 /]
+
+[#--
+ -- This macro generates a brief description in DoxyGen format.
+ --]
+[#macro EmitDoxygenBrief object=[]]
+ [#if object.brief[0]??]
+[@utils.FormatStringAsText " * @brief "
+ " * "
+ utils.WithDot(object.brief[0]?cap_first)
+ boundary /]
+ [/#if]
+[/#macro]
+
+[#--
+ -- This macro generates a detailed description in DoxyGen format.
+ --]
+[#macro EmitDoxygenDetails object=[]]
+ [#if object.details[0]??]
+[@utils.FormatStringAsText " * @details "
+ " * "
+ utils.WithDot(object.details[0]?cap_first)
+ boundary /]
+ [/#if]
+[/#macro]
+
+[#--
+ -- This macro generates a notes list in DoxyGen format.
+ --]
+[#macro EmitDoxygenNotes object=[]]
+ [#list object.* as note]
+ [#if note?node_name == "note"]
+ [@utils.FormatStringAsText " * @note "
+ " * "
+ utils.WithDot(note[0]?cap_first)
+ boundary /]
+ [/#if]
+ [/#list]
+[/#macro]
+
+[#--
+ -- This macro generates a pre-requisites list in DoxyGen format.
+ --]
+[#macro EmitDoxygenPrerequisites object=[]]
+ [#list object.* as pre]
+ [#if pre?node_name == "pre"]
+ [@utils.FormatStringAsText " * @pre "
+ " * "
+ utils.WithDot(pre[0]?cap_first)
+ boundary /]
+ [/#if]
+ [/#list]
+[/#macro]
+
+[#--
+ -- This macro generates a post-requisites list in DoxyGen format.
+ --]
+[#macro EmitDoxygenPostrequisites object=[]]
+ [#list object.* as post]
+ [#if post?node_name == "post"]
+ [@utils.FormatStringAsText " * @post "
+ " * "
+ utils.WithDot(post[0]?cap_first)
+ boundary /]
+ [/#if]
+ [/#list]
+[/#macro]
+
+[#--
+ -- This macro generates a complete Doxygen documentation comment.
+ --]
+[#macro EmitDoxygenDocumentationComment object=[]]
+/**
+ [@code.EmitDoxygenBrief object /]
+ [@code.EmitDoxygenDetails object /]
+ [@code.EmitDoxygenPrerequisites object /]
+ [@code.EmitDoxygenPostrequisites object /]
+ [@code.EmitDoxygenNotes object /]
+ */
+[/#macro]
+
+[#--
+ -- This macro generates the parameters description in DoxyGen format.
+ --]
+[#macro EmitDoxygenParams params=[]]
+ [#list params as param]
+ [#local name = (param.@name[0]!"no-name")?trim /]
+ [#local brief = (param.@brief[0]!"")?trim /]
+ [#local dir = (param.@dir[0]!"boh")?trim?lower_case /]
+ [#if dir == "in"]
+[@utils.FormatStringAsText " * @param[in] "
+ " * "
+ utils.IntelligentDot(name + " " + brief?uncap_first)
+ boundary /]
+ [#elseif dir == "out"]
+[@utils.FormatStringAsText " * @param[out] "
+ " * "
+ utils.IntelligentDot(name + " " + brief?uncap_first)
+ boundary /]
+ [#elseif dir == "both"]
+[@utils.FormatStringAsText " * @param[in,out] "
+ " * "
+ utils.IntelligentDot(name + " " + brief?uncap_first)
+ boundary /]
+ [#elseif dir == "boh"]
+[@utils.FormatStringAsText " * @param "
+ " * "
+ utils.IntelligentDot(name + " " + brief?uncap_first)
+ boundary /]
+ [/#if]
+ [/#list]
+[/#macro]
+
+[#--
+ -- This macro generates a return description followed by a retval list
+ -- in DoxyGen format.
+ --]
+[#macro EmitDoxygenReturn return=[]]
+ [#if return[0]?? && ((return[0].@type[0]!"void")?trim != "void")]
+ [#local brief = (return[0].@brief[0]!"")?trim /]
+ [#if brief != ""]
+[@utils.FormatStringAsText " * @return "
+ " * "
+ utils.WithDot(brief?cap_first)
+ boundary /]
+ [/#if]
+ [#list return[0].value as value]
+ [#local label = (value.@name[0]!"no-val")?trim /]
+ [#local brief = (value.@brief[0]!"")?trim /]
+[@utils.FormatStringAsText " * @retval "
+ " * "
+ utils.WithDot(label + " " + brief?uncap_first)
+ boundary /]
+ [/#list]
+ [/#if]
+[/#macro]
+
+[#--
+ -- This macro generates the inner function code (if present).
+ --]
+[#macro EmitCode code=[]]
+ [#if function.code[0]?? && (function.code[0]?trim != "")]
+${indentation}${function.code[0]?trim}
+ [/#if]
+[/#macro]
+
+[#--
+ -- Returns true if the module exports some functions.
+ --]
+[#function HasPublicFunctions module=[]]
+ [#local flag = false /]
+ [#list module.function as function]
+ [#if (function.@visibility[0]!"private") == "public"]
+ [#local flag = true /]
+ [/#if]
+ [/#list]
+ [#return flag /]
+[/#function]
+
+[#--
+ -- Returns true if the module has static functions.
+ --]
+[#function HasPrivateFunctions module=[]]
+ [#local flag = false /]
+ [#list module.function as function]
+ [#if (function.@visibility[0]!"private") == "private"]
+ [#local flag = true /]
+ [/#if]
+ [/#list]
+ [#return flag /]
+[/#function]
+
+[#--
+ -- This macro generates a function prototype from an XML "function"
+ -- node passed as parameter.
+ -- @note Does not generate the final EOL.
+ --]
+[#macro GeneratePrototype function={}]
+ [#if function.return?? && function.return[0]??]
+ [#local rettype = (function.return[0].@type[0]!"void")?trim /]
+ [#else]
+ [#local rettype = "void" /]
+ [/#if]
+ [#local name = (function.@name[0]!"no-name")?trim /]
+ [#local visibility = (function.@visibility[0]!"private")?trim /]
+ [#if function.param?? && function.param[0]??]
+ [#-- If the function has parameters then generates the parameters list --]
+ [#local l1 = rettype + " " + name + "(" /]
+ [#if visibility == "private"]
+ [#local l1 = "static " + l1 /]
+ [/#if]
+ [#local ln = ""?right_pad(l1?length) /]
+ [#list function.param as param]
+ [#local type = (param.@type[0]!"no-type")?trim /]
+ [#if type?contains("$")]
+ [#local pstring = type?replace("$", (param.@name[0]!"no-name")?trim) /]
+ [#else]
+ [#local pstring = type + " " + (param.@name[0]!"no-name")?trim /]
+ [/#if]
+ [#local dir = (param.@dir[0]!"boh")?trim?lower_case /]
+ [#if dir == "in"]
+ [#local pstring = "const " + pstring /]
+ [/#if]
+ [#if param_index == 0]
+ [#local line = l1 + pstring /]
+ [#else]
+ [#if (line + ", " + pstring + " ")?length > boundary]
+${line + ","}
+ [#local line = ln + pstring /]
+ [#else]
+ [#local line = line + ", " + pstring /]
+ [/#if]
+ [/#if]
+ [/#list]
+${line + ")"}[#rt]
+ [#else]
+${rettype + " " + name}(void)[#rt]
+ [/#if]
+[/#macro]
+
+[#--
+ -- This macro generates a function (and its Doxygen documentation)
+ -- from an XML "function" node passed as parameter.
+ --]
+[#macro GenerateFunction function={}]
+/**
+[@EmitDoxygenBrief function.@brief /]
+[@EmitDoxygenDetails function.details /]
+[@EmitDoxygenParams function.param /]
+[@EmitDoxygenReturn function.return /]
+ *
+ * @note --Implementer notes here (or remove the tag)--
+ * @bug --Known problems please here (or remove the tag)--
+ * @todo --Implement this function (then remove the tag)--
+ */
+[@GeneratePrototype function /] {
+ [#if function.code[0]??]
+ [#-- Makes sure to undef the do_code macro --]
+ [#assign inline = "[#ftl][#macro do_code function][/#macro]"?interpret /]
+[@inline /]
+ [#-- Interprets the code within the code element --]
+ [#assign inline = function.code[0]?interpret /]
+[@inline /]
+[@do_code function /]
+ [#else]
+
+${indentation}/* ${function.@name[0]!"no-name"}() Implementation here! */
+ [/#if]
+}
+[/#macro]
+
+[#--
+ -- Generates the implementations for the private functions in the specified
+ -- module.
+ --]
+[#macro GeneratePrivateFunctionsImplementations module]
+ [#list module.function as function]
+ [#if (function.@visibility[0]!"private") == "private"]
+[@code.GenerateFunction function /]
+
+ [/#if]
+ [/#list]
+[/#macro]
+
+[#--
+ -- Generates the prototypes of the public functions in the specified
+ -- module.
+ --]
+[#macro GeneratePublicFunctionsPrototypes indentation module]
+ [#list module.function as function]
+ [#if (function.@visibility[0]!"private")?trim == "public"]
+${indentation}[@code.GeneratePrototype function /];
+ [/#if]
+ [/#list]
+[/#macro]
+
+[#--
+ -- Generates the implementations for the public functions in the specified
+ -- module.
+ --]
+[#macro GeneratePublicFunctionsImplementations module]
+ [#list module.function as function]
+ [#if (function.@visibility[0]!"private") == "public"]
+[@code.GenerateFunction function /]
+
+ [/#if]
+ [/#list]
+[/#macro]
diff --git a/tools/gencfg/lib/liblicense.ftl b/tools/gencfg/lib/liblicense.ftl
new file mode 100644
index 000000000..18581ee29
--- /dev/null
+++ b/tools/gencfg/lib/liblicense.ftl
@@ -0,0 +1,58 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+
+[#--
+ -- Emits the ChibiOS/RT standard license exception text.
+ -- The license exception text is indented by 4 spaces.
+ --]
+[#macro EmitLicenseExceptionAsText]
+
+ ---
+
+ A special exception to the GPL can be applied should you wish to distribute
+ a combined work that includes ChibiOS/RT, without being obliged to provide
+ the source code for any proprietary components. See the file exception.txt
+ for full details of how and when the exception can be applied.
+[/#macro]
+
+[#--
+ -- Emits the ChibiOS/RT standard license text.
+ -- The license text is indented by 4 spaces.
+ --]
+[#macro EmitLicenseAsText]
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+[/#macro]
diff --git a/tools/gencfg/lib/libstm32f4xx.ftl b/tools/gencfg/lib/libstm32f4xx.ftl
new file mode 100644
index 000000000..81b8f987c
--- /dev/null
+++ b/tools/gencfg/lib/libstm32f4xx.ftl
@@ -0,0 +1,144 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+
+[#--
+ -- Emits the STM32F4xx ADC driver constant configuration structures.
+ --]
+[#macro EmitADCConfig config]
+ [#local cfg_name = config.name[0]?string /]
+ [@code.EmitDoxygenDocumentationComment config /]
+const ADCConfig ${cfg_name} = {0};
+
+ [#list config.groups.group as group]
+ [#local grpcfg_name = group.name[0]?string /]
+ [@code.EmitDoxygenDocumentationComment group /]
+const ADCGroupConfig ${grpcfg_name} = {
+ /* Circular conversion flag.*/
+ ${group.circular[0]?string?upper_case},
+ /* Number of channels sampled in the conversion group.*/
+ ${group.channels_sequence.channel?size},
+ /* End of conversion callback or NULL.*/
+ [#if group.conv_callback[0]?string?trim == ""]
+ NULL,
+ [#else]
+ ${group.conv_callback[0]?string?trim},
+ [/#if]
+ /* Error callback or NULL.*/
+ [#if group.error_callback[0]?string?trim == ""]
+ NULL,
+ [#else]
+ ${group.error_callback[0]?string?trim},
+ [/#if]
+ /* CR1 register initialization value.*/
+ [#local resolution = group.resolution[0]?word_list[0]?number /]
+ [#local cr1 = "ADC_CR1_RESOLUTION_N(" + resolution?string + ")" /]
+ [#local disc = group.discontinuous[0]?word_list[0]?number /]
+ [#if disc > 0]
+ [#local cr1 = cr1 + " | ADC_CR1_DISCEN" /]
+ [#local cr1 = cr1 + " | ADC_CR1_DISCNUM_N(" + (disc - 1)?string + ")" /]
+ [/#if]
+ ${cr1},
+ /* CR2 register initialization value.*/
+ [#local exten = group.trigger_mode[0]?word_list[0]?number /]
+ [#local cr2 = "ADC_CR1_EXTEN_N(" + exten?string + ")" /]
+ [#local extsel = group.trigger_source[0]?word_list[0]?number /]
+ [#local cr2 = cr2 + " | ADC_CR1_EXSEL_N(" + extsel?string + ")" /]
+ [#if group.alignment[0]?word_list[0]?number != 0]
+ [#local cr2 = cr2 + " | ADC_CR2_ALIGN" /]
+ [/#if]
+ ${cr2},
+ /* Channels sample time settings.*/
+ [#local smpr1 = "" /]
+ [#local smpr2 = "" /]
+ [#list group.sample_time.* as input]
+ [#local sinput = input?node_name]
+ [#if input_index < 9]
+ [#local smpr2 = smpr2 + "ADC_SMPR2_SMP_" + input?node_name +
+ "(" + input?string + ") | " /]
+ [#elseif input_index == 9]
+ [#local smpr2 = smpr2 + "ADC_SMPR2_SMP_" + input?node_name +
+ "(" + input?string + ")," /]
+ [#elseif input_index < 18]
+ [#local smpr1 = smpr1 + "ADC_SMPR1_SMP_" + input?node_name +
+ "(" + input?string + ") | " /]
+ [#else]
+ [#local smpr1 = smpr1 + "ADC_SMPR1_SMP_" + input?node_name +
+ "(" + input?string + ")," /]
+ [/#if]
+ [/#list]
+ [@utils.FormatStringAsText " " " " smpr1 80 /]
+ [@utils.FormatStringAsText " " " " smpr2 80 /]
+ /* Channels sequence.*/
+ [#local sqr1 = "ADC_SQR1_NUM_CH(" + group.channels_sequence?size + ")" /]
+ [#local sqr2 = "" /]
+ [#local sqr3 = "" /]
+ [#list group.channels_sequence.channel as channel]
+ [#if channel_index <= 5]
+ [#local sqr3 = sqr3 + "ADC_SQR3_SQ" + (channel_index + 1) +
+ "_N(" + channel + ")" /]
+ [#if channel_has_next && channel_index < 5]
+ [#local sqr3 = sqr3 + " | " /]
+ [/#if]
+ [#elseif channel_index <= 11]
+ [#local sqr2 = sqr2 + "ADC_SQR2_SQ" + (channel_index + 1) +
+ "_N(" + channel + ")" /]
+ [#if channel_has_next && channel_index < 11]
+ [#local sqr2 = sqr2 + " | " /]
+ [/#if]
+ [#else]
+ [#local sqr1 = sqr1 + " | ADC_SQR2_SQ" + (channel_index + 1) +
+ "_N(" + channel + ")" /]
+ [/#if]
+ [/#list]
+ [#-- SQR2 could be empty.--]
+ [#if sqr2 == ""]
+ [#local sqr2 = "0" /]
+ [/#if]
+ [#local sqr1 = sqr1 + "," /]
+ [#local sqr2 = sqr2 + "," /]
+ [@utils.FormatStringAsText " " " " sqr1 80 /]
+ [@utils.FormatStringAsText " " " " sqr2 80 /]
+ [@utils.FormatStringAsText " " " " sqr3 80 /]
+};
+ [/#list]
+[/#macro]
+
+[#--
+ -- Emits the STM32F4xx ADC driver configuration external declarations.
+ --]
+[#macro EmitADCConfigExtern config]
+ [#local cfg_name = config.name[0]?string /]
+ [#list config.groups.group as group]
+ [#local grpcfg_name = group.name[0]?string /]
+ [#-- Only emits the comment if there is at least a callback defined.--]
+ /* ADC configuration "${cfg_name}".*/
+ extern const ADCConfig ${cfg_name};
+ /* ADC conversion group "${grpcfg_name}".*/
+ extern const ADCGroupConfig ${grpcfg_name};
+ [#if group.conv_callback[0]?string?trim != ""]
+ void ${group.conv_callback[0]?string?trim}(ADCDriver *, adcsample_t *, size_t);
+ [/#if]
+ [#if group.error_callback[0]?string?trim != ""]
+ void ${group.error_callback[0]?string?trim}(ADCDriver *, adcerror_t);
+ [/#if]
+
+ [/#list]
+[/#macro]
diff --git a/tools/gencfg/lib/libutils.ftl b/tools/gencfg/lib/libutils.ftl
new file mode 100644
index 000000000..03b0622a3
--- /dev/null
+++ b/tools/gencfg/lib/libutils.ftl
@@ -0,0 +1,109 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+
+[#--
+ -- Returns the trimmed text "s" making sure it is terminated by a dot.
+ -- The empty string is always returned as an empty string, the dot is not
+ -- added.
+ --]
+[#function WithDot s]
+ [#local s = s?trim /]
+ [#if s == ""]
+ [#return s /]
+ [/#if]
+ [#if s?ends_with(".")]
+ [#return s /]
+ [/#if]
+ [#return s + "." /]
+[/#function]
+
+[#--
+ -- Returns the trimmed text "s" making sure it is not terminated by a dot.
+ --]
+[#function WithoutDot s]
+ [#local s = s?trim /]
+ [#if s?ends_with(".")]
+ [#return s?substring(0, s?length - 2) /]
+ [/#if]
+ [#return s /]
+[/#function]
+
+[#--
+ -- Returns the trimmed text "s" making sure it is terminated by a dot if the
+ -- text is composed of multiple phrases, if the text is composed of a single
+ -- phrase then makes sure it is *not* terminated by a dot.
+ -- A phrase is recognized by the pattern ". " into the text.
+ -- The empty string is always returned as an empty string, the dot is never
+ -- added.
+ --]
+[#function IntelligentDot s]
+ [#local s = s?trim /]
+ [#if s?contains(". ")]
+ [#return WithDot(s) /]
+ [/#if]
+ [#return WithoutDot(s) /]
+[/#function]
+
+[#--
+ -- Formats a text string in a sequence of strings no longer than "len" (first
+ -- line) or "lenn" (subsequent lines).
+ -- White spaces are normalized between words, sequences of white spaces become
+ -- a single space.
+ --]
+[#function StringToText len1 lenn s]
+ [#local words=s?word_list /]
+ [#local line="" /]
+ [#local lines=[] /]
+ [#list words as word]
+ [#if lines?size == 0]
+ [#local len = len1 /]
+ [#else]
+ [#local len = lenn /]
+ [/#if]
+ [#if (line?length + word?length + 1 > len)]
+ [#local lines = lines + [line?trim] /]
+ [#local line = word + " " /]
+ [#else]
+ [#local line = line + word + " " /]
+ [/#if]
+ [/#list]
+ [#if line != ""]
+ [#local lines = lines + [line?trim] /]
+ [/#if]
+ [#return lines /]
+[/#function]
+
+[#--
+ -- Emits a string "s" as a formatted text, the first line is prefixed by the
+ -- "p1" parameter, subsequent lines are prefixed by the "pn" paramenter.
+ -- Emitted lines are no longer than the "len" parameter.
+ -- White spaces are normalized between words.
+ --]
+[#macro FormatStringAsText p1 pn s len]
+ [#local lines = StringToText(len - p1?length, len - pn?length, s) /]
+ [#list lines as line]
+ [#if line_index == 0]
+${p1}${line}
+ [#else]
+${pn}${line}
+ [/#if]
+ [/#list]
+[/#macro]
diff --git a/tools/gencfg/processors/boards/stm32f4xx/config.fmpp b/tools/gencfg/processors/boards/stm32f4xx/config.fmpp
new file mode 100644
index 000000000..970d936ca
--- /dev/null
+++ b/tools/gencfg/processors/boards/stm32f4xx/config.fmpp
@@ -0,0 +1,5 @@
+sourceRoot: templates
+outputRoot: output
+data: {
+ doc1: xml(../input/stm32f4board.xml)
+}
diff --git a/tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl b/tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl
new file mode 100644
index 000000000..f38fd106a
--- /dev/null
+++ b/tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl
@@ -0,0 +1,139 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+[@pp.dropOutputFile /]
+[#import "/@lib/libutils.ftl" as utils /]
+[#import "/@lib/liblicense.ftl" as license /]
+[@pp.changeOutputFile name="board.c" /]
+/*
+[@license.EmitLicenseAsText /]
+*/
+
+#include "ch.h"
+#include "hal.h"
+
+#if HAL_USE_PAL || defined(__DOXYGEN__)
+/**
+ * @brief PAL setup.
+ * @details Digital I/O ports static configuration as defined in @p board.h.
+ * This variable is used by the HAL when initializing the PAL driver.
+ */
+const PALConfig pal_default_config =
+{
+ {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
+ VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
+ {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
+ VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
+ {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
+ VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
+ {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
+ VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
+ {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
+ VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
+ {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
+ VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
+ {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
+ VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
+ {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
+ VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
+ {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
+ VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}
+};
+#endif
+
+/**
+ * @brief Early initialization code.
+ * @details This initialization must be performed just after stack setup
+ * and before any other initialization.
+ */
+void __early_init(void) {
+
+ stm32_clock_init();
+[#if doc1.board.board_functions.__early_init[0]??]
+ ${doc1.board.board_functions.__early_init[0]}
+[/#if]
+}
+
+#if HAL_USE_SDC || defined(__DOXYGEN__)
+/**
+ * @brief SDC card detection.
+ */
+bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) {
+[#if doc1.board.board_functions.sdc_lld_is_card_inserted[0]??]
+${doc1.board.board_functions.sdc_lld_is_card_inserted[0]}
+[#else]
+
+ (void)sdcp;
+ /* TODO: Fill the implementation.*/
+ return TRUE;
+[/#if]
+}
+
+/**
+ * @brief SDC card write protection detection.
+ */
+bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) {
+[#if doc1.board.board_functions.sdc_lld_is_write_protected[0]??]
+${doc1.board.board_functions.sdc_lld_is_write_protected[0]}
+[#else]
+
+ (void)sdcp;
+ /* TODO: Fill the implementation.*/
+ return FALSE;
+[/#if]
+}
+#endif /* HAL_USE_SDC */
+
+#if HAL_USE_MMC_SPI || defined(__DOXYGEN__)
+/**
+ * @brief MMC_SPI card detection.
+ */
+bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) {
+[#if doc1.board.board_functions.mmc_lld_is_card_inserted[0]??]
+${doc1.board.board_functions.mmc_lld_is_card_inserted[0]}
+[#else]
+
+ (void)mmcp;
+ /* TODO: Fill the implementation.*/
+ return TRUE;
+[/#if]
+}
+
+/**
+ * @brief MMC_SPI card write protection detection.
+ */
+bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) {
+[#if doc1.board.board_functions.mmc_lld_is_write_protected[0]??]
+${doc1.board.board_functions.mmc_lld_is_write_protected[0]}
+[#else]
+
+ (void)mmcp;
+ /* TODO: Fill the implementation.*/
+ return FALSE;
+[/#if]
+}
+#endif
+
+/**
+ * @brief Board-specific initialization code.
+ * @todo Add your board-specific code, if any.
+ */
+void boardInit(void) {
+}
diff --git a/tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl b/tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl
new file mode 100644
index 000000000..c24c0a355
--- /dev/null
+++ b/tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl
@@ -0,0 +1,327 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+[@pp.dropOutputFile /]
+[#import "/@lib/libutils.ftl" as utils /]
+[#import "/@lib/liblicense.ftl" as license /]
+[@pp.changeOutputFile name="board.h" /]
+/*
+[@license.EmitLicenseAsText /]
+*/
+
+#ifndef _BOARD_H_
+#define _BOARD_H_
+
+/*
+ * Setup for ${doc1.board.board_name[0]} board.
+ */
+
+/*
+ * Board identifier.
+ */
+#define BOARD_${doc1.board.board_id[0]}
+#define BOARD_NAME "${doc1.board.board_name[0]}"
+
+[#if doc1.board.ethernet_phy[0]??]
+/*
+ * Ethernet PHY type.
+ */
+#define BOARD_PHY_ID ${doc1.board.ethernet_phy.identifier[0]}
+[#if doc1.board.ethernet_phy.bus_type[0]?string == "RMII"]
+#define BOARD_PHY_RMII
+[/#if]
+[/#if]
+
+/*
+ * Board oscillators-related settings.
+[#if doc1.board.clocks.@LSEFrequency[0]?number == 0]
+ * NOTE: LSE not fitted.
+[/#if]
+[#if doc1.board.clocks.@HSEFrequency[0]?number == 0]
+ * NOTE: HSE not fitted.
+[/#if]
+ */
+#if !defined(STM32_LSECLK)
+#define STM32_LSECLK ${doc1.board.clocks.@LSEFrequency[0]}
+#endif
+
+#if !defined(STM32_HSECLK)
+#define STM32_HSECLK ${doc1.board.clocks.@HSEFrequency[0]}
+#endif
+
+[#if doc1.board.clocks.@HSEBypass[0]?string == "true"]
+#define STM32_HSE_BYPASS
+[/#if]
+
+/*
+ * Board voltages.
+ * Required for performance limits calculation.
+ */
+#define STM32_VDD ${doc1.board.clocks.@VDD[0]}
+
+/*
+ * MCU type as defined in the ST header file stm32f4xx.h.
+ */
+#define STM32F4XX
+
+/*
+ * IO pins assignments.
+ */
+[#list doc1.board.ports.* as port]
+ [#assign port_name = port?node_name?upper_case /]
+ [#list port.* as pin]
+ [#assign pin_name = pin?node_name?upper_case /]
+ [#assign name = pin.@ID[0]?string?trim /]
+ [#if name?length == 0]
+ [#assign name = pin_name /]
+ [/#if]
+#define ${(port_name + "_" + name)?right_pad(27, " ")} ${pin_index?string}
+ [/#list]
+
+[/#list]
+/*
+ * I/O ports initial setup, this configuration is established soon after reset
+ * in the initialization code.
+ * Please refer to the STM32 Reference Manual for details.
+ */
+#define PIN_MODE_INPUT(n) (0U << ((n) * 2))
+#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2))
+#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2))
+#define PIN_MODE_ANALOG(n) (3U << ((n) * 2))
+#define PIN_ODR_LOW(n) (0U << (n))
+#define PIN_ODR_HIGH(n) (1U << (n))
+#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
+#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
+#define PIN_OSPEED_2M(n) (0U << ((n) * 2))
+#define PIN_OSPEED_25M(n) (1U << ((n) * 2))
+#define PIN_OSPEED_50M(n) (2U << ((n) * 2))
+#define PIN_OSPEED_100M(n) (3U << ((n) * 2))
+#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2))
+#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2))
+#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2))
+#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4))
+
+[#list doc1.board.ports.* as port]
+ [#assign port_name = port?node_name?upper_case /]
+/*
+ * ${port_name} setup:
+ *
+ [#-- Generating pin descriptions inside the comment.--]
+ [#list port.* as pin]
+ [#assign pin_name = pin?node_name?upper_case /]
+ [#assign name = pin.@ID[0]?string?trim /]
+ [#if name?length == 0]
+ [#assign name = pin_name /]
+ [/#if]
+ [#assign mode = pin.@Mode[0] /]
+ [#assign type = pin.@Type[0] /]
+ [#assign resistor = pin.@Resistor[0] /]
+ [#assign speed = pin.@Speed[0] /]
+ [#assign alternate = pin.@Alternate[0] /]
+ [#if mode == "Input"]
+ [#assign desc = mode + " " + resistor /]
+ [#elseif mode == "Output"]
+ [#assign desc = mode + " " + type + " " + speed /]
+ [#elseif mode == "Alternate"]
+ [#assign desc = mode + " " + alternate /]
+ [#else]
+ [#assign desc = "Analog" /]
+ [/#if]
+ * P${(port?node_name[4..] + pin_index?string)?right_pad(3, " ")} - ${name?right_pad(26, " ")}(${desc?lower_case}).
+ [/#list]
+ */
+ [#--
+ -- Generating MODER register value.
+ --]
+ [#list port.* as pin]
+ [#assign pin_name = pin?node_name?upper_case /]
+ [#assign name = pin.@ID[0]?string?trim /]
+ [#if name?length == 0]
+ [#assign name = pin_name /]
+ [/#if]
+ [#assign mode = pin.@Mode[0] /]
+ [#if mode == "Input"]
+ [#assign out = "PIN_MODE_INPUT(" + port_name + "_" + name + ")" /]
+ [#elseif mode == "Output"]
+ [#assign out = "PIN_MODE_OUTPUT(" + port_name + "_" + name + ")" /]
+ [#elseif mode == "Alternate"]
+ [#assign out = "PIN_MODE_ALTERNATE(" + port_name + "_" + name + ")" /]
+ [#else]
+ [#assign out = "PIN_MODE_ANALOG(" + port_name + "_" + name + ")" /]
+ [/#if]
+ [#if pin_index == 0]
+ [#assign line = "#define VAL_" + port_name + "_MODER (" + out /]
+ [#else]
+ [#assign line = " " + out /]
+ [/#if]
+ [#if pin_index < 15]
+${(line + " |")?right_pad(76, " ") + "\\"}
+ [#else]
+${line + ")"}
+ [/#if]
+ [/#list]
+ [#--
+ -- Generating OTYPER register value.
+ --]
+ [#list port.* as pin]
+ [#assign pin_name = pin?node_name?upper_case /]
+ [#assign name = pin.@ID[0]?string?trim /]
+ [#if name?length == 0]
+ [#assign name = pin_name /]
+ [/#if]
+ [#assign type = pin.@Type[0] /]
+ [#if type == "PushPull"]
+ [#assign out = "PIN_OTYPE_PUSHPULL(" + port_name + "_" + name + ")" /]
+ [#else]
+ [#assign out = "PIN_OTYPE_OPENDRAIN(" + port_name + "_" + name + ")" /]
+ [/#if]
+ [#if pin_index == 0]
+ [#assign line = "#define VAL_" + port_name + "_OTYPER (" + out /]
+ [#else]
+ [#assign line = " " + out /]
+ [/#if]
+ [#if pin_index < 15]
+${(line + " |")?right_pad(76, " ") + "\\"}
+ [#else]
+${line + ")"}
+ [/#if]
+ [/#list]
+ [#--
+ -- Generating SPEEDR register value.
+ --]
+ [#list port.* as pin]
+ [#assign pin_name = pin?node_name?upper_case /]
+ [#assign name = pin.@ID[0]?string?trim /]
+ [#if name?length == 0]
+ [#assign name = pin_name /]
+ [/#if]
+ [#assign speed = pin.@Speed[0] /]
+ [#if speed == "Minimum"]
+ [#assign out = "PIN_OSPEED_2M(" + port_name + "_" + name + ")" /]
+ [#elseif speed == "Low"]
+ [#assign out = "PIN_OSPEED_25M(" + port_name + "_" + name + ")" /]
+ [#elseif speed == "High"]
+ [#assign out = "PIN_OSPEED_50M(" + port_name + "_" + name + ")" /]
+ [#else]
+ [#assign out = "PIN_OSPEED_100M(" + port_name + "_" + name + ")" /]
+ [/#if]
+ [#if pin_index == 0]
+ [#assign line = "#define VAL_" + port_name + "_OSPEEDR (" + out /]
+ [#else]
+ [#assign line = " " + out /]
+ [/#if]
+ [#if pin_index < 15]
+${(line + " |")?right_pad(76, " ") + "\\"}
+ [#else]
+${line + ")"}
+ [/#if]
+ [/#list]
+ [#--
+ -- Generating PUPDR register value.
+ --]
+ [#list port.* as pin]
+ [#assign pin_name = pin?node_name?upper_case /]
+ [#assign name = pin.@ID[0]?string?trim /]
+ [#if name?length == 0]
+ [#assign name = pin_name /]
+ [/#if]
+ [#assign resistor = pin.@Resistor[0] /]
+ [#if resistor == "Floating"]
+ [#assign out = "PIN_PUPDR_FLOATING(" + port_name + "_" + name + ")" /]
+ [#elseif resistor == "PullUp"]
+ [#assign out = "PIN_PUPDR_PULLUP(" + port_name + "_" + name + ")" /]
+ [#else]
+ [#assign out = "PIN_PUPDR_PULLDOWN(" + port_name + "_" + name + ")" /]
+ [/#if]
+ [#if pin_index == 0]
+ [#assign line = "#define VAL_" + port_name + "_PUPDR (" + out /]
+ [#else]
+ [#assign line = " " + out /]
+ [/#if]
+ [#if pin_index < 15]
+${(line + " |")?right_pad(76, " ") + "\\"}
+ [#else]
+${line + ")"}
+ [/#if]
+ [/#list]
+ [#--
+ -- Generating ODR register value.
+ --]
+ [#list port.* as pin]
+ [#assign pin_name = pin?node_name?upper_case /]
+ [#assign name = pin.@ID[0]?string?trim /]
+ [#if name?length == 0]
+ [#assign name = pin_name /]
+ [/#if]
+ [#assign level = pin.@Level[0] /]
+ [#if level == "Low"]
+ [#assign out = "PIN_ODR_LOW(" + port_name + "_" + name + ")" /]
+ [#else]
+ [#assign out = "PIN_ODR_HIGH(" + port_name + "_" + name + ")" /]
+ [/#if]
+ [#if pin_index == 0]
+ [#assign line = "#define VAL_" + port_name + "_ODR (" + out /]
+ [#else]
+ [#assign line = " " + out /]
+ [/#if]
+ [#if pin_index < 15]
+${(line + " |")?right_pad(76, " ") + "\\"}
+ [#else]
+${line + ")"}
+ [/#if]
+ [/#list]
+ [#--
+ -- Generating AFRx registers values.
+ --]
+ [#list port.* as pin]
+ [#assign pin_name = pin?node_name?upper_case /]
+ [#assign name = pin.@ID[0]?string?trim /]
+ [#if name?length == 0]
+ [#assign name = pin_name /]
+ [/#if]
+ [#assign alternate = pin.@Alternate[0]?trim /]
+ [#assign out = "PIN_AFIO_AF(" + port_name + "_" + name + ", " + alternate + ")" /]
+ [#if pin_index == 0]
+ [#assign line = "#define VAL_" + port_name + "_AFRL (" + out /]
+ [#elseif pin_index == 8]
+ [#assign line = "#define VAL_" + port_name + "_AFRH (" + out /]
+ [#else]
+ [#assign line = " " + out /]
+ [/#if]
+ [#if (pin_index == 7) || (pin_index == 15)]
+${line + ")"}
+ [#else]
+${(line + " |")?right_pad(76, " ") + "\\"}
+ [/#if]
+ [/#list]
+
+[/#list]
+
+#if !defined(_FROM_ASM_)
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void boardInit(void);
+#ifdef __cplusplus
+}
+#endif
+#endif /* _FROM_ASM_ */
+
+#endif /* _BOARD_H_ */
diff --git a/tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl b/tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl
new file mode 100644
index 000000000..c88471ac3
--- /dev/null
+++ b/tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl
@@ -0,0 +1,28 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+[@pp.dropOutputFile /]
+[#import "/@lib/libutils.ftl" as utils /]
+[@pp.changeOutputFile name="board.mk" /]
+# List of all the board related files.
+BOARDSRC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]}/board.c
+
+# Required include directories
+BOARDINC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]}
diff --git a/tools/gencfg/processors/hal/stm32f4xx/config.fmpp b/tools/gencfg/processors/hal/stm32f4xx/config.fmpp
new file mode 100644
index 000000000..307a6f61c
--- /dev/null
+++ b/tools/gencfg/processors/hal/stm32f4xx/config.fmpp
@@ -0,0 +1,5 @@
+sourceRoot: templates
+outputRoot: output
+data: {
+ doc1: xml(../input/stm32f4xx_cfg.xml)
+}
diff --git a/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl b/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl
new file mode 100644
index 000000000..eeea09d99
--- /dev/null
+++ b/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl
@@ -0,0 +1,66 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+[@pp.dropOutputFile /]
+[#import "/@lib/libutils.ftl" as utils /]
+[#import "/@lib/liblicense.ftl" as license /]
+[#import "/@lib/libcode.ftl" as code /]
+[#import "/@lib/libstm32f4xx.ftl" as stm32f4xx /]
+[#assign fname = doc1.configuration.name[0] /]
+[@pp.changeOutputFile name = fname + ".c" /]
+/*
+[@license.EmitLicenseAsText /]
+*/
+
+#include "ch.h"
+#include "hal.h"
+
+#include "${fname + ".h"}"
+
+/*===========================================================================*/
+/* Module local definitions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module exported variables. */
+/*===========================================================================*/
+
+[#list doc1.configuration.configs.* as config]
+ [#assign config_type = config?node_name /]
+ [#if config_type == "adc_config"]
+ [@stm32f4xx.EmitADCConfig config /]
+ [/#if]
+
+[/#list]
+/*===========================================================================*/
+/* Module local variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local functions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module interrupt handlers. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module exported functions. */
+/*===========================================================================*/
diff --git a/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl b/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl
new file mode 100644
index 000000000..47ea70f7c
--- /dev/null
+++ b/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl
@@ -0,0 +1,72 @@
+[#ftl]
+[#--
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ --]
+[@pp.dropOutputFile /]
+[#import "/@lib/libutils.ftl" as utils /]
+[#import "/@lib/liblicense.ftl" as license /]
+[#import "/@lib/libcode.ftl" as code /]
+[#import "/@lib/libstm32f4xx.ftl" as stm32f4xx /]
+[#assign fname = doc1.configuration.name[0] /]
+[@pp.changeOutputFile name = fname + ".h" /]
+/*
+[@license.EmitLicenseAsText /]
+*/
+
+#ifndef _${fname?upper_case}_H_
+#define _${fname?upper_case}_H_
+
+/*===========================================================================*/
+/* Module constants. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module pre-compile time settings. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module data structures and types. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module macros. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+[#list doc1.configuration.configs.* as config]
+ [#assign config_type = config?node_name /]
+ [#if config_type == "adc_config"]
+ [@stm32f4xx.EmitADCConfigExtern config /]
+ [/#if]
+[/#list]
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _${fname?upper_case}_H_ */
diff --git a/tools/gencfg/processors/processors.xml b/tools/gencfg/processors/processors.xml
new file mode 100644
index 000000000..cac95cc23
--- /dev/null
+++ b/tools/gencfg/processors/processors.xml
@@ -0,0 +1,14 @@
+<processors>
+ <processor>
+ <name>STM32F4xx Board Configuration</name>
+ <path>resources/gencfg/processors/boards/stm32f4xx/templates</path>
+ <default>resources/gencfg/xml/stm32f4board.xml</default>
+ <basefilename>board</basefilename>
+ </processor>
+ <processor>
+ <name>STM32F0xx Board Configuration</name>
+ <path>resources/gencfg/processors/boards/stm32f0xx/templates</path>
+ <default>resources/gencfg/xml/stm32f0board.xml</default>
+ <basefilename>board</basefilename>
+ </processor>
+</processors>
diff --git a/tools/gencfg/readme.txt b/tools/gencfg/readme.txt
new file mode 100644
index 000000000..5b2b58ba4
--- /dev/null
+++ b/tools/gencfg/readme.txt
@@ -0,0 +1,14 @@
+*****************************************************************************
+*** Files Organization ***
+*****************************************************************************
+
+--{root} - Configuration Generator tool.
+ +--readme.txt - This file.
+ +--config.fmpp - Tool configuration file, tool setup is done here.
+ +--run.bat - Tool runner batch file.
+ +--lib/ - FTL library files.
+ +--processors/ - Various configuration generators.
+ +--schema/ - Schema files used to validate XML configurations.
+ +--xml/ - Templates of configuration files.
+
+Write requirements and setup documentation here.
diff --git a/tools/gencfg/run.bat b/tools/gencfg/run.bat
new file mode 100644
index 000000000..460783f39
--- /dev/null
+++ b/tools/gencfg/run.bat
@@ -0,0 +1 @@
+fmpp -C config.fmpp
diff --git a/tools/gencfg/schema/boards/abstract_board.xsd b/tools/gencfg/schema/boards/abstract_board.xsd
new file mode 100644
index 000000000..c4c953240
--- /dev/null
+++ b/tools/gencfg/schema/boards/abstract_board.xsd
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="../common/doc.xsd" />
+
+ <xs:complexType name="AbstractBoardType" abstract="true">
+ <xs:sequence>
+ <xs:element name="board_name" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="board_id" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="\w[\w\d_]*"></xs:pattern>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="board_functions" maxOccurs="1" minOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="__early_init" type="xs:string" maxOccurs="1" minOccurs="0"></xs:element>
+ <xs:element name="boardInit" type="xs:string" maxOccurs="1" minOccurs="0">
+ </xs:element>
+ <xs:element name="sdc_lld_is_card_inserted" type="xs:string" maxOccurs="1" minOccurs="0">
+ </xs:element>
+ <xs:element name="sdc_lld_is_write_protected" type="xs:string" maxOccurs="1" minOccurs="0">
+ </xs:element>
+ <xs:element name="mmc_lld_is_card_inserted" type="xs:string" maxOccurs="1" minOccurs="0">
+ </xs:element>
+ <xs:element name="mmc_lld_is_write_protected" type="xs:string" maxOccurs="1" minOccurs="0">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType></xs:element>
+ <xs:element name="ethernet_phy" type="EthernetPHYType"
+ maxOccurs="1" minOccurs="0">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="EthernetPHYType">
+ <xs:sequence>
+ <xs:element name="identifier" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ <xs:pattern value="MII_[\w\d_]+"></xs:pattern>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="bus_type" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ <xs:enumeration value="RMII"></xs:enumeration>
+ <xs:enumeration value="MII"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/tools/gencfg/schema/boards/stm32f4xx_board.xsd b/tools/gencfg/schema/boards/stm32f4xx_board.xsd
new file mode 100644
index 000000000..ace3b5acb
--- /dev/null
+++ b/tools/gencfg/schema/boards/stm32f4xx_board.xsd
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="../common/doc.xsd" />
+ <xs:include schemaLocation="../common/stm32/stm32_gpiov2_port.xsd" />
+ <xs:include schemaLocation="abstract_board.xsd" />
+
+ <xs:complexType name="STM32F4xxBoardType">
+ <xs:complexContent>
+ <xs:extension base="AbstractBoardType">
+ <xs:sequence>
+ <xs:element name="clocks" maxOccurs="1" minOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="HSEBypass" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ <xs:enumeration value="false"></xs:enumeration>
+ <xs:enumeration value="true"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="HSEFrequency"
+ use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ <xs:minInclusive value="0"></xs:minInclusive>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="LSEFrequency"
+ use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+
+ <xs:minInclusive value="0"></xs:minInclusive>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="VDD" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+
+ <xs:minInclusive value="180"></xs:minInclusive>
+
+ <xs:maxInclusive value="360"></xs:maxInclusive>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType></xs:element>
+ <xs:element name="ports" type="portsType" maxOccurs="1"
+ minOccurs="1">
+ </xs:element>
+ </xs:sequence>
+
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="portsType">
+ <xs:sequence>
+ <xs:element name="GPIOA" type="STM32GPIOv2PortType"
+ minOccurs="1" maxOccurs="1"></xs:element>
+ <xs:element name="GPIOB" type="STM32GPIOv2PortType"
+ minOccurs="1" maxOccurs="1"></xs:element>
+ <xs:element name="GPIOC" type="STM32GPIOv2PortType"
+ minOccurs="1" maxOccurs="1"></xs:element>
+ <xs:element name="GPIOD" type="STM32GPIOv2PortType"
+ maxOccurs="1" minOccurs="1"></xs:element>
+ <xs:element name="GPIOE" type="STM32GPIOv2PortType"
+ maxOccurs="1" minOccurs="1"></xs:element>
+ <xs:element name="GPIOF" type="STM32GPIOv2PortType"
+ maxOccurs="1" minOccurs="1"></xs:element>
+ <xs:element name="GPIOG" type="STM32GPIOv2PortType"
+ maxOccurs="1" minOccurs="1"></xs:element>
+ <xs:element name="GPIOH" type="STM32GPIOv2PortType"
+ maxOccurs="1" minOccurs="1"></xs:element>
+ <xs:element name="GPIOI" type="STM32GPIOv2PortType"
+ maxOccurs="1" minOccurs="1"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:element name="board" type="STM32F4xxBoardType"></xs:element>
+
+</xs:schema>
diff --git a/tools/gencfg/schema/common/doc.xsd b/tools/gencfg/schema/common/doc.xsd
new file mode 100644
index 000000000..e5be361d5
--- /dev/null
+++ b/tools/gencfg/schema/common/doc.xsd
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:complexType name="NamedItem">
+ <xs:annotation>
+ <xs:documentation>
+ >Generic item with optional name and brief
+ description
+ </xs:documentation>
+ </xs:annotation>
+ <xs:sequence>
+ <xs:element name="name" maxOccurs="1" minOccurs="1">
+ <xs:annotation>
+ <xs:documentation>Name of the object.</xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ <xs:pattern value="\w[\w\d_]*"></xs:pattern>
+ <xs:minLength value="1"></xs:minLength>
+ <xs:maxLength value="24"></xs:maxLength>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="DocumentedItem">
+ <xs:annotation>
+ <xs:documentation>>Something that can have a detailed description
+ attached
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension base="NamedItem">
+ <xs:sequence>
+ <xs:element name="brief" maxOccurs="1" minOccurs="1">
+ <xs:annotation>
+ <xs:documentation>
+ Brief description of the object.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="0"></xs:minLength>
+ <xs:maxLength value="72"></xs:maxLength>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="details" maxOccurs="1" minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>
+ Object documentation as text, does not preserve
+ formatting.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="pre" maxOccurs="unbounded" minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>
+ Object pre-requisites as text, does not preserve
+ formatting.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="post" maxOccurs="unbounded" minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>
+ Object post-requisites as text, does not preserve
+ formatting.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="note" maxOccurs="unbounded" minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>
+ Object note as text, does not preserve formatting.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd b/tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd
new file mode 100644
index 000000000..c3ac59487
--- /dev/null
+++ b/tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:complexType name="STM32GPIOv2PortType">
+
+ <xs:sequence>
+ <xs:element
+ name="pin0"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin1"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin2"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin3"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin4"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin5"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin6"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin7"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin8"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin9"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin10"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin11"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin12"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin13"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin14"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ <xs:element
+ name="pin15"
+ type="STM32GPIOv2PinType"
+ maxOccurs="1"
+ minOccurs="1"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="STM32GPIOv2PinType">
+ <xs:annotation>
+ <xs:documentation>
+ Object representing an STM32 pin for the GPIOv2
+ peripheral.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:attribute
+ name="ID"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>Pin identifier, used to generate a #define with the
+ pin name.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:annotation>
+ <xs:documentation>
+ </xs:documentation>
+ </xs:annotation>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="\w?[\w\d_]*"></xs:pattern>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute
+ name="Mode"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>
+ Pin mode, as defined for MODER register.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Input"></xs:enumeration>
+ <xs:enumeration value="Output"></xs:enumeration>
+ <xs:enumeration value="Alternate"></xs:enumeration>
+ <xs:enumeration value="Analog"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute
+ name="Level"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>Logic level for the ODR register.</xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="High"></xs:enumeration>
+ <xs:enumeration value="Low"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute
+ name="Speed"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>
+ Pin speed as defined in SPEEDR register.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Minimum"></xs:enumeration>
+ <xs:enumeration value="Low"></xs:enumeration>
+ <xs:enumeration value="High"></xs:enumeration>
+ <xs:enumeration value="Maximum"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute
+ name="Type"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>
+ Pin type as defined in TYPER register.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="PushPull"></xs:enumeration>
+ <xs:enumeration value="OpenDrain"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute
+ name="Resistor"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>
+ Pin pull-up/down resistor as defined in PUDR register.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Floating"></xs:enumeration>
+ <xs:enumeration value="PullUp"></xs:enumeration>
+ <xs:enumeration value="PullDown"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute
+ name="Alternate"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>
+ Pin alternate function number, only valid if
+ "Alternate" is selected
+ in the Mode attribute.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"></xs:minInclusive>
+ <xs:maxInclusive value="15"></xs:maxInclusive>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+</xs:schema>
diff --git a/tools/gencfg/schema/hal/abstract_adc_cfg.xsd b/tools/gencfg/schema/hal/abstract_adc_cfg.xsd
new file mode 100644
index 000000000..52a6c9096
--- /dev/null
+++ b/tools/gencfg/schema/hal/abstract_adc_cfg.xsd
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="abstract_driver_cfg.xsd" />
+
+ <xs:complexType name="AbstractAdcGroupCfgType">
+ <xs:complexContent>
+ <xs:extension base="DocumentedItem">
+ <xs:sequence>
+ <xs:element name="circular" maxOccurs="1" minOccurs="1">
+
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="conv_callback" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="0"></xs:minLength>
+ <xs:maxLength value="24"></xs:maxLength>
+ <xs:pattern value="\w[\w\d_]*"></xs:pattern>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="error_callback" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="0"></xs:minLength>
+ <xs:maxLength value="24"></xs:maxLength>
+
+ <xs:pattern value="\w[\w\d_]*"></xs:pattern>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+
+ <xs:complexType name="AbstractAdcCfgType">
+ <xs:complexContent>
+ <xs:extension base="AbstractDriverCfgType"></xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+</xs:schema>
diff --git a/tools/gencfg/schema/hal/abstract_cfg.xsd b/tools/gencfg/schema/hal/abstract_cfg.xsd
new file mode 100644
index 000000000..72491eea9
--- /dev/null
+++ b/tools/gencfg/schema/hal/abstract_cfg.xsd
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="../common/doc.xsd" />
+
+ <xs:complexType name="AbstractCfgType">
+ <xs:complexContent>
+ <xs:extension base="DocumentedItem">
+ <xs:sequence>
+ <xs:element
+ name="hal"
+ maxOccurs="1"
+ minOccurs="1" type="HALSettingsType">
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="ADCSettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="ADC_USE_WAIT">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="ADC_USE_MUTUAL_EXCLUSION">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+
+ <xs:complexType name="CANSettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="CAN_USE_SLEEP_MODE">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="EXTSettingsType"></xs:complexType>
+
+ <xs:complexType name="GPTSettingsType"></xs:complexType>
+
+ <xs:complexType name="I2CSettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="I2C_USE_MUTUAL_EXCLUSION">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="ICUSettingsType"></xs:complexType>
+
+ <xs:complexType name="MACSettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="MAC_USE_EVENTS">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="MMC_SPISettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="MMC_NICE_WAITING">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="PALSettingsType"></xs:complexType>
+
+ <xs:complexType name="PWMSettingsType"></xs:complexType>
+
+ <xs:complexType name="RTCSettingsType"></xs:complexType>
+
+ <xs:complexType name="SDCSettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="SDC_INIT_RETRY">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"></xs:minInclusive>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="SDC_MMC_SUPPORT">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="false"></xs:enumeration>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="SDC_NICE_WAITING">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="SERIALSettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="SERIAL_DEFAULT_BITRATE">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minExclusive value="300"></xs:minExclusive>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="SERIAL_BUFFERS_SIZE">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="4"></xs:minInclusive>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="SERIAL_USBSettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="SERIAL_USB_BUFFERS_SIZE">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="64"></xs:minInclusive>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="SPISettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="SPI_USE_WAIT">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element
+ minOccurs="1"
+ maxOccurs="1"
+ name="SPI_USE_MUTUAL_EXCLUSION">
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="TMSettingsType"></xs:complexType>
+
+ <xs:complexType name="UARTSettingsType"></xs:complexType>
+
+ <xs:complexType name="USBSettingsType"></xs:complexType>
+
+ <xs:complexType name="HALSettingsType">
+ <xs:sequence>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="ADC"
+ type="ADCSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="CAN"
+ type="CANSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="EXT"
+ type="EXTSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="GPT"
+ type="GPTSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="I2C"
+ type="I2CSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="ICU"
+ type="ICUSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="MAC"
+ type="MACSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="MMC_SPI"
+ type="MMC_SPISettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="PAL"
+ type="PALSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="PWM"
+ type="PWMSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="RTC"
+ type="RTCSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="SDC"
+ type="SDCSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="SERIAL"
+ type="SERIALSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="SERIAL_USB"
+ type="SERIAL_USBSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="SPI"
+ type="SPISettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="TM"
+ type="TMSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="UART"
+ type="UARTSettingsType">
+ </xs:element>
+ <xs:element
+ minOccurs="0"
+ maxOccurs="1"
+ name="USB"
+ type="USBSettingsType">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/tools/gencfg/schema/hal/abstract_driver_cfg.xsd b/tools/gencfg/schema/hal/abstract_driver_cfg.xsd
new file mode 100644
index 000000000..d6501ff2a
--- /dev/null
+++ b/tools/gencfg/schema/hal/abstract_driver_cfg.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="../common/doc.xsd" />
+
+ <xs:complexType name="AbstractDriverCfgType">
+ <xs:complexContent>
+ <xs:extension base="DocumentedItem"></xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+</xs:schema>
diff --git a/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd b/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd
new file mode 100644
index 000000000..331933109
--- /dev/null
+++ b/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="../abstract_adc_cfg.xsd" />
+
+ <xs:complexType name="STM32F4AdcCfgType">
+ <xs:complexContent>
+ <xs:extension base="AbstractAdcCfgType">
+ <xs:sequence>
+ <xs:element name="groups" minOccurs="1" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="group" maxOccurs="unbounded"
+ minOccurs="1" type="STM32F4xxAdcGroupCfgType"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+
+ <xs:complexType name="STM32F4xxAdcGroupCfgType">
+ <xs:complexContent>
+ <xs:extension base="AbstractAdcGroupCfgType">
+ <xs:sequence>
+ <xs:element name="alignment" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="0 Samples are Right Aligned"></xs:enumeration>
+ <xs:enumeration value="1 Samples are Left Aligned"></xs:enumeration>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="resolution" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="0 12 bits"></xs:enumeration>
+ <xs:enumeration value="1 10 bits"></xs:enumeration>
+ <xs:enumeration value="2 8 bits"></xs:enumeration>
+ <xs:enumeration value="3 6 bits"></xs:enumeration>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="trigger_mode" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="0 Software"></xs:enumeration>
+ <xs:enumeration value="1 Rising Edge"></xs:enumeration>
+ <xs:enumeration value="2 Falling Edge"></xs:enumeration>
+ <xs:enumeration value="3 Both Edges"></xs:enumeration>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="trigger_source" maxOccurs="1"
+ minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="0 Timer 1 CC1 event"></xs:enumeration>
+ <xs:enumeration value="1 Timer 1 CC2 event"></xs:enumeration>
+ <xs:enumeration value="2 Timer 1 CC3 event"></xs:enumeration>
+ <xs:enumeration value="3 Timer 2 CC2 event"></xs:enumeration>
+ <xs:enumeration value="4 Timer 2 CC3 event"></xs:enumeration>
+ <xs:enumeration value="5 Timer 2 CC4 event"></xs:enumeration>
+ <xs:enumeration value="6 Timer 2 TRGO event"></xs:enumeration>
+ <xs:enumeration value="7 Timer 3 CC1 event"></xs:enumeration>
+ <xs:enumeration value="8 Timer 3 TRGO event"></xs:enumeration>
+ <xs:enumeration value="9 Timer 4 CC4 event"></xs:enumeration>
+ <xs:enumeration value="10 Timer 5 CC1 event"></xs:enumeration>
+ <xs:enumeration value="11 Timer 5 CC2 event"></xs:enumeration>
+ <xs:enumeration value="12 Timer 5 CC3 event"></xs:enumeration>
+ <xs:enumeration value="13 Timer 8 CC1 event"></xs:enumeration>
+ <xs:enumeration value="14 Timer 8 CC4 event"></xs:enumeration>
+ <xs:enumeration value="15 EXTI line15"></xs:enumeration>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="discontinuous" maxOccurs="1"
+ minOccurs="1">
+
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="0 Disabled"></xs:enumeration>
+ <xs:enumeration value="1 One discontinous conversion"></xs:enumeration>
+ <xs:enumeration
+ value="2 Two discontinous conversions">
+ </xs:enumeration>
+ <xs:enumeration
+ value="3 Three discontinous conversions">
+ </xs:enumeration>
+ <xs:enumeration
+ value="4 Four discontinous conversions">
+ </xs:enumeration>
+ <xs:enumeration
+ value="5 Five discontinous conversions">
+ </xs:enumeration>
+ <xs:enumeration
+ value="6 Six discontinous conversions">
+ </xs:enumeration>
+ <xs:enumeration
+ value="7 Seven discontinous conversions">
+ </xs:enumeration>
+ <xs:enumeration
+ value="8 Eight discontinous conversions">
+ </xs:enumeration>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="sample_time" maxOccurs="1" minOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="IN0" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN1" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN2" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN3" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN4" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN5" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN6" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN7" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN8" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN9" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN10" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN11" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN12" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN13" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN14" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IN15" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="SENSOR" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="VREFINT" maxOccurs="1"
+ minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="VBAT" maxOccurs="1" minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_SAMPLE_3"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_15"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_28"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_56"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_84"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_112"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_144"></xs:enumeration>
+ <xs:enumeration value="ADC_SAMPLE_480"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="channels_sequence" maxOccurs="1"
+ minOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="channel" maxOccurs="16"
+ minOccurs="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADC_CHANNEL_IN0"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN1"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN2"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN3"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN4"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN5"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN6"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN7"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN8"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN9"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN10"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN11"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN12"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN13"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN14"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_IN15"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_SENSOR"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_VREFINT"></xs:enumeration>
+ <xs:enumeration value="ADC_CHANNEL_VBAT"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+
+
+
+
+
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd b/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd
new file mode 100644
index 000000000..f846403f3
--- /dev/null
+++ b/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="../../common/doc.xsd" />
+ <xs:include schemaLocation="stm32f4xx_adc_cfg.xsd" />
+
+ <xs:complexType name="STM32F4xxCfgType">
+ <xs:complexContent>
+ <xs:extension base="DocumentedItem">
+ <xs:sequence>
+ <xs:element name="configs" maxOccurs="1" minOccurs="1">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded" minOccurs="1">
+ <xs:choice>
+ <xs:element name="adc_config" type="STM32F4AdcCfgType"
+ maxOccurs="1" minOccurs="0">
+ </xs:element>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="configuration" type="STM32F4xxCfgType"></xs:element>
+</xs:schema>
diff --git a/tools/gencfg/xml/stm32f0board.xml b/tools/gencfg/xml/stm32f0board.xml
new file mode 100644
index 000000000..64420371f
--- /dev/null
+++ b/tools/gencfg/xml/stm32f0board.xml
@@ -0,0 +1,665 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- STM32F4xx board Template -->
+<board
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://www.chibios.org/xml/schema/boards/stm32f0xx_board.xsd">
+ <board_name>-----human readable board name-----</board_name>
+ <board_id>BOARD_IDENTIFIER</board_id>
+ <board_functions></board_functions>
+ <clocks
+ HSEFrequency="8000000"
+ HSEBypass="false"
+ LSEFrequency="32768" />
+ <ports>
+ <GPIOA>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID="JTAG_TMS"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ <pin14
+ ID="JTAG_TCK"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="PullDown"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ <pin15
+ ID="JTAG_TDI"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ </GPIOA>
+ <GPIOB>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID="BOOT1"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID="JTAG_TDO"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ <pin4
+ ID="JTAG_TRST"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOB>
+ <GPIOC>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID="OSC32_IN"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID="OSC32_OUT"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOC>
+ <GPIOD>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOD>
+ <GPIOF>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOF>
+ </ports>
+</board>
diff --git a/tools/gencfg/xml/stm32f4board.xml b/tools/gencfg/xml/stm32f4board.xml
new file mode 100644
index 000000000..0c6b42106
--- /dev/null
+++ b/tools/gencfg/xml/stm32f4board.xml
@@ -0,0 +1,1190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- STM32F4xx board Template -->
+<board
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://www.chibios.org/xml/schema/boards/stm32f4xx_board.xsd">
+ <board_name>-----human readable board name-----</board_name>
+ <board_id>BOARD_IDENTIFIER</board_id>
+ <board_functions></board_functions>
+ <ethernet_phy>
+ <identifier>MII_KS8721_ID</identifier>
+ <bus_type>RMII</bus_type>
+ </ethernet_phy>
+ <clocks
+ HSEFrequency="8000000"
+ HSEBypass="false"
+ LSEFrequency="32768"
+ VDD="300" />
+ <ports>
+ <GPIOA>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID="JTAG_TMS"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ <pin14
+ ID="JTAG_TCK"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="PullDown"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ <pin15
+ ID="JTAG_TDI"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ </GPIOA>
+ <GPIOB>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID="BOOT1"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID="JTAG_TDO"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ <pin4
+ ID="JTAG_TRST"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Alternate"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOB>
+ <GPIOC>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID="OSC32_IN"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID="OSC32_OUT"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOC>
+ <GPIOD>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOD>
+ <GPIOE>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOE>
+ <GPIOF>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOF>
+ <GPIOG>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOG>
+ <GPIOH>
+ <pin0
+ ID="OSC_IN"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Input"
+ Alternate="0"></pin0>
+ <pin1
+ ID="OSC_OUT"
+ Type="PushPull"
+ Speed="Maximum"
+ Resistor="Floating"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOH>
+ <GPIOI>
+ <pin0
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin1
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin2
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin3
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin4
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin5
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin6
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin7
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin8
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin9
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin10
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin11
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin12
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin13
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin14
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ <pin15
+ ID=""
+ Type="PushPull"
+ Speed="Minimum"
+ Resistor="PullUp"
+ Level="High"
+ Mode="Input"
+ Alternate="0" />
+ </GPIOI>
+ </ports>
+</board>
diff --git a/tools/gencfg/xml/stm32f4xx_cfg.xml b/tools/gencfg/xml/stm32f4xx_cfg.xml
new file mode 100644
index 000000000..896cc2614
--- /dev/null
+++ b/tools/gencfg/xml/stm32f4xx_cfg.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- STM32F4xx board Template -->
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://www.chibios.org/xml/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd">
+ <name>hal_configs</name>
+ <brief>Application HAL-related settings.</brief>
+ <configs>
+ <adc_config>
+ <name>adccfg1</name>
+ <brief>Example ADC configuration.</brief>
+ <groups>
+ <group>
+ <name>adcgrpcfg1</name>
+ <brief>Example ADC conversion group configuration.</brief>
+ <circular>true</circular>
+ <conv_callback>conv_callback</conv_callback>
+ <error_callback>error_callback</error_callback>
+ <alignment>0 Samples are Right Aligned</alignment>
+ <resolution>0 12 bits</resolution>
+ <trigger_mode>0 Software</trigger_mode>
+ <trigger_source>0 Timer 1 CC1 event</trigger_source>
+ <discontinuous>2 Two discontinous conversions</discontinuous>
+ <sample_time>
+ <IN0>ADC_SAMPLE_3</IN0>
+ <IN1>ADC_SAMPLE_3</IN1>
+ <IN2>ADC_SAMPLE_3</IN2>
+ <IN3>ADC_SAMPLE_3</IN3>
+ <IN4>ADC_SAMPLE_3</IN4>
+ <IN5>ADC_SAMPLE_3</IN5>
+ <IN6>ADC_SAMPLE_3</IN6>
+ <IN7>ADC_SAMPLE_3</IN7>
+ <IN8>ADC_SAMPLE_3</IN8>
+ <IN9>ADC_SAMPLE_3</IN9>
+ <IN10>ADC_SAMPLE_3</IN10>
+ <IN11>ADC_SAMPLE_3</IN11>
+ <IN12>ADC_SAMPLE_3</IN12>
+ <IN13>ADC_SAMPLE_3</IN13>
+ <IN14>ADC_SAMPLE_3</IN14>
+ <IN15>ADC_SAMPLE_3</IN15>
+ <SENSOR>ADC_SAMPLE_3</SENSOR>
+ <VREFINT>ADC_SAMPLE_3</VREFINT>
+ <VBAT>ADC_SAMPLE_3</VBAT>
+ </sample_time>
+ <channels_sequence>
+ <channel>ADC_CHANNEL_IN0</channel>
+ <channel>ADC_CHANNEL_IN8</channel>
+ </channels_sequence>
+ </group>
+ </groups>
+ </adc_config>
+ </configs>
+</configuration>