2 FreeRTOS V7.0.2 - Copyright (C) 2011 Real Time Engineers Ltd.
\r
5 ***************************************************************************
\r
7 * FreeRTOS tutorial books are available in pdf and paperback. *
\r
8 * Complete, revised, and edited pdf reference manuals are also *
\r
11 * Purchasing FreeRTOS documentation will not only help you, by *
\r
12 * ensuring you get running as quickly as possible and with an *
\r
13 * in-depth knowledge of how to use FreeRTOS, it will also help *
\r
14 * the FreeRTOS project to continue with its mission of providing *
\r
15 * professional grade, cross platform, de facto standard solutions *
\r
16 * for microcontrollers - completely free of charge! *
\r
18 * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
\r
20 * Thank you for using FreeRTOS, and thank you for your support! *
\r
22 ***************************************************************************
\r
25 This file is part of the FreeRTOS distribution.
\r
27 FreeRTOS is free software; you can redistribute it and/or modify it under
\r
28 the terms of the GNU General Public License (version 2) as published by the
\r
29 Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
\r
30 >>>NOTE<<< The modification to the GPL is included to allow you to
\r
31 distribute a combined work that includes FreeRTOS without being obliged to
\r
32 provide the source code for proprietary components outside of the FreeRTOS
\r
33 kernel. FreeRTOS is distributed in the hope that it will be useful, but
\r
34 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
\r
35 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
36 more details. You should have received a copy of the GNU General Public
\r
37 License and the FreeRTOS license exception along with FreeRTOS; if not it
\r
38 can be viewed here: http://www.freertos.org/a00114.html and also obtained
\r
39 by writing to Richard Barry, contact details for whom are available on the
\r
44 http://www.FreeRTOS.org - Documentation, latest information, license and
\r
47 http://www.SafeRTOS.com - A version that is certified for use in safety
\r
50 http://www.OpenRTOS.com - Commercial support, development, porting,
\r
51 licensing and training services.
\r
54 /* Hardware specific includes. */
\r
56 #include <machine/intrinsics.h>
\r
57 #include <machine/cint.h>
\r
58 #include <machine/wdtcon.h>
\r
60 /* Scheduler Includes. */
\r
61 #include "FreeRTOS.h"
\r
65 /* Demo Includes. */
\r
68 /*---------------------------------------------------------------------------*/
\r
71 * See if the Serial Transmit Interrupt is currently activated, meaning that
\r
72 * the interrupt is working through the back log of bytes that it needs to
\r
73 * send. If the ISR is not enabled, then it will be triggered to send the first
\r
74 * byte, and it will be automatically re-triggered when that byte has been
\r
75 * sent. When the queue is exhausted, the ISR disables itself.
77 static void prvCheckTransmit( void );
\r
80 * The transmit and receive interrupt handlers.
\r
82 static void prvTxBufferInterruptHandler( int iArg ) __attribute__( ( longcall ) );
\r
83 static void prvRxInterruptHandler( int iArg )__attribute__( ( longcall ) );
\r
85 /*-----------------------------------------------------------*/
\r
87 /* Queues used to pass bytes into and out of the interrupt handlers.
\r
88 NOTE: This is not intended to be an example of an efficient interrupt handler,
\r
89 but instead to load the kernel and interrupt mechanisms in order to test the
\r
90 FreeRTOS port. Using a FIFO, DMA, circular buffer, etc. architecture will
\r
91 to improve efficiency. */
\r
92 static xQueueHandle xSerialTransmitQueue = NULL;
\r
93 static xQueueHandle xSerialReceiveQueue = NULL;
\r
94 static volatile portBASE_TYPE xTransmitStatus = 0UL;
\r
96 /*-----------------------------------------------------------*/
\r
98 xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
\r
100 unsigned long ulReloadValue = 0UL;
\r
102 ulReloadValue = ( configPERIPHERAL_CLOCK_HZ / ( 48UL * ulWantedBaud ) ) - 1UL;
\r
104 if( NULL == xSerialTransmitQueue )
\r
106 xSerialTransmitQueue = xQueueCreate( uxQueueLength, sizeof( char ) );
\r
107 xSerialReceiveQueue = xQueueCreate( uxQueueLength, sizeof( char ) );
\r
110 /* Enable ASC0 Module. */
\r
113 while ( 0 != ( WDT_CON0.reg & 0x1UL ) );
\r
114 ASC0_CLC.reg = 0x0200UL;
\r
118 /* Disable the Operation. */
\r
119 ASC0_CON.reg &= 0xFFFF7FFF;
\r
121 /* Set-up the GPIO Ports. */
\r
122 P3_IOCR0.reg = 0x00009000; /* 3.0 ASC In, 3.1 Alt ASC Out */
\r
124 /* Write the baud rate. */
\r
125 ASC0_BG.reg = ulReloadValue;
\r
127 /* Reconfigure and re-initialise the Operation. */
\r
128 ASC0_PISEL.reg = 0UL;
\r
129 ASC0_CON.reg = 0UL;
\r
130 ASC0_CON.bits.M = 0x01; /* 8bit async. */
\r
131 ASC0_CON.bits.REN = 0x01; /* Receiver enabled. */
\r
132 ASC0_CON.bits.FDE = 0x01; /* Fractional divider enabled. */
\r
133 ASC0_CON.bits.BRS = 0x01; /* Divide by three. */
\r
134 ASC0_CON.bits.LB = 0x01; /* Loopback enabled. */
\r
135 ASC0_CON.bits.R = 0x01; /* Enable the baud rate generator. */
\r
137 /* Install the Tx interrupt. */
\r
138 if( 0 != _install_int_handler( configINTERRUPT_PRIORITY_TX, prvTxBufferInterruptHandler, 0 ) )
\r
140 ASC0_TBSRC.reg = configINTERRUPT_PRIORITY_TX | 0x5000UL;
\r
141 xTransmitStatus = 0UL;
\r
144 /* Install the Rx interrupt. */
\r
145 if( 0 != _install_int_handler( configINTERRUPT_PRIORITY_RX, prvRxInterruptHandler, 0 ) )
\r
147 ASC0_RSRC.reg = configINTERRUPT_PRIORITY_RX | 0x5000UL;
\r
150 /* COM Handle is never used by demo code. */
\r
151 return (xComPortHandle) pdPASS;
\r
153 /*---------------------------------------------------------------------------*/
\r
155 void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength )
\r
157 unsigned short usChar;
\r
159 for( usChar = 0; usChar < usStringLength; usChar++ )
\r
161 xSerialPutChar( pxPort, pcString[ usChar ], portMAX_DELAY );
\r
164 /*---------------------------------------------------------------------------*/
\r
166 signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime )
\r
168 /* Just to remove compiler warnings about unused parameters. */
\r
171 return xQueueReceive( xSerialReceiveQueue, pcRxedChar, xBlockTime );
\r
173 /*---------------------------------------------------------------------------*/
\r
175 signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime )
\r
177 portBASE_TYPE xReturn = pdPASS;
\r
179 /* Just to remove compiler warnings about unused parameters. */
\r
182 /* Send the character to the interrupt handler. */
\r
183 xReturn = xQueueSend( xSerialTransmitQueue, &cOutChar, xBlockTime );
\r
185 /* Start the transmission of bytes if necessary. */
\r
186 prvCheckTransmit();
\r
190 /*---------------------------------------------------------------------------*/
\r
192 static void prvTxBufferInterruptHandler( int iArg )
\r
194 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
\r
195 unsigned char ucTx;
\r
197 /* Just to remove compiler warnings about unused parameters. */
\r
201 ASC0_TBSRC.reg |= 0x4000UL;
\r
202 xTransmitStatus = 1UL;
\r
204 /* TBUF Can be refilled. */
\r
205 if( pdPASS == xQueueReceiveFromISR( xSerialTransmitQueue, &ucTx, &xHigherPriorityTaskWoken ) )
\r
207 ASC0_TBUF.reg = ucTx;
\r
211 /* Failed to get a character out of the Queue. No longer busy. */
\r
212 xTransmitStatus = 0UL;
\r
215 /* Finally end ISR and switch Task. */
\r
216 portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
\r
218 /*---------------------------------------------------------------------------*/
\r
220 static void prvRxInterruptHandler( int iArg )
\r
222 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
\r
223 unsigned char ucRx;
\r
225 /* Just to remove compiler warnings about unused parameters. */
\r
228 /* Grab the character as early as possible. */
\r
229 ucRx = ( unsigned char ) ASC0_RBUF.reg;
\r
232 ASC0_RSRC.reg |= 0x4000UL;
\r
234 /* Frame available in RBUF. */
\r
235 if( pdPASS != xQueueSendFromISR( xSerialReceiveQueue, &ucRx, &xHigherPriorityTaskWoken ) )
\r
237 /* Error handling code can go here. */
\r
240 /* Finally end ISR and switch Task. */
\r
241 portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
\r
243 /*---------------------------------------------------------------------------*/
\r
245 void prvCheckTransmit( void )
\r
247 /* Check to see if the interrupt handler is working its way through the
\r
249 if ( 0 == xTransmitStatus )
\r
251 /* Not currently operational so kick off the first byte. */
\r
252 ASC0_TBSRC.reg |= 0x8000UL;
\r
255 /*---------------------------------------------------------------------------*/
\r