From 65716f26dbbb7bc0ba3e8bfcc56614a0dcf10e9e Mon Sep 17 00:00:00 2001 From: rtel Date: Fri, 24 Jan 2014 13:27:01 +0000 Subject: [PATCH] Continue Zynq demo - ParTest.c now working (with single LED), but still very much a work in progress. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2176 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject | 6 +- .../RTOSDemo/src/FreeRTOSConfig.h | 2 +- .../RTOSDemo/src/FreeRTOS_tick_config.c | 120 +++++++----------- .../RTOSDemo/src/ParTest.c | 34 ++++- .../CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c | 74 ++++------- .../RTOSDemo/src/main_blinky.c | 2 +- 6 files changed, 111 insertions(+), 127 deletions(-) diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject index 24b21be6d..f3fd43ab2 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject @@ -36,7 +36,7 @@ - diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h index 52b21ac9a..8b4eb3c9c 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h @@ -151,7 +151,7 @@ to exclude the API function. */ #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 #define INCLUDE_eTaskGetState 1 -#define INCLUDE_xTimerPendFunctionCallFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 1 /* This demo makes use of one or more example stats formatting functions. These format the raw data provided by the uxTaskGetSystemState() function in to human diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOS_tick_config.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOS_tick_config.c index 7752a211f..57d52db06 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOS_tick_config.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOS_tick_config.c @@ -71,73 +71,57 @@ #include "xscutimer.h" #include "xscugic.h" -#define XSCUTIMER_CLOCK_HZ XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ/2 - -static XScuTimer Timer; /* A9 timer counter */ +#define XSCUTIMER_CLOCK_HZ ( XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 2UL ) /* * The application must provide a function that configures a peripheral to * create the FreeRTOS tick interrupt, then define configSETUP_TICK_INTERRUPT() * in FreeRTOSConfig.h to call the function. This file contains a function - * that is suitable for use on the Renesas RZ MPU. + * that is suitable for use on the Zynq SoC. */ void vConfigureTickInterrupt( void ) { -static XScuGic InterruptController; /* Interrupt controller instance */ -int Status; +static XScuGic xInterruptController; /* Interrupt controller instance */ +BaseType_t xStatus; extern void FreeRTOS_Tick_Handler( void ); -XScuTimer_Config *ScuConfig; -XScuGic_Config *IntcConfig; - - IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID); - Status = XScuGic_CfgInitialize(&InterruptController, IntcConfig, IntcConfig->CpuBaseAddress ); - configASSERT( Status == XST_SUCCESS ); - - /* - * Connect to the interrupt controller - */ - Status = XScuGic_Connect(&InterruptController, XPAR_SCUTIMER_INTR, (Xil_ExceptionHandler) FreeRTOS_Tick_Handler, (void *)&Timer); - configASSERT( Status == XST_SUCCESS ); - - /* - * Initialize the A9Timer driver. - */ - ScuConfig = XScuTimer_LookupConfig(XPAR_SCUTIMER_DEVICE_ID); - - Status = XScuTimer_CfgInitialize(&Timer, ScuConfig, ScuConfig->BaseAddr); - - configASSERT( Status == XST_SUCCESS ); - - /* - * Enable Auto reload mode. - */ - XScuTimer_EnableAutoReload(&Timer); - - /* - * Load the timer counter register. - */ - XScuTimer_LoadTimer(&Timer, XSCUTIMER_CLOCK_HZ / configTICK_RATE_HZ); - - /* - * Start the timer counter and then wait for it - * to timeout a number of times. - */ - XScuTimer_Start(&Timer); - - /* - * Enable the interrupt for the Timer in the interrupt controller - */ - XScuGic_Enable(&InterruptController, XPAR_SCUTIMER_INTR); - - /* - * Enable the timer interrupts for timer mode. - */ - XScuTimer_EnableInterrupt(&Timer); - - /* - * Do NOT enable interrupts in the ARM processor here. - * This happens when the scheduler is started. - */ +XScuTimer_Config *pxTimerConfig; +XScuGic_Config *pxGICConfig; +XScuTimer xTimer; + + /* This function is called with the IRQ interrupt disabled, and the IRQ + interrupt should be left disabled. It is enabled automatically when the + scheduler is started. */ + + /* Ensure XScuGic_CfgInitialize() has been called. In this demo it has + already been called from prvSetupHardware() in main(). */ + pxGICConfig = XScuGic_LookupConfig( XPAR_SCUGIC_SINGLE_DEVICE_ID ); + xStatus = XScuGic_CfgInitialize( &xInterruptController, pxGICConfig, pxGICConfig->CpuBaseAddress ); + configASSERT( xStatus == XST_SUCCESS ); + + /* Install the FreeRTOS tick handler. */ + xStatus = XScuGic_Connect(&xInterruptController, XPAR_SCUTIMER_INTR, (Xil_ExceptionHandler) FreeRTOS_Tick_Handler, (void *)&xTimer); + configASSERT( xStatus == XST_SUCCESS ); + + /* Initialise the timer. */ + pxTimerConfig = XScuTimer_LookupConfig( XPAR_SCUTIMER_DEVICE_ID ); + xStatus = XScuTimer_CfgInitialize( &xTimer, pxTimerConfig, pxTimerConfig->BaseAddr ); + configASSERT( xStatus == XST_SUCCESS ); + + /* Enable Auto reload mode. */ + XScuTimer_EnableAutoReload( &xTimer ); + + /* Load the timer counter register. */ + XScuTimer_LoadTimer( &xTimer, XSCUTIMER_CLOCK_HZ / configTICK_RATE_HZ ); + + /* Start the timer counter and then wait for it to timeout a number of + times. */ + XScuTimer_Start( &xTimer ); + + /* Enable the interrupt for the xTimer in the interrupt controller. */ + XScuGic_Enable( &xInterruptController, XPAR_SCUTIMER_INTR ); + + /* Enable the interrupt in the xTimer itself. */ + XScuTimer_EnableInterrupt( &xTimer ); } /*-----------------------------------------------------------*/ @@ -156,30 +140,24 @@ void vInitialiseRunTimeStats( void ) } /*-----------------------------------------------------------*/ -extern XScuGic_Config XScuGic_ConfigTable[]; -static const XScuGic_Config *CfgPtr = &XScuGic_ConfigTable[ XPAR_SCUGIC_SINGLE_DEVICE_ID ]; void vApplicationIRQHandler( uint32_t ulICCIAR ) { +extern const XScuGic_Config XScuGic_ConfigTable[]; +static const XScuGic_VectorTableEntry *pxVectorTable = XScuGic_ConfigTable[ XPAR_SCUGIC_SINGLE_DEVICE_ID ].HandlerTable; uint32_t ulInterruptID; -XScuGic_VectorTableEntry *TablePtr; -//XScuGic_Config *CfgPtr; -//extern XScuGic_Config XScuGic_ConfigTable[]; - -// CfgPtr = &XScuGic_ConfigTable[ XPAR_SCUGIC_SINGLE_DEVICE_ID ]; +const XScuGic_VectorTableEntry *pxVectorEntry; /* Re-enable interrupts. */ __asm ( "cpsie i" ); - /* The ID of the interrupt can be obtained by bitwise anding the ICCIAR value + /* The ID of the interrupt is obtained by bitwise anding the ICCIAR value with 0x3FF. */ ulInterruptID = ulICCIAR & 0x3FFUL; - configASSERT( ulInterruptID < XSCUGIC_MAX_NUM_INTR_INPUTS ); - /* Call the function installed in the array of installed handler functions. */ - TablePtr = &(CfgPtr->HandlerTable[ ulInterruptID ]); - TablePtr->Handler(TablePtr->CallBackRef); -// intc_func_table[ ulInterruptID ]( 0 ); + /* Call the function installed in the array of installed handler functions. */ + pxVectorEntry = &( pxVectorTable[ ulInterruptID ] ); + pxVectorEntry->Handler( pxVectorEntry->CallBackRef ); } diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c index 9e11bd544..54753a43e 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c @@ -76,20 +76,52 @@ /* Demo includes. */ #include "partest.h" +/* Xilinx includes. */ +#include "xgpiops.h" + +#define partstNUM_LEDS ( 1 ) +#define partstDIRECTION_OUTPUT ( 1 ) +#define partstOUTPUT_ENABLED ( 1 ) +#define partstLED_OUTPUT ( 10 ) + +/*-----------------------------------------------------------*/ + +static XGpioPs xGpio; + /*-----------------------------------------------------------*/ void vParTestInitialise( void ) { +XGpioPs_Config *pxConfigPtr; +BaseType_t xStatus; + + /* Initialise the GPIO driver. */ + pxConfigPtr = XGpioPs_LookupConfig( XPAR_XGPIOPS_0_DEVICE_ID ); + xStatus = XGpioPs_CfgInitialize( &xGpio, pxConfigPtr, pxConfigPtr->BaseAddr ); + configASSERT( xStatus == XST_SUCCESS ); + + /* Enable outputs and set low. */ + XGpioPs_SetDirectionPin( &xGpio, partstLED_OUTPUT, partstDIRECTION_OUTPUT ); + XGpioPs_SetOutputEnablePin( &xGpio, partstLED_OUTPUT, partstOUTPUT_ENABLED ); + XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, 0x0 ); } /*-----------------------------------------------------------*/ -void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +void vParTestSetLED( UBaseType_t uxLED, BaseType_t xValue ) { + ( void ) uxLED; + XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, xValue ); } /*-----------------------------------------------------------*/ void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) { +BaseType_t xLEDState; + + ( void ) uxLED; + + xLEDState = XGpioPs_ReadPin( &xGpio, partstLED_OUTPUT ); + XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, !xLEDState ); } diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c index 1a266fe15..4ff8d28ed 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c @@ -128,12 +128,6 @@ void vApplicationIdleHook( void ); void vApplicationStackOverflowHook( xTaskHandle pxTask, char *pcTaskName ); void vApplicationTickHook( void ); -/* - * Creates and verifies different files on the volume, demonstrating the use of - * various different API functions. - */ -extern void vCreateAndVerifySampleFiles( void ); - /*-----------------------------------------------------------*/ int main( void ) @@ -159,50 +153,30 @@ int main( void ) static void prvSetupHardware( void ) { -int Status; -XScuGic InterruptController; /* Interrupt controller instance */ -extern void FreeRTOS_IRQ_Handler( void ); -extern void FreeRTOS_SWI_Handler( void ); - - __asm volatile ( "cpsid i" ); - Xil_ExceptionInit(); - - XScuGic_Config *IntcConfig; /* The configuration parameters of the - interrupt controller */ - /* - * Initialize the interrupt controller driver - */ - IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID); - configASSERT( IntcConfig ); - configASSERT( IntcConfig->CpuBaseAddress == ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) ); - configASSERT( IntcConfig->DistBaseAddress == configINTERRUPT_CONTROLLER_BASE_ADDRESS ); - - Status = XScuGic_CfgInitialize(&InterruptController, IntcConfig, IntcConfig->CpuBaseAddress ); - configASSERT( Status == XST_SUCCESS ); - -// Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_IRQ_INT, (Xil_ExceptionHandler)FreeRTOS_IRQ_Handler, &InterruptController); -// Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_SWI_INT, (Xil_ExceptionHandler)FreeRTOS_SWI_Handler, &InterruptController); - -// Xil_ExceptionEnableMask( XIL_EXCEPTION_ALL ); -// Xil_ExceptionEnable(); - - /* - * Connect the interrupt controller interrupt handler to the hardware - * interrupt handling logic in the ARM processor. - */ -#if 0 - Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_UNDEFINED_INT, - (Xil_ExceptionHandler)FreeRTOS_ExHandler, - (void *)4); - - Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_PREFETCH_ABORT_INT, - (Xil_ExceptionHandler)FreeRTOS_ExHandler, - (void *)4); - - Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_DATA_ABORT_INT, - (Xil_ExceptionHandler)FreeRTOS_ExHandler, - (void *)8); -#endif +BaseType_t xStatus; +XScuGic_Config *pxGICConfig; +XScuGic xInterruptController; + + /* Ensure no interrupts execute while the scheduler is in an inconsistent + state. Interrupts are automatically enabled when the scheduler is + started. */ + portDISABLE_INTERRUPTS(); + + /* Obtain the configuration of the GIC. */ + pxGICConfig = XScuGic_LookupConfig( XPAR_SCUGIC_SINGLE_DEVICE_ID ); + + /* Sanity check the FreeRTOSConfig.h settings are correct for the + hardware. */ + configASSERT( pxGICConfig ); + configASSERT( pxGICConfig->CpuBaseAddress == ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) ); + configASSERT( pxGICConfig->DistBaseAddress == configINTERRUPT_CONTROLLER_BASE_ADDRESS ); + + /* Install a default handler for each GIC interrupt. */ + xStatus = XScuGic_CfgInitialize( &xInterruptController, pxGICConfig, pxGICConfig->CpuBaseAddress ); + configASSERT( xStatus == XST_SUCCESS ); + + /* Initialise the LED port. */ + vParTestInitialise(); } /*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c index aba3cfce2..4837cbc47 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c @@ -148,7 +148,7 @@ static xQueueHandle xQueue = NULL; void main_blinky( void ) { /* Create the queue. */ - xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( unsigned long ) ); + xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) ); if( xQueue != NULL ) { -- 2.39.5