LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Advertise
  • Mirrors
  • Logos
  • Contact us
  • Find Resources
  • Job Opportunity
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Navigation: All forums > Openrisc > Message List > Message Post

    Message

    Reply | Reply all
    Date Prev | Date Next | Thread Prev | Thread Next Date Index | Thread Index

    From: György 'nog' Jeney<nog@s...>
    Date: Sun May 29 17:53:52 CEST 2005
    Subject: [openrisc] [ork1sim #102] UART: Move loopback handling out of uart_clock16 [4/6]
    Top
    Hi,

    Changelog says it all.

    ChangeLog:
    * Move loopback handling out of uart_clock16.

    nog.
    -------------- next part --------------
    --- ../or1ksim-patch/peripheral/16450.c 2005-05-29 15:52:41.000000000 +0200
    +++ peripheral/16450.c 2005-05-29 15:52:34.000000000 +0200
    @@ -61,8 +61,8 @@ static void uart_vapi_cmd(void *dat);
    static void uart_clear_int(struct dev_16450 *uart, int intr);
    void uart_tx_send(void *dat);

    -/* Number of clock cycles (one clock cycle is one call to the uart_clock())
    - before a single character is transmitted or received. */
    +/* Number of clock cycles (one clock cycle is when UART_CLOCK_DIVIDER simulator
    + * cycles have elapsed) before a single character is transmitted or received. */
    static unsigned long char_clks(int dll, int dlh, int lcr)
    {
    unsigned int bauds_per_char = 2;
    @@ -260,6 +260,35 @@ static void uart_clear_int(struct dev_16
    SCHED_ADD(uart_next_int, uart, 0);
    }

    +/*----------------------------------------------------[ Loopback handling ]---*/
    +static void uart_loopback(struct dev_16450 *uart)
    +{
    + if(!(uart->regs.mcr & UART_MCR_LOOP))
    + return;
    +
    + if((uart->regs.mcr & UART_MCR_AUX2) != ((uart->regs.msr & UART_MSR_DCD) >> 4))
    + uart->regs.msr |= UART_MSR_DDCD;
    +
    + if((uart->regs.mcr & UART_MCR_AUX1) < ((uart->regs.msr & UART_MSR_RI) >> 4))
    + uart->regs.msr |= UART_MSR_TERI;
    +
    + if((uart->regs.mcr & UART_MCR_RTS) != ((uart->regs.msr & UART_MSR_CTS) >> 3))
    + uart->regs.msr |= UART_MSR_DCTS;
    +
    + if((uart->regs.mcr & UART_MCR_DTR) != ((uart->regs.msr & UART_MSR_DSR) >> 5))
    + uart->regs.msr |= UART_MSR_DDSR;
    +
    + uart->regs.msr &= ~(UART_MSR_DCD | UART_MSR_RI | UART_MSR_DSR | UART_MSR_CTS);
    + uart->regs.msr |= ((uart->regs.mcr & UART_MCR_AUX2) << 4);
    + uart->regs.msr |= ((uart->regs.mcr & UART_MCR_AUX1) << 4);
    + uart->regs.msr |= ((uart->regs.mcr & UART_MCR_RTS) << 3);
    + uart->regs.msr |= ((uart->regs.mcr & UART_MCR_DTR) << 5);
    +
    + if(uart->regs.msr & (UART_MSR_DCTS | UART_MSR_DDSR | UART_MSR_TERI |
    + UART_MSR_DDCD))
    + uart_int_msi(uart);
    +}
    +
    /*----------------------------------------------------[ Transmitter logic ]---*/
    /* Sends the data in the shift register to the outside world */
    static void send_char (struct dev_16450 *uart, int bits_send)
    @@ -604,6 +633,7 @@ void uart_write_byte(oraddr_t addr, uint
    break;
    case UART_MCR:
    uart->regs.mcr = value & UART_VALID_MCR;
    + uart_loopback(uart);
    break;
    case UART_SCR:
    uart->regs.scr = value;
    @@ -696,6 +726,7 @@ uint8_t uart_read_byte(oraddr_t addr, vo
    value = uart->regs.msr & UART_VALID_MSR;
    uart->regs.msr = 0;
    uart_clear_int(uart, UART_IIR_MSI);
    + uart_loopback(uart);
    break;
    case UART_SCR:
    value = uart->regs.scr;
    @@ -807,48 +838,6 @@ void uart_vapi_read (unsigned long id, u
    uart_vapi_cmd(uart);
    }

    -/* Simulation hook. Must be called every clock cycle to simulate all UART
    - devices. It does internal functional UART simulation. */
    -void uart_clock16 (void *dat)
    -{
    - struct dev_16450 *uart = dat;
    -
    - /* 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");
    -
    - /***************** Loopback *****************/
    - if (uart->regs.mcr & UART_MCR_LOOP) {
    - 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;
    - if ((uart->regs.mcr & UART_MCR_AUX1) <
    - ((uart->regs.msr & UART_MSR_RI) >> 4))
    - uart->regs.msr |= UART_MSR_TERI; - if ((uart->regs.mcr & UART_MCR_RTS) != - ((uart->regs.msr & UART_MSR_CTS) >> 3)) - uart->regs.msr |= UART_MSR_DCTS; - if ((uart->regs.mcr & UART_MCR_DTR) != - ((uart->regs.msr & UART_MSR_DSR) >> 5)) - uart->regs.msr |= UART_MSR_DDSR; - uart->regs.msr &= ~(UART_MSR_DCD | UART_MSR_RI - | UART_MSR_DSR | UART_MSR_CTS); - uart->regs.msr |= ((uart->regs.mcr & UART_MCR_AUX2) << 4); - uart->regs.msr |= ((uart->regs.mcr & UART_MCR_AUX1) << 4); - uart->regs.msr |= ((uart->regs.mcr & UART_MCR_RTS) << 3); - uart->regs.msr |= ((uart->regs.mcr & UART_MCR_DTR) << 5); - } -} - /* Reset. It initializes all registers of all UART devices to zero values, (re)opens all RX/TX file streams and places devices in memory address space. */ @@ -914,7 +903,6 @@ void uart_reset(void *dat) uart->vapi_buf_tail_ptr = 0; memset(uart->vapi_buf, 0, sizeof(uart->vapi_buf)); - SCHED_ADD (uart_clock16, dat, UART_CLOCK_DIVIDER); uart_sched_recv_check(uart); }

     
    Copyright (c) 1999 OPENCORES.ORG. All rights reserved.