diff --git a/boards/GENERIC_SPC563M/board.c b/boards/GENERIC_SPC563M/board.c index 327b83eef..0edcfcdc2 100644 --- a/boards/GENERIC_SPC563M/board.c +++ b/boards/GENERIC_SPC563M/board.c @@ -28,7 +28,7 @@ */ void __early_init(void) { - spc563_clock_init(); + spc_clock_init(); } /* diff --git a/demos/PPC-SPC563M-GCC/halconf.h b/demos/PPC-SPC563M-GCC/halconf.h index 83783d10f..bab04ab7b 100644 --- a/demos/PPC-SPC563M-GCC/halconf.h +++ b/demos/PPC-SPC563M-GCC/halconf.h @@ -32,7 +32,7 @@ #ifndef _HALCONF_H_ #define _HALCONF_H_ -/*#include "mcuconf.h"*/ +#include "mcuconf.h" /** * @brief Enables the TM subsystem. diff --git a/demos/PPC-SPC563M-GCC/mcuconf.h b/demos/PPC-SPC563M-GCC/mcuconf.h new file mode 100644 index 000000000..6b54153b1 --- /dev/null +++ b/demos/PPC-SPC563M-GCC/mcuconf.h @@ -0,0 +1,51 @@ +/* + * Licensed under ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * SPC560Pxx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 1...15 Lowest...Highest. + */ + +#define SPC563Mxx_MCUCONF + +/* + * HAL driver system settings. + */ +#define SPC_NO_INIT FALSE +#define SPC_CLK_BYPASS FALSE +#define SPC_ALLOW_OVERCLOCK FALSE +#define SPC_CLK_PREDIV 1 +#define SPC_CLK_MFD 80 +#define SPC_CLK_RFD RFD_DIV4 +#define SPC_FLASH_BIUCR (BIUCR_BANK1_TOO | \ + BIUCR_MASTER4_PREFETCH | \ + BIUCR_MASTER0_PREFETCH | \ + BIUCR_DPFEN | \ + BIUCR_IPFEN | \ + BIUCR_PFLIM_ON_MISS | \ + BIUCR_BFEN) + +/* + * SERIAL driver system settings. + */ +#define SPC_USE_ESCIA TRUE +#define SPC_USE_ESCIB TRUE +#define SPC_ESCIA_PRIORITY 8 +#define SPC_ESCIB_PRIORITY 8 diff --git a/os/hal/platforms/SPC560BCxx/hal_lld.h b/os/hal/platforms/SPC560BCxx/hal_lld.h index 27103dfef..6cc920c6e 100644 --- a/os/hal/platforms/SPC560BCxx/hal_lld.h +++ b/os/hal/platforms/SPC560BCxx/hal_lld.h @@ -593,6 +593,13 @@ /* Derived constants and error checks. */ /*===========================================================================*/ +/* + * Configuration-related checks. + */ +#if !defined(SPC560BCxx_MCUCONF) +#error "Using a wrong mcuconf.h file, SPC560BCxx_MCUCONF not defined" +#endif + /* Check on the XOSC frequency.*/ #if (SPC5_XOSC_CLK < SPC5_XOSC_CLK_MIN) || \ (SPC5_XOSC_CLK > SPC5_XOSC_CLK_MAX) diff --git a/os/hal/platforms/SPC560Pxx/hal_lld.h b/os/hal/platforms/SPC560Pxx/hal_lld.h index 97baf86d4..e015d5d09 100644 --- a/os/hal/platforms/SPC560Pxx/hal_lld.h +++ b/os/hal/platforms/SPC560Pxx/hal_lld.h @@ -588,6 +588,13 @@ /* Derived constants and error checks. */ /*===========================================================================*/ +/* + * Configuration-related checks. + */ +#if !defined(SPC560Pxx_MCUCONF) +#error "Using a wrong mcuconf.h file, SPC560Pxx_MCUCONF not defined" +#endif + /* Check on the XOSC frequency.*/ #if (SPC5_XOSC_CLK < SPC5_XOSC_CLK_MIN) || \ (SPC5_XOSC_CLK > SPC5_XOSC_CLK_MAX) diff --git a/os/hal/platforms/SPC56x/hal_lld.c b/os/hal/platforms/SPC563Mxx/hal_lld.c similarity index 77% rename from os/hal/platforms/SPC56x/hal_lld.c rename to os/hal/platforms/SPC563Mxx/hal_lld.c index f5dec4516..89a5d9e45 100644 --- a/os/hal/platforms/SPC56x/hal_lld.c +++ b/os/hal/platforms/SPC563Mxx/hal_lld.c @@ -1,26 +1,20 @@ /* - 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 . -*/ + * Licensed under ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /** - * @file SPC56x/hal_lld.c - * @brief SPC563 HAL subsystem low level driver source. + * @file SPC563Mxx/hal_lld.c + * @brief SPC563Mxx HAL subsystem low level driver source. * * @addtogroup HAL * @{ @@ -64,7 +58,7 @@ void hal_lld_init(void) { "mtspr 1013, %%r3": : : "r3"); /* FLASH wait states and prefetching setup.*/ - CFLASH0.BIUCR.R = SPC563_FLASH_BIUCR | SPC563_FLASH_WS; + CFLASH0.BIUCR.R = SPC_FLASH_BIUCR | SPC_FLASH_WS; CFLASH0.BIUCR2.R = 0; CFLASH0.PFCR3.R = 0; @@ -87,7 +81,7 @@ void hal_lld_init(void) { /* Downcounter timer initialized for system tick use, TB enabled for debug and measurements.*/ - n = SPC563_SYSCLK / CH_FREQUENCY; + n = SPC_SYSCLK / CH_FREQUENCY; asm volatile ("li %%r3, 0 \t\n" "mtspr 284, %%r3 \t\n" /* Clear TBL register. */ "mtspr 285, %%r3 \t\n" /* Clear TBU register. */ @@ -114,18 +108,20 @@ void hal_lld_init(void) { * * @special */ -void spc563_clock_init(void) { +void spc_clock_init(void) { +#if !SPC_NO_INIT /* PLL activation.*/ FMPLL.ESYNCR1.B.EMODE = 1; FMPLL.ESYNCR1.B.CLKCFG &= 1; /* Bypass mode, PLL off.*/ FMPLL.ESYNCR1.B.CLKCFG |= 2; /* PLL on. */ - FMPLL.ESYNCR1.B.EPREDIV = SPC563_CLK_PREDIV; - FMPLL.ESYNCR1.B.EMFD = SPC563_CLK_MFD; - FMPLL.ESYNCR2.B.ERFD = SPC563_CLK_RFD; + FMPLL.ESYNCR1.B.EPREDIV = SPC_CLK_PREDIV; + FMPLL.ESYNCR1.B.EMFD = SPC_CLK_MFD; + FMPLL.ESYNCR2.B.ERFD = SPC_CLK_RFD; while (!FMPLL.SYNSR.B.LOCK) ; FMPLL.ESYNCR1.B.CLKCFG |= 4; /* Clock from the PLL. */ +#endif /* !SPC_NO_INIT */ } /** @} */ diff --git a/os/hal/platforms/SPC56x/hal_lld.h b/os/hal/platforms/SPC563Mxx/hal_lld.h similarity index 66% rename from os/hal/platforms/SPC56x/hal_lld.h rename to os/hal/platforms/SPC563Mxx/hal_lld.h index 8a30113ba..afb4a459f 100644 --- a/os/hal/platforms/SPC56x/hal_lld.h +++ b/os/hal/platforms/SPC563Mxx/hal_lld.h @@ -1,26 +1,20 @@ /* - 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 . -*/ + * Licensed under ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /** - * @file SPC56x/hal_lld.h - * @brief SPC563 HAL subsystem low level driver header. + * @file SPC563Mxx/hal_lld.h + * @brief SPC563Mxx HAL subsystem low level driver header. * * @addtogroup HAL * @{ @@ -50,8 +44,10 @@ #define RFD_DIV8 2 /**< Divide VCO frequency by 8. */ #define RFD_DIV16 3 /**< Divide VCO frequency by 16.*/ -/* The following settings are related to the FLASH controller, performance - and stability depends on them, be careful.*/ +/** + * @name BIUCR register definitions + * @{ + */ #define BIUCR_BANK1_TOO 0x01000000 /**< Use settings for bank1 too.*/ #define BIUCR_MASTER7_PREFETCH 0x00800000 /**< Enable master 7 prefetch. */ #define BIUCR_MASTER6_PREFETCH 0x00400000 /**< Enable master 6 prefetch. */ @@ -90,26 +86,34 @@ #define BIUCR_PFLIM_ON_MISS (1 << 1) /**< Prefetch on miss. */ #define BIUCR_PFLIM_ON_HITMISS (2 << 1) /**< Prefetch on hit and miss. */ #define BIUCR_BFEN 0x00000001 /**< Flash buffering enable. */ +/** @} */ /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ +/** + * @brief Disables the clocks initialization in the HAL. + */ +#if !defined(SPC5_NO_INIT) || defined(__DOXYGEN__) +#define SPC_NO_INIT FALSE +#endif + /** * @brief Clock bypass. * @note If set to @p TRUE then the PLL is not started and initialized, the * external clock is used as-is and the other clock-related settings * are ignored. */ -#if !defined(SPC563_CLK_BYPASS) || defined(__DOXYGEN__) -#define SPC563_CLK_BYPASS FALSE +#if !defined(SPC_CLK_BYPASS) || defined(__DOXYGEN__) +#define SPC_CLK_BYPASS FALSE #endif /** * @brief Disables the overclock checks. */ -#if !defined(SPC563_ALLOW_OVERCLOCK) || defined(__DOXYGEN__) -#define SPC563_ALLOW_OVERCLOCK FALSE +#if !defined(SPC_ALLOW_OVERCLOCK) || defined(__DOXYGEN__) +#define SPC_ALLOW_OVERCLOCK FALSE #endif /** @@ -117,23 +121,23 @@ * @note Must be in range 0...14. * @note The effective divider factor is this value plus one. */ -#if !defined(SPC563_CLK_PREDIV) || defined(__DOXYGEN__) -#define SPC563_CLK_PREDIV 1 +#if !defined(SPC_CLK_PREDIV) || defined(__DOXYGEN__) +#define SPC_CLK_PREDIV 1 #endif /** * @brief Multiplication factor divider. * @note Must be in range 32...96. */ -#if !defined(SPC563_CLK_MFD) || defined(__DOXYGEN__) -#define SPC563_CLK_MFD 80 +#if !defined(SPC_CLK_MFD) || defined(__DOXYGEN__) +#define SPC_CLK_MFD 80 #endif /** * @brief Reduced frequency divider. */ -#if !defined(SPC563_CLK_RFD) || defined(__DOXYGEN__) -#define SPC563_CLK_RFD RFD_DIV4 +#if !defined(SPC_CLK_RFD) || defined(__DOXYGEN__) +#define SPC_CLK_RFD RFD_DIV4 #endif /** @@ -144,64 +148,71 @@ * those are calculated from the system clock and ORed with this * value. */ -#if !defined(SPC563_FLASH_BIUCR) || defined(__DOXYGEN__) -#define SPC563_FLASH_BIUCR (BIUCR_BANK1_TOO | \ - BIUCR_MASTER4_PREFETCH | \ - BIUCR_MASTER0_PREFETCH | \ - BIUCR_DPFEN | \ - BIUCR_IPFEN | \ - BIUCR_PFLIM_ON_MISS | \ - BIUCR_BFEN) +#if !defined(SPC_FLASH_BIUCR) || defined(__DOXYGEN__) +#define SPC_FLASH_BIUCR (BIUCR_BANK1_TOO | \ + BIUCR_MASTER4_PREFETCH | \ + BIUCR_MASTER0_PREFETCH | \ + BIUCR_DPFEN | \ + BIUCR_IPFEN | \ + BIUCR_PFLIM_ON_MISS | \ + BIUCR_BFEN) #endif /*===========================================================================*/ /* Derived constants and error checks. */ /*===========================================================================*/ -#if (SPC563_CLK_PREDIV < 0) || (SPC563_CLK_PREDIV > 14) -#error "invalid SPC563_CLK_PREDIV value specified" +/* + * Configuration-related checks. + */ +#if !defined(SPC563Mxx_MCUCONF) +#error "Using a wrong mcuconf.h file, SPC563Mxx_MCUCONF not defined" #endif -#if (SPC563_CLK_MFD < 32) || (SPC563_CLK_MFD > 96) -#error "invalid SPC563_CLK_MFD value specified" +#if (SPC_CLK_PREDIV < 0) || (SPC_CLK_PREDIV > 14) +#error "invalid SPC_CLK_PREDIV value specified" #endif -#if (SPC563_CLK_RFD != RFD_DIV2) && (SPC563_CLK_RFD != RFD_DIV4) && \ - (SPC563_CLK_RFD != RFD_DIV8) && (SPC563_CLK_RFD != RFD_DIV16) -#error "invalid SPC563_CLK_RFD value specified" +#if (SPC_CLK_MFD < 32) || (SPC_CLK_MFD > 96) +#error "invalid SPC_CLK_MFD value specified" +#endif + +#if (SPC_CLK_RFD != RFD_DIV2) && (SPC_CLK_RFD != RFD_DIV4) && \ + (SPC_CLK_RFD != RFD_DIV8) && (SPC_CLK_RFD != RFD_DIV16) +#error "invalid SPC_CLK_RFD value specified" #endif /** * @brief PLL output clock. */ -#define SPC563_PLLCLK ((EXTCLK / (SPC563_CLK_PREDIV + 1)) * SPC563_CLK_MFD) +#define SPC_PLLCLK ((EXTCLK / (SPC_CLK_PREDIV + 1)) * SPC_CLK_MFD) -#if (SPC563_PLLCLK < 256000000) || (SPC563_PLLCLK > 512000000) +#if (SPC_PLLCLK < 256000000) || (SPC_PLLCLK > 512000000) #error "VCO frequency out of the acceptable range (256...512)" #endif /** * @brief PLL output clock. */ -#if !SPC563_CLK_BYPASS || defined(__DOXYGEN__) -#define SPC563_SYSCLK (SPC563_PLLCLK / (1 << (SPC563_CLK_RFD + 1))) +#if !SPC_CLK_BYPASS || defined(__DOXYGEN__) +#define SPC_SYSCLK (SPC_PLLCLK / (1 << (SPC_CLK_RFD + 1))) #else -#define SPC563_SYSCLK EXTCLK +#define SPC_SYSCLK EXTCLK #endif -#if (SPC563_SYSCLK > 80000000) && !SPC563_ALLOW_OVERCLOCK +#if (SPC_SYSCLK > 80000000) && !SPC_ALLOW_OVERCLOCK #error "System clock above maximum rated frequency (80MHz)" #endif /** * @brief Flash wait states are a function of the system clock. */ -#if (SPC563_SYSCLK <= 30000000) || defined(__DOXYGEN__) -#define SPC563_FLASH_WS (BIUCR_APC_0 | BIUCR_RWSC_0 | BIUCR_WWSC_1) -#elif SPC563_SYSCLK <= 60000000 -#define SPC563_FLASH_WS (BIUCR_APC_1 | BIUCR_RWSC_1 | BIUCR_WWSC_1) +#if (SPC_SYSCLK <= 30000000) || defined(__DOXYGEN__) +#define SPC_FLASH_WS (BIUCR_APC_0 | BIUCR_RWSC_0 | BIUCR_WWSC_1) +#elif SPC_SYSCLK <= 60000000 +#define SPC_FLASH_WS (BIUCR_APC_1 | BIUCR_RWSC_1 | BIUCR_WWSC_1) #else -#define SPC563_FLASH_WS (BIUCR_APC_2 | BIUCR_RWSC_2 | BIUCR_WWSC_1) +#define SPC_FLASH_WS (BIUCR_APC_2 | BIUCR_RWSC_2 | BIUCR_WWSC_1) #endif /*===========================================================================*/ @@ -220,7 +231,7 @@ extern "C" { #endif void hal_lld_init(void); - void spc563_clock_init(void); + void spc_clock_init(void); #ifdef __cplusplus } #endif diff --git a/os/hal/platforms/SPC56x/mpc563m.h b/os/hal/platforms/SPC563Mxx/mpc563m.h similarity index 100% rename from os/hal/platforms/SPC56x/mpc563m.h rename to os/hal/platforms/SPC563Mxx/mpc563m.h diff --git a/os/hal/platforms/SPC56x/platform.dox b/os/hal/platforms/SPC563Mxx/platform.dox similarity index 100% rename from os/hal/platforms/SPC56x/platform.dox rename to os/hal/platforms/SPC563Mxx/platform.dox diff --git a/os/hal/platforms/SPC563Mxx/platform.mk b/os/hal/platforms/SPC563Mxx/platform.mk new file mode 100644 index 000000000..e9a508857 --- /dev/null +++ b/os/hal/platforms/SPC563Mxx/platform.mk @@ -0,0 +1,6 @@ +# List of all the SPC56x platform files. +PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/SPC563Mxx/hal_lld.c \ + ${CHIBIOS}/os/hal/platforms/SPC5xx/ESCIv1/serial_lld.c + +# Required include directories +PLATFORMINC = ${CHIBIOS}/os/hal/platforms/SPC563Mxx diff --git a/os/hal/platforms/SPC56x/serial_lld.c b/os/hal/platforms/SPC563Mxx/serial_lld.c similarity index 100% rename from os/hal/platforms/SPC56x/serial_lld.c rename to os/hal/platforms/SPC563Mxx/serial_lld.c diff --git a/os/hal/platforms/SPC56x/serial_lld.h b/os/hal/platforms/SPC563Mxx/serial_lld.h similarity index 100% rename from os/hal/platforms/SPC56x/serial_lld.h rename to os/hal/platforms/SPC563Mxx/serial_lld.h diff --git a/os/hal/platforms/SPC563Mxx/typedefs.h b/os/hal/platforms/SPC563Mxx/typedefs.h new file mode 100644 index 000000000..2214513eb --- /dev/null +++ b/os/hal/platforms/SPC563Mxx/typedefs.h @@ -0,0 +1,25 @@ +/* + * Licensed under ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file SPC56x/typedefs.h + * @brief Dummy typedefs file. + */ + +#ifndef _TYPEDEFS_H_ +#define _TYPEDEFS_H_ + +#include "chtypes.h" + +#endif /* _TYPEDEFS_H_ */ diff --git a/os/hal/platforms/SPC56x/platform.mk b/os/hal/platforms/SPC56x/platform.mk deleted file mode 100644 index 6069e7dc6..000000000 --- a/os/hal/platforms/SPC56x/platform.mk +++ /dev/null @@ -1,6 +0,0 @@ -# List of all the SPC56x platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/SPC56x/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/SPC56x/serial_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/SPC56x diff --git a/os/hal/platforms/SPC56x/typedefs.h b/os/hal/platforms/SPC56x/typedefs.h deleted file mode 100644 index 5947e0f37..000000000 --- a/os/hal/platforms/SPC56x/typedefs.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - 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 . -*/ - -/** - * @file SPC56x/typedefs.h - * @brief Dummy typedefs file. - */ - -#ifndef _TYPEDEFS_H_ -#define _TYPEDEFS_H_ - -#include "chtypes.h" - -#endif /* _TYPEDEFS_H_ */ diff --git a/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.c b/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.c new file mode 100644 index 000000000..ca90d0d56 --- /dev/null +++ b/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.c @@ -0,0 +1,288 @@ +/* + * Licensed under ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file SPC5xx/ESCI_v1/serial_lld.c + * @brief SPC5xx low level serial driver code. + * + * @addtogroup SERIAL + * @{ + */ + +#include "ch.h" +#include "hal.h" + +#if HAL_USE_SERIAL || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/** + * @brief eSCI-A serial driver identifier. + */ +#if SPC_USE_ESCIA || defined(__DOXYGEN__) +SerialDriver SD1; +#endif + +/** + * @brief eSCI-B serial driver identifier. + */ +#if SPC_USE_ESCIB || defined(__DOXYGEN__) +SerialDriver SD2; +#endif + +/*===========================================================================*/ +/* Driver local variables. */ +/*===========================================================================*/ + +/** + * @brief Driver default configuration. + */ +static const SerialConfig default_config = { + SERIAL_DEFAULT_BITRATE, + SD_MODE_NORMAL | SD_MODE_PARITY_NONE +}; + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/** + * @brief eSCI initialization. + * @details This function must be invoked with interrupts disabled. + * + * @param[in] sdp pointer to a @p SerialDriver object + * @param[in] config the architecture-dependent serial driver configuration + */ +static void esci_init(SerialDriver *sdp, const SerialConfig *config) { + volatile struct ESCI_tag *escip = sdp->escip; + uint8_t mode = config->sc_mode; + + escip->CR2.R = 0; /* MDIS off. */ + escip->CR1.R = 0; + escip->LCR.R = 0; + escip->CR1.B.SBR = SPC_SYSCLK / (16 * config->sc_speed); + if (mode & SD_MODE_LOOPBACK) + escip->CR1.B.LOOPS = 1; + switch (mode & SD_MODE_PARITY) { + case SD_MODE_PARITY_ODD: + escip->CR1.B.PT = 1; + case SD_MODE_PARITY_EVEN: + escip->CR1.B.PE = 1; + escip->CR1.B.M = 1; /* Makes it 8 bits data + 1 bit parity. */ + default: + ; + } + escip->LPR.R = 0; + escip->CR1.R |= 0x0000002C; /* RIE, TE, RE to 1. */ + escip->CR2.R |= 0x000F; /* ORIE, NFIE, FEIE, PFIE to 1. */ +} + +/** + * @brief eSCI de-initialization. + * @details This function must be invoked with interrupts disabled. + * + * @param[in] escip pointer to an eSCI I/O block + */ +static void esci_deinit(volatile struct ESCI_tag *escip) { + + escip->LPR.R = 0; + escip->SR.R = 0xFFFFFFFF; + escip->CR1.R = 0; + escip->CR2.R = 0x8000; /* MDIS on. */ +} + +/** + * @brief Error handling routine. + * + * @param[in] sdp pointer to a @p SerialDriver object + * @param[in] sr eSCI SR register value + */ +static void set_error(SerialDriver *sdp, uint32_t sr) { + flagsmask_t sts = 0; + + if (sr & 0x08000000) + sts |= SD_OVERRUN_ERROR; + if (sr & 0x04000000) + sts |= SD_NOISE_ERROR; + if (sr & 0x02000000) + sts |= SD_FRAMING_ERROR; + if (sr & 0x01000000) + sts |= SD_PARITY_ERROR; +/* if (sr & 0x00000000) + sts |= SD_BREAK_DETECTED;*/ + chSysLockFromIsr(); + chnAddFlagsI(sdp, sts); + chSysUnlockFromIsr(); +} + +/** + * @brief Common IRQ handler. + * + * @param[in] sdp pointer to a @p SerialDriver object + */ +static void serve_interrupt(SerialDriver *sdp) { + volatile struct ESCI_tag *escip = sdp->escip; + + uint32_t sr = escip->SR.R; + escip->SR.R = 0x3FFFFFFF; /* Does not clear TDRE | TC.*/ + if (sr & 0x0F000000) /* OR | NF | FE | PF. */ + set_error(sdp, sr); + if (sr & 0x20000000) { /* RDRF. */ + chSysLockFromIsr(); + sdIncomingDataI(sdp, escip->DR.B.D); + chSysUnlockFromIsr(); + } + if (escip->CR1.B.TIE && (sr & 0x80000000)) { /* TDRE. */ + msg_t b; + chSysLockFromIsr(); + b = chOQGetI(&sdp->oqueue); + if (b < Q_OK) { + chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); + escip->CR1.B.TIE = 0; + } + else { + ESCI_A.SR.B.TDRE = 1; + escip->DR.R = (uint16_t)b; + } + chSysUnlockFromIsr(); + } +} + +#if SPC_USE_ESCIA || defined(__DOXYGEN__) +static void notify1(GenericQueue *qp) { + + (void)qp; + if (ESCI_A.SR.B.TDRE) { + msg_t b = sdRequestDataI(&SD1); + if (b != Q_EMPTY) { + ESCI_A.SR.B.TDRE = 1; + ESCI_A.CR1.B.TIE = 1; + ESCI_A.DR.R = (uint16_t)b; + } + } +} +#endif + +#if SPC_USE_ESCIB || defined(__DOXYGEN__) +static void notify2(GenericQueue *qp) { + + (void)qp; + if (ESCI_B.SR.B.TDRE) { + msg_t b = sdRequestDataI(&SD2); + if (b != Q_EMPTY) { + ESCI_B.SR.B.TDRE = 1; + ESCI_B.CR1.B.TIE = 1; + ESCI_B.DR.R = (uint16_t)b; + } + } +} +#endif + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +#if SPC_USE_ESCIA || defined(__DOXYGEN__) +/** + * @brief eSCI-A interrupt handler. + * + * @isr + */ +CH_IRQ_HANDLER(vector146) { + + CH_IRQ_PROLOGUE(); + + serve_interrupt(&SD1); + + CH_IRQ_EPILOGUE(); +} +#endif + +#if SPC_USE_ESCIB || defined(__DOXYGEN__) +/** + * @brief eSCI-B interrupt handler. + * + * @isr + */ +CH_IRQ_HANDLER(vector149) { + + CH_IRQ_PROLOGUE(); + + serve_interrupt(&SD2); + + CH_IRQ_EPILOGUE(); +} +#endif + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level serial driver initialization. + * + * @notapi + */ +void sd_lld_init(void) { + +#if SPC_USE_ESCIA + sdObjectInit(&SD1, NULL, notify1); + SD1.escip = &ESCI_A; + ESCI_A.CR2.R = 0x8000; /* MDIS ON. */ + INTC.PSR[146].R = SPC_ESCIA_PRIORITY; +#endif + +#if SPC_USE_ESCIB + sdObjectInit(&SD2, NULL, notify2); + SD2.escip = &ESCI_B; + ESCI_B.CR2.R = 0x8000; /* MDIS ON. */ + INTC.PSR[149].R = SPC_ESCIB_PRIORITY; +#endif +} + +/** + * @brief Low level serial driver configuration and (re)start. + * + * @param[in] sdp pointer to a @p SerialDriver object + * @param[in] config the architecture-dependent serial driver configuration. + * If this parameter is set to @p NULL then a default + * configuration is used. + * + * @notapi + */ +void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { + + if (config == NULL) + config = &default_config; + esci_init(sdp, config); +} + +/** + * @brief Low level serial driver stop. + * + * @param[in] sdp pointer to a @p SerialDriver object + * + * @notapi + */ +void sd_lld_stop(SerialDriver *sdp) { + + if (sdp->state == SD_READY) + esci_deinit(sdp->escip); +} + +#endif /* HAL_USE_SERIAL */ + +/** @} */ diff --git a/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.h b/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.h new file mode 100644 index 000000000..606344d9f --- /dev/null +++ b/os/hal/platforms/SPC5xx/ESCI_v1/serial_lld.h @@ -0,0 +1,156 @@ +/* + * Licensed under ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file SPC5xx/ESCI_v1/serial_lld.c + * @brief SPC5xx low level serial driver code. + * + * @addtogroup SERIAL + * @{ + */ + +#ifndef _SERIAL_LLD_H_ +#define _SERIAL_LLD_H_ + +#if HAL_USE_SERIAL || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/** + * @name Serial port modes + * @{ + */ +#define SD_MODE_PARITY_MASK 0x03 /**< @brief Parity field mask. */ +#define SD_MODE_PARITY_NONE 0x00 /**< @brief No parity. */ +#define SD_MODE_PARITY_EVEN 0x01 /**< @brief Even parity. */ +#define SD_MODE_PARITY_ODD 0x02 /**< @brief Odd parity. */ + +#define SD_MODE_NORMAL 0x00 /**< @brief Normal operations. */ +#define SD_MODE_LOOPBACK 0x80 /**< @brief Internal loopback. */ +/** @} */ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @brief eSCI-A driver enable switch. + * @details If set to @p TRUE the support for eSCI-A is included. + * @note The default is @p TRUE. + */ +#if !defined(SPC_USE_ESCIA) || defined(__DOXYGEN__) +#define SPC_USE_ESCIA TRUE +#endif + +/** + * @brief eSCI-B driver enable switch. + * @details If set to @p TRUE the support for eSCI-B is included. + * @note The default is @p TRUE. + */ +#if !defined(SPC_USE_ESCIB) || defined(__DOXYGEN__) +#define SPC_USE_ESCIB TRUE +#endif + +/** + * @brief eSCI-A interrupt priority level setting. + */ +#if !defined(SPC_ESCIA_PRIORITY) || defined(__DOXYGEN__) +#define SPC_ESCIA_PRIORITY 8 +#endif + +/** + * @brief eSCI-B interrupt priority level setting. + */ +#if !defined(SPC_ESCIB_PRIORITY) || defined(__DOXYGEN__) +#define SPC_ESCIB_PRIORITY 8 +#endif + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Generic Serial Driver configuration structure. + * @details An instance of this structure must be passed to @p sdStart() + * in order to configure and start a serial driver operations. + * @note This structure content is architecture dependent, each driver + * implementation defines its own version and the custom static + * initializers. + */ +typedef struct { + /** + * @brief Bit rate. + */ + uint32_t sc_speed; + /** + * @brief Mode flags. + */ + uint8_t sc_mode; +} SerialConfig; + +/** + * @brief @p SerialDriver specific data. + */ +#define _serial_driver_data \ + _base_asynchronous_channel_data \ + /* Driver state.*/ \ + sdstate_t state; \ + /* Input queue.*/ \ + InputQueue iqueue; \ + /* Output queue.*/ \ + OutputQueue oqueue; \ + /* Input circular buffer.*/ \ + uint8_t ib[SERIAL_BUFFERS_SIZE]; \ + /* Output circular buffer.*/ \ + uint8_t ob[SERIAL_BUFFERS_SIZE]; \ + /* End of the mandatory fields.*/ \ + /* Pointer to the volatile eSCI registers block.*/ \ + volatile struct ESCI_tag *escip; + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#if SPC_USE_ESCIA && !defined(__DOXYGEN__) +extern SerialDriver SD1; +#endif +#if SPC_USE_ESCIB && !defined(__DOXYGEN__) +extern SerialDriver SD2; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + void sd_lld_init(void); + void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); + void sd_lld_stop(SerialDriver *sdp); +#ifdef __cplusplus +} +#endif + +#endif /* HAL_USE_SERIAL */ + +#endif /* _SERIAL_LLD_H_ */ + +/** @} */ diff --git a/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c b/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c index 4334c03d4..b666a65ae 100644 --- a/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c +++ b/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c @@ -13,7 +13,7 @@ */ /** - * @file SPC5xx/serial_lld.c + * @file SPC5xx/LINFlex_v1/serial_lld.c * @brief SPC5xx low level serial driver code. * * @addtogroup SERIAL diff --git a/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.h b/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.h index 85dc1345b..0b1873f30 100644 --- a/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.h +++ b/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.h @@ -13,7 +13,7 @@ */ /** - * @file SPC5xx/serial_lld.h + * @file SPC5xx/LINFlex_v1/serial_lld.h * @brief SPC5xx low level serial driver header. * * @addtogroup SERIAL diff --git a/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c b/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c index a0aee25f5..8cd8b2bd3 100644 --- a/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c +++ b/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c @@ -13,7 +13,7 @@ */ /** - * @file SPC5xx/SIU_v1/pal_lld.c + * @file SPC5xx/SIUL_v1/pal_lld.c * @brief SPC5xx SIU/SIUL low level driver code. * * @addtogroup PAL diff --git a/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h b/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h index e15bdf441..32b54d260 100644 --- a/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h +++ b/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h @@ -13,7 +13,7 @@ */ /** - * @file SPC5xx/SIU_v1//pal_lld.h + * @file SPC5xx/SIUL_v1/pal_lld.h * @brief SPC5xx SIU/SIUL low level driver header. * * @addtogroup PAL