]> git.sur5r.net Git - freertos/blob - Demo/TriCore_TC1782_TriBoard_GCC/RTOSDemo/serial.c
f381ef2740f2a1cfae7f56fe34c3bf5d3cac6418
[freertos] / Demo / TriCore_TC1782_TriBoard_GCC / RTOSDemo / serial.c
1 /*\r
2     FreeRTOS V7.0.2 - Copyright (C) 2011 Real Time Engineers Ltd.\r
3 \r
4 \r
5     ***************************************************************************\r
6      *                                                                       *\r
7      *    FreeRTOS tutorial books are available in pdf and paperback.        *\r
8      *    Complete, revised, and edited pdf reference manuals are also       *\r
9      *    available.                                                         *\r
10      *                                                                       *\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
17      *                                                                       *\r
18      *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *\r
19      *                                                                       *\r
20      *    Thank you for using FreeRTOS, and thank you for your support!      *\r
21      *                                                                       *\r
22     ***************************************************************************\r
23 \r
24 \r
25     This file is part of the FreeRTOS distribution.\r
26 \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
40     FreeRTOS WEB site.\r
41 \r
42     1 tab == 4 spaces!\r
43 \r
44     http://www.FreeRTOS.org - Documentation, latest information, license and\r
45     contact details.\r
46 \r
47     http://www.SafeRTOS.com - A version that is certified for use in safety\r
48     critical systems.\r
49 \r
50     http://www.OpenRTOS.com - Commercial support, development, porting,\r
51     licensing and training services.\r
52 */\r
53 \r
54 /* Hardware specific includes. */\r
55 #include <tc1782.h>\r
56 #include <machine/intrinsics.h>\r
57 #include <machine/cint.h>\r
58 #include <machine/wdtcon.h>\r
59 \r
60 /* Scheduler Includes. */\r
61 #include "FreeRTOS.h"\r
62 #include "task.h"\r
63 #include "queue.h"\r
64 \r
65 /* Demo Includes. */\r
66 #include "serial.h"\r
67 \r
68 /*---------------------------------------------------------------------------*/\r
69 \r
70 /*\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.
76  */\r
77 static void prvCheckTransmit( void );\r
78 \r
79 /*\r
80  * The transmit and receive interrupt handlers.\r
81  */\r
82 static void prvTxBufferInterruptHandler( int iArg ) __attribute__( ( longcall ) );\r
83 static void prvRxInterruptHandler( int iArg )__attribute__( ( longcall ) );\r
84 \r
85 /*-----------------------------------------------------------*/\r
86 \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
95 \r
96 /*-----------------------------------------------------------*/\r
97 \r
98 xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )\r
99 {\r
100 unsigned long ulReloadValue = 0UL;\r
101 \r
102         ulReloadValue = ( configPERIPHERAL_CLOCK_HZ / ( 48UL * ulWantedBaud ) ) - 1UL;\r
103 \r
104         if( NULL == xSerialTransmitQueue )\r
105         {\r
106                 xSerialTransmitQueue = xQueueCreate( uxQueueLength, sizeof( char ) );\r
107                 xSerialReceiveQueue = xQueueCreate( uxQueueLength, sizeof( char ) );\r
108         }\r
109 \r
110         /* Enable ASC0 Module. */\r
111         unlock_wdtcon();\r
112         {\r
113                 while ( 0 != ( WDT_CON0.reg & 0x1UL ) );\r
114                 ASC0_CLC.reg = 0x0200UL;\r
115         }\r
116         lock_wdtcon();\r
117 \r
118         /* Disable the Operation. */\r
119         ASC0_CON.reg &= 0xFFFF7FFF;\r
120 \r
121         /* Set-up the GPIO Ports. */\r
122         P3_IOCR0.reg = 0x00009000;      /* 3.0 ASC In, 3.1 Alt ASC Out */\r
123 \r
124         /* Write the baud rate. */\r
125         ASC0_BG.reg = ulReloadValue;\r
126 \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
136 \r
137         /* Install the Tx interrupt. */\r
138         if( 0 != _install_int_handler( configINTERRUPT_PRIORITY_TX, prvTxBufferInterruptHandler, 0 ) )\r
139         {\r
140                 ASC0_TBSRC.reg = configINTERRUPT_PRIORITY_TX | 0x5000UL;\r
141                 xTransmitStatus = 0UL;\r
142         }\r
143 \r
144         /* Install the Rx interrupt. */\r
145         if( 0 != _install_int_handler( configINTERRUPT_PRIORITY_RX, prvRxInterruptHandler, 0 ) )\r
146         {\r
147                 ASC0_RSRC.reg = configINTERRUPT_PRIORITY_RX | 0x5000UL;\r
148         }\r
149 \r
150         /* COM Handle is never used by demo code. */\r
151         return (xComPortHandle) pdPASS;\r
152 }\r
153 /*---------------------------------------------------------------------------*/\r
154 \r
155 void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength )\r
156 {\r
157 unsigned short usChar;\r
158 \r
159         for( usChar = 0; usChar < usStringLength; usChar++ )\r
160         {\r
161                 xSerialPutChar( pxPort, pcString[ usChar ], portMAX_DELAY );\r
162         }\r
163 }\r
164 /*---------------------------------------------------------------------------*/\r
165 \r
166 signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime )\r
167 {\r
168         /* Just to remove compiler warnings about unused parameters. */\r
169         ( void )pxPort;\r
170 \r
171         return xQueueReceive( xSerialReceiveQueue, pcRxedChar, xBlockTime );\r
172 }\r
173 /*---------------------------------------------------------------------------*/\r
174 \r
175 signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime )\r
176 {\r
177 portBASE_TYPE xReturn = pdPASS;\r
178 \r
179         /* Just to remove compiler warnings about unused parameters. */\r
180         ( void )pxPort;\r
181 \r
182         /* Send the character to the interrupt handler. */\r
183         xReturn = xQueueSend( xSerialTransmitQueue, &cOutChar, xBlockTime );\r
184 \r
185         /* Start the transmission of bytes if necessary. */\r
186         prvCheckTransmit();\r
187 \r
188         return xReturn;\r
189 }\r
190 /*---------------------------------------------------------------------------*/\r
191 \r
192 static void prvTxBufferInterruptHandler( int iArg )\r
193 {\r
194 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
195 unsigned char ucTx;\r
196 \r
197         /* Just to remove compiler warnings about unused parameters. */\r
198         ( void ) iArg;\r
199 \r
200         /* ACK. */\r
201         ASC0_TBSRC.reg |= 0x4000UL;\r
202         xTransmitStatus = 1UL;\r
203 \r
204         /* TBUF Can be refilled. */\r
205         if( pdPASS == xQueueReceiveFromISR( xSerialTransmitQueue, &ucTx, &xHigherPriorityTaskWoken ) )\r
206         {\r
207                 ASC0_TBUF.reg = ucTx;\r
208         }\r
209         else\r
210         {\r
211                 /* Failed to get a character out of the Queue. No longer busy. */\r
212                 xTransmitStatus = 0UL;\r
213         }\r
214 \r
215         /* Finally end ISR and switch Task. */\r
216         portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
217 }\r
218 /*---------------------------------------------------------------------------*/\r
219 \r
220 static void prvRxInterruptHandler( int iArg )\r
221 {\r
222 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
223 unsigned char ucRx;\r
224 \r
225         /* Just to remove compiler warnings about unused parameters. */\r
226         ( void ) iArg;\r
227 \r
228         /* Grab the character as early as possible. */\r
229         ucRx = ( unsigned char ) ASC0_RBUF.reg;\r
230 \r
231         /* ACK. */\r
232         ASC0_RSRC.reg |= 0x4000UL;\r
233 \r
234         /* Frame available in RBUF. */\r
235         if( pdPASS != xQueueSendFromISR( xSerialReceiveQueue, &ucRx, &xHigherPriorityTaskWoken ) )\r
236         {\r
237                 /* Error handling code can go here. */\r
238         }\r
239 \r
240         /* Finally end ISR and switch Task. */\r
241         portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
242 }\r
243 /*---------------------------------------------------------------------------*/\r
244 \r
245 void prvCheckTransmit( void )\r
246 {\r
247         /* Check to see if the interrupt handler is working its way through the\r
248         buffer. */\r
249         if ( 0 == xTransmitStatus )\r
250         {\r
251                 /* Not currently operational so kick off the first byte. */\r
252                 ASC0_TBSRC.reg |= 0x8000UL;\r
253         }\r
254 }\r
255 /*---------------------------------------------------------------------------*/\r