]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/ARM7_STR75x_GCC/serial/serial.c
Update version numbers ready for release.
[freertos] / FreeRTOS / Demo / ARM7_STR75x_GCC / serial / serial.c
1 /*\r
2  * FreeRTOS Kernel V10.1.1\r
3  * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 \r
28 /*\r
29         BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.\r
30 */\r
31 \r
32 \r
33 /*-----------------------------------------------------------\r
34  * Components that can be compiled to either ARM or THUMB mode are\r
35  * contained in this file.c  The ISR routines, which can only be compiled\r
36  * to ARM mode, are contained in serialISR.c.\r
37  *----------------------------------------------------------*/\r
38 \r
39 \r
40 \r
41 /* Library includes. */\r
42 #include "75x_uart.h"\r
43 #include "75x_gpio.h"\r
44 #include "75x_eic.h"\r
45 #include "75x_mrcc.h"\r
46 \r
47 /* Scheduler includes. */\r
48 #include "FreeRTOS.h"\r
49 #include "queue.h"\r
50 \r
51 /* Demo application includes. */\r
52 #include "serial.h"\r
53 \r
54 #define serINVALID_QUEUE                                ( ( QueueHandle_t ) 0 )\r
55 #define serNO_BLOCK                                             ( ( TickType_t ) 0 )\r
56 \r
57 /*-----------------------------------------------------------*/\r
58 \r
59 /* Queues used to hold received characters, and characters waiting to be\r
60 transmitted. */\r
61 static QueueHandle_t xRxedChars;\r
62 static QueueHandle_t xCharsForTx;\r
63 \r
64 static volatile portBASE_TYPE xQueueEmpty = pdTRUE;\r
65 \r
66 /*-----------------------------------------------------------*/\r
67 \r
68 /* The interrupt service routine - called from the assembly entry point. */\r
69 void vSerialISR( void );\r
70 void vConfigureQueues( QueueHandle_t xQForRx, QueueHandle_t xQForTx, volatile portBASE_TYPE *pxEmptyFlag );\r
71 \r
72 /*-----------------------------------------------------------*/\r
73 \r
74 /*\r
75  * See the serial2.h header file.\r
76  */\r
77 xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )\r
78 {\r
79 xComPortHandle xReturn;\r
80 UART_InitTypeDef UART_InitStructure;\r
81 GPIO_InitTypeDef GPIO_InitStructure;\r
82 EIC_IRQInitTypeDef  EIC_IRQInitStructure;       \r
83 \r
84         /* Create the queues used to hold Rx and Tx characters. */\r
85         xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );\r
86         xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed char ) );\r
87 \r
88         /* If the queues were created correctly then setup the serial port\r
89         hardware. */\r
90         if( ( xRxedChars != serINVALID_QUEUE ) && ( xCharsForTx != serINVALID_QUEUE ) )\r
91         {\r
92         \r
93                 vConfigureQueues( xRxedChars, xCharsForTx, &xQueueEmpty );\r
94         \r
95                 portENTER_CRITICAL();\r
96                 {\r
97                         /* Enable the UART0 Clock. */\r
98                         MRCC_PeripheralClockConfig( MRCC_Peripheral_UART0, ENABLE );\r
99                         \r
100                         /* Configure the UART0_Tx as alternate function */\r
101                         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;\r
102                         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;\r
103                         GPIO_Init(GPIO0, &GPIO_InitStructure);\r
104                         \r
105                         /* Configure the UART0_Rx as input floating */\r
106                         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;\r
107                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;\r
108                         GPIO_Init(GPIO0, &GPIO_InitStructure);\r
109                         \r
110                         /* Configure UART0. */\r
111                         UART_InitStructure.UART_WordLength = UART_WordLength_8D;\r
112                         UART_InitStructure.UART_StopBits = UART_StopBits_1;\r
113                         UART_InitStructure.UART_Parity = UART_Parity_No;\r
114                         UART_InitStructure.UART_BaudRate = ulWantedBaud;\r
115                         UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;\r
116                         UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;\r
117                         UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_2; /* FIFO size 16 bytes, FIFO level 8 bytes */\r
118                         UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_2; /* FIFO size 16 bytes, FIFO level 8 bytes */\r
119                         UART_Init(UART0, &UART_InitStructure);\r
120 \r
121                         /* Enable the UART0 */\r
122                         UART_Cmd(UART0, ENABLE);\r
123 \r
124                         /* Configure the IEC for the UART interrupts. */                        \r
125                         EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE;\r
126                         EIC_IRQInitStructure.EIC_IRQChannel = UART0_IRQChannel;\r
127                         EIC_IRQInitStructure.EIC_IRQChannelPriority = 1;\r
128                         EIC_IRQInit(&EIC_IRQInitStructure);\r
129                         \r
130                         xQueueEmpty = pdTRUE;\r
131                         UART_ITConfig( UART0, UART_IT_Transmit | UART_IT_Receive, ENABLE );\r
132                 }\r
133                 portEXIT_CRITICAL();\r
134         }\r
135         else\r
136         {\r
137                 xReturn = ( xComPortHandle ) 0;\r
138         }\r
139 \r
140         /* This demo file only supports a single port but we have to return\r
141         something to comply with the standard demo header file. */\r
142         return xReturn;\r
143 }\r
144 /*-----------------------------------------------------------*/\r
145 \r
146 signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, TickType_t xBlockTime )\r
147 {\r
148         /* The port handle is not required as this driver only supports one port. */\r
149         ( void ) pxPort;\r
150 \r
151         /* Get the next character from the buffer.  Return false if no characters\r
152         are available, or arrive before xBlockTime expires. */\r
153         if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )\r
154         {\r
155                 return pdTRUE;\r
156         }\r
157         else\r
158         {\r
159                 return pdFALSE;\r
160         }\r
161 }\r
162 /*-----------------------------------------------------------*/\r
163 \r
164 void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength )\r
165 {\r
166 signed char *pxNext;\r
167 \r
168         /* A couple of parameters that this port does not use. */\r
169         ( void ) usStringLength;\r
170         ( void ) pxPort;\r
171 \r
172         /* NOTE: This implementation does not handle the queue being full as no\r
173         block time is used! */\r
174 \r
175         /* The port handle is not required as this driver only supports UART0. */\r
176         ( void ) pxPort;\r
177 \r
178         /* Send each character in the string, one at a time. */\r
179         pxNext = ( signed char * ) pcString;\r
180         while( *pxNext )\r
181         {\r
182                 xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );\r
183                 pxNext++;\r
184         }\r
185 }\r
186 /*-----------------------------------------------------------*/\r
187 \r
188 signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, TickType_t xBlockTime )\r
189 {\r
190 portBASE_TYPE xReturn;\r
191 \r
192         /* Place the character in the queue of characters to be transmitted. */\r
193         portENTER_CRITICAL();\r
194         {\r
195                 if( xQueueEmpty == pdTRUE )\r
196                 {\r
197                         UART0->DR = cOutChar;\r
198                         xReturn = pdPASS;\r
199                 }\r
200                 else\r
201                 {\r
202                         if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )\r
203                         {\r
204                                 xReturn = pdFAIL;\r
205                         }                       \r
206                         else\r
207                         {\r
208                                 xReturn = pdPASS;                               \r
209                         }\r
210                 }\r
211                 \r
212                 xQueueEmpty = pdFALSE;\r
213         }\r
214         portEXIT_CRITICAL();\r
215 \r
216         return xReturn;\r
217 }\r
218 /*-----------------------------------------------------------*/\r
219 \r
220 void vSerialClose( xComPortHandle xPort )\r
221 {\r
222         /* Not supported as not required by the demo application. */\r
223 }\r
224 /*-----------------------------------------------------------*/\r
225 \r
226 \r
227 \r
228 \r
229 \r
230         \r