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