1 /* ----------------------------------------------------------------------------
\r
2 * SAM Software Package License
\r
3 * ----------------------------------------------------------------------------
\r
4 * Copyright (c) 2011, 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 DBGU console.
\r
37 /*----------------------------------------------------------------------------
\r
39 *----------------------------------------------------------------------------*/
\r
46 /*----------------------------------------------------------------------------
\r
48 *----------------------------------------------------------------------------*/
\r
50 /** The Pheripheral has no HW ID */
\r
51 #define ID_NOTUSED 0xFF
\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
62 /*----------------------------------------------------------------------------
\r
64 *----------------------------------------------------------------------------*/
\r
69 typedef struct _DbgPort {
\r
71 const Pin* pPioList;
\r
72 const uint8_t bPioListSize;
\r
76 /*----------------------------------------------------------------------------
\r
78 *----------------------------------------------------------------------------*/
\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
87 /** Uses DBGU as debug port */
\r
88 static sDbgPort dbgpDbgu =
\r
91 pinsDbgu, PIO_LISTSIZE(pinsDbgu),
\r
94 /** Uses USART0 as debug port */
\r
95 static sDbgPort dbgpUs0 =
\r
98 pinsUs0, PIO_LISTSIZE(pinsUs0),
\r
102 /** Uses USART0 as debug port */
\r
103 static sDbgPort dbgpUs1 =
\r
106 pinsUs1, PIO_LISTSIZE(pinsUs1),
\r
110 /** Current used debug port */
\r
111 static sDbgPort *pDbgPort = &dbgpDbgu;
\r
112 /** Console initialize status */
\r
113 uint8_t _bConsoleIsInitialized = 0;
\r
116 * \brief Select USART0 as DBGU port.
\r
118 void DBGU_ConsoleUseUSART0(void)
\r
120 pDbgPort = &dbgpUs0;
\r
121 _bConsoleIsInitialized = 0;
\r
124 * \brief Select USART1 as DBGU port.
\r
126 void DBGU_ConsoleUseUSART1(void)
\r
128 pDbgPort = &dbgpUs1;
\r
129 _bConsoleIsInitialized = 0;
\r
133 * \brief Select DBGU as DBGU port.
\r
135 void DBGU_ConsoleUseDBGU(void)
\r
137 pDbgPort = &dbgpDbgu;
\r
138 _bConsoleIsInitialized = 0;
\r
142 * \brief Configures an DBGU peripheral with the specified parameters.
\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
147 extern void DBGU_Configure( uint32_t baudrate, uint32_t masterClock)
\r
150 /* Configure PIO */
\r
151 PIO_Configure(CONSOLE_PINLIST, CONSOLE_PINLISTSIZE);
\r
153 if ( ID_NOTUSED != CONSOLE_ID )
\r
155 PMC_EnablePeripheral(CONSOLE_ID);
\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
163 CONSOLE_DBGU->DBGU_MR = DBGU_MR_CHMODE_NORM | DBGU_MR_PAR_NONE;
\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
180 * \brief Outputs a character on the DBGU line.
\r
182 * \note This function is synchronous (i.e. uses polling).
\r
183 * \param c Character to send.
\r
185 extern void DBGU_PutChar( uint8_t c )
\r
187 if ( !_bConsoleIsInitialized )
\r
189 DBGU_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
\r
192 /* Wait for the transmitter to be ready */
\r
193 while ( (CONSOLE_DBGU->DBGU_SR & DBGU_SR_TXEMPTY) == 0 ) ;
\r
195 /* Send character */
\r
196 CONSOLE_DBGU->DBGU_THR=c ;
\r
200 * \brief Input a character from the DBGU line.
\r
202 * \note This function is synchronous
\r
203 * \return character received.
\r
205 extern uint32_t DBGU_GetChar( void )
\r
207 if ( !_bConsoleIsInitialized )
\r
209 DBGU_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
\r
212 while ( (CONSOLE_DBGU->DBGU_SR & DBGU_SR_RXRDY) == 0 ) ;
\r
213 return CONSOLE_DBGU->DBGU_RHR ;
\r
217 * \brief Check if there is Input from DBGU line.
\r
219 * \return true if there is Input.
\r
221 extern uint32_t DBGU_IsRxReady( void )
\r
223 if ( !_bConsoleIsInitialized )
\r
225 //DBGU_Configure( CONSOLE_BAUDRATE, BOARD_MCK ) ;
\r
227 return (CONSOLE_DBGU->DBGU_SR & DBGU_SR_RXRDY) > 0 ;
\r
231 * Displays the content of the given frame on the DBGU.
\r
233 * \param pucFrame Pointer to the frame to dump.
\r
234 * \param dwSize Buffer size in bytes.
\r
236 extern void DBGU_DumpFrame( uint8_t* pucFrame, uint32_t dwSize )
\r
240 for ( dw=0 ; dw < dwSize ; dw++ )
\r
242 printf( "%02X ", pucFrame[dw] ) ;
\r
249 * Displays the content of the given buffer on the DBGU.
\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
255 extern void DBGU_DumpMemory( uint8_t* pucBuffer, uint32_t dwSize, uint32_t dwAddress )
\r
259 uint32_t dwLastLineStart ;
\r
262 for ( i=0 ; i < (dwSize / 16) ; i++ )
\r
264 printf( "0x%08X: ", (unsigned int )(dwAddress + ( i * 16) )) ;
\r
265 pucTmp = (uint8_t*)&pucBuffer[i*16] ;
\r
267 for ( j=0 ; j < 4 ; j++ )
\r
269 printf( "%02X%02X%02X%02X ", pucTmp[0], pucTmp[1], pucTmp[2], pucTmp[3] ) ;
\r
273 pucTmp=(uint8_t*)&pucBuffer[i*16] ;
\r
275 for ( j=0 ; j < 16 ; j++ )
\r
277 DBGU_PutChar( *pucTmp++ ) ;
\r
283 if ( (dwSize%16) != 0 )
\r
285 dwLastLineStart=dwSize - (dwSize%16) ;
\r
287 printf( "0x%08X: ", (unsigned int ) (dwAddress + dwLastLineStart )) ;
\r
288 for ( j=dwLastLineStart ; j < dwLastLineStart+16 ; j++ )
\r
290 if ( (j!=dwLastLineStart) && (j%4 == 0) )
\r
297 printf( "%02X", pucBuffer[j] ) ;
\r
306 for ( j=dwLastLineStart ; j < dwSize ; j++ )
\r
308 DBGU_PutChar( pucBuffer[j] ) ;
\r
318 * \param pdwValue Pointer to the uint32_t variable to contain the input value.
\r
320 extern uint32_t DBGU_GetInteger( uint32_t* pdwValue )
\r
324 uint32_t dwValue=0 ;
\r
328 ucKey=DBGU_GetChar() ;
\r
329 DBGU_PutChar( ucKey ) ;
\r
331 if ( ucKey >= '0' && ucKey <= '9' )
\r
333 dwValue = (dwValue * 10) + (ucKey - '0');
\r
338 if ( ucKey == 0x0D || ucKey == ' ' )
\r
342 printf( "\n\rWrite a number and press ENTER or SPACE!\n\r" ) ;
\r
348 *pdwValue=dwValue ;
\r
355 printf( "\n\r'%c' not a number!\n\r", ucKey ) ;
\r
364 * Reads an integer and check the value
\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
370 extern uint32_t DBGU_GetIntegerMinMax( uint32_t* pdwValue, uint32_t dwMin, uint32_t dwMax )
\r
372 uint32_t dwValue=0 ;
\r
374 if ( DBGU_GetInteger( &dwValue ) == 0 )
\r
379 if ( dwValue < dwMin || dwValue > dwMax )
\r
381 printf( "\n\rThe number have to be between %u and %u\n\r", (unsigned int)dwMin, (unsigned int)dwMax ) ;
\r
388 *pdwValue = dwValue ;
\r
394 * Reads an hexadecimal number
\r
396 * \param pdwValue Pointer to the uint32_t variable to contain the input value.
\r
398 extern uint32_t DBGU_GetHexa32( uint32_t* pdwValue )
\r
402 uint32_t dwValue = 0 ;
\r
404 for ( dw=0 ; dw < 8 ; dw++ )
\r
406 ucKey = DBGU_GetChar() ;
\r
407 DBGU_PutChar( ucKey ) ;
\r
409 if ( ucKey >= '0' && ucKey <= '9' )
\r
411 dwValue = (dwValue * 16) + (ucKey - '0') ;
\r
415 if ( ucKey >= 'A' && ucKey <= 'F' )
\r
417 dwValue = (dwValue * 16) + (ucKey - 'A' + 10) ;
\r
421 if ( ucKey >= 'a' && ucKey <= 'f' )
\r
423 dwValue = (dwValue * 16) + (ucKey - 'a' + 10) ;
\r
427 printf( "\n\rIt is not a hexa character!\n\r" ) ;
\r
436 *pdwValue = dwValue ;
\r
441 #if defined __ICCARM__ /* IAR Ewarm 5.41+ */
\r
443 * \brief Outputs a character on the DBGU.
\r
445 * \param c Character to output.
\r
447 * \return The character that was output.
\r
449 extern WEAK signed int putchar( signed int c )
\r
451 DBGU_PutChar( c ) ;
\r
455 #endif // defined __ICCARM__
\r