OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [ARM9_AT91SAM9XE_IAR/] [serial/] [serial.c] - Blame information for rev 609

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 577 jeremybenn
/*
2
    FreeRTOS V6.1.1 - Copyright (C) 2011 Real Time Engineers Ltd.
3
 
4
    ***************************************************************************
5
    *                                                                         *
6
    * If you are:                                                             *
7
    *                                                                         *
8
    *    + New to FreeRTOS,                                                   *
9
    *    + Wanting to learn FreeRTOS or multitasking in general quickly       *
10
    *    + Looking for basic training,                                        *
11
    *    + Wanting to improve your FreeRTOS skills and productivity           *
12
    *                                                                         *
13
    * then take a look at the FreeRTOS books - available as PDF or paperback  *
14
    *                                                                         *
15
    *        "Using the FreeRTOS Real Time Kernel - a Practical Guide"        *
16
    *                  http://www.FreeRTOS.org/Documentation                  *
17
    *                                                                         *
18
    * A pdf reference manual is also available.  Both are usually delivered   *
19
    * to your inbox within 20 minutes to two hours when purchased between 8am *
20
    * and 8pm GMT (although please allow up to 24 hours in case of            *
21
    * exceptional circumstances).  Thank you for your support!                *
22
    *                                                                         *
23
    ***************************************************************************
24
 
25
    This file is part of the FreeRTOS distribution.
26
 
27
    FreeRTOS is free software; you can redistribute it and/or modify it under
28
    the terms of the GNU General Public License (version 2) as published by the
29
    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
30
    ***NOTE*** The exception to the GPL is included to allow you to distribute
31
    a combined work that includes FreeRTOS without being obliged to provide the
32
    source code for proprietary components outside of the FreeRTOS kernel.
33
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
34
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
35
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
36
    more details. You should have received a copy of the GNU General Public
37
    License and the FreeRTOS license exception along with FreeRTOS; if not it
38
    can be viewed here: http://www.freertos.org/a00114.html and also obtained
39
    by writing to Richard Barry, contact details for whom are available on the
40
    FreeRTOS WEB site.
41
 
42
    1 tab == 4 spaces!
43
 
44
    http://www.FreeRTOS.org - Documentation, latest information, license and
45
    contact details.
46
 
47
    http://www.SafeRTOS.com - A version that is certified for use in safety
48
    critical systems.
49
 
50
    http://www.OpenRTOS.com - Commercial support, development, porting,
51
    licensing and training services.
52
*/
53
 
54
/*
55
        BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
56
*/
57
 
58
/* Standard includes. */
59
#include <stdlib.h>
60
 
61
/* Scheduler includes. */
62
#include "FreeRTOS.h"
63
#include "queue.h"
64
 
65
/* Demo application includes. */
66
#include "serial.h"
67
 
68
/* Atmel library includes. */
69
#include <usart/usart.h>
70
#include <aic/aic.h>
71
#include <pmc/pmc.h>
72
 
73
/*-----------------------------------------------------------*/
74
 
75
/* Location of the COM0 registers. */
76
#define serCOM0                                                 ( ( AT91PS_USART ) AT91C_BASE_US0 )
77
 
78
/* Interrupt control macros. */
79
#define serINTERRUPT_LEVEL                              ( 5 )
80
#define vInterruptOn()                                  serCOM0->US_IER = ( AT91C_US_TXRDY | AT91C_US_RXRDY )
81
#define vInterruptOff()                                 serCOM0->US_IDR = AT91C_US_TXRDY
82
 
83
/* Misc constants. */
84
#define serINVALID_QUEUE                                ( ( xQueueHandle ) 0 )
85
#define serHANDLE                                               ( ( xComPortHandle ) 1 )
86
#define serNO_BLOCK                                             ( ( portTickType ) 0 )
87
#define serNO_TIMEGUARD                                 ( ( unsigned long ) 0 )
88
#define serNO_PERIPHERAL_B_SETUP                ( ( unsigned long ) 0 )
89
 
90
 
91
/* Queues used to hold received characters, and characters waiting to be
92
transmitted. */
93
static xQueueHandle xRxedChars;
94
static xQueueHandle xCharsForTx;
95
 
96
/*-----------------------------------------------------------*/
97
 
98
/* The interrupt service routine. */
99
__arm void vSerialISR( void );
100
 
101
/*-----------------------------------------------------------*/
102
 
103
/*
104
 * See the serial2.h header file.
105
 */
