]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/HCS12_CodeWarrior_banked/serial/serial.c
03a612651a110579cd95a624ca519d0e50339219
[freertos] / FreeRTOS / Demo / HCS12_CodeWarrior_banked / serial / serial.c
1 /*\r
2     FreeRTOS V8.1.1 - Copyright (C) 2014 Real Time Engineers Ltd. \r
3     All rights reserved\r
4 \r
5     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
6 \r
7     ***************************************************************************\r
8      *                                                                       *\r
9      *    FreeRTOS provides completely free yet professionally developed,    *\r
10      *    robust, strictly quality controlled, supported, and cross          *\r
11      *    platform software that has become a de facto standard.             *\r
12      *                                                                       *\r
13      *    Help yourself get started quickly and support the FreeRTOS         *\r
14      *    project by purchasing a FreeRTOS tutorial book, reference          *\r
15      *    manual, or both from: http://www.FreeRTOS.org/Documentation        *\r
16      *                                                                       *\r
17      *    Thank you!                                                         *\r
18      *                                                                       *\r
19     ***************************************************************************\r
20 \r
21     This file is part of the FreeRTOS distribution.\r
22 \r
23     FreeRTOS is free software; you can redistribute it and/or modify it under\r
24     the terms of the GNU General Public License (version 2) as published by the\r
25     Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
26 \r
27     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
28     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
29     >>!   obliged to provide the source code for proprietary components     !<<\r
30     >>!   outside of the FreeRTOS kernel.                                   !<<\r
31 \r
32     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
33     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
34     FOR A PARTICULAR PURPOSE.  Full license text is available from the following\r
35     link: http://www.freertos.org/a00114.html\r
36 \r
37     1 tab == 4 spaces!\r
38 \r
39     ***************************************************************************\r
40      *                                                                       *\r
41      *    Having a problem?  Start by reading the FAQ "My application does   *\r
42      *    not run, what could be wrong?"                                     *\r
43      *                                                                       *\r
44      *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
45      *                                                                       *\r
46     ***************************************************************************\r
47 \r
48     http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
49     license and Real Time Engineers Ltd. contact details.\r
50 \r
51     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
52     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
53     compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
54 \r
55     http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
56     Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
57     licenses offer ticketed support, indemnification and middleware.\r
58 \r
59     http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
60     engineered and independently SIL3 certified version for use in safety and\r
61     mission critical applications that require provable dependability.\r
62 \r
63     1 tab == 4 spaces!\r
64 */\r
65 \r
66 \r
67 /* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER for port 1.\r
68 \r
69 Note that this driver is written to test the RTOS port and is not intended\r
70 to represent an optimised solution. */\r
71 \r
72 /* Processor Expert generated includes. */\r
73 #include "com0.h"\r
74 \r
75 /* Scheduler include files. */\r
76 #include "FreeRTOS.h"\r
77 #include "queue.h"\r
78 #include "task.h"\r
79 \r
80 /* Demo application include files. */\r
81 #include "serial.h"\r
82 \r
83 /* The queues used to communicate between the task code and the interrupt\r
84 service routines. */\r
85 static QueueHandle_t xRxedChars; \r
86 static QueueHandle_t xCharsForTx; \r
87 \r
88 /* Interrupt identification bits. */\r
89 #define serOVERRUN_INTERRUPT            ( 0x08 )\r
90 #define serRX_INTERRUPT                         ( 0x20 )\r
91 #define serTX_INTERRUPT                         ( 0x80 )\r
92 \r
93 /*-----------------------------------------------------------*/\r
94 \r
95 \r
96 /*\r
97  * Initialise port for interrupt driven communications.\r
98  */\r
99 xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )\r
100 {\r
101         /* Hardware setup is performed by the Processor Expert generated code.  \r
102         This function just creates the queues used to communicate between the \r
103         interrupt code and the task code - then sets the required baud rate. */\r
104 \r
105         xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );\r
106         xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );\r
107 \r
108         COM0_SetBaudRateMode( ( char ) ulWantedBaud );\r
109 \r
110         return NULL;\r
111 }\r
112 /*-----------------------------------------------------------*/\r
113 \r
114 signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, TickType_t xBlockTime )\r
115 {\r
116         /* Get the next character from the buffer queue.  Return false if no characters\r
117         are available, or arrive before xBlockTime expires. */\r
118         if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )\r
119         {\r
120                 return pdTRUE;\r
121         }\r
122         else\r
123         {\r
124                 return pdFALSE;\r
125         }\r
126 }\r
127 /*-----------------------------------------------------------*/\r
128 \r
129 signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, TickType_t xBlockTime )\r
130 {\r
131         /* Place the character in the queue of characters to be transmitted. */\r
132         if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )\r
133         {\r
134                 return pdFAIL;\r
135         }\r
136 \r
137         /* Turn on the Tx interrupt so the ISR will remove the character from the\r
138         queue and send it.   This does not need to be in a critical section as\r
139         if the interrupt has already removed the character the next interrupt\r
140         will simply turn off the Tx interrupt again. */\r
141         SCI0CR2_SCTIE = 1;;\r
142 \r
143         return pdPASS;\r
144 }\r
145 /*-----------------------------------------------------------*/\r
146 \r
147 void vSerialClose( xComPortHandle xPort )\r
148 {       \r
149         /* Not supported. */\r
150         ( void ) xPort;\r
151 }\r
152 /*-----------------------------------------------------------*/\r
153 \r
154 \r
155 /* \r
156  * Interrupt service routine for the serial port.  Must be in non-banked\r
157  * memory. \r
158  */\r
159 \r
160 #pragma CODE_SEG __NEAR_SEG NON_BANKED\r
161 \r
162 __interrupt void vCOM0_ISR( void )\r
163 {\r
164 volatile unsigned char ucByte, ucStatus;\r
165 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
166 \r
167         /* What caused the interrupt? */\r
168         ucStatus = SCI0SR1;\r
169         \r
170         if( ucStatus & serOVERRUN_INTERRUPT )\r
171         {\r
172                 /* The interrupt was caused by an overrun.  Clear the error by reading\r
173                 the data register. */\r
174                 ucByte = SCI0DRL;\r
175         }\r
176 \r
177         if( ucStatus & serRX_INTERRUPT )\r
178         {       \r
179                 /* The interrupt was caused by a character being received.\r
180                 Read the received byte. */\r
181                 ucByte = SCI0DRL;                      \r
182 \r
183                 /* Post the character onto the queue of received characters - noting\r
184                 whether or not this wakes a task. */\r
185                 xQueueSendFromISR( xRxedChars, ( void * ) &ucByte, &xHigherPriorityTaskWoken );\r
186         }\r
187         \r
188         if( ( ucStatus & serTX_INTERRUPT ) && ( SCI0CR2_SCTIE ) )\r
189         {       \r
190                 /* The interrupt was caused by a character being transmitted. */\r
191                 if( xQueueReceiveFromISR( xCharsForTx, ( void * ) &ucByte, &xHigherPriorityTaskWoken ) == pdTRUE )\r
192                 {\r
193                         /* Clear the SCRF bit. */\r
194                         SCI0DRL = ucByte;\r
195                 }\r
196                 else\r
197                 {\r
198                         /* Disable transmit interrupt */\r
199                         SCI0CR2_SCTIE = 0;                 \r
200                 }\r
201         }\r
202 \r
203         if( xHigherPriorityTaskWoken )\r
204         {\r
205                 portYIELD();\r
206         }\r
207 }\r
208 \r
209 #pragma CODE_SEG DEFAULT\r
210 \r