OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 1391 to Rev 1392
    Reverse comparison

Rev 1391 → Rev 1392

/trunk/or1ksim/peripheral/16450.c
48,6 → 48,8
#include "channel.h"
#include "debug.h"
 
DEFAULT_DEBUG_CHANNEL(uart);
 
#define MIN(a,b) ((a) < (b) ? (a) : (b))
 
/* Number of clock cycles (one clock cycle is one call to the uart_clock())
79,7 → 81,7
{
struct dev_16450 *uart = dat;
debug(4, "uart_write_byte(%"PRIxADDR",%02"PRIx32")\n", addr, value);
TRACE("uart_write_byte(%"PRIxADDR",%02"PRIx32")\n", addr, value);
 
if (uart->regs.lcr & UART_LCR_DLAB) {
switch (addr % UART_ADDR_SPACE) {
86,6 → 88,8
case UART_DLL:
uart->regs.dll = value;
uart->char_clks = char_clks(uart->regs.dll, uart->regs.dlh, uart->regs.lcr);
TRACE("\tSetting char_clks to %li (%02x, %02x, %02x)\n", uart->char_clks,
uart->regs.dll, uart->regs.dlh, uart->regs.lcr);
return;
case UART_DLH:
uart->regs.dlh = value;
140,7 → 144,7
uart->regs.scr = value;
break;
default:
debug(1, "write out of range (addr %x)\n", addr);
TRACE("write out of range (addr %x)\n", addr);
}
}
 
150,17 → 154,17
struct dev_16450 *uart = dat;
uint8_t value = 0;
debug(4, "uart_read_byte(%"PRIxADDR")", addr);
TRACE("uart_read_byte(%"PRIxADDR")", addr);
if (uart->regs.lcr & UART_LCR_DLAB) {
switch (addr % UART_ADDR_SPACE) {
case UART_DLL:
value = uart->regs.dll;
debug(4, "= %"PRIx8"\n", value);
TRACE("= %"PRIx8"\n", value);
return value;
case UART_DLH:
value = uart->regs.dlh;
debug(4, "= %"PRIx8"\n", value);
TRACE("= %"PRIx8"\n", value);
return value;
}
}
169,11 → 173,11
case UART_RXBUF:
{ /* Print out FIFO for debugging */
int i;
debug(4, "(%i/%i,%i,%i:", uart->istat.rxbuf_full, uart->fifo_len,
uart->istat.rxbuf_head, uart->istat.rxbuf_tail);
TRACE("(%i/%i, %i, %i:", uart->istat.rxbuf_full, uart->fifo_len,
uart->istat.rxbuf_head, uart->istat.rxbuf_tail);
for (i = 0; i < uart->istat.rxbuf_full; i++)
debug(4, "%02x ", uart->regs.rxbuf[(uart->istat.rxbuf_tail + i) % uart->fifo_len]);
debug(4, ")");
TRACE("%02x ", uart->regs.rxbuf[(uart->istat.rxbuf_tail + i) % uart->fifo_len]);
TRACE(")");
}
if (uart->istat.rxbuf_full) {
value = uart->regs.rxbuf[uart->istat.rxbuf_tail];
216,9 → 220,9
value = uart->regs.scr;
break;
default:
debug(1, "read out of range (addr %"PRIxADDR")\n", addr);
TRACE("read out of range (addr %"PRIxADDR")\n", addr);
}
debug(4, " = %"PRIx8"\n", value);
TRACE(" = %"PRIx8"\n", value);
return value;
}
 
