-/*\r
- FreeRTOS.org V4.8.0 - Copyright (C) 2003-2008 Richard Barry.\r
-\r
- This file is part of the FreeRTOS.org distribution.\r
-\r
- FreeRTOS.org is free software; you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License as published by\r
- the Free Software Foundation; either version 2 of the License, or\r
- (at your option) any later version.\r
-\r
- FreeRTOS.org is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License\r
- along with FreeRTOS.org; if not, write to the Free Software\r
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
-\r
- A special exception to the GPL can be applied should you wish to distribute\r
- a combined work that includes FreeRTOS.org, without being obliged to provide\r
- the source code for any proprietary components. See the licensing section \r
- of http://www.FreeRTOS.org for full details of how and when the exception\r
- can be applied.\r
-\r
- ***************************************************************************\r
- ***************************************************************************\r
- * *\r
- * SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *\r
- * and even write all or part of your application on your behalf. *\r
- * See http://www.OpenRTOS.com for details of the services we provide to *\r
- * expedite your project. *\r
- * *\r
- ***************************************************************************\r
- ***************************************************************************\r
-\r
- Please ensure to read the configuration and relevant port sections of the\r
- online documentation.\r
-\r
- http://www.FreeRTOS.org - Documentation, latest information, license and \r
- contact details.\r
-\r
- http://www.SafeRTOS.com - A version that is certified for use in safety \r
- critical systems.\r
-\r
- http://www.OpenRTOS.com - Commercial support, development, porting, \r
- licensing and training services.\r
-*/\r
-\r
-/*-----------------------------------------------------------\r
- * Implementation of functions defined in portable.h for the PPC405 port.\r
- *----------------------------------------------------------*/\r
-\r
-\r
-/* Scheduler includes. */\r
-#include "FreeRTOS.h"\r
-#include "task.h"\r
-\r
-/* Library includes. */\r
-#include "xtime_l.h"\r
-#include "xintc.h"\r
-#include "xintc_i.h"\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/* Definitions to set the initial MSR of each task. */\r
-#define portCRITICAL_INTERRUPT_ENABLE ( 1UL << 17UL )\r
-#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 15UL )\r
-#define portMACHINE_CHECK_ENABLE ( 1UL << 12UL )\r
-#define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE )\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/*\r
- * Setup the system timer to generate the tick interrupt.\r
- */\r
-static void prvSetupTimerInterrupt( void );\r
-\r
-/*\r
- * The handler for the tick interrupt - defined in portasm.s.\r
- */\r
-extern void vPortTickISR( void );\r
-\r
-/*\r
- * The handler for the yield function - defined in portasm.s.\r
- */\r
-extern void vPortYield( void );\r
-\r
-/*\r
- * Function to start the scheduler running by starting the highest\r
- * priority task that has thus far been created.\r
- */\r
-extern void vPortStartFirstTask( void );\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/* Structure used to hold the state of the interrupt controller. */\r
-static XIntc xInterruptController;\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/* \r
- * Initialise the stack of a task to look exactly as if the task had been\r
- * interrupted.\r
- * \r
- * See the header file portable.h.\r
- */\r
-portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )\r
-{\r
- /* Place a known value at the bottom of the stack for debugging. */\r
- *pxTopOfStack = 0xDEADBEEF;\r
- *pxTopOfStack--;\r
-\r
- /* EABI stack frame. */\r
- pxTopOfStack -= 28; /* R31 to R4 inclusive. */\r
-\r
- /* Parameters in R3. */\r
- *pxTopOfStack = ( portSTACK_TYPE ) pvParameters;\r
- pxTopOfStack--;\r
- *pxTopOfStack = 0x02020202UL; /* R2. */\r
- pxTopOfStack--;\r
-\r
- /* R1 is the stack pointer so is omitted. */\r
-\r
- *pxTopOfStack = 0x10000001UL;; /* R0. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = 0x00000000UL; /* USPRG0. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = 0x00000000UL; /* CR. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = 0x00000000UL; /* XER. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = 0x00000000UL; /* CTR. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = ( portSTACK_TYPE ) vPortEndScheduler; /* LR. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* SRR0. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = portINITIAL_MSR;/* SRR1. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = ( portSTACK_TYPE ) vPortEndScheduler;/* Next LR. */\r
- pxTopOfStack--;\r
- *pxTopOfStack = 0x00000000UL;;/* Backchain. */\r
-\r
- return pxTopOfStack;\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-portBASE_TYPE xPortStartScheduler( void )\r
-{\r
- prvSetupTimerInterrupt();\r
- XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );\r
- vPortStartFirstTask();\r
-\r
- /* Should not get here as the tasks are now running! */\r
- return pdFALSE;\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vPortEndScheduler( void )\r
-{\r
- /* Not implemented. */\r
- for( ;; );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-/*\r
- * Hardware initialisation to generate the RTOS tick. \r
- */\r
-static void prvSetupTimerInterrupt( void )\r
-{\r
-const unsigned portLONG ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
-\r
- XTime_PITClearInterrupt();\r
- XTime_FITClearInterrupt();\r
- XTime_WDTClearInterrupt();\r
- XTime_WDTDisableInterrupt();\r
- XTime_FITDisableInterrupt();\r
-\r
- XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) vPortTickISR, ( void * ) 0 );\r
-\r
- XTime_PITEnableAutoReload();\r
- XTime_PITSetInterval( ulInterval );\r
- XTime_PITEnableInterrupt();\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vPortISRHandler( void *vNullDoNotUse )\r
-{\r
-unsigned portLONG ulInterruptStatus, ulInterruptMask = 1UL;\r
-portBASE_TYPE xInterruptNumber;\r
-XIntc_Config *pxInterruptController;\r
-XIntc_VectorTableEntry *pxTable;\r
-\r
- /* Get the configuration by using the device ID - in this case it is\r
- assumed that only one interrupt controller is being used. */\r
- pxInterruptController = &XIntc_ConfigTable[ XPAR_OPB_INTC_0_DEVICE_ID ];\r
- \r
- /* Which interrupts are pending? */\r
- ulInterruptStatus = XIntc_mGetIntrStatus( pxInterruptController->BaseAddress );\r
- \r
- for( xInterruptNumber = 0; xInterruptNumber < XPAR_INTC_MAX_NUM_INTR_INPUTS; xInterruptNumber++ )\r
- {\r
- if( ulInterruptStatus & 0x01UL )\r
- {\r
- /* Clear the pending interrupt. */\r
- XIntc_mAckIntr( pxInterruptController->BaseAddress, ulInterruptMask );\r
-\r
- /* Call the registered handler. */\r
- pxTable = &( pxInterruptController->HandlerTable[ xInterruptNumber ] );\r
- pxTable->Handler( pxTable->CallBackRef );\r
- }\r
- \r
- /* Check the next interrupt. */\r
- ulInterruptMask <<= 0x01UL;\r
- ulInterruptStatus >>= 0x01UL;\r
-\r
- /* Have we serviced all interrupts? */\r
- if( ulInterruptStatus == 0UL )\r
- {\r
- break;\r
- }\r
- }\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vPortSetupInterruptController( void )\r
-{\r
-extern void vPortISRWrapper( void );\r
-\r
- /* Perform all library calls necessary to initialise the exception table\r
- and interrupt controller. This assumes only one interrupt controller is in\r
- use. */\r
- XExc_mDisableExceptions( XEXC_NON_CRITICAL );\r
- XExc_Init();\r
-\r
- /* The library functions save the context - we then jump to a wrapper to\r
- save the stack into the TCB. The wrapper then calls the handler defined\r
- above. */\r
- XExc_RegisterHandler( XEXC_ID_NON_CRITICAL_INT, ( XExceptionHandler ) vPortISRWrapper, NULL );\r
- XIntc_Initialize( &xInterruptController, XPAR_OPB_INTC_0_DEVICE_ID );\r
- XIntc_Start( &xInterruptController, XIN_REAL_MODE );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-portBASE_TYPE xPortInstallInterruptHandler( unsigned portCHAR ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef )\r
-{\r
-portBASE_TYPE xReturn = pdFAIL;\r
-\r
- /* This function is defined here so the scope of xInterruptController can\r
- remain within this file. */\r
-\r
- if( XST_SUCCESS == XIntc_Connect( &xInterruptController, ucInterruptID, pxHandler, pvCallBackRef ) )\r
- {\r
- XIntc_Enable( &xInterruptController, ucInterruptID );\r
- xReturn = pdPASS;\r
- }\r
-\r
- return xReturn; \r
-}\r
+/*
+ FreeRTOS.org V4.8.0 - Copyright (C) 2003-2008 Richard Barry.
+
+ This file is part of the FreeRTOS.org distribution.
+
+ FreeRTOS.org 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 2 of the License, or
+ (at your option) any later version.
+
+ FreeRTOS.org 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 FreeRTOS.org; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ A special exception to the GPL can be applied should you wish to distribute
+ a combined work that includes FreeRTOS.org, without being obliged to provide
+ the source code for any proprietary components. See the licensing section
+ of http://www.FreeRTOS.org for full details of how and when the exception
+ can be applied.
+
+ ***************************************************************************
+ ***************************************************************************
+ * *
+ * SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *
+ * and even write all or part of your application on your behalf. *
+ * See http://www.OpenRTOS.com for details of the services we provide to *
+ * expedite your project. *
+ * *
+ ***************************************************************************
+ ***************************************************************************
+
+ Please ensure to read the configuration and relevant port sections of the
+ online documentation.
+
+ http://www.FreeRTOS.org - Documentation, latest information, license and
+ contact details.
+
+ http://www.SafeRTOS.com - A version that is certified for use in safety
+ critical systems.
+
+ http://www.OpenRTOS.com - Commercial support, development, porting,
+ licensing and training services.
+*/
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the PPC405 port.
+ *----------------------------------------------------------*/
+
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Library includes. */
+#include "xtime_l.h"
+#include "xintc.h"
+#include "xintc_i.h"
+
+/*-----------------------------------------------------------*/
+
+/* Definitions to set the initial MSR of each task. */
+#define portCRITICAL_INTERRUPT_ENABLE ( 1UL << 17UL )
+#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 15UL )
+#define portMACHINE_CHECK_ENABLE ( 1UL << 12UL )
+#define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Setup the system timer to generate the tick interrupt.
+ */
+static void prvSetupTimerInterrupt( void );
+
+/*
+ * The handler for the tick interrupt - defined in portasm.s.
+ */
+extern void vPortTickISR( void );
+
+/*
+ * The handler for the yield function - defined in portasm.s.
+ */
+extern void vPortYield( void );
+
+/*
+ * Function to start the scheduler running by starting the highest
+ * priority task that has thus far been created.
+ */
+extern void vPortStartFirstTask( void );
+
+/*-----------------------------------------------------------*/
+
+/* Structure used to hold the state of the interrupt controller. */
+static XIntc xInterruptController;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if the task had been
+ * interrupted.
+ *
+ * See the header file portable.h.
+ */
+portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
+{
+ /* Place a known value at the bottom of the stack for debugging. */
+ *pxTopOfStack = 0xDEADBEEF;
+ pxTopOfStack--;
+
+ /* EABI stack frame. */
+ pxTopOfStack -= 28; /* R31 to R4 inclusive. */
+
+ /* Parameters in R3. */
+ *pxTopOfStack = ( portSTACK_TYPE ) pvParameters;
+ pxTopOfStack--;
+ *pxTopOfStack = 0x02020202UL; /* R2. */
+ pxTopOfStack--;
+
+ /* R1 is the stack pointer so is omitted. */
+
+ *pxTopOfStack = 0x10000001UL;; /* R0. */
+ pxTopOfStack--;
+ *pxTopOfStack = 0x00000000UL; /* USPRG0. */
+ pxTopOfStack--;
+ *pxTopOfStack = 0x00000000UL; /* CR. */
+ pxTopOfStack--;
+ *pxTopOfStack = 0x00000000UL; /* XER. */
+ pxTopOfStack--;
+ *pxTopOfStack = 0x00000000UL; /* CTR. */
+ pxTopOfStack--;
+ *pxTopOfStack = ( portSTACK_TYPE ) vPortEndScheduler; /* LR. */
+ pxTopOfStack--;
+ *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* SRR0. */
+ pxTopOfStack--;
+ *pxTopOfStack = portINITIAL_MSR;/* SRR1. */
+ pxTopOfStack--;
+ *pxTopOfStack = ( portSTACK_TYPE ) vPortEndScheduler;/* Next LR. */
+ pxTopOfStack--;
+ *pxTopOfStack = 0x00000000UL;/* Backchain. */
+
+ return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+portBASE_TYPE xPortStartScheduler( void )
+{
+ prvSetupTimerInterrupt();
+ XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );
+ vPortStartFirstTask();
+
+ /* Should not get here as the tasks are now running! */
+ return pdFALSE;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+ /* Not implemented. */
+ for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * Hardware initialisation to generate the RTOS tick.
+ */
+static void prvSetupTimerInterrupt( void )
+{
+const unsigned portLONG ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );
+
+ XTime_PITClearInterrupt();
+ XTime_FITClearInterrupt();
+ XTime_WDTClearInterrupt();
+ XTime_WDTDisableInterrupt();
+ XTime_FITDisableInterrupt();
+
+ XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) vPortTickISR, ( void * ) 0 );
+
+ XTime_PITEnableAutoReload();
+ XTime_PITSetInterval( ulInterval );
+ XTime_PITEnableInterrupt();
+}
+/*-----------------------------------------------------------*/
+
+void vPortISRHandler( void *vNullDoNotUse )
+{
+unsigned portLONG ulInterruptStatus, ulInterruptMask = 1UL;
+portBASE_TYPE xInterruptNumber;
+XIntc_Config *pxInterruptController;
+XIntc_VectorTableEntry *pxTable;
+
+ /* Get the configuration by using the device ID - in this case it is
+ assumed that only one interrupt controller is being used. */
+ pxInterruptController = &XIntc_ConfigTable[ XPAR_XPS_INTC_0_DEVICE_ID ];
+
+ /* Which interrupts are pending? */
+ ulInterruptStatus = XIntc_mGetIntrStatus( pxInterruptController->BaseAddress );
+
+ for( xInterruptNumber = 0; xInterruptNumber < XPAR_INTC_MAX_NUM_INTR_INPUTS; xInterruptNumber++ )
+ {
+ if( ulInterruptStatus & 0x01UL )
+ {
+ /* Clear the pending interrupt. */
+ XIntc_mAckIntr( pxInterruptController->BaseAddress, ulInterruptMask );
+
+ /* Call the registered handler. */
+ pxTable = &( pxInterruptController->HandlerTable[ xInterruptNumber ] );
+ pxTable->Handler( pxTable->CallBackRef );
+ }
+
+ /* Check the next interrupt. */
+ ulInterruptMask <<= 0x01UL;
+ ulInterruptStatus >>= 0x01UL;
+
+ /* Have we serviced all interrupts? */
+ if( ulInterruptStatus == 0UL )
+ {
+ break;
+ }
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vPortSetupInterruptController( void )
+{
+extern void vPortISRWrapper( void );
+
+ /* Perform all library calls necessary to initialise the exception table
+ and interrupt controller. This assumes only one interrupt controller is in
+ use. */
+ XExc_mDisableExceptions( XEXC_NON_CRITICAL );
+ XExc_Init();
+
+ /* The library functions save the context - we then jump to a wrapper to
+ save the stack into the TCB. The wrapper then calls the handler defined
+ above. */
+ XExc_RegisterHandler( XEXC_ID_NON_CRITICAL_INT, ( XExceptionHandler ) vPortISRWrapper, NULL );
+ XIntc_Initialize( &xInterruptController, XPAR_XPS_INTC_0_DEVICE_ID );
+ XIntc_Start( &xInterruptController, XIN_REAL_MODE );
+}
+/*-----------------------------------------------------------*/
+
+portBASE_TYPE xPortInstallInterruptHandler( unsigned portCHAR ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef )
+{
+portBASE_TYPE xReturn = pdFAIL;
+
+ /* This function is defined here so the scope of xInterruptController can
+ remain within this file. */
+
+ if( XST_SUCCESS == XIntc_Connect( &xInterruptController, ucInterruptID, pxHandler, pvCallBackRef ) )
+ {
+ XIntc_Enable( &xInterruptController, ucInterruptID );
+ xReturn = pdPASS;
+ }
+
+ return xReturn;
+}