[Dosemu-cvs] dosemu/src/base/serial ser_defs.h,1.1.1.1,1.1.1.1.4.1 ser_init.c,1.1.2.1,1.1.2.2 ser_ir
Brought to you by:
bartoldeman
From: <bar...@us...> - 2003-10-03 16:02:00
|
Update of /cvsroot/dosemu/dosemu/src/base/serial In directory sc8-pr-cvs1:/tmp/cvs-serv15081/src/base/serial Modified Files: Tag: Release-1_2 ser_defs.h ser_init.c ser_irq.c ser_ports.c Log Message: Merge serial changes from Stas: - Switched serial to async IO - Use tcdrain() for non-FIFO data sends to minimize latencies - Some other small changes to reduce latencies. This allows to use dosemu's serial port emulation for the time-sensitive tasks. Index: ser_defs.h =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/base/serial/ser_defs.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.4.1 diff -u -d -r1.1.1.1 -r1.1.1.1.4.1 --- ser_defs.h 23 Jun 2003 00:02:08 -0000 1.1.1.1 +++ ser_defs.h 3 Oct 2003 16:01:55 -0000 1.1.1.1.4.1 @@ -308,5 +308,7 @@ inline int msr_compute_delta_bits(int oldmsr, int newmsr); int ser_open(int num); void ser_set_params(int num); +void receive_engine(int num); +void transmit_engine(int num); #endif /* SER_DEFS_H */ Index: ser_init.c =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/base/serial/ser_init.c,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- ser_init.c 17 Sep 2003 14:40:54 -0000 1.1.2.1 +++ ser_init.c 3 Oct 2003 16:01:55 -0000 1.1.2.2 @@ -199,6 +199,12 @@ return(0); } +static void async_serial_run(void) +{ + /* Currently the fd is not passed to function, so we just call serial_run() */ + s_printf("SERIAL: Async notification received\n"); + serial_run(); +} /* This function opens ONE serial port for DOSEMU. Normally called only * by do_ser_init below. [num = port, return = file descriptor] @@ -256,6 +262,7 @@ goto fail_close; } RPT_SYSCALL(tcgetattr(com[num].fd, &com[num].oldset)); + add_to_io_select(com[num].fd, 1, async_serial_run); return com[num].fd; fail_close: @@ -357,6 +364,7 @@ { int i; s_printf("SER%d: Running ser_close\n",num); + remove_from_io_select(com[num].fd, 1); uart_clear_fifo(num,UART_FCR_CLEAR_CMD); /* save current dosemu settings of the file and restore the old settings Index: ser_irq.c =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/base/serial/ser_irq.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.4.1 diff -u -d -r1.1.1.1 -r1.1.1.1.4.1 --- ser_irq.c 23 Jun 2003 00:02:08 -0000 1.1.1.1 +++ ser_irq.c 3 Oct 2003 16:01:55 -0000 1.1.1.1.4.1 @@ -101,7 +101,7 @@ * and checking if it's time to generate a hardware interrupt (RDI). * [num = port] */ -static void receive_engine(int num) /* Internal 16550 Receive emulation */ +void receive_engine(int num) /* Internal 16550 Receive emulation */ { if (com[num].MCR & UART_MCR_LOOP) return; /* Return if loopback */ @@ -135,7 +135,7 @@ * of the XMIT FIFO/THR register, and checking if it's time to generate * a hardware interrupt (THRI). [num = port] */ -static void transmit_engine(int num) /* Internal 16550 Transmission emulation */ +void transmit_engine(int num) /* Internal 16550 Transmission emulation */ { int rtrn; int control; Index: ser_ports.c =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/base/serial/ser_ports.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.4.1 diff -u -d -r1.1.1.1 -r1.1.1.1.4.1 --- ser_ports.c 23 Jun 2003 00:02:08 -0000 1.1.1.1 +++ ser_ports.c 3 Oct 2003 16:01:55 -0000 1.1.1.1.4.1 @@ -101,7 +101,7 @@ /* Move existing chars in receive buffer to the start of buffer */ for(i = 0; i < com[num].rx_buf_bytes; i++) - com[num].rx_buf[i] = com[num].rx_buf[com[num].rx_buf_start++]; + com[num].rx_buf[i] = com[num].rx_buf[com[num].rx_buf_start + i]; /* Update start and end pointers in buffer */ com[num].rx_buf_start = 0; @@ -119,7 +119,7 @@ */ void uart_fill(int num) { - int size; + int size = 0; /* Return if in loopback mode */ if (com[num].MCR & UART_MCR_LOOP) return; @@ -180,6 +180,8 @@ } /* Else, the following code executes if emulated UART is in 16450 mode. */ + if(s3_printf) s_printf("SER%d: Got %i bytes, %i in buffer\n",num, + size, com[num].rx_buf_bytes); com[num].rx_timeout = 0; /* Reset receive timeout */ com[num].LSRqueued |= UART_LSR_DR; /* Update queued LSR */ if(s3_printf) s_printf("SER%d: Func uart_fill requesting RX_INTR\n",num); @@ -195,6 +197,8 @@ void uart_clear_fifo(int num, int fifo) { /* DANG_FIXTHIS Should clearing UART cause THRE int if it's enabled? */ + + if(s1_printf) s_printf("SER%d: Clear FIFO.\n",num); /* Clear the receive FIFO */ if (fifo & UART_FCR_CLEAR_RCVR) { @@ -696,10 +700,13 @@ rtrn = RPT_SYSCALL(write(com[num].fd, &val, 1)); /* Attempt char xmit */ if (rtrn != 1) /* Did transmit fail? */ com[num].tx_overflow = 1; /* Set overflow flag */ + else tcdrain(com[num].fd); } if (!com[num].fifo_enable || com[num].tx_buf_bytes >= (TX_BUFFER_SIZE-1)) /* Is FIFO full? */ com[num].LSR &= ~UART_LSR_THRE; /* THR full */ + + transmit_engine(num); } @@ -845,6 +852,10 @@ /* Set interrupt enable flag according to OUT2 bit in MCR */ com[num].int_enab = (val & UART_MCR_OUT2) ? 1 : 0; + if (com[num].int_enab) { + if(s3_printf) s_printf("SER%d: Update interrupt status after MCR update\n",num); + serial_int_engine(num, 0); /* Update interrupt status */ + } /* Force RTS & DTR reinitialization if the loopback state has changed */ if (UART_MCR_LOOP) changed |= UART_MCR_RTS | UART_MCR_DTR; @@ -1080,7 +1091,7 @@ com[num].tx_trigger = 1; } com[num].IER = (val & 0xF); /* Write to IER */ - if(s1_printf) s_printf("SER%d: IER = 0x%x\n", num, val); + if(s1_printf) s_printf("SER%d: Write IER = 0x%x\n", num, val); serial_int_engine(num, 0); /* Update interrupt status */ } break; |