]> git.sur5r.net Git - freertos/blobdiff - Source/portable/GCC/PPC405/port.c
PPC405 work in progress.
[freertos] / Source / portable / GCC / PPC405 / port.c
index 8801d72940b459d17cd7ea32b07bde17034f3e16..b97444b3c4e1727653ab7d6f9b88267ce97d16a9 100644 (file)
@@ -41,7 +41,7 @@
 */\r
 \r
 /*-----------------------------------------------------------\r
- * Implementation of functions defined in portable.h for the MicroBlaze port.\r
+ * Implementation of functions defined in portable.h for the PPC405 port.\r
  *----------------------------------------------------------*/\r
 \r
 \r
 #include "task.h"\r
 \r
 /* Library includes. */\r
-#include "xexception_l.h"\r
 #include "xtime_l.h"\r
+#include "xintc.h"\r
+#include "xintc_i.h"\r
 \r
 /* Standard includes. */\r
 #include <string.h>\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
-#define portCRITICAL_INTERRUPT_ENABLE  ( 1UL << 14UL )\r
-#define portEXTERNAL_INTERRUPT_ENABLE  ( 1UL << 16UL )\r
-#define portMACHINE_CHECK_ENABLE               ( 1UL << 19UL )\r
+#define portCRITICAL_INTERRUPT_ENABLE  ( 0UL << 17UL )\r
+#define portEXTERNAL_INTERRUPT_ENABLE  ( 1UL << 15UL )\r
+#define portMACHINE_CHECK_ENABLE               ( 0UL << 12UL )\r
 #define portINITIAL_MSR                ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE )\r
 \r
 /*\r
  */\r
 static void prvSetupTimerInterrupt( void );\r
-extern void vStartFirstTask( void );\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvTickISR( void );\r
+extern void vPortTickISR( void );\r
 extern void vPortYield( void );\r
+extern void vPortStartFirstTask( void );\r
+\r
+static XIntc xInterruptController;\r
 \r
 /* \r
  * Initialise the stack of a task to look exactly as if a call to \r
@@ -84,9 +85,7 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE
        *pxTopOfStack = 0xDEADBEEF;\r
        *pxTopOfStack--;\r
 \r
-       *pxTopOfStack = 0x10000001UL;;  /* R0. */\r
-       pxTopOfStack--;\r
-                                                                       /* SP. */\r
+       /* EABI stack frame. */\r
        *pxTopOfStack = 0x31313131UL;   /* R31. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = 0x30303030UL;   /* R30. */\r
@@ -147,20 +146,26 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE
        pxTopOfStack--;\r
        *pxTopOfStack = 0x02020202UL;   /* R2. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = 0x00000000;             /* CR. */\r
+       *pxTopOfStack = 0x10000001UL;;  /* R0. */\r
+       pxTopOfStack--;\r
+       *pxTopOfStack = 0x00000000UL;   /* USPRG0. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = 0x00000000;             /* XER. */\r
+       *pxTopOfStack = 0x00000000UL;   /* CR. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = 0x00000000;             /* LR. */\r
+       *pxTopOfStack = 0x00000000UL;   /* XER. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = 0x00000000;             /* CTR. */\r
+       *pxTopOfStack = 0x00000000UL;   /* CTR. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = 0x00000000;             /* USPRG0. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask; /* LR. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* SRR0. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = portINITIAL_MSR;/* SRR1. */\r
        pxTopOfStack--;\r
+       *pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask;/* Next LR. */\r
+       pxTopOfStack--;\r
+       *pxTopOfStack = 0x00000000UL;;/* Backchain. */\r
+//     pxTopOfStack--;\r
 \r
        return pxTopOfStack;\r
 }\r
@@ -171,8 +176,13 @@ portBASE_TYPE xPortStartScheduler( void )
 extern void *pxCurrentTCB;\r
 \r
        prvSetupTimerInterrupt();\r
-       vStartFirstTask();\r
-       \r
+\r
+       XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );\r
+\r
+//     XExc_mEnableExceptions( XEXC_NON_CRITICAL );\r
+\r
+       vPortStartFirstTask();\r
+\r
        /* Should not get here as the tasks are now running! */\r
        return pdFALSE;\r
 }\r
@@ -187,21 +197,22 @@ void vPortEndScheduler( void )
 /*\r
  * Hardware initialisation to generate the RTOS tick.   \r
  */\r
+static void prvTickISR( void );\r
 static void prvSetupTimerInterrupt( void )\r
 {\r
 const unsigned portLONG ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
 \r
-       XExc_Init();\r
-       XExc_mDisableExceptions( XEXC_NON_CRITICAL ) ;  \r
-       XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) prvTickISR, ( void * ) 0 );\r
-       XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );\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_PITEnableInterrupt();\r
        XTime_PITSetInterval( ulInterval );\r
        XTime_PITEnableInterrupt();\r
-       \r
-       XExc_mEnableExceptions( XEXC_NON_CRITICAL ) ;\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -216,12 +227,82 @@ static unsigned portLONG ulTicks = 0;
                ulTicks = 0;\r
        }\r
        XTime_PITClearInterrupt();\r
-       \r
-       #if configUSE_PREEMPTION == 1\r
-       #endif\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+void vPortISRHandler( void *vNullDoNotUse )\r
+{\r
+Xuint32 IntrStatus;\r
+Xuint32 IntrMask = 1;\r
+int IntrNumber;\r
+//extern XIntc xInterruptController;\r
+XIntc_Config *CfgPtr;// = xInterruptController.CfgPtr;\r
+         \r
+    /* Get the configuration data using the device ID */\r
+    //CfgPtr = &XIntc_ConfigTable[(Xuint32)DeviceId];\r
+       CfgPtr = &XIntc_ConfigTable[(Xuint32)XPAR_OPB_INTC_0_DEVICE_ID];\r
+  \r
+    /* Get the interrupts that are waiting to be serviced */\r
+    IntrStatus = XIntc_mGetIntrStatus(CfgPtr->BaseAddress);\r
+  \r
+    /* Service each interrupt that is active and enabled by checking each\r
+     * bit in the register from LSB to MSB which corresponds to an interrupt\r
+     * intput signal\r
+     */\r
+    for (IntrNumber = 0; IntrNumber < XPAR_INTC_MAX_NUM_INTR_INPUTS;\r
+         IntrNumber++)\r
+    {\r
+        if (IntrStatus & 1)\r
+        {\r
+            XIntc_VectorTableEntry *TablePtr;\r
+      \r
+            /* The interrupt is active and enabled, call the interrupt\r
+             * handler that was setup with the specified parameter\r
+             */\r
+            TablePtr = &(CfgPtr->HandlerTable[IntrNumber]);\r
+            TablePtr->Handler(TablePtr->CallBackRef);\r
+\r
+                       /* Clear the interrupt. */      \r
+            XIntc_mAckIntr(CfgPtr->BaseAddress, IntrMask);\r
+                       break;\r
+        }\r
+        \r
+        /* Move to the next interrupt to check */\r
+        IntrMask <<= 1;\r
+        IntrStatus >>= 1;\r
+      \r
+        /* If there are no other bits set indicating that all interrupts\r
+         * have been serviced, then exit the loop\r
+         */\r
+        if (IntrStatus == 0)\r
+        {\r
+            break;\r
+        }\r
+    }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vPortSetupInterruptController( void )\r
+{\r
+extern void vPortISRWrapper( void );\r
+\r
+       XExc_mDisableExceptions( XEXC_NON_CRITICAL );\r
+       XExc_Init();\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
+       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