00001 /* 00002 FreeRTOS V3.2.4 - copyright (C) 2003-2005 Richard Barry. 00003 00004 This file is part of the FreeRTOS distribution. 00005 00006 FreeRTOS is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 2 of the License, or 00009 (at your option) any later version. 00010 00011 FreeRTOS is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with FreeRTOS; if not, write to the Free Software 00018 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00019 00020 A special exception to the GPL can be applied should you wish to distribute 00021 a combined work that includes FreeRTOS, without being obliged to provide 00022 the source code for any proprietary components. See the licensing section 00023 of http://www.FreeRTOS.org for full details of how and when the exception 00024 can be applied. 00025 00026 *************************************************************************** 00027 See http://www.FreeRTOS.org for documentation, latest information, license 00028 and contact details. Please ensure to read the configuration and relevant 00029 port sections of the online documentation. 00030 *************************************************************************** 00031 */ 00032 00033 /* 00034 NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode. 00035 The processor MUST be in supervisor mode when vTaskStartScheduler is 00036 called. The demo applications included in the FreeRTOS.org download switch 00037 to supervisor mode prior to main being called. If you are not using one of 00038 these demo application projects then ensure Supervisor mode is used. 00039 */ 00040 00041 00042 /* 00043 * Creates all the application tasks, then starts the scheduler. 00044 * Main.c includes an idle hook function that simply periodically sends data 00045 * to the USB task for transmission. 00046 */ 00047 00048 /* 00049 Changes from V3.2.2 00050 00051 + Modified the stack sizes used by some tasks to permit use of the 00052 command line GCC tools. 00053 */ 00054 00055 /* Library includes. */ 00056 #include <string.h> 00057 #include <stdio.h> 00058 00059 /* Scheduler includes. */ 00060 #include "FreeRTOS.h" 00061 #include "task.h" 00062 #include "portable.h" 00063 00064 /* MAKE CODE */ 00065 #include "config.h" 00066 00067 /* Hardware specific headers. */ 00068 #include "AT91SAM7X256.h" 00069 00070 00071 // NORMAL PROGRAMMING RESUMES 00072 00073 /*-----------------------------------------------------------*/ 00074 00075 /* 00076 * Configure the processor for use with the Atmel demo board. This is very 00077 * minimal as most of the setup is performed in the startup code. 00078 */ 00079 static void prvSetupHardware( void ); 00080 00081 /* 00082 * The idle hook. 00083 */ 00084 void vApplicationIdleHook( void ); 00085 /*-----------------------------------------------------------*/ 00086 00087 /* 00088 * Setup hardware then start all the demo application tasks. 00089 */ 00090 void MakeStarterTask( void* parameters ); 00091 00092 void MakeStarterTask( void* parameters ) 00093 { 00094 (void)parameters; 00095 Run( ); 00096 TaskDelete( NULL ); 00097 } 00098 00099 int main( void ) 00100 { 00101 /* Setup the ports. */ 00102 prvSetupHardware(); 00103 00104 /* Create the make task. */ 00105 TaskCreate( MakeStarterTask, "Make", 1200, NULL, 4 ); 00106 00107 /*NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode. 00108 The processor MUST be in supervisor mode when vTaskStartScheduler is 00109 called. The demo applications included in the FreeRTOS.org download switch 00110 to supervisor mode prior to main being called. If you are not using one of 00111 these demo application projects then ensure Supervisor mode is used here. */ 00112 vTaskStartScheduler(); 00113 00114 /* Should never get here! */ 00115 return 0; 00116 } 00117 /*-----------------------------------------------------------*/ 00118 00119 00120 static void prvSetupHardware( void ) 00121 { 00122 /* When using the JTAG debugger the hardware is not always initialised to 00123 the correct default state. This line just ensures that this does not 00124 cause all interrupts to be masked at the start. */ 00125 AT91C_BASE_AIC->AIC_EOICR = 0; 00126 00127 /* Most setup is performed by the low level init function called from the 00128 startup asm file.*/ 00129 00130 // ENABLE HARDWARE RESET 00131 while((AT91C_BASE_RSTC->RSTC_RSR & (AT91C_RSTC_SRCMP | AT91C_RSTC_NRSTL)) != (AT91C_RSTC_NRSTL)); 00132 AT91C_BASE_RSTC->RSTC_RMR = (0xa5 << 24) 00133 | AT91C_RSTC_URSTEN 00134 | ((12 - 1) << 8) // 125ms == (1 << 12) / 32768 00135 ; 00136 00137 // EEPROM DISABLE 00138 #if ( CONTROLLER_VERSION == 90 ) 00139 AT91C_BASE_PIOB->PIO_PER = 1 << 17; // Set PB17 - the EEPROM ~enable - in PIO mode 00140 AT91C_BASE_PIOB->PIO_OER = 1 << 17; // Configure in Output 00141 AT91C_BASE_PIOB->PIO_SODR = 1 << 17; // Set Output 00142 #elif ( CONTROLLER_VERSION == 95 || CONTROLLER_VERSION == 100 || CONTROLLER_VERSION == 200 ) 00143 AT91C_BASE_PIOA->PIO_PER = 1 << 9; // Set PA9 - the EEPROM ~enable - in PIO mode 00144 AT91C_BASE_PIOA->PIO_OER = 1 << 9; // Configure in Output 00145 AT91C_BASE_PIOA->PIO_SODR = 1 << 9; // Set Output 00146 #endif 00147 00148 // CAN DISABLE 00149 #if ( CONTROLLER_VERSION == 90 ) 00150 AT91C_BASE_PIOB->PIO_PER = 1 << 16; // Set PB16 - the CAN ~enable - in PIO mode 00151 AT91C_BASE_PIOB->PIO_OER = 1 << 16; // Configure in Output 00152 AT91C_BASE_PIOB->PIO_SODR = 1 << 16; // Set Output 00153 #elif ( CONTROLLER_VERSION == 95 || CONTROLLER_VERSION == 100 || CONTROLLER_VERSION == 200 ) 00154 AT91C_BASE_PIOA->PIO_PER = 1 << 7; // Set PA7 - the CAN ~enable - in PIO mode 00155 AT91C_BASE_PIOA->PIO_OER = 1 << 7; // Configure in Output 00156 AT91C_BASE_PIOA->PIO_SODR = 1 << 7; // Set Output 00157 #endif 00158 00159 /* Enable the peripheral clock. */ 00160 AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA; 00161 AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB; 00162 00163 // Enable the EMAC 00164 AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_EMAC; 00165 00166 #if ( APPBOARD_VERSION == 100 ) 00167 // Kill the outputs 00168 // Outputs 0 - 7 are PA24, PA5, PA6, PA2, PB25, PA25, PA26, PB23 00169 int outputAMask = ( 1 << 24 ) | ( 1 << 5 ) | ( 1 << 6 ) | ( 1 << 2 ) | ( 1 << 25 ) | ( 1 << 26 ); 00170 int outputBMask = ( 1 << 25 ) | ( 1 << 23 ); 00171 // Set in peripheral mode 00172 AT91C_BASE_PIOA->PIO_PER = outputAMask; 00173 AT91C_BASE_PIOB->PIO_PER = outputBMask; 00174 // Set to Outputs 00175 AT91C_BASE_PIOA->PIO_OER = outputAMask; 00176 AT91C_BASE_PIOB->PIO_OER = outputBMask; 00177 // Turn Off 00178 AT91C_BASE_PIOA->PIO_CODR = outputAMask; 00179 AT91C_BASE_PIOB->PIO_CODR = outputBMask; 00180 #endif 00181 00182 /* Turn the USB line into an input, kill the pull up */ 00183 #if ( CONTROLLER_VERSION == 90 ) 00184 AT91C_BASE_PIOB->PIO_PER = AT91C_PIO_PB10; 00185 AT91C_BASE_PIOB->PIO_ODR = AT91C_PIO_PB10; 00186 AT91C_BASE_PIOB->PIO_PPUDR = AT91C_PIO_PB10; 00187 #elif ( CONTROLLER_VERSION == 95 || CONTROLLER_VERSION == 100 ) 00188 AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA10; 00189 AT91C_BASE_PIOA->PIO_ODR = AT91C_PIO_PA10; 00190 AT91C_BASE_PIOA->PIO_PPUDR = AT91C_PIO_PA10; 00191 #elif ( CONTROLLER_VERSION == 200 ) 00192 AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA29; 00193 AT91C_BASE_PIOA->PIO_ODR = AT91C_PIO_PA29; 00194 AT91C_BASE_PIOA->PIO_PPUDR = AT91C_PIO_PA29; 00195 #endif 00196 00197 /* Setup the PIO for the USB pull up resistor. */ 00198 /* Start low: no USB */ 00199 #if ( CONTROLLER_VERSION == 90 ) 00200 AT91C_BASE_PIOB->PIO_PER = AT91C_PIO_PB11; 00201 AT91C_BASE_PIOB->PIO_OER = AT91C_PIO_PB11; 00202 AT91C_BASE_PIOB->PIO_SODR = AT91C_PIO_PB11; 00203 #elif ( CONTROLLER_VERSION == 95 || CONTROLLER_VERSION == 100 ) 00204 AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA11; 00205 AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA11; 00206 AT91C_BASE_PIOA->PIO_CODR = AT91C_PIO_PA11; // had this round the wrong way... 00207 #elif ( CONTROLLER_VERSION == 200 ) 00208 AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA30; 00209 AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA30; 00210 AT91C_BASE_PIOA->PIO_CODR = AT91C_PIO_PA30; 00211 #endif 00212 } 00213 /*-----------------------------------------------------------*/ 00214 00215 /*-----------------------------------------------------------*/ 00216 00217 int toggle; 00218 void vApplicationIdleHook( void ) 00219 { 00220 // prevent the function from being optimized away? 00221 toggle = !toggle; 00222 } 00223 00224 /*----------------------------------------------------------------------*/ 00225 00226
The Make Controller Kit is an open source project maintained by MakingThings.
MakingThings code is released under the Apache 2.0 license.
Bug tracker, development wiki and status can be found at http://dev.makingthings.com.
This document was last updated on 18 May 2009.