2012-07-08 08:32:03 +00:00
|
|
|
[#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_
|
|
|
|
|
|
|
|
/*
|
2012-07-12 14:02:44 +00:00
|
|
|
* Setup for ${doc1.board.board_name[0]} board.
|
2012-07-08 08:32:03 +00:00
|
|
|
*/
|
|
|
|
|
2012-07-08 08:46:16 +00:00
|
|
|
/*
|
|
|
|
* Board identifier.
|
|
|
|
*/
|
2012-07-12 14:02:44 +00:00
|
|
|
#define BOARD_${doc1.board.board_id[0]}
|
|
|
|
#define BOARD_NAME "${doc1.board.board_name[0]}"
|
2012-07-08 08:46:16 +00:00
|
|
|
|
2012-07-12 14:02:44 +00:00
|
|
|
[#if doc1.board.ethernet_phy[0]??]
|
2012-07-08 08:46:16 +00:00
|
|
|
/*
|
|
|
|
* Ethernet PHY type.
|
|
|
|
*/
|
2012-07-12 14:02:44 +00:00
|
|
|
#define BOARD_PHY_ID ${doc1.board.ethernet_phy.identifier[0]}
|
2012-07-18 16:19:35 +00:00
|
|
|
[#if doc1.board.ethernet_phy.bus_type[0]?string == "RMII"]
|
2012-07-08 08:46:16 +00:00
|
|
|
#define BOARD_PHY_RMII
|
|
|
|
[/#if]
|
|
|
|
[/#if]
|
|
|
|
|
2012-07-08 09:55:25 +00:00
|
|
|
/*
|
|
|
|
* Board oscillators-related settings.
|
2012-07-12 14:02:44 +00:00
|
|
|
[#if doc1.board.clocks.@LSEFrequency[0]?number == 0]
|
2012-07-08 09:55:25 +00:00
|
|
|
* NOTE: LSE not fitted.
|
|
|
|
[/#if]
|
2012-07-12 14:02:44 +00:00
|
|
|
[#if doc1.board.clocks.@HSEFrequency[0]?number == 0]
|
2012-07-08 09:55:25 +00:00
|
|
|
* NOTE: HSE not fitted.
|
|
|
|
[/#if]
|
|
|
|
*/
|
|
|
|
#if !defined(STM32_LSECLK)
|
2012-07-12 14:02:44 +00:00
|
|
|
#define STM32_LSECLK ${doc1.board.clocks.@LSEFrequency[0]}
|
2012-07-08 09:55:25 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !defined(STM32_HSECLK)
|
2012-07-12 14:02:44 +00:00
|
|
|
#define STM32_HSECLK ${doc1.board.clocks.@HSEFrequency[0]}
|
2012-07-08 09:55:25 +00:00
|
|
|
#endif
|
|
|
|
|
2012-07-12 14:02:44 +00:00
|
|
|
[#if doc1.board.clocks.@HSEBypass[0]?string == "true"]
|
2012-07-08 09:55:25 +00:00
|
|
|
#define STM32_HSE_BYPASS
|
|
|
|
[/#if]
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Board voltages.
|
|
|
|
* Required for performance limits calculation.
|
|
|
|
*/
|
2012-07-12 14:02:44 +00:00
|
|
|
#define STM32_VDD ${doc1.board.clocks.@VDD[0]}
|
2012-07-08 09:55:25 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* MCU type as defined in the ST header file stm32f4xx.h.
|
|
|
|
*/
|
|
|
|
#define STM32F4XX
|
|
|
|
|
|
|
|
/*
|
|
|
|
* IO pins assignments.
|
|
|
|
*/
|
2012-07-08 12:05:39 +00:00
|
|
|
[#list doc1.board.ports.* as port]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#assign port_name = port?node_name?upper_case /]
|
2012-07-08 12:05:39 +00:00
|
|
|
[#list port.* as pin]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#assign pin_name = pin?node_name?upper_case /]
|
2012-07-08 12:05:39 +00:00
|
|
|
[#assign name = pin.@ID[0]?string?trim /]
|
|
|
|
[#if name?length == 0]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#assign name = pin_name /]
|
2012-07-08 12:05:39 +00:00
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
#define ${(port_name + "_" + name)?right_pad(27, " ")} ${pin_index?string}
|
2012-07-08 12:05:39 +00:00
|
|
|
[/#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))
|
2012-07-08 13:21:00 +00:00
|
|
|
#define PIN_ODR_LOW(n) (0U << (n))
|
|
|
|
#define PIN_ODR_HIGH(n) (1U << (n))
|
2012-07-08 12:05:39 +00:00
|
|
|
#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))
|
2012-07-08 14:58:39 +00:00
|
|
|
#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2))
|
|
|
|
#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2))
|
|
|
|
#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2))
|
2012-07-08 12:05:39 +00:00
|
|
|
#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4))
|
2012-07-08 09:55:25 +00:00
|
|
|
|
2012-07-08 10:32:28 +00:00
|
|
|
[#list doc1.board.ports.* as port]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#assign port_name = port?node_name?upper_case /]
|
2012-07-08 12:05:39 +00:00
|
|
|
/*
|
2012-07-08 12:46:22 +00:00
|
|
|
* ${port_name} setup:
|
2012-07-08 12:05:39 +00:00
|
|
|
*
|
2012-07-08 12:46:22 +00:00
|
|
|
[#-- Generating pin descriptions inside the comment.--]
|
2012-07-08 10:32:28 +00:00
|
|
|
[#list port.* as pin]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#assign pin_name = pin?node_name?upper_case /]
|
2012-07-08 10:32:28 +00:00
|
|
|
[#assign name = pin.@ID[0]?string?trim /]
|
|
|
|
[#if name?length == 0]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#assign name = pin_name /]
|
2012-07-08 10:32:28 +00:00
|
|
|
[/#if]
|
2012-07-08 12:05:39 +00:00
|
|
|
[#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]
|
2012-07-11 11:59:23 +00:00
|
|
|
* P${(port?node_name[4..] + pin_index?string)?right_pad(3, " ")} - ${name?right_pad(26, " ")}(${desc?lower_case}).
|
2012-07-08 10:32:28 +00:00
|
|
|
[/#list]
|
2012-07-08 12:05:39 +00:00
|
|
|
*/
|
2012-07-08 13:21:00 +00:00
|
|
|
[#--
|
|
|
|
-- Generating MODER register value.
|
|
|
|
--]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#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"]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_MODE_INPUT(" + port_name + "_" + name + ")" /]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#elseif mode == "Output"]
|
2012-07-08 13:50:34 +00:00
|
|
|
[#assign out = "PIN_MODE_OUTPUT(" + port_name + "_" + name + ")" /]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#elseif mode == "Alternate"]
|
2012-07-08 13:50:34 +00:00
|
|
|
[#assign out = "PIN_MODE_ALTERNATE(" + port_name + "_" + name + ")" /]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#else]
|
2012-07-08 13:50:34 +00:00
|
|
|
[#assign out = "PIN_MODE_ANALOG(" + port_name + "_" + name + ")" /]
|
2012-07-08 12:46:22 +00:00
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index == 0]
|
2012-07-08 12:46:22 +00:00
|
|
|
[#assign line = "#define VAL_" + port_name + "_MODER (" + out /]
|
|
|
|
[#else]
|
|
|
|
[#assign line = " " + out /]
|
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index < 15]
|
2012-07-08 12:46:22 +00:00
|
|
|
${(line + " |")?right_pad(76, " ") + "\\"}
|
|
|
|
[#else]
|
|
|
|
${line + ")"}
|
|
|
|
[/#if]
|
|
|
|
[/#list]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#--
|
|
|
|
-- 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"]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_OTYPE_PUSHPULL(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#else]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_OTYPE_OPENDRAIN(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index == 0]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#assign line = "#define VAL_" + port_name + "_OTYPER (" + out /]
|
|
|
|
[#else]
|
|
|
|
[#assign line = " " + out /]
|
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index < 15]
|
2012-07-08 13:21:00 +00:00
|
|
|
${(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"]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_OSPEED_2M(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#elseif speed == "Low"]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_OSPEED_25M(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#elseif speed == "High"]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_OSPEED_50M(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#else]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_OSPEED_100M(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index == 0]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#assign line = "#define VAL_" + port_name + "_OSPEEDR (" + out /]
|
|
|
|
[#else]
|
|
|
|
[#assign line = " " + out /]
|
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index < 15]
|
2012-07-08 13:21:00 +00:00
|
|
|
${(line + " |")?right_pad(76, " ") + "\\"}
|
|
|
|
[#else]
|
|
|
|
${line + ")"}
|
|
|
|
[/#if]
|
|
|
|
[/#list]
|
|
|
|
[#--
|
2012-07-08 14:58:39 +00:00
|
|
|
-- Generating PUPDR register value.
|
2012-07-08 13:21:00 +00:00
|
|
|
--]
|
|
|
|
[#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"]
|
2012-07-08 14:58:39 +00:00
|
|
|
[#assign out = "PIN_PUPDR_FLOATING(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#elseif resistor == "PullUp"]
|
2012-07-08 14:58:39 +00:00
|
|
|
[#assign out = "PIN_PUPDR_PULLUP(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#else]
|
2012-07-08 14:58:39 +00:00
|
|
|
[#assign out = "PIN_PUPDR_PULLDOWN(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index == 0]
|
2012-07-08 14:58:39 +00:00
|
|
|
[#assign line = "#define VAL_" + port_name + "_PUPDR (" + out /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#else]
|
|
|
|
[#assign line = " " + out /]
|
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index < 15]
|
2012-07-08 13:21:00 +00:00
|
|
|
${(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"]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_ODR_LOW(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#else]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_ODR_HIGH(" + port_name + "_" + name + ")" /]
|
2012-07-08 13:21:00 +00:00
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index == 0]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#assign line = "#define VAL_" + port_name + "_ODR (" + out /]
|
|
|
|
[#else]
|
|
|
|
[#assign line = " " + out /]
|
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index < 15]
|
2012-07-08 13:21:00 +00:00
|
|
|
${(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 /]
|
2012-07-08 13:32:14 +00:00
|
|
|
[#assign out = "PIN_AFIO_AF(" + port_name + "_" + name + ", " + alternate + ")" /]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if pin_index == 0]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#assign line = "#define VAL_" + port_name + "_AFRL (" + out /]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#elseif pin_index == 8]
|
2012-07-08 13:21:00 +00:00
|
|
|
[#assign line = "#define VAL_" + port_name + "_AFRH (" + out /]
|
|
|
|
[#else]
|
|
|
|
[#assign line = " " + out /]
|
|
|
|
[/#if]
|
2012-07-11 11:59:23 +00:00
|
|
|
[#if (pin_index == 7) || (pin_index == 15)]
|
2012-07-08 13:21:00 +00:00
|
|
|
${line + ")"}
|
|
|
|
[#else]
|
|
|
|
${(line + " |")?right_pad(76, " ") + "\\"}
|
|
|
|
[/#if]
|
|
|
|
[/#list]
|
2012-07-08 10:32:28 +00:00
|
|
|
|
|
|
|
[/#list]
|
|
|
|
|
2012-07-08 08:32:03 +00:00
|
|
|
#if !defined(_FROM_ASM_)
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
void boardInit(void);
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* _FROM_ASM_ */
|
|
|
|
|
|
|
|
#endif /* _BOARD_H_ */
|