summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhpa <hpa>2001-09-06 02:23:34 +0000
committerhpa <hpa>2001-09-06 02:23:34 +0000
commitf60b806fa5de0de039569f0cd2486ff0f26b200f (patch)
tree41e2a7235bba4dcb0f1707c8c92446b4613ec466
parentd9e969980fd6517cabd04b9321a3b88ff667ef3c (diff)
downloadsyslinux-1.64-pre1.tar.gz
First cut of "hardware" flowcontrol support for serial console.syslinux-1.64-pre1
-rw-r--r--NEWS5
-rw-r--r--isolinux.asm60
-rw-r--r--ldlinux.asm60
-rw-r--r--pxelinux.asm60
-rw-r--r--syslinux.doc13
-rw-r--r--version2
6 files changed, 144 insertions, 56 deletions
diff --git a/NEWS b/NEWS
index 6746e93d..22776e2a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,11 @@
Starting with 1.47, changes marked with SYSLINUX/PXELINUX/ISOLINUX
apply to that specific program only; other changes apply to both.
+Changes in 1.64:
+ * Limited support for hardware flow control when using a
+ serial port console.
+ * Support specifying the serial port I/O address explicitly.
+
Changes in 1.63:
* Make the ppmtolss16 program handle color conversion more
correctly.
diff --git a/isolinux.asm b/isolinux.asm
index 2830ecbf..3dc5e7ed 100644
--- a/isolinux.asm
+++ b/isolinux.asm
@@ -350,6 +350,7 @@ VidCols resb 1 ; Columns on screen-1
VidRows resb 1 ; Rows on screen-1
RetryCount resb 1 ; Used for disk access retries
KbdFlags resb 1 ; Check for keyboard escapes
+FlowControl resb 1 ; Serial port flow control
LoadFlags resb 1 ; Loadflags from kernel
A20Tries resb 1 ; Times until giving up on A20
FuncFlag resb 1 ; == 1 if <Ctrl-F> pressed
@@ -1187,37 +1188,50 @@ pc_serial: call getint ; "serial" command
call getint
jnc .valid_baud
mov ebx,DEFAULT_BAUD ; No baud rate given
-.valid_baud: pop di ; Serial port #
+.valid_baud:
+ push ebx
+ call getint ; Hardware flow control?
+ jnc .valid_flow
+ xor bx,bx ; Default -> no flow control
+.valid_flow:
+ mov [FlowControl],bl
+ pop ebx ; Baud rate
+ pop di ; Serial port #
cmp ebx,byte 75
jb parse_config_2 ; < 75 baud == bogus
mov eax,BAUD_DIVISOR
cdq
div ebx
push ax ; Baud rate divisor
- mov dx,di
+ cmp di,3
+ ja .port_is_io ; If port > 3 then port is I/O addr
shl di,1
- mov ax,[di+serial_base]
- mov [SerialPort],ax
- push ax ; Serial port base
- mov ax,00e3h ; INT 14h init parameters
- int 14h ; Init serial port
- pop bx ; Serial port base
- lea dx,[bx+3]
+ mov di,[di+serial_base]
+.port_is_io: mov [SerialPort],di
+ lea dx,[di+3] ; DX -> LCR
mov al,83h ; Enable DLAB
call slow_out
pop ax ; Divisor
- mov dx,bx
+ mov dx,di ; DX -> LS
call slow_out
- inc dx
+ inc dx ; DX -> MS
mov al,ah
call slow_out
mov al,03h ; Disable DLAB
- add dx,byte 2
+ add dx,byte 2 ; DX -> LCR
call slow_out
- sub dx,byte 2
+ sub dx,byte 2 ; DX -> IER
xor al,al ; IRQ disable
call slow_out
+ test byte [FlowControl],01h
+ jz .no_flow
+ add dx,byte 3 ; DX -> MCR
+ in al,dx
+ or al,03h ; DTR=1 RTS=1
+ call slow_out
+.no_flow:
+
; Show some life
mov si,isolinux_banner
call write_serial_str
@@ -3312,11 +3326,23 @@ write_serial:
and bx,bx
je .noserial
push ax
-.waitspace: lea dx,[bx+5] ; Wait for space in transmit reg
+.waitspace:
+ ; Wait for space in transmit register
+ lea dx,[bx+5] ; DX -> LSR
in al,dx
test al,20h
jz .waitspace
- xchg dx,bx
+
+ ; Wait for CTS to become available if applicable
+ test byte [FlowControl], 01h
+ jz .no_flow
+ inc dx ; DX -> MSR
+ in al,dx
+ test al,10h
+ jz .waitspace
+.no_flow:
+
+ xchg dx,bx ; DX -> THR
pop ax
call slow_out ; Send data
.noserial: popad
@@ -3424,9 +3450,9 @@ pollchar:
mov dx,[SerialPort]
and dx,dx
jz .done ; No serial port -> no input
- add dx,byte 5 ; Serial status register
+ add dx,byte 5 ; DX -> LSR
in al,dx
- test al,1 ; ZF = 0 if traffic
+ test al,1 ; ZF = 0 if data pending
.done: popad
ret
diff --git a/ldlinux.asm b/ldlinux.asm
index 3ffdc235..eae1102d 100644
--- a/ldlinux.asm
+++ b/ldlinux.asm
@@ -325,6 +325,7 @@ VidCols resb 1 ; Columns on screen-1
VidRows resb 1 ; Rows on screen-1
RetryCount resb 1 ; Used for disk access retries
KbdFlags resb 1 ; Check for keyboard escapes
+FlowControl resb 1 ; Serial port flow control
LoadFlags resb 1 ; Loadflags from kernel
A20Tries resb 1 ; Times until giving up on A20
FuncFlag resb 1 ; Escape sequences received from keyboard
@@ -1285,37 +1286,50 @@ pc_serial: call getint ; "serial" command
call getint
jnc .valid_baud
mov ebx,DEFAULT_BAUD ; No baud rate given
-.valid_baud: pop di ; Serial port #
+.valid_baud:
+ push ebx
+ call getint ; Hardware flow control?
+ jnc .valid_flow
+ xor bx,bx ; Default -> no flow control
+.valid_flow:
+ mov [FlowControl],bl
+ pop ebx ; Baud rate
+ pop di ; Serial port #
cmp ebx,byte 75
jb parse_config_2 ; < 75 baud == bogus
mov eax,BAUD_DIVISOR
cdq
div ebx
push ax ; Baud rate divisor
- mov dx,di
+ cmp di,3
+ ja .port_is_io ; If port > 3 then port is I/O addr
shl di,1
- mov ax,[di+serial_base]
- mov [SerialPort],ax
- push ax ; Serial port base
- mov ax,00e3h ; INT 14h init parameters
- int 14h ; Init serial port
- pop bx ; Serial port base
- lea dx,[bx+3]
+ mov di,[di+serial_base]
+.port_is_io: mov [SerialPort],di
+ lea dx,[di+3] ; DX -> LCR
mov al,83h ; Enable DLAB
call slow_out
pop ax ; Divisor
- mov dx,bx
+ mov dx,di ; DX -> LS
call slow_out
- inc dx
+ inc dx ; DX -> MS
mov al,ah
call slow_out
mov al,03h ; Disable DLAB
- add dx,byte 2
+ add dx,byte 2 ; DX -> LCR
call slow_out
- sub dx,byte 2
+ sub dx,byte 2 ; DX -> IER
xor al,al ; IRQ disable
call slow_out
+ test byte [FlowControl],01h
+ jz .no_flow
+ add dx,byte 3 ; DX -> MCR
+ in al,dx
+ or al,03h ; DTR=1 RTS=1
+ call slow_out
+.no_flow:
+
; Show some life
mov si,syslinux_banner
call write_serial_str
@@ -3251,11 +3265,23 @@ write_serial:
and bx,bx
je .noserial
push ax
-.waitspace: lea dx,[bx+5] ; Wait for space in transmit reg
+.waitspace:
+ ; Wait for space in transmit register
+ lea dx,[bx+5] ; DX -> LSR
in al,dx
test al,20h
jz .waitspace
- xchg dx,bx
+
+ ; Wait for CTS to become available if applicable
+ test byte [FlowControl], 01h
+ jz .no_flow
+ inc dx ; DX -> MSR
+ in al,dx
+ test al,10h
+ jz .waitspace
+.no_flow:
+
+ xchg dx,bx ; DX -> THR
pop ax
call slow_out ; Send data
.noserial: popad
@@ -3376,9 +3402,9 @@ pollchar:
mov dx,[SerialPort]
and dx,dx
jz .done ; No serial port -> no input
- add dx,byte 5 ; Serial status register
+ add dx,byte 5 ; DX -> LSR
in al,dx
- test al,1 ; ZF = 0 if traffic
+ test al,1 ; ZF = 0 if data pending
.done: popad
ret
diff --git a/pxelinux.asm b/pxelinux.asm
index 5a2d5a48..f2ae34a9 100644
--- a/pxelinux.asm
+++ b/pxelinux.asm
@@ -385,6 +385,7 @@ VidCols resb 1 ; Columns on screen-1
VidRows resb 1 ; Rows on screen-1
RetryCount resb 1 ; Used for disk access retries
KbdFlags resb 1 ; Check for keyboard escapes
+FlowControl resb 1 ; Serial port flow control
LoadFlags resb 1 ; Loadflags from kernel
A20Tries resb 1 ; Times until giving up on A20
FuncFlag resb 1 ; == 1 if <Ctrl-F> pressed
@@ -1002,37 +1003,50 @@ pc_serial: call getint ; "serial" command
call getint
jnc .valid_baud
mov ebx,DEFAULT_BAUD ; No baud rate given
-.valid_baud: pop di ; Serial port #
+.valid_baud:
+ push ebx
+ call getint ; Hardware flow control?
+ jnc .valid_flow
+ xor bx,bx ; Default -> no flow control
+.valid_flow:
+ mov [FlowControl],bl
+ pop ebx ; Baud rate
+ pop di ; Serial port #
cmp ebx,byte 75
jb parse_config_2 ; < 75 baud == bogus
mov eax,BAUD_DIVISOR
cdq
div ebx
push ax ; Baud rate divisor
- mov dx,di
+ cmp di,3
+ ja .port_is_io ; If port > 3 then port is I/O addr
shl di,1
- mov ax,[di+serial_base]
- mov [SerialPort],ax
- push ax ; Serial port base
- mov ax,00e3h ; INT 14h init parameters
- int 14h ; Init serial port
- pop bx ; Serial port base
- lea dx,[bx+3]
+ mov di,[di+serial_base]
+.port_is_io: mov [SerialPort],di
+ lea dx,[di+3] ; DX -> LCR
mov al,83h ; Enable DLAB
call slow_out
pop ax ; Divisor
- mov dx,bx
+ mov dx,di ; DX -> LS
call slow_out
- inc dx
+ inc dx ; DX -> MS
mov al,ah
call slow_out
mov al,03h ; Disable DLAB
- add dx,byte 2
+ add dx,byte 2 ; DX -> LCR
call slow_out
- sub dx,byte 2
+ sub dx,byte 2 ; DX -> IER
xor al,al ; IRQ disable
call slow_out
+ test byte [FlowControl],01h
+ jz .no_flow
+ add dx,byte 3 ; DX -> MCR
+ in al,dx
+ or al,03h ; DTR=1 RTS=1
+ call slow_out
+.no_flow:
+
; Show some life
mov si,pxelinux_banner
call write_serial_str
@@ -3318,11 +3332,23 @@ write_serial:
and bx,bx
je .noserial
push ax
-.waitspace: lea dx,[bx+5] ; Wait for space in transmit reg
+.waitspace:
+ ; Wait for space in transmit register
+ lea dx,[bx+5] ; DX -> LSR
in al,dx
test al,20h
jz .waitspace
- xchg dx,bx
+
+ ; Wait for CTS to become available if applicable
+ test byte [FlowControl], 01h
+ jz .no_flow
+ inc dx ; DX -> MSR
+ in al,dx
+ test al,10h
+ jz .waitspace
+.no_flow:
+
+ xchg dx,bx ; DX -> THR
pop ax
call slow_out ; Send data
.noserial: popad
@@ -3477,9 +3503,9 @@ pollchar:
mov dx,[SerialPort]
and dx,dx
jz .done ; No serial port -> no input
- add dx,byte 5 ; Serial status register
+ add dx,byte 5 ; DX -> LSR
in al,dx
- test al,1 ; ZF = 0 if traffic
+ test al,1 ; ZF = 0 if data pending
.done: popad
ret
diff --git a/syslinux.doc b/syslinux.doc
index 28a020f0..f3469864 100644
--- a/syslinux.doc
+++ b/syslinux.doc
@@ -201,11 +201,16 @@ TIMEOUT timeout
NOTE: The maximum possible timeout value is 35996; corresponding to
just below one hour.
-SERIAL port [baudrate]
+SERIAL port [[baudrate] flowcontrol]
Enables a serial port to act as the console. "port" is a
- number (0 = /dev/ttyS0 = COM1, etc.); if "baudrate" is
- omitted, the baud rate defaults to 9600 bps. The serial
- parameters are hardcoded to be 8 bits, no parity, 1 stop bit.
+ number (0 = /dev/ttyS0 = COM1, etc.) or an I/O port address
+ (e.g. 0x3F8); if "baudrate" is omitted, the baud rate defaults
+ to 9600 bps. The serial parameters are hardcoded to be 8
+ bits, no parity, 1 stop bit.
+
+ "flowcontrol" is a flag (0 = off, 1 = on), to support hardware
+ flowcontrol (RTS/CTS). Specifically, SYSLINUX will assert
+ DTR and RTS, and will honor incoming CTS.
For this directive to be guaranteed to work properly, it
should be the first directive in the configuration file.
diff --git a/version b/version
index 58e4eb6b..8725364a 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-1.63
+1.64