/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the disclaimer below. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "dbgu.h" #include #include //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Initializes the DBGU with the given parameters, and enables both the /// transmitter and the receiver. The mode parameter contains the value of the /// DBGU_MR register. /// Value DBGU_STANDARD can be used for mode to get the most common configuration /// (i.e. aysnchronous, 8bits, no parity, 1 stop bit, no flow control). /// \param mode Operating mode to configure. /// \param baudrate Desired baudrate (e.g. 115200). /// \param mck Frequency of the system master clock in Hz. //------------------------------------------------------------------------------ void DBGU_Configure( unsigned int mode, unsigned int baudrate, unsigned int mck) { // Reset & disable receiver and transmitter, disable interrupts AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF; // Configure baud rate AT91C_BASE_DBGU->DBGU_BRGR = mck / (baudrate * 16); // Configure mode register AT91C_BASE_DBGU->DBGU_MR = mode; // Disable DMA channel AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS; // Enable receiver and transmitter AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN; } //------------------------------------------------------------------------------ /// Outputs a character on the DBGU line. /// \note This function is synchronous (i.e. uses polling). /// \param c Character to send. //------------------------------------------------------------------------------ void DBGU_PutChar(unsigned char c) { // Wait for the transmitter to be ready while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXEMPTY) == 0); // Send character AT91C_BASE_DBGU->DBGU_THR = c; // Wait for the transfer to complete while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXEMPTY) == 0); } //------------------------------------------------------------------------------ /// Return 1 if a character can be read in DBGU //------------------------------------------------------------------------------ unsigned int DBGU_IsRxReady() { return (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY); } //------------------------------------------------------------------------------ /// Reads and returns a character from the DBGU. /// \note This function is synchronous (i.e. uses polling). /// \return Character received. //------------------------------------------------------------------------------ unsigned char DBGU_GetChar(void) { while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY) == 0); return AT91C_BASE_DBGU->DBGU_RHR; } #ifndef NOFPUT #include //------------------------------------------------------------------------------ /// \exclude /// Implementation of fputc using the DBGU as the standard output. Required /// for printf(). /// \param c Character to write. /// \param pStream Output stream. /// \param The character written if successful, or -1 if the output stream is /// not stdout or stderr. //------------------------------------------------------------------------------ signed int fputc(signed int c, FILE *pStream) { if ((pStream == stdout) || (pStream == stderr)) { DBGU_PutChar(c); return c; } else { return EOF; } } //------------------------------------------------------------------------------ /// \exclude /// Implementation of fputs using the DBGU as the standard output. Required /// for printf(). Does NOT currently use the PDC. /// \param pStr String to write. /// \param pStream Output stream. /// \return Number of characters written if successful, or -1 if the output /// stream is not stdout or stderr. //------------------------------------------------------------------------------ signed int fputs(const char *pStr, FILE *pStream) { signed int num = 0; while (*pStr != 0) { if (fputc(*pStr, pStream) == -1) { return -1; } num++; pStr++; } return num; } #undef putchar //------------------------------------------------------------------------------ /// \exclude /// Outputs a character on the DBGU. /// \param c Character to output. /// \return The character that was output. //------------------------------------------------------------------------------ signed int putchar(signed int c) { return fputc(c, stdout); } #endif //#ifndef NOFPUT