226,7 → 230,7
void uart_vapi_read (unsigned long id, unsigned long data, void *dat)
{
struct dev_16450 *uart = dat;
debug(4, "UART: id %08lx, data %08lx\n", id, data);
TRACE("UART: id %08lx, data %08lx\n", id, data);
uart->vapi_buf[uart->vapi_buf_head_ptr] = data;
uart->vapi_buf_head_ptr = (uart->vapi_buf_head_ptr + 1) % UART_VAPI_BUF_LEN;
if (uart->vapi_buf_tail_ptr == uart->vapi_buf_head_ptr) {
238,7 → 242,7
static void send_char (struct dev_16450 *uart, int bits_send)
{
PRINTF ("%c", (char)uart->iregs.txser);
debug(4, "TX \'%c\' via UART at %"PRIxADDR"...\n", (char)uart->iregs.txser,
TRACE("TX \'%c\' via UART at %"PRIxADDR"...\n", (char)uart->iregs.txser,
uart->baseaddr);
if (uart->regs.mcr & UART_MCR_LOOP)
uart->iregs.loopback = uart->iregs.txser;
297,10 → 301,10
if (uart->vapi.lcr & UART_LCR_STOP)
fe |= ((packet >> (nbits++)) & 1) ^ 1;
 
debug (4, "lcr vapi %02x, uart %02x\n", uart->vapi.lcr, uart->regs.lcr);
TRACE ("lcr vapi %02x, uart %02x\n", uart->vapi.lcr, uart->regs.lcr);
data |= (uart->vapi.lcr << 8) | (pe << 16) | (fe << 17) | (uart->vapi.lcr << 8);
PRINTF ("vapi_send (%08lx, %08x)\n", uart->vapi_id, data);
debug (4, "vapi_send (%08lx, %08x)\n", uart->vapi_id, data);
TRACE ("vapi_send (%08lx, %08x)\n", uart->vapi_id, data);
vapi_send (uart->vapi_id, data);
} else {
char buffer[1] = { uart->iregs.txser & 0xFF };
318,7 → 322,7
if (uart->istat.rxbuf_full + 1 > uart->fifo_len)
uart->regs.lsr |= UART_LSR_OVRRUN | UART_LSR_RXERR;
else {
debug(4, "add %02x\n", ch);
TRACE("add %02x\n", ch);
uart->regs.rxbuf[uart->istat.rxbuf_head] = ch;
uart->istat.rxbuf_head = (uart->istat.rxbuf_head + 1) % uart->fifo_len;
uart->istat.rxbuf_full++;
336,11 → 340,15
 
/* Schedule for later */
SCHED_ADD (uart_clock16, dat, UART_CLOCK_DIVIDER);
 
TRACE("Running uart clock:\n");
/* If VAPI is not selected, UART communicates with two file streams;
if VAPI is selected, we use VAPI streams. */
/* if txfs is corrupted, skip this uart. */
if (!uart->vapi_id && !channel_ok(uart->channel)) return;
 
TRACE("\tChannel stream or VAPI checks out ok\n");
if (uart->vapi.next_break_cnt >= 0)
if (--uart->vapi.next_break_cnt < 0) {
349,6 → 357,9
}
 
/***************** Transmit *****************/
TRACE("\tuart->istat.txser_full = %i\n", uart->istat.txser_full);
TRACE("\tuart->istat.txbuf_full = %i\n", uart->istat.txser_full);
TRACE("\tuart->char_clks = %li\n", uart->char_clks);
if (!uart->istat.txser_full) {
// uart->regs.lsr |= UART_LSR_TXBUFE;
if (uart->istat.txbuf_full) {
418,7 → 429,7
if (uart->char_clks <= uart->istat.rxser_clks++) {
/* Set unused character bits to zero and allow lsr register in fifo */
uart->iregs.rxser &= ((1 << ((uart->regs.lcr & 3) + 5)) - 1) | 0xff00;
debug(4, "Receiving 0x%02lx'%c' via UART (at %"PRIxADDR"...\n",
TRACE("\tReceiving 0x%02lx'%c' via UART (at %"PRIxADDR"...\n",
uart->iregs.rxser, (char)uart->iregs.rxser, uart->baseaddr);
PRINTF ("%c", (char)uart->iregs.rxser);
uart->istat.rxser_full = 0;
456,7 → 467,7
while (!received) {
if (uart->vapi_buf_head_ptr != uart->vapi_buf_tail_ptr) {
unsigned long data = uart->vapi_buf[uart->vapi_buf_tail_ptr];
debug(4, "Handling: %08lx (%i,%i)\n", data, uart->vapi_buf_head_ptr,
TRACE("\tHandling: %08lx (%i,%i)\n", data, uart->vapi_buf_head_ptr,
uart->vapi_buf_tail_ptr);
uart->vapi_buf_tail_ptr = (uart->vapi_buf_tail_ptr + 1) % UART_VAPI_BUF_LEN;
switch (data >> 24) {
468,7 → 479,7
if ((uart->vapi.lcr & ~UART_LCR_SBC) != (uart->regs.lcr & ~UART_LCR_SBC)
|| uart->vapi.char_clks != uart->char_clks
|| uart->vapi.skew < -MAX_SKEW || uart->vapi.skew > MAX_SKEW) {
debug (3, "WARNING: unmatched VAPI (%02x) and uart (%02x) modes.\n",
WARN("WARNING: unmatched VAPI (%02x) and uart (%02x) modes.\n",
uart->vapi.lcr & ~UART_LCR_SBC, uart->regs.lcr & ~UART_LCR_SBC);
/* Set error bits */
uart->iregs.rxser |= (UART_LSR_FRAME | UART_LSR_RXERR) << 8;
492,7 → 503,7
uart->vapi.next_break = (data >> 16) & 1;
break;
default:
debug (0, "WARNING: Invalid vapi command %02lx\n", data >> 24);
WARN ("WARNING: Invalid vapi command %02lx\n", data >> 24);
break;
}
} else break;
502,7 → 513,7
/***************** Loopback *****************/
if (uart->regs.mcr & UART_MCR_LOOP) {
debug(5, "uart_clock: Loopback\n");
TRACE("uart_clock: Loopback\n");
if ((uart->regs.mcr & UART_MCR_AUX2) !=
((uart->regs.msr & UART_MSR_DCD) >> 4))
uart->regs.msr |= UART_MSR_DDCD;
556,7 → 567,7
uart->regs.iir = UART_IIR_MSI;
}
if (!(uart->regs.iir & UART_IIR_NO_INT)) {
debug (4, "uart->regs.iir = %i\t", uart->regs.iir);
TRACE("\tuart->regs.iir = %i\t", uart->regs.iir);
report_interrupt(uart->irq);
}
}
574,11 → 585,11
else
uart->channel = channel_init(uart->channel_str);
if(channel_open(uart->channel) < 0) {
debug (0, "WARNING: UART has problems with channel \"%s\".\n", uart->channel_str);
WARN ("WARNING: UART has problems with channel \"%s\".\n", uart->channel_str);
} else if (config.sim.verbose)
PRINTF("UART at 0x%"PRIxADDR" uses ", uart->baseaddr);
} else {
debug (0, "WARNING: UART at %"PRIxADDR" has no vapi nor channel specified\n", uart->baseaddr);
WARN ("WARNING: UART at %"PRIxADDR" has no vapi nor channel specified\n", uart->baseaddr);
}
if (uart->uart16550)
/trunk/or1ksim/support/dbchs.h
20,3 → 20,4
 
/* Declatrations of all debug channels */
DECLARE_DEBUG_CHANNEL(sched)
DECLARE_DEBUG_CHANNEL(uart)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.