]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil/libboard_samv7-ek/source/dbg_console.c
Final V8.2.1 release ready for tagging:
[freertos] / FreeRTOS / Demo / CORTEX_M7_SAMV71_Xplained_IAR_Keil / libboard_samv7-ek / source / dbg_console.c
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2012, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 /**\r
31  * \file\r
32  *\r
33  * Implements UART console.\r
34  *\r
35  */\r
36 \r
37 /*----------------------------------------------------------------------------\r
38  *        Headers\r
39  *----------------------------------------------------------------------------*/\r
40 \r
41 #include "board.h"\r
42 \r
43 #include <stdio.h>\r
44 #include <stdint.h>\r
45 \r
46 /*----------------------------------------------------------------------------\r
47  *        Definitions\r
48  *----------------------------------------------------------------------------*/\r
49 \r
50 /** Console baudrate always using 115200. */\r
51 \r
52 \r
53 #define CONSOLE_BAUDRATE    115200\r
54 \r
55 #ifdef SSC_AUDIO\r
56 /** Usart Hw interface used by the console (UART4). */\r
57 #warning Please use UART4 pins for debug consol as UART0 pins are used in SSC audio for SAMv7 Xplained ultra board\r
58 #define CONSOLE_UART       UART4\r
59 \r
60 /** Pins description corresponding to Rxd,Txd, (UART pins) */\r
61 #define CONSOLE_PINS        {PINS_UART4}\r
62 \r
63 #define CONSOLE_ID          ID_UART4\r
64 #else\r
65 /** Usart Hw interface used by the console (UART0). */\r
66 #define CONSOLE_UART       UART0\r
67 \r
68 /** Pins description corresponding to Rxd,Txd, (UART pins) */\r
69 #define CONSOLE_PINS        {PINS_UART0}\r
70 \r
71 #define CONSOLE_ID          ID_UART0\r
72 \r
73 #endif\r
74 \r
75 \r
76 \r
77 \r
78 /*----------------------------------------------------------------------------\r
79  *        Variables\r
80  *----------------------------------------------------------------------------*/\r
81 \r
82 /** Is Console Initialized. */\r
83 static uint8_t _ucIsConsoleInitialized=0 ;\r
84 \r
85 /**\r
86  * \brief Configures an USART peripheral with the specified parameters.\r
87  *\r
88  * \param baudrate  Baudrate at which the USART should operate (in Hz).\r
89  * \param masterClock  Frequency of the system master clock (in Hz).\r
90  */\r
91 extern void DBG_Configure( uint32_t baudrate, uint32_t masterClock)\r
92 {\r
93     \r
94     const Pin pPins[] = CONSOLE_PINS ;\r
95     Uart *pUart = CONSOLE_UART ;\r
96 \r
97     unsigned int mode;\r
98 \r
99     /* Configure PIO */\r
100     PIO_Configure( pPins, PIO_LISTSIZE( pPins ) ) ;\r
101     PMC_EnablePeripheral(CONSOLE_ID);\r
102 \r
103     mode =  UART_MR_CHMODE_NORMAL | UART_MR_PAR_NO;\r
104         \r
105 \r
106     // Reset & disable receiver and transmitter, disable interrupts\r
107     pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RSTSTA;\r
108     pUart->UART_IDR = 0xFFFFFFFF;\r
109     \r
110    \r
111     pUart->UART_BRGR = (masterClock / baudrate) / 16 ;\r
112 \r
113     // Configure mode register\r
114     pUart->UART_MR = (mode );\r
115 \r
116     // Enable receiver and transmitter\r
117     pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;\r
118     _ucIsConsoleInitialized = 1 ;\r
119 \r
120     /* Disable buffering for printf(). */\r
121 #if ( defined (__GNUC__) && !defined (__SAMBA__) )\r
122         setvbuf(stdout, (char *)NULL, _IONBF, 0);\r
123 #endif\r
124 }\r
125 \r
126 /**\r
127  * \brief Outputs a character on the UART line.\r
128  *\r
129  * \note This function is synchronous (i.e. uses polling).\r
130  * \param c  Character to send.\r
131  */\r
132 extern void DBG_PutChar( uint8_t c )\r
133 {\r
134     Uart *pUart=CONSOLE_UART ;\r
135 \r
136     if ( !_ucIsConsoleInitialized )\r
137     {\r
138         DBG_Configure(CONSOLE_BAUDRATE, BOARD_MCK);\r
139     }\r
140 \r
141     // Wait for the transmitter to be ready\r
142     while ((pUart->UART_SR & UART_SR_TXEMPTY) == 0);\r
143     \r
144     // Send character\r
145     pUart->UART_THR = c;\r
146     \r
147     // Wait for the transfer to complete\r
148     while ((pUart->UART_SR & UART_SR_TXEMPTY) == 0);\r
149 \r
150 }\r
151 \r
152 /**\r
153  * \brief Input a character from the UART line.\r
154  *\r
155  * \note This function is synchronous\r
156  * \return character received.\r
157  */\r
158 extern uint32_t DBG_GetChar( void )\r
159 {\r
160     Uart *pUart= CONSOLE_UART ;\r
161 \r
162     if ( !_ucIsConsoleInitialized )\r
163     {\r
164         DBG_Configure(CONSOLE_BAUDRATE, BOARD_MCK);\r
165     }\r
166 \r
167     while ((pUart->UART_SR & UART_SR_RXRDY) == 0);\r
168     return pUart->UART_RHR;\r
169 }\r
170 \r
171 /**\r
172  * \brief Check if there is Input from UART line.\r
173  *\r
174  * \return true if there is Input.\r
175  */\r
176 extern uint32_t DBG_IsRxReady( void )\r
177 {\r
178     Uart *pUart=CONSOLE_UART ;\r
179 \r
180     if ( !_ucIsConsoleInitialized )\r
181     {\r
182         DBG_Configure( CONSOLE_BAUDRATE, BOARD_MCK ) ;\r
183     }\r
184 \r
185     return (pUart->UART_SR & UART_SR_RXRDY);\r
186 }\r
187 \r
188 /**\r
189  *  Displays the content of the given frame on the UART0.\r
190  *\r
191  *  \param pucFrame Pointer to the frame to dump.\r
192  *  \param dwSize   Buffer size in bytes.\r
193  */\r
194 extern void DBG_DumpFrame( uint8_t* pucFrame, uint32_t dwSize )\r
195 {\r
196     uint32_t dw ;\r
197 \r
198     for ( dw=0 ; dw < dwSize ; dw++ )\r
199     {\r
200         printf( "%02X ", pucFrame[dw] ) ;\r
201     }\r
202 \r
203     printf( "\n\r" ) ;\r
204 }\r
205 \r
206 /**\r
207  *  Displays the content of the given buffer on the UART0.\r
208  *\r
209  *  \param pucBuffer  Pointer to the buffer to dump.\r
210  *  \param dwSize     Buffer size in bytes.\r
211  *  \param dwAddress  Start address to display\r
212  */\r
213 extern void DBG_DumpMemory( uint8_t* pucBuffer, uint32_t dwSize, uint32_t dwAddress )\r
214 {\r
215     uint32_t i ;\r
216     uint32_t j ;\r
217     uint32_t dwLastLineStart ;\r
218     uint8_t* pucTmp ;\r
219 \r
220     for ( i=0 ; i < (dwSize / 16) ; i++ )\r
221     {\r
222         printf( "0x%08X: ", (unsigned int)(dwAddress + (i*16)) ) ;\r
223         pucTmp = (uint8_t*)&pucBuffer[i*16] ;\r
224 \r
225         for ( j=0 ; j < 4 ; j++ )\r
226         {\r
227             printf( "%02X%02X%02X%02X ", pucTmp[0], pucTmp[1], pucTmp[2], pucTmp[3] ) ;\r
228             pucTmp += 4 ;\r
229         }\r
230 \r
231         pucTmp=(uint8_t*)&pucBuffer[i*16] ;\r
232 \r
233         for ( j=0 ; j < 16 ; j++ )\r
234         {\r
235             DBG_PutChar( *pucTmp++ ) ;\r
236         }\r
237 \r
238         printf( "\n\r" ) ;\r
239     }\r
240 \r
241     if ( (dwSize%16) != 0 )\r
242     {\r
243         dwLastLineStart=dwSize - (dwSize%16) ;\r
244 \r
245         printf( "0x%08X: ", (unsigned int)(dwAddress + dwLastLineStart) ) ;\r
246         for ( j=dwLastLineStart ; j < dwLastLineStart+16 ; j++ )\r
247         {\r
248             if ( (j!=dwLastLineStart) && (j%4 == 0) )\r
249             {\r
250                 printf( " " ) ;\r
251             }\r
252 \r
253             if ( j < dwSize )\r
254             {\r
255                 printf( "%02X", pucBuffer[j] ) ;\r
256             }\r
257             else\r
258             {\r
259                 printf("  ") ;\r
260             }\r
261         }\r
262 \r
263         printf( " " ) ;\r
264         for ( j=dwLastLineStart ; j < dwSize ; j++ )\r
265         {\r
266             DBG_PutChar( pucBuffer[j] ) ;\r
267         }\r
268 \r
269         printf( "\n\r" ) ;\r
270     }\r
271 }\r
272 \r
273 /**\r
274  * Reads an integer\r
275  *\r
276  * \param pdwValue  Pointer to a integer variable to contain the input value.\r
277  *\r
278  * \return success(1) or failure(0)\r
279  */\r
280 extern uint32_t DBG_GetInteger( int32_t* pdwValue )\r
281 {\r
282     uint8_t ucKey ;\r
283     uint8_t ucNum = 0 ;\r
284     int32_t dwValue = 0 ;\r
285     int32_t sign = 1 ;\r
286 \r
287     while ( 1 )\r
288     {\r
289         ucKey=DBG_GetChar() ;\r
290         DBG_PutChar( ucKey ) ;\r
291 \r
292         if ( ((ucKey == '-') || (ucKey == '+')) && (ucNum == 0) )\r
293         {\r
294             if (ucKey == '-')\r
295             {\r
296                 sign = -1;\r
297             }\r
298             else\r
299             {\r
300                 sign = 1;\r
301             }\r
302             ucNum++;\r
303         }\r
304         else\r
305         {\r
306             if ( ucKey >= '0' &&  ucKey <= '9' )\r
307             {\r
308                 dwValue = (dwValue * 10) + (ucKey - '0');\r
309                 ucNum++;\r
310             }\r
311             else\r
312             {\r
313                 if ( ucKey == 0x0D || ucKey == ' ' )\r
314                 {\r
315                     if ( ucNum == 0 )\r
316                     {\r
317                         printf( "\n\rWrite a number and press ENTER or SPACE!\n\r" ) ;\r
318                         return 0 ;\r
319                     }\r
320                     else\r
321                     {\r
322                         printf( "\n\r" ) ;\r
323                         *pdwValue = dwValue * sign;\r
324 \r
325                         return 1 ;\r
326                     }\r
327                 }\r
328                 else\r
329                 {\r
330                     printf( "\n\r'%c' not a number or sign(+/-)!\n\r", ucKey ) ;\r
331 \r
332                     return 0 ;\r
333                 }\r
334             }\r
335         }\r
336     }\r
337 }\r
338 \r
339 /**\r
340  * Reads an integer and check the value\r
341  *\r
342  * \param pdwValue  Pointer to a integer variable to contain the input value.\r
343  * \param dwMin     Minimum value\r
344  * \param dwMax     Maximum value\r
345  *\r
346  * \return success(1) or failure(0)\r
347  */\r
348 extern uint32_t DBG_GetIntegerMinMax( int32_t* pdwValue, int32_t dwMin, int32_t dwMax )\r
349 {\r
350     int32_t dwValue = 0 ;\r
351 \r
352     if ( DBG_GetInteger( &dwValue ) == 0 )\r
353     {\r
354         return 0 ;\r
355     }\r
356 \r
357     if ( dwValue < dwMin || dwValue > dwMax )\r
358     {\r
359         printf( "\n\rThe number have to be between %d and %d\n\r", (int)dwMin, (int)dwMax ) ;\r
360 \r
361         return 0 ;\r
362     }\r
363 \r
364     printf( "\n\r" ) ;\r
365 \r
366     *pdwValue = dwValue ;\r
367 \r
368     return 1 ;\r
369 }\r
370 \r
371 /**\r
372  *  Reads an hexadecimal number\r
373  *\r
374  *  \param pdwValue  Pointer to the uint32_t variable to contain the input value.\r
375  */\r
376 extern uint32_t DBG_GetHexa32( uint32_t* pdwValue )\r
377 {\r
378     uint8_t ucKey ;\r
379     uint32_t dw = 0 ;\r
380     uint32_t dwValue = 0 ;\r
381 \r
382     for ( dw=0 ; dw < 8 ; dw++ )\r
383     {\r
384         ucKey = DBG_GetChar() ;\r
385         DBG_PutChar( ucKey ) ;\r
386 \r
387         if ( ucKey >= '0' &&  ucKey <= '9' )\r
388         {\r
389             dwValue = (dwValue * 16) + (ucKey - '0') ;\r
390         }\r
391         else\r
392         {\r
393             if ( ucKey >= 'A' &&  ucKey <= 'F' )\r
394             {\r
395                 dwValue = (dwValue * 16) + (ucKey - 'A' + 10) ;\r
396             }\r
397             else\r
398             {\r
399                 if ( ucKey >= 'a' &&  ucKey <= 'f' )\r
400                 {\r
401                     dwValue = (dwValue * 16) + (ucKey - 'a' + 10) ;\r
402                 }\r
403                 else\r
404                 {\r
405                     printf( "\n\rIt is not a hexa character!\n\r" ) ;\r
406 \r
407                     return 0 ;\r
408                 }\r
409             }\r
410         }\r
411     }\r
412 \r
413     printf("\n\r" ) ;\r
414     *pdwValue = dwValue ;\r
415 \r
416     return 1 ;\r
417 }\r
418 \r
419 #if defined __ICCARM__ /* IAR Ewarm 5.41+ */\r
420 /**\r
421  * \brief Outputs a character on the UART.\r
422  *\r
423  * \param c  Character to output.\r
424  *\r
425  * \return The character that was output.\r
426  */\r
427 extern WEAK signed int putchar( signed int c )\r
428 {\r
429     DBG_PutChar( c ) ;\r
430 \r
431     return c ;\r
432 }\r
433 \r
434 extern WEAK int puts(const char *ptr )\r
435 {\r
436   \r
437     for ( ; *ptr != 0 ; ptr++ )\r
438     {\r
439         DBG_PutChar( *ptr ) ;\r
440     }\r
441     \r
442     return 0;\r
443 \r
444 }\r
445 #endif // defined __ICCARM__\r
446 \r