]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A5_SAMA5D4x_EK_IAR/AtmelFiles/libboard_sama5d4x-ek/source/dbgu_console.c
Core kernel files:
[freertos] / FreeRTOS / Demo / CORTEX_A5_SAMA5D4x_EK_IAR / AtmelFiles / libboard_sama5d4x-ek / source / dbgu_console.c
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2013, 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 DBGU 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 /** The Pheripheral has no HW ID */\r
51 #define ID_NOTUSED         0xFF\r
52 \r
53 /** Usart Hw ID (ID_USART0) */\r
54 #define CONSOLE_ID              (pDbgPort->bID)\r
55 /** Usart Hw interface used by the console (USART0). */\r
56 #define CONSOLE_DBGU            ((Dbgu*)pDbgPort->pHw)\r
57 /** Pins description list */\r
58 #define CONSOLE_PINLIST         (pDbgPort->pPioList)\r
59 /** Pins description list size */\r
60 #define CONSOLE_PINLISTSIZE     (pDbgPort->bPioListSize)\r
61 \r
62 /*----------------------------------------------------------------------------\r
63  *        Types\r
64  *----------------------------------------------------------------------------*/\r
65 \r
66 /**\r
67  * Debug port struct\r
68  */\r
69 typedef struct _DbgPort {\r
70     const  void*   pHw;\r
71     const  Pin*    pPioList;\r
72     const  uint8_t bPioListSize;\r
73     const  uint8_t bID;\r
74 } sDbgPort;\r
75 \r
76 /*----------------------------------------------------------------------------\r
77  *        Variables\r
78  *----------------------------------------------------------------------------*/\r
79 \r
80 /** Pins for DBGU */\r
81 static const Pin pinsDbgu[] = {PINS_DBGU};\r
82 /** Pins for USART0 */\r
83 static const Pin pinsUs0[] = {PIN_USART0_TXD, PIN_USART0_RXD};\r
84 /** Pins for USART1 */\r
85 static const Pin pinsUs1[] = {PIN_USART1_TXD, PIN_USART1_RXD};\r
86 /** Pins for USART3 */\r
87 static const Pin pinsUs3[] = {PIN_USART3_TXD, PIN_USART3_RXD};\r
88 \r
89 /** Uses DBGU as debug port */\r
90 static sDbgPort dbgpDbgu =\r
91 {\r
92     DBGU,\r
93     pinsDbgu, PIO_LISTSIZE(pinsDbgu),\r
94     ID_DBGU\r
95 };\r
96 /** Uses USART0 as debug port */\r
97 static sDbgPort dbgpUs0  =\r
98 {\r
99     USART0,\r
100     pinsUs0, PIO_LISTSIZE(pinsUs0),\r
101     ID_USART0\r
102 };\r
103 \r
104 /** Uses USART0 as debug port */\r
105 static sDbgPort dbgpUs1  =\r
106 {\r
107     USART1,\r
108     pinsUs1, PIO_LISTSIZE(pinsUs1),\r
109     ID_USART1\r
110 };\r
111 /** Uses USART0 as debug port */\r
112 static sDbgPort dbgpUs3  =\r
113 {\r
114     USART3,\r
115     pinsUs3, PIO_LISTSIZE(pinsUs3),\r
116     ID_USART3\r
117 };\r
118 \r
119 /** Current used debug port */\r
120 static sDbgPort *pDbgPort = &dbgpUs3;\r
121 /** Console initialize status */\r
122 uint8_t _bConsoleIsInitialized = 0;\r
123 \r
124 /**\r
125  * \brief Select USART0 as DBGU port.\r
126  */\r
127 void DBGU_ConsoleUseUSART0(void)\r
128 {\r
129     pDbgPort = &dbgpUs0;\r
130     _bConsoleIsInitialized = 0;\r
131 }\r
132 /**\r
133  * \brief Select USART1 as DBGU port.\r
134  */\r
135 void DBGU_ConsoleUseUSART1(void)\r
136 {\r
137     pDbgPort = &dbgpUs1;\r
138     _bConsoleIsInitialized = 0;\r
139 }\r
140 \r
141 /**\r
142  * \brief Select USART3 as DBGU port.\r
143  */\r
144 void DBGU_ConsoleUseUSART3(void)\r
145 {\r
146     pDbgPort = &dbgpUs3;\r
147     _bConsoleIsInitialized = 0;\r
148 }\r
149 /**\r
150  * \brief Select DBGU as DBGU port.\r
151  */\r
152 void DBGU_ConsoleUseDBGU(void)\r
153 {\r
154     pDbgPort = &dbgpDbgu;\r
155     _bConsoleIsInitialized = 0;\r
156 }\r
157 \r
158 /**\r
159  * \brief Configures an DBGU peripheral with the specified parameters.\r
160  *\r
161  * \param baudrate  Baudrate at which the DBGU should operate (in Hz).\r
162  * \param masterClock  Frequency of the system master clock (in Hz).\r
163  */\r
164 extern void DBGU_Configure( uint32_t baudrate, uint32_t masterClock)\r
165 {\r
166 \r
167     /* Configure PIO */\r
168     PIO_Configure(CONSOLE_PINLIST, CONSOLE_PINLISTSIZE);\r
169 \r
170     if ( ID_NOTUSED != CONSOLE_ID )\r
171     {\r
172         //PMC_SetPeriMaxClock(CONSOLE_ID, BOARD_MCK);\r
173         PMC_EnablePeripheral(CONSOLE_ID);\r
174     }\r
175 \r
176     /* Configure mode register */\r
177     if (CONSOLE_DBGU!= DBGU ) {\r
178         CONSOLE_DBGU->DBGU_MR = DBGU_MR_CHMODE_NORM | DBGU_MR_PAR_NONE | US_MR_CHRL_8_BIT;\r
179     }\r
180     else {\r
181         CONSOLE_DBGU->DBGU_MR = DBGU_MR_CHMODE_NORM | DBGU_MR_PAR_NONE;\r
182     }\r
183     /* Reset and disable receiver & transmitter */\r
184     CONSOLE_DBGU->DBGU_CR = DBGU_CR_RSTRX | DBGU_CR_RSTTX;\r
185     CONSOLE_DBGU->DBGU_IDR = 0xFFFFFFFF;\r
186     CONSOLE_DBGU->DBGU_CR = DBGU_CR_RXDIS | DBGU_CR_TXDIS;\r
187     /* Configure baudrate */\r
188     CONSOLE_DBGU->DBGU_BRGR = (masterClock/2 / baudrate) / 16;\r
189     /* Enable receiver and transmitter */\r
190     CONSOLE_DBGU->DBGU_CR = DBGU_CR_RXEN | DBGU_CR_TXEN;\r
191     _bConsoleIsInitialized = 1 ;\r
192 #if defined(__GNUC__)\r
193     setvbuf(stdout, (char*)NULL, _IONBF, 0);\r
194 #endif\r
195 }\r
196 \r
197 /**\r
198  * \brief Outputs a character on the DBGU line.\r
199  *\r
200  * \note This function is synchronous (i.e. uses polling).\r
201  * \param c  Character to send.\r
202  */\r
203 extern void DBGU_PutChar( uint8_t c )\r
204 {\r
205     if ( !_bConsoleIsInitialized )\r
206     {\r
207         DBGU_Configure(CONSOLE_BAUDRATE, BOARD_MCK);\r
208     }\r
209 \r
210     /* Wait for the transmitter to be ready */\r
211     while ( (CONSOLE_DBGU->DBGU_SR & DBGU_SR_TXEMPTY) == 0 ) ;\r
212 \r
213     /* Send character */\r
214     CONSOLE_DBGU->DBGU_THR=c ;\r
215 }\r
216 \r
217 /**\r
218  * \brief Input a character from the DBGU line.\r
219  *\r
220  * \note This function is synchronous\r
221  * \return character received.\r
222  */\r
223 extern uint32_t DBGU_GetChar( void )\r
224 {\r
225     if ( !_bConsoleIsInitialized )\r
226     {\r
227         DBGU_Configure(CONSOLE_BAUDRATE, BOARD_MCK);\r
228     }\r
229 \r
230     while ( (CONSOLE_DBGU->DBGU_SR & DBGU_SR_RXRDY) == 0 ) ;\r
231     return CONSOLE_DBGU->DBGU_RHR ;\r
232 }\r
233 \r
234 /**\r
235  * \brief Check if there is Input from DBGU line.\r
236  *\r
237  * \return true if there is Input.\r
238  */\r
239 extern uint32_t DBGU_IsRxReady( void )\r
240 {\r
241     if ( !_bConsoleIsInitialized )\r
242     {\r
243         //DBGU_Configure( CONSOLE_BAUDRATE, BOARD_MCK ) ;\r
244     }\r
245     return (CONSOLE_DBGU->DBGU_SR & DBGU_SR_RXRDY) > 0 ;\r
246 }\r
247 \r
248 /**\r
249  *  Displays the content of the given frame on the DBGU.\r
250  *\r
251  *  \param pucFrame Pointer to the frame to dump.\r
252  *  \param dwSize   Buffer size in bytes.\r
253  */\r
254 extern void DBGU_DumpFrame( uint8_t* pucFrame, uint32_t dwSize )\r
255 {\r
256     uint32_t dw ;\r
257 \r
258     for ( dw=0 ; dw < dwSize ; dw++ )\r
259     {\r
260         printf( "%02X ", pucFrame[dw] ) ;\r
261     }\r
262 \r
263     printf( "\n\r" ) ;\r
264 }\r
265 \r
266 /**\r
267  *  Displays the content of the given buffer on the DBGU.\r
268  *\r
269  *  \param pucBuffer  Pointer to the buffer to dump.\r
270  *  \param dwSize     Buffer size in bytes.\r
271  *  \param dwAddress  Start address to display\r
272  */\r
273 extern void DBGU_DumpMemory( uint8_t* pucBuffer, uint32_t dwSize, uint32_t dwAddress )\r
274 {\r
275     uint32_t i ;\r
276     uint32_t j ;\r
277     uint32_t dwLastLineStart ;\r
278     uint8_t* pucTmp ;\r
279 \r
280     for ( i=0 ; i < (dwSize / 16) ; i++ )\r
281     {\r
282         printf( "0x%08X: ", (unsigned int )(dwAddress + ( i * 16) )) ;\r
283         pucTmp = (uint8_t*)&pucBuffer[i*16] ;\r
284 \r
285         for ( j=0 ; j < 4 ; j++ )\r
286         {\r
287             printf( "%02X%02X%02X%02X ", pucTmp[0], pucTmp[1], pucTmp[2], pucTmp[3] ) ;\r
288             pucTmp += 4 ;\r
289         }\r
290 \r
291         pucTmp=(uint8_t*)&pucBuffer[i*16] ;\r
292 \r
293         for ( j=0 ; j < 16 ; j++ )\r
294         {\r
295             DBGU_PutChar( *pucTmp++ ) ;\r
296         }\r
297 \r
298         printf( "\n\r" ) ;\r
299     }\r
300 \r
301     if ( (dwSize%16) != 0 )\r
302     {\r
303         dwLastLineStart=dwSize - (dwSize%16) ;\r
304 \r
305         printf( "0x%08X: ", (unsigned int ) (dwAddress + dwLastLineStart )) ;\r
306         for ( j=dwLastLineStart ; j < dwLastLineStart+16 ; j++ )\r
307         {\r
308             if ( (j!=dwLastLineStart) && (j%4 == 0) )\r
309             {\r
310                 printf( " " ) ;\r
311             }\r
312 \r
313             if ( j < dwSize )\r
314             {\r
315                 printf( "%02X", pucBuffer[j] ) ;\r
316             }\r
317             else\r
318             {\r
319                 printf("  ") ;\r
320             }\r
321         }\r
322 \r
323         printf( " " ) ;\r
324         for ( j=dwLastLineStart ; j < dwSize ; j++ )\r
325         {\r
326             DBGU_PutChar( pucBuffer[j] ) ;\r
327         }\r
328 \r
329         printf( "\n\r" ) ;\r
330     }\r
331 }\r
332 \r
333 /**\r
334  *  Reads an integer\r
335  *\r
336  *  \param pdwValue  Pointer to the uint32_t variable to contain the input value.\r
337  */\r
338 extern uint32_t DBGU_GetInteger( uint32_t* pdwValue )\r
339 {\r
340     uint8_t ucKey ;\r
341     uint8_t ucNbNb=0 ;\r
342     uint32_t dwValue=0 ;\r
343 \r
344     while ( 1 )\r
345     {\r
346         ucKey=DBGU_GetChar() ;\r
347         DBGU_PutChar( ucKey ) ;\r
348 \r
349         if ( ucKey >= '0' &&  ucKey <= '9' )\r
350         {\r
351             dwValue = (dwValue * 10) + (ucKey - '0');\r
352             ucNbNb++ ;\r
353         }\r
354         else\r
355         {\r
356             if ( ucKey == 0x0D || ucKey == ' ' )\r
357             {\r
358                 if ( ucNbNb == 0 )\r
359                 {\r
360                     printf( "\n\rWrite a number and press ENTER or SPACE!\n\r" ) ;\r
361                     return 0 ;\r
362                 }\r
363                 else\r
364                 {\r
365                     printf( "\n\r" ) ;\r
366                     *pdwValue=dwValue ;\r
367 \r
368                     return 1 ;\r
369                 }\r
370             }\r
371             else\r
372             {\r
373                 printf( "\n\r'%c' not a number!\n\r", ucKey ) ;\r
374 \r
375                 return 0 ;\r
376             }\r
377         }\r
378     }\r
379 }\r
380 \r
381 /**\r
382  *  Reads an integer and check the value\r
383  *\r
384  *  \param pdwValue  Pointer to the uint32_t variable to contain the input value.\r
385  *  \param dwMin     Minimum value\r
386  *  \param dwMax     Maximum value\r
387  */\r
388 extern uint32_t DBGU_GetIntegerMinMax( uint32_t* pdwValue, uint32_t dwMin, uint32_t dwMax )\r
389 {\r
390     uint32_t dwValue=0 ;\r
391 \r
392     if ( DBGU_GetInteger( &dwValue ) == 0 )\r
393     {\r
394         return 0 ;\r
395     }\r
396 \r
397     if ( dwValue < dwMin || dwValue > dwMax )\r
398  {\r
399         printf( "\n\rThe number have to be between %u and %u\n\r", (unsigned int)dwMin, (unsigned int)dwMax ) ;\r
400 \r
401         return 0 ;\r
402     }\r
403 \r
404     printf( "\n\r" ) ;\r
405 \r
406     *pdwValue = dwValue ;\r
407 \r
408     return 1 ;\r
409 }\r
410 \r
411 /**\r
412  *  Reads an hexadecimal number\r
413  *\r
414  *  \param pdwValue  Pointer to the uint32_t variable to contain the input value.\r
415  */\r
416 extern uint32_t DBGU_GetHexa32( uint32_t* pdwValue )\r
417 {\r
418     uint8_t ucKey ;\r
419     uint32_t dw = 0 ;\r
420     uint32_t dwValue = 0 ;\r
421 \r
422     for ( dw=0 ; dw < 8 ; dw++ )\r
423     {\r
424         ucKey = DBGU_GetChar() ;\r
425         DBGU_PutChar( ucKey ) ;\r
426 \r
427         if ( ucKey >= '0' &&  ucKey <= '9' )\r
428         {\r
429             dwValue = (dwValue * 16) + (ucKey - '0') ;\r
430         }\r
431         else\r
432         {\r
433             if ( ucKey >= 'A' &&  ucKey <= 'F' )\r
434             {\r
435                 dwValue = (dwValue * 16) + (ucKey - 'A' + 10) ;\r
436             }\r
437             else\r
438             {\r
439                 if ( ucKey >= 'a' &&  ucKey <= 'f' )\r
440                 {\r
441                     dwValue = (dwValue * 16) + (ucKey - 'a' + 10) ;\r
442                 }\r
443                 else\r
444                 {\r
445                     printf( "\n\rIt is not a hexa character!\n\r" ) ;\r
446 \r
447                     return 0 ;\r
448                 }\r
449             }\r
450         }\r
451     }\r
452 \r
453     printf("\n\r" ) ;\r
454     *pdwValue = dwValue ;\r
455 \r
456     return 1 ;\r
457 }\r
458 \r
459 #if defined __ICCARM__ /* IAR Ewarm 5.41+ */\r
460 /**\r
461  * \brief Outputs a character on the DBGU.\r
462  *\r
463  * \param c  Character to output.\r
464  *\r
465  * \return The character that was output.\r
466  */\r
467 extern WEAK signed int putchar( signed int c )\r
468 {\r
469     DBGU_PutChar( c ) ;\r
470 \r
471     return c ;\r
472 }\r
473 #endif // defined __ICCARM__\r
474 \r
475 \r