1 /* ----------------------------------------------------------------------------
\r
2 * SAM Software Package License
\r
3 * ----------------------------------------------------------------------------
\r
4 * Copyright (c) 2012, Atmel Corporation
\r
6 * All rights reserved.
\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
11 * - Redistributions of source code must retain the above copyright notice,
\r
12 * this list of conditions and the disclaimer below.
\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
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
33 * Implements UART console.
\r
37 /*----------------------------------------------------------------------------
\r
39 *----------------------------------------------------------------------------*/
\r
46 /*----------------------------------------------------------------------------
\r
48 *----------------------------------------------------------------------------*/
\r
50 /** Console baudrate always using 115200. */
\r
53 #define CONSOLE_BAUDRATE 115200
\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
60 /** Pins description corresponding to Rxd,Txd, (UART pins) */
\r
61 #define CONSOLE_PINS {PINS_UART4}
\r
63 #define CONSOLE_ID ID_UART4
\r
65 /** Usart Hw interface used by the console (UART0). */
\r
66 #define CONSOLE_UART UART0
\r
68 /** Pins description corresponding to Rxd,Txd, (UART pins) */
\r
69 #define CONSOLE_PINS {PINS_UART0}
\r
71 #define CONSOLE_ID ID_UART0
\r
78 /*----------------------------------------------------------------------------
\r
80 *----------------------------------------------------------------------------*/
\r
82 /** Is Console Initialized. */
\r
83 static uint8_t _ucIsConsoleInitialized=0 ;
\r
86 * \brief Configures an USART peripheral with the specified parameters.
\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
91 extern void DBG_Configure( uint32_t baudrate, uint32_t masterClock)
\r
94 const Pin pPins[] = CONSOLE_PINS ;
\r
95 Uart *pUart = CONSOLE_UART ;
\r
100 PIO_Configure( pPins, PIO_LISTSIZE( pPins ) ) ;
\r
101 PMC_EnablePeripheral(CONSOLE_ID);
\r
103 mode = UART_MR_CHMODE_NORMAL | UART_MR_PAR_NO;
\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
111 pUart->UART_BRGR = (masterClock / baudrate) / 16 ;
\r
113 // Configure mode register
\r
114 pUart->UART_MR = (mode );
\r
116 // Enable receiver and transmitter
\r
117 pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
\r
118 _ucIsConsoleInitialized = 1 ;
\r
120 /* Disable buffering for printf(). */
\r
121 #if ( defined (__GNUC__) && !defined (__SAMBA__) )
\r
122 setvbuf(stdout, (char *)NULL, _IONBF, 0);
\r
127 * \brief Outputs a character on the UART line.
\r
129 * \note This function is synchronous (i.e. uses polling).
\r
130 * \param c Character to send.
\r
132 extern void DBG_PutChar( uint8_t c )
\r
134 Uart *pUart=CONSOLE_UART ;
\r
136 if ( !_ucIsConsoleInitialized )
\r
138 DBG_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
\r
141 // Wait for the transmitter to be ready
\r
142 while ((pUart->UART_SR & UART_SR_TXEMPTY) == 0);
\r
145 pUart->UART_THR = c;
\r
147 // Wait for the transfer to complete
\r
148 while ((pUart->UART_SR & UART_SR_TXEMPTY) == 0);
\r
153 * \brief Input a character from the UART line.
\r
155 * \note This function is synchronous
\r
156 * \return character received.
\r
158 extern uint32_t DBG_GetChar( void )
\r
160 Uart *pUart= CONSOLE_UART ;
\r
162 if ( !_ucIsConsoleInitialized )
\r
164 DBG_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
\r
167 while ((pUart->UART_SR & UART_SR_RXRDY) == 0);
\r
168 return pUart->UART_RHR;
\r
172 * \brief Check if there is Input from UART line.
\r
174 * \return true if there is Input.
\r
176 extern uint32_t DBG_IsRxReady( void )
\r
178 Uart *pUart=CONSOLE_UART ;
\r
180 if ( !_ucIsConsoleInitialized )
\r
182 DBG_Configure( CONSOLE_BAUDRATE, BOARD_MCK ) ;
\r
185 return (pUart->UART_SR & UART_SR_RXRDY);
\r
189 * Displays the content of the given frame on the UART0.
\r
191 * \param pucFrame Pointer to the frame to dump.
\r
192 * \param dwSize Buffer size in bytes.
\r
194 extern void DBG_DumpFrame( uint8_t* pucFrame, uint32_t dwSize )
\r
198 for ( dw=0 ; dw < dwSize ; dw++ )
\r
200 printf( "%02X ", pucFrame[dw] ) ;
\r
207 * Displays the content of the given buffer on the UART0.
\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
213 extern void DBG_DumpMemory( uint8_t* pucBuffer, uint32_t dwSize, uint32_t dwAddress )
\r
217 uint32_t dwLastLineStart ;
\r
220 for ( i=0 ; i < (dwSize / 16) ; i++ )
\r
222 printf( "0x%08X: ", (unsigned int)(dwAddress + (i*16)) ) ;
\r
223 pucTmp = (uint8_t*)&pucBuffer[i*16] ;
\r
225 for ( j=0 ; j < 4 ; j++ )
\r
227 printf( "%02X%02X%02X%02X ", pucTmp[0], pucTmp[1], pucTmp[2], pucTmp[3] ) ;
\r
231 pucTmp=(uint8_t*)&pucBuffer[i*16] ;
\r
233 for ( j=0 ; j < 16 ; j++ )
\r
235 DBG_PutChar( *pucTmp++ ) ;
\r
241 if ( (dwSize%16) != 0 )
\r
243 dwLastLineStart=dwSize - (dwSize%16) ;
\r
245 printf( "0x%08X: ", (unsigned int)(dwAddress + dwLastLineStart) ) ;
\r
246 for ( j=dwLastLineStart ; j < dwLastLineStart+16 ; j++ )
\r
248 if ( (j!=dwLastLineStart) && (j%4 == 0) )
\r
255 printf( "%02X", pucBuffer[j] ) ;
\r
264 for ( j=dwLastLineStart ; j < dwSize ; j++ )
\r
266 DBG_PutChar( pucBuffer[j] ) ;
\r
276 * \param pdwValue Pointer to a integer variable to contain the input value.
\r
278 * \return success(1) or failure(0)
\r
280 extern uint32_t DBG_GetInteger( int32_t* pdwValue )
\r
283 uint8_t ucNum = 0 ;
\r
284 int32_t dwValue = 0 ;
\r
289 ucKey=DBG_GetChar() ;
\r
290 DBG_PutChar( ucKey ) ;
\r
292 if ( ((ucKey == '-') || (ucKey == '+')) && (ucNum == 0) )
\r
306 if ( ucKey >= '0' && ucKey <= '9' )
\r
308 dwValue = (dwValue * 10) + (ucKey - '0');
\r
313 if ( ucKey == 0x0D || ucKey == ' ' )
\r
317 printf( "\n\rWrite a number and press ENTER or SPACE!\n\r" ) ;
\r
323 *pdwValue = dwValue * sign;
\r
330 printf( "\n\r'%c' not a number or sign(+/-)!\n\r", ucKey ) ;
\r
340 * Reads an integer and check the value
\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
346 * \return success(1) or failure(0)
\r
348 extern uint32_t DBG_GetIntegerMinMax( int32_t* pdwValue, int32_t dwMin, int32_t dwMax )
\r
350 int32_t dwValue = 0 ;
\r
352 if ( DBG_GetInteger( &dwValue ) == 0 )
\r
357 if ( dwValue < dwMin || dwValue > dwMax )
\r
359 printf( "\n\rThe number have to be between %d and %d\n\r", (int)dwMin, (int)dwMax ) ;
\r
366 *pdwValue = dwValue ;
\r
372 * Reads an hexadecimal number
\r
374 * \param pdwValue Pointer to the uint32_t variable to contain the input value.
\r
376 extern uint32_t DBG_GetHexa32( uint32_t* pdwValue )
\r
380 uint32_t dwValue = 0 ;
\r
382 for ( dw=0 ; dw < 8 ; dw++ )
\r
384 ucKey = DBG_GetChar() ;
\r
385 DBG_PutChar( ucKey ) ;
\r
387 if ( ucKey >= '0' && ucKey <= '9' )
\r
389 dwValue = (dwValue * 16) + (ucKey - '0') ;
\r
393 if ( ucKey >= 'A' && ucKey <= 'F' )
\r
395 dwValue = (dwValue * 16) + (ucKey - 'A' + 10) ;
\r
399 if ( ucKey >= 'a' && ucKey <= 'f' )
\r
401 dwValue = (dwValue * 16) + (ucKey - 'a' + 10) ;
\r
405 printf( "\n\rIt is not a hexa character!\n\r" ) ;
\r
414 *pdwValue = dwValue ;
\r
419 #if defined __ICCARM__ /* IAR Ewarm 5.41+ */
\r
421 * \brief Outputs a character on the UART.
\r
423 * \param c Character to output.
\r
425 * \return The character that was output.
\r
427 extern WEAK signed int putchar( signed int c )
\r
434 extern WEAK int puts(const char *ptr )
\r
437 for ( ; *ptr != 0 ; ptr++ )
\r
439 DBG_PutChar( *ptr ) ;
\r
445 #endif // defined __ICCARM__
\r