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

Subversion Repositories openrisc

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

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

Line No. Rev Author Line
1 580 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
/* Library includes. */
69
#include "usart/usart.h"
70
#include "pmc/pmc.h"
71
#include "irq/irq.h"
72
#include "pio/pio.h"
73
 
74
/*-----------------------------------------------------------*/
75
 
76
/* Interrupt control macros. */
77
#define serINTERRUPT_LEVEL                              ( 5 )
78
#define vInterruptOn()                                  BOARD_USART_BASE->US_IER = ( AT91C_US_TXRDY | AT91C_US_RXRDY )
79
#define vInterruptOff()                                 BOARD_USART_BASE->US_IDR = AT91C_US_TXRDY
80
 
81
/* Misc constants. */
82
#define serINVALID_QUEUE                                ( ( xQueueHandle ) 0 )
83
#define serHANDLE                                               ( ( xComPortHandle ) 1 )
84
#define serNO_BLOCK                                             ( ( portTickType ) 0 )
85
#define serNO_TIMEGUARD                                 ( ( unsigned long ) 0 )
86
#define serNO_PERIPHERAL_B_SETUP                ( ( unsigned long ) 0 )
87
 
88
 
89
/* Queues used to hold received characters, and characters waiting to be
90
transmitted. */
91
static xQueueHandle xRxedChars;
92
static xQueueHandle xCharsForTx;
93
 
94
/*-----------------------------------------------------------*/
95
 
96
/* The interrupt service routine - called from the assembly entry point. */
97
void vSerialISR( void );
98
 
99
/*-----------------------------------------------------------*/
100
 
101
/*
102
 * See the serial2.h header file.
103
 */
104
xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
105
{
106
xComPortHandle xReturn = serHANDLE;
107
extern void ( vUART_ISR )( void );
108
const Pin xUSART_Pins[] = { BOARD_PIN_USART_RXD, BOARD_PIN_USART_TXD };
109
 
110
 
111
        /* Create the queues used to hold Rx and Tx characters. */
112
        xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
113
        xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
114
 
115
        /* If the queues were created correctly then setup the serial port
116
        hardware. */
117
        if( ( xRxedChars != serINVALID_QUEUE ) && ( xCharsForTx != serINVALID_QUEUE ) )
118
        {
119
                portENTER_CRITICAL();
120
                {
121
                        /* Enable the peripheral clock in the PMC. */
122
                        PMC_EnablePeripheral( BOARD_ID_USART );
123
 
124
                        /* Configure the USART. */
125
                        USART_Configure( BOARD_USART_BASE, AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT, ulWantedBaud, configCPU_CLOCK_HZ );
126
 
127
                        /* Configure the interrupt.  Note the pre-emption priority is set
128
                        in bits [8:15] of the priority value passed as the parameter. */
129
                        IRQ_ConfigureIT( BOARD_ID_USART, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 8 ), vSerialISR );
130
                        IRQ_EnableIT( BOARD_ID_USART );
131
 
132
                        /* Enable receiver & transmitter. */
133
                        USART_SetTransmitterEnabled( BOARD_USART_BASE, pdTRUE );
134
                        USART_SetReceiverEnabled( BOARD_USART_BASE, pdTRUE );
135
 
136
                        /* Configure IO for USART use. */
137
                        PIO_Configure( xUSART_Pins, PIO_LISTSIZE( xUSART_Pins ) );
138
                }
139
                portEXIT_CRITICAL();
140
        }
141
        else
142
        {
143
                xReturn = ( xComPortHandle ) 0;
144
        }
145
 
146
        /* This demo file only supports a single port but we have to return
147
        something to comply with the standard demo header file. */
148
        return xReturn;
149
}
150
/*-----------------------------------------------------------*/
151
 
152
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime )
153
{
154
        /* The port handle is not required as this driver only supports one port. */
155
        ( void ) pxPort;
156
 
157
        /* Get the next character from the buffer.  Return false if no characters
158
        are available, or arrive before xBlockTime expires. */
159
        if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
160
        {
161
                return pdTRUE;
162
        }
163
        else
164
        {
165
                return pdFALSE;
166
        }
167
}
168
/*-----------------------------------------------------------*/
169
 
170
void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength )
171
{
172
signed char *pxNext;
173
 
174
        /* A couple of parameters that this port does not use. */
175
        ( void ) usStringLength;
176
        ( void ) pxPort;
177
 
178
        /* NOTE: This implementation does not handle the queue being full as no
179
        block time is used! */
180
 
181
        /* The port handle is not required as this driver only supports UART0. */
182
        ( void ) pxPort;
183
 
184
        /* Send each character in the string, one at a time. */
185
        pxNext = ( signed char * ) pcString;
186
        while( *pxNext )
187
        {
188
                xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
189
                pxNext++;
190
        }
191
}
192
/*-----------------------------------------------------------*/
193
 
194
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime )
195
{
196
        /* Place the character in the queue of characters to be transmitted. */
197
        if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
198
        {
199
                return pdFAIL;
200
        }
201
 
202
        /* Turn on the Tx interrupt so the ISR will remove the character from the
203
        queue and send it.   This does not need to be in a critical section as
204
        if the interrupt has already removed the character the next interrupt
205
        will simply turn off the Tx interrupt again. */
206
        vInterruptOn();
207
 
208
        return pdPASS;
209
}
210
/*-----------------------------------------------------------*/
211
 
212
void vSerialClose( xComPortHandle xPort )
213
{
214
        /* Not supported as not required by the demo application. */
215
}
216
/*-----------------------------------------------------------*/
217
 
218
void vSerialISR( void )
219
{
220
unsigned long ulStatus;
221
signed char cChar;
222
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
223
 
224
        /* What caused the interrupt? */
225
        ulStatus = BOARD_USART_BASE->US_CSR &= BOARD_USART_BASE->US_IMR;
226
 
227
        if( ulStatus & AT91C_US_TXRDY )
228
        {
229
                /* The interrupt was caused by the THR becoming empty.  Are there any
230
                more characters to transmit? */
231
                if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
232
                {
233
                        /* A character was retrieved from the queue so can be sent to the
234
                        THR now. */
235
                        BOARD_USART_BASE->US_THR = cChar;
236
                }
237
                else
238
                {
239
                        /* Queue empty, nothing to send so turn off the Tx interrupt. */
240
                        vInterruptOff();
241
                }
242
        }
243
 
244
        if( ulStatus & AT91C_US_RXRDY )
245
        {
246
                /* The interrupt was caused by a character being received.  Grab the
247
                character from the RHR and place it in the queue or received
248
                characters. */
249
                cChar = BOARD_USART_BASE->US_RHR;
250
                xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
251
        }
252
 
253
        /* If a task was woken by either a character being received or a character
254
        being transmitted then we may need to switch to another task. */
255
        portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
256
}
257
 
258
 
259
 
260
 
261
 

powered by: WebSVN 2.1.0

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