91 lines
3.0 KiB
C
91 lines
3.0 KiB
C
/***************************************************************************
|
|
* Copyright (C) 01/2008 by Olaf Rempel *
|
|
* razzor@kopf-tisch.de *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; version 2 of the License *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program; if not, write to the *
|
|
* Free Software Foundation, Inc., *
|
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
***************************************************************************/
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include "AT91SAM7S256.h"
|
|
#include "board.h"
|
|
#include "at91_dbgu.h"
|
|
#include "at91_sysc.h"
|
|
#include "fifo.h"
|
|
|
|
static struct fifo *txfifo;
|
|
|
|
static void dbgu_isr(uint32_t status)
|
|
{
|
|
/* only enabled interrupts */
|
|
status &= *AT91C_DBGU_IMR;
|
|
/*
|
|
if (status & AT91C_US_TXEMPTY) {
|
|
static char c;
|
|
if (c == '\n') {
|
|
*AT91C_DBGU_THR = '\r';
|
|
c = 0;
|
|
|
|
} else if (fifo_getbyte(&txfifo, &c) == 1)
|
|
*AT91C_DBGU_THR = c;
|
|
else
|
|
*AT91C_DBGU_IDR = AT91C_US_TXEMPTY;
|
|
}
|
|
*/
|
|
if (status & AT91C_US_TXBUFE)
|
|
if (fifo_txpdc(txfifo, AT91C_BASE_PDC_DBGU, 16) == 0)
|
|
*AT91C_DBGU_IDR = AT91C_US_TXBUFE;
|
|
}
|
|
|
|
void at91_dbgu_init(void)
|
|
{
|
|
/* switch pins to UART */
|
|
*AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;
|
|
|
|
/* enable Debug Port with 115200 Baud (+0.16%) */
|
|
AT91S_DBGU *dbgu = AT91C_BASE_DBGU;
|
|
dbgu->DBGU_BRGR = BAUD_TO_DIV(115200);
|
|
dbgu->DBGU_MR = AT91C_US_PAR_NONE | AT91C_US_CHMODE_NORMAL;
|
|
dbgu->DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN | AT91C_US_RSTSTA;
|
|
|
|
txfifo = fifo_alloc(1024);
|
|
|
|
/* enable TX PDC */
|
|
dbgu->DBGU_PTCR = AT91C_PDC_TXTEN;
|
|
|
|
sysc_register_isr(AT91_SYSIRQ_DBGU, dbgu_isr);
|
|
}
|
|
|
|
void at91_dbgu_putc(char c)
|
|
{
|
|
fifo_putbyte(txfifo, c);
|
|
// *AT91C_DBGU_IER = AT91C_US_TXEMPTY;
|
|
*AT91C_DBGU_IER = AT91C_US_TXBUFE;
|
|
}
|
|
|
|
void at91_dbgu_puts(const char *p)
|
|
{
|
|
fifo_put(txfifo, (char *)p, strlen(p));
|
|
// *AT91C_DBGU_IER = AT91C_US_TXEMPTY;
|
|
*AT91C_DBGU_IER = AT91C_US_TXBUFE;
|
|
}
|
|
|
|
int at91_dbgu_write(void *base, const char *buf, size_t len)
|
|
{
|
|
int retval = fifo_put(txfifo, (char *)buf, len);
|
|
// *AT91C_DBGU_IER = AT91C_US_TXEMPTY;
|
|
*AT91C_DBGU_IER = AT91C_US_TXBUFE;
|
|
return retval;
|
|
}
|