diff options
author | hpa <hpa> | 2001-09-06 02:23:34 +0000 |
---|---|---|
committer | hpa <hpa> | 2001-09-06 02:23:34 +0000 |
commit | f60b806fa5de0de039569f0cd2486ff0f26b200f (patch) | |
tree | 41e2a7235bba4dcb0f1707c8c92446b4613ec466 | |
parent | d9e969980fd6517cabd04b9321a3b88ff667ef3c (diff) | |
download | syslinux-1.64-pre1.tar.gz |
First cut of "hardware" flowcontrol support for serial console.syslinux-1.64-pre1
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | isolinux.asm | 60 | ||||
-rw-r--r-- | ldlinux.asm | 60 | ||||
-rw-r--r-- | pxelinux.asm | 60 | ||||
-rw-r--r-- | syslinux.doc | 13 | ||||
-rw-r--r-- | version | 2 |
6 files changed, 144 insertions, 56 deletions
@@ -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. @@ -1 +1 @@ -1.63 +1.64 |