*/\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
*/\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
pxTopOfStack--;\r
*pxTopOfStack = 0x00000000UL; /* CTR. */\r
pxTopOfStack--;\r
- *pxTopOfStack = ( portSTACK_TYPE ) vStartFirstTask; /* LR. */\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 ) vStartFirstTask;/* Next LR. */\r
+ *pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask;/* Next LR. */\r
pxTopOfStack--;\r
*pxTopOfStack = 0x00000000UL;;/* Backchain. */\r
// pxTopOfStack--;\r
{\r
extern void *pxCurrentTCB;\r
\r
- XExc_Init();\r
- XExc_mDisableExceptions( XEXC_NON_CRITICAL ) ; \r
+ prvSetupTimerInterrupt();\r
\r
-// prvSetupTimerInterrupt();\r
XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );\r
- XExc_mEnableExceptions( XEXC_NON_CRITICAL ) ;\r
\r
- vStartFirstTask();\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
/*\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_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) prvTickISR, ( 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_PITSetInterval( ulInterval );\r
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