2 FreeRTOS V7.5.1 - Copyright (C) 2013 Real Time Engineers Ltd.
\r
4 VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
\r
6 ***************************************************************************
\r
8 * FreeRTOS provides completely free yet professionally developed, *
\r
9 * robust, strictly quality controlled, supported, and cross *
\r
10 * platform software that has become a de facto standard. *
\r
12 * Help yourself get started quickly and support the FreeRTOS *
\r
13 * project by purchasing a FreeRTOS tutorial book, reference *
\r
14 * manual, or both from: http://www.FreeRTOS.org/Documentation *
\r
18 ***************************************************************************
\r
20 This file is part of the FreeRTOS distribution.
\r
22 FreeRTOS is free software; you can redistribute it and/or modify it under
\r
23 the terms of the GNU General Public License (version 2) as published by the
\r
24 Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
\r
26 >>! NOTE: The modification to the GPL is included to allow you to distribute
\r
27 >>! a combined work that includes FreeRTOS without being obliged to provide
\r
28 >>! the source code for proprietary components outside of the FreeRTOS
\r
31 FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
\r
32 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
33 FOR A PARTICULAR PURPOSE. Full license text is available from the following
\r
34 link: http://www.freertos.org/a00114.html
\r
38 ***************************************************************************
\r
40 * Having a problem? Start by reading the FAQ "My application does *
\r
41 * not run, what could be wrong?" *
\r
43 * http://www.FreeRTOS.org/FAQHelp.html *
\r
45 ***************************************************************************
\r
47 http://www.FreeRTOS.org - Documentation, books, training, latest versions,
\r
48 license and Real Time Engineers Ltd. contact details.
\r
50 http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
\r
51 including FreeRTOS+Trace - an indispensable productivity tool, a DOS
\r
52 compatible FAT file system, and our tiny thread aware UDP/IP stack.
\r
54 http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
\r
55 Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
\r
56 licenses offer ticketed support, indemnification and middleware.
\r
58 http://www.SafeRTOS.com - High Integrity Systems also provide a safety
\r
59 engineered and independently SIL3 certified version for use in safety and
\r
60 mission critical applications that require provable dependability.
\r
66 /* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER for port 1.
\r
68 Note that this driver is written to test the RTOS port and is not intended
\r
69 to represent an optimised solution. */
\r
71 /* Processor Expert generated includes. */
\r
74 /* Scheduler include files. */
\r
75 #include "FreeRTOS.h"
\r
79 /* Demo application include files. */
\r
82 /* The queues used to communicate between the task code and the interrupt
\r
83 service routines. */
\r
84 static xQueueHandle xRxedChars;
\r
85 static xQueueHandle xCharsForTx;
\r
87 /* Interrupt identification bits. */
\r
88 #define serOVERRUN_INTERRUPT ( 0x08 )
\r
89 #define serRX_INTERRUPT ( 0x20 )
\r
90 #define serTX_INTERRUPT ( 0x80 )
\r
92 /*-----------------------------------------------------------*/
\r
96 * Initialise port for interrupt driven communications.
\r
98 xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
\r
100 /* Hardware setup is performed by the Processor Expert generated code.
\r
101 This function just creates the queues used to communicate between the
\r
102 interrupt code and the task code - then sets the required baud rate. */
\r
104 xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
\r
105 xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
\r
107 COM0_SetBaudRateMode( ( char ) ulWantedBaud );
\r
111 /*-----------------------------------------------------------*/
\r
113 signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime )
\r
115 /* Get the next character from the buffer queue. Return false if no characters
\r
116 are available, or arrive before xBlockTime expires. */
\r
117 if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
\r
126 /*-----------------------------------------------------------*/
\r
128 signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime )
\r
130 /* Place the character in the queue of characters to be transmitted. */
\r
131 if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
\r
136 /* Turn on the Tx interrupt so the ISR will remove the character from the
\r
137 queue and send it. This does not need to be in a critical section as
\r
138 if the interrupt has already removed the character the next interrupt
\r
139 will simply turn off the Tx interrupt again. */
\r
140 SCI0CR2_SCTIE = 1;;
\r
144 /*-----------------------------------------------------------*/
\r
146 void vSerialClose( xComPortHandle xPort )
\r
148 /* Not supported. */
\r
151 /*-----------------------------------------------------------*/
\r
155 * Interrupt service routine for the serial port. Must be in non-banked
\r
159 #pragma CODE_SEG __NEAR_SEG NON_BANKED
\r
161 __interrupt void vCOM0_ISR( void )
\r
163 volatile unsigned char ucByte, ucStatus;
\r
164 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
\r
166 /* What caused the interrupt? */
\r
167 ucStatus = SCI0SR1;
\r
169 if( ucStatus & serOVERRUN_INTERRUPT )
\r
171 /* The interrupt was caused by an overrun. Clear the error by reading
\r
172 the data register. */
\r
176 if( ucStatus & serRX_INTERRUPT )
\r
178 /* The interrupt was caused by a character being received.
\r
179 Read the received byte. */
\r
182 /* Post the character onto the queue of received characters - noting
\r
183 whether or not this wakes a task. */
\r
184 xQueueSendFromISR( xRxedChars, ( void * ) &ucByte, &xHigherPriorityTaskWoken );
\r
187 if( ( ucStatus & serTX_INTERRUPT ) && ( SCI0CR2_SCTIE ) )
\r
189 /* The interrupt was caused by a character being transmitted. */
\r
190 if( xQueueReceiveFromISR( xCharsForTx, ( void * ) &ucByte, &xHigherPriorityTaskWoken ) == pdTRUE )
\r
192 /* Clear the SCRF bit. */
\r
197 /* Disable transmit interrupt */
\r
198 SCI0CR2_SCTIE = 0;
\r
202 if( xHigherPriorityTaskWoken )
\r
208 #pragma CODE_SEG DEFAULT
\r