]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/HCS12_CodeWarrior_banked/serial/serial.c
Update version number.
[freertos] / FreeRTOS / Demo / HCS12_CodeWarrior_banked / serial / serial.c
1 /*\r
2     FreeRTOS V7.5.1 - Copyright (C) 2013 Real Time Engineers Ltd.\r
3 \r
4     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
5 \r
6     ***************************************************************************\r
7      *                                                                       *\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
11      *                                                                       *\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
15      *                                                                       *\r
16      *    Thank you!                                                         *\r
17      *                                                                       *\r
18     ***************************************************************************\r
19 \r
20     This file is part of the FreeRTOS distribution.\r
21 \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
25 \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
29     >>! kernel.\r
30 \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
35 \r
36     1 tab == 4 spaces!\r
37 \r
38     ***************************************************************************\r
39      *                                                                       *\r
40      *    Having a problem?  Start by reading the FAQ "My application does   *\r
41      *    not run, what could be wrong?"                                     *\r
42      *                                                                       *\r
43      *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
44      *                                                                       *\r
45     ***************************************************************************\r
46 \r
47     http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
48     license and Real Time Engineers Ltd. contact details.\r
49 \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
53 \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
57 \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
61 \r
62     1 tab == 4 spaces!\r
63 */\r
64 \r
65 \r
66 /* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER for port 1.\r
67 \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
70 \r
71 /* Processor Expert generated includes. */\r
72 #include "com0.h"\r
73 \r
74 /* Scheduler include files. */\r
75 #include "FreeRTOS.h"\r
76 #include "queue.h"\r
77 #include "task.h"\r
78 \r
79 /* Demo application include files. */\r
80 #include "serial.h"\r
81 \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
86 \r
87 /* Interrupt identification bits. */\r
88 #define serOVERRUN_INTERRUPT            ( 0x08 )\r
89 #define serRX_INTERRUPT                         ( 0x20 )\r
90 #define serTX_INTERRUPT                         ( 0x80 )\r
91 \r
92 /*-----------------------------------------------------------*/\r
93 \r
94 \r
95 /*\r
96  * Initialise port for interrupt driven communications.\r
97  */\r
98 xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )\r
99 {\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
103 \r
104         xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );\r
105         xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );\r
106 \r
107         COM0_SetBaudRateMode( ( char ) ulWantedBaud );\r
108 \r
109         return NULL;\r
110 }\r
111 /*-----------------------------------------------------------*/\r
112 \r
113 signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime )\r
114 {\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
118         {\r
119                 return pdTRUE;\r
120         }\r
121         else\r
122         {\r
123                 return pdFALSE;\r
124         }\r
125 }\r
126 /*-----------------------------------------------------------*/\r
127 \r
128 signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime )\r
129 {\r
130         /* Place the character in the queue of characters to be transmitted. */\r
131         if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )\r
132         {\r
133                 return pdFAIL;\r
134         }\r
135 \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
141 \r
142         return pdPASS;\r
143 }\r
144 /*-----------------------------------------------------------*/\r
145 \r
146 void vSerialClose( xComPortHandle xPort )\r
147 {       \r
148         /* Not supported. */\r
149         ( void ) xPort;\r
150 }\r
151 /*-----------------------------------------------------------*/\r
152 \r
153 \r
154 /* \r
155  * Interrupt service routine for the serial port.  Must be in non-banked\r
156  * memory. \r
157  */\r
158 \r
159 #pragma CODE_SEG __NEAR_SEG NON_BANKED\r
160 \r
161 __interrupt void vCOM0_ISR( void )\r
162 {\r
163 volatile unsigned char ucByte, ucStatus;\r
164 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
165 \r
166         /* What caused the interrupt? */\r
167         ucStatus = SCI0SR1;\r
168         \r
169         if( ucStatus & serOVERRUN_INTERRUPT )\r
170         {\r
171                 /* The interrupt was caused by an overrun.  Clear the error by reading\r
172                 the data register. */\r
173                 ucByte = SCI0DRL;\r
174         }\r
175 \r
176         if( ucStatus & serRX_INTERRUPT )\r
177         {       \r
178                 /* The interrupt was caused by a character being received.\r
179                 Read the received byte. */\r
180                 ucByte = SCI0DRL;                      \r
181 \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
185         }\r
186         \r
187         if( ( ucStatus & serTX_INTERRUPT ) && ( SCI0CR2_SCTIE ) )\r
188         {       \r
189                 /* The interrupt was caused by a character being transmitted. */\r
190                 if( xQueueReceiveFromISR( xCharsForTx, ( void * ) &ucByte, &xHigherPriorityTaskWoken ) == pdTRUE )\r
191                 {\r
192                         /* Clear the SCRF bit. */\r
193                         SCI0DRL = ucByte;\r
194                 }\r
195                 else\r
196                 {\r
197                         /* Disable transmit interrupt */\r
198                         SCI0CR2_SCTIE = 0;                 \r
199                 }\r
200         }\r
201 \r
202         if( xHigherPriorityTaskWoken )\r
203         {\r
204                 portYIELD();\r
205         }\r
206 }\r
207 \r
208 #pragma CODE_SEG DEFAULT\r
209 \r