106
xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
107
{
108
xComPortHandle xReturn = serHANDLE;
109
 
110
        /* Create the queues used to hold Rx and Tx characters. */
111
        xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
112
        xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
113
 
114
        /* If the queues were created correctly then setup the serial port
115
        hardware. */
116
        if( ( xRxedChars != serINVALID_QUEUE ) && ( xCharsForTx != serINVALID_QUEUE ) )
117
        {
118
                PMC_EnablePeripheral( AT91C_ID_US0 );
119
                portENTER_CRITICAL();
120
                {
121
                        USART_Configure( serCOM0, ( AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE ), ulWantedBaud, configCPU_CLOCK_HZ );
122
 
123
                        /* Enable Rx and Tx. */
124
                        USART_SetTransmitterEnabled( serCOM0, pdTRUE );
125
                        USART_SetReceiverEnabled( serCOM0, pdTRUE );
126
 
127
                        /* Enable the Rx interrupts.  The Tx interrupts are not enabled
128
                        until there are characters to be transmitted. */
129
                        serCOM0->US_IER = AT91C_US_RXRDY;
130
 
131
                        /* Enable the interrupts in the AIC. */
132
                        AIC_ConfigureIT( AT91C_ID_US0, AT91C_AIC_PRIOR_LOWEST, ( void (*)( void ) ) vSerialISR );
133
                        AIC_EnableIT( AT91C_ID_US0 );
134
                }
135
                portEXIT_CRITICAL();
136
        }
137
        else
138
        {
139
                xReturn = ( xComPortHandle ) 0;
140
        }
141
 
142
        /* This demo file only supports a single port but we have to return
143
        something to comply with the standard demo header file. */
144
        return xReturn;
145
}
146
/*-----------------------------------------------------------*/
147
 
148
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime )
149
{
150
        /* The port handle is not required as this driver only supports one port. */
151
        ( void ) pxPort;
152
 
153
        /* Get the next character from the buffer.  Return false if no characters
154
        are available, or arrive before xBlockTime expires. */
155
        if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
156
        {
157
                return pdTRUE;
158
        }
159
        else
160
        {
161
                return pdFALSE;
162
        }
163
}
164
/*-----------------------------------------------------------*/
165
 
166
void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength )
167
{
168
signed char *pxNext;
169
 
170
        /* A couple of parameters that this port does not use. */
171
        ( void ) usStringLength;
172
        ( void ) pxPort;
173
 
174
        /* NOTE: This implementation does not handle the queue being full as no
175
        block time is used! */
176
 
177
        /* The port handle is not required as this driver only supports UART0. */
178
        ( void ) pxPort;
179
 
180
        /* Send each character in the string, one at a time. */
181
        pxNext = ( signed char * ) pcString;
182
        while( *pxNext )
183
        {
184
                xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
185
                pxNext++;
186
        }
187
}
188
/*-----------------------------------------------------------*/
189
 
190
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime )
191
{
192
        /* Just to remove compiler warning. */
193
        ( void ) pxPort;
194
 
195
        /* Place the character in the queue of characters to be transmitted. */
196
        if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
197
        {
198
                return pdFAIL;
199
        }
200
 
201
        /* Turn on the Tx interrupt so the ISR will remove the character from the
202
        queue and send it.   This does not need to be in a critical section as
203
        if the interrupt has already removed the character the next interrupt
204
        will simply turn off the Tx interrupt again. */
205
        vInterruptOn();
206
 
207
        return pdPASS;
208
}
209
/*-----------------------------------------------------------*/
210
 
211
void vSerialClose( xComPortHandle xPort )
212
{
213
        /* Not supported as not required by the demo application. */
214
        ( void ) xPort;
215
}
216
/*-----------------------------------------------------------*/
217
 
218
/* Serial port ISR.  This can cause a context switch so is not defined as a
219
standard ISR using the __irq keyword.  Instead a wrapper function is defined
220
within serialISR.s79 which in turn calls this function.  See the port
221
documentation on the FreeRTOS.org website for more information. */
222
__arm void vSerialISR( void )
223
{
224
unsigned long ulStatus;
225
signed char cChar;
226
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
227
 
228
        /* What caused the interrupt? */
229
        ulStatus = serCOM0->US_CSR &= serCOM0->US_IMR;
230
 
231
        if( ulStatus & AT91C_US_TXRDY )
232
        {
233
                /* The interrupt was caused by the THR becoming empty.  Are there any
234
                more characters to transmit? */
235
                if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
236
                {
237
                        /* A character was retrieved from the queue so can be sent to the
238
                        THR now. */
239
                        serCOM0->US_THR = cChar;
240
                }
241
                else
242
                {
243
                        /* Queue empty, nothing to send so turn off the Tx interrupt. */
244
                        vInterruptOff();
245
                }
246
        }
247
 
248
        if( ulStatus & AT91C_US_RXRDY )
249
        {
250
                /* The interrupt was caused by a character being received.  Grab the
251
                character from the RHR and place it in the queue or received
252
                characters. */
253
                cChar = serCOM0->US_RHR;
254
                xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
255
        }
256
 
257
        /* If a task was woken by either a character being received or a character
258
        being transmitted then we may need to switch to another task. */
259
        portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
260
 
261
        /* End the interrupt in the AIC. */
262
        AT91C_BASE_AIC->AIC_EOICR = 0;
263
}
264
 
265
 
266
 
267
 
268
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.