Return to BSD News archive
Newsgroups: comp.os.386bsd.questions Path: sserve!newshost.anu.edu.au!munnari.oz.au!constellation!osuunx.ucc.okstate.edu!moe.ksu.ksu.edu!vixen.cso.uiuc.edu!howland.reston.ans.net!usc!news.isi.edu!gremlin!lazarus.nrtc.northrop.com!dec From: dec@lazarus.nrtc.northrop.com (Dwight E. Cass) Subject: [FreeBSD 1.0 Release/syscons]: My keyboard goes away under X Message-ID: <CGI211.u0@gremlin.nrtc.northrop.com> Summary: syscons mini-FAQ Keywords: FreeBSD, syscons Sender: news@gremlin.nrtc.northrop.com (Usenet News Manager) Organization: Northrop Automation Sciences Laboratory, Pico Rivera, CA Date: Sun, 14 Nov 1993 20:53:24 GMT Lines: 403 As many of you are now aware, FreeBSD 1.0 RELEASE has done something to aggravate the problem with loosing your keyboard under X. The problem as I understand it, is that the system has to deal with two different devices referencing the same physical device in two different modes (/dev/vga in raw mode and /dev/console and translated mode). Over time, the system forgets which of these devices really owns the keyboard and X looses. One workaround to this problem is to upgrade to the syscons console driver. However, its not quite that simple, and there are a few pitfalls (all of which I fell into :-) ) which you should watch out for when doing this upgrade. So, the following is a long summary of what I have learned, done as a mini-FAQ, and I hope it helps you. 1. What is syscons? [The following is a reduction of information from the syscons-0.1.tar file originally on ref.tfs.com with the current information verified by examination of the code] syscons is an "enhanced" version of the pccons console driver, which supports up to twelve (12) virtual consoles (VTYs) selectable via changeable key sequences, a text mode screen saver (displays a field of stars), some SCO ANSI ESC sequences including ANSI color attributes, insert/delete line/character, 80x25 and 80x50 text modes on vga displays, and a collection of various SYSV386/SCO compatible ioctls including: KDGKBMODE Get keyboard mode (RAW, XLATE) KDSKBMODE Set keyboard mode KDMKTONE Sound the bell KIOCSOUND Generate a specific Hz tone KDGETMODE Get display mode (TEXT, GRAPHICS) KDSETMODE Set display mode (TEXT, GRAPHICS, and a non-restoring TEXT mode) KDENABIO Allow IO operations KDDISABIO Disallow IO operations KDGKBTYPE Get keyboard type (not yet implemented) KDGETLED Get LED status KDSETLED Set LED status KDSETRAD Set keyboard delay & repeat rate KDSBORDER Set display border KDGKBSTATE Get keyboard state KDSKBSTATE Set keyboard state GIO_KEYMAP Get keyboard mapping table PIO_KEYMAP Set Keyboard mapping table GIO_SCRNMAP Get screen output translation map PIO_SCRNMAP Set screen output translation map GIO_FONTXX Get size XX font, where XX is 8x8, 8x14, or 8x16 PIO_FONTXX Set size XX font GETFKEY Get function key definition SETFKEY Set function key definition CONS_BLANKTIME Set screensaver timeout CONS_80x25TEXT Set 80x25 char text mode CONS_80x50TEXT Set 80x50 char text mode CONS_GETVERS Get current syscons version CONS_GETINFO Get current vty display state VT_GETMODE Get screen switcher mode VT_SETMODE Set screen switcher mode VT_RELDISP Primary screen switcher IOCTL VT_OPENQRY Get next free VTY VT_GETACTIVE Get number of active VTYs VT_ACTIVATE Switch to specific VTY VT_WAITACTIVATE Wait for switch to happen CONSOLE_X_MODE? Support for old way of doing X support 1a. What are the syscons ANSI ESC sequences? The following ANSI ESC sequences are supported (\E = ESCape): \EM Up 1 line and scroll if at top of screen \Ec Move cursor home and clear screen \r Move cursor to beginning of row \n Move down one row \E[r;cf Move cursor to row r, column c \E[r;cH Move cursor to row r, column c (same as above) \E[rJ Clear display, r specifies type of clear operation: r = 0: Clear from cursor to end of display (default) r = 1: Clear from beginning of display to cursor r = 2: Clear entire display \E[rK Clear line, r specified type of clear operation: r = 0: Clear from cursor to end of line (default) r = 1: Clear from beginning of line to cursor r = 2: Clear entire line \E[rz Switch to VTY r (r = 0: /dev/ttyv0), default is don't switch. \E[=p;dB Change bell duration to pitch p (in Hz) and duration d (in 1/10ths of a second) \E[=t;bC Change cursor shape to start at scan line t and end at scan line b \E[x;y;zm Change display attributes, x, y, and z can be: 0: reset to normal 1: bold text 4: underline 5: blink 7: reverse video 30: black foreground color 31: blue foreground color 32: green foreground color 33: cyan foreground color 34: red foreground color 35: violet foreground color 36: orange foreground color 37: light gray foreground color 40-47: same as 30-37, except background color For the following sequences, r defaults to 1: \E[rA Move up r rows \E[rB Move down r rows \E[re Move down r rows \E[rC Move right r columns \E[ra Move right r columns \E[rD Move left r columns \E[rE Move cursor to start of line and r lines down \E[rF Move cursor to start of line and r lines up \E[rL Insert r lines at after the current row \E[rM Delete r lines starting with the current row \E[r@ Insert r characters after current column \E[rP Delete r characters starting with current column \E[rX Delete r characters starting with current column, but only from the current row \E[rS Scroll up r rows \E[rT Scroll down r rows \E[rZ Move backwards r tabstops \E[r` Move cursor to column r \E[rd Move cursor to row r For the following sequences, ANSI colors are defined as: 0 black 8 dark grey 1 dark red 9 bright red 2 green 10 bright green 3 orange 11 yellow 4 blue 12 bright blue 5 violet 13 bright violet 6 cyan 14 bright cyan 7 light grey 15 white and Direct colors are defined as: 0 black 8 dark grey 1 blue 9 bright blue 2 green 10 bright green 3 cyan 11 bright cyan 4 red 12 bright red 5 violet 13 bright violet 6 orange 14 yellow 7 light grey 15 white \E[x;yx Change display attributes x = 0: reset attributes x = 1: set ANSI normal background color, y = ANSI color x = 2: set ANSI normal foreground color, y = ANSI color x = 3: set normal color directly, colors numbers are expressed in decimal using the direct color map, but are bit encoded as two 4 bit field, background and foreground. Thus, a blue background with yellow foreground is \E[3;30x (30 = 0x1E) x = 5: set ANSI reverse video background color, y = ANSI color x = 6: set ANSI reverse video foreground color, use y = ANSI color x = 7: set reverse video color directly, use colors from x = 3 \E[=yA Change display border color, y = Direct color \E[=yF Set ANSI normal foreground color, y = ANSI color \E[=yG Set ANSI normal background color, y = ANSI color \E[=yH Set ANSI reverse video foreground color, y = ANSI color \E[=yI Set ANSI reverse video background color, y = ANSI color 2. How do you switch from pccons to syscons? From the kernel point of view, this is a really easy job. First, you will need to modify your kernel configuration file and change the following line: device pc0 at isa? port "IO_KBD" tty irq 1 vector pcrint to the following (arrows indicate the only changes): device sc0 at isa? port "IO_KBD" tty irq 1 vector scintr ^^^ ^^^^^^ You should also specify a number of virtual consoles (VTYs). To do this, add the line: options "NCONS=N" # N = number of virtual consoles desired ** For X support, you MUST specify at least two virtual consoles. ** Once your configuration file has been modified, rebuild your kernel. Before you reboot, you must also create the virtual console devices and modify your /etc/ttys to know about these new consoles. To make the new devices: cd /dev ./MAKEDEV vtyN # N = number of virtual consoles configured rm /dev/vga # You will no longer need this... The MAKEDEV script will generate a collection of /dev/ttyv? devices, one for each virtual console, from 0 to b. You must now change your /etc/ttys file to use these devices. In the simplest case (just to make sure you can reboot), simply change the first line: vga "/usr/libexec/getty Pc" pc3 on secure to the following: ttyv0 "/usr/libexec/getty Pc" pc3 on secure ^^^^^ This will start a getty on at least the console device. If you want gettys on other virtual consoles you can add additional lines, such as: ttyv1 "/usr/libexec/getty Pc" pc3 on secure ttyv2 "/usr/libexec/getty Pc" pc3 on secure *** WARNING: MAKE SURE THAT THERE IS AT LEAST ONE FREE VTY FOR X *** At this point, you can reboot your system, and you should now be running the syscons console driver - congratulations! 2a. Is pc3 still the right terminal type for syscons? pc3 seems to work fine for syscons (and I actually like how well it does work), but there are people who suggest switching to cons25, the ANSI 80x25 terminal definition. I think the best thing to do is to build a new termcap entry specifically for syscons (I am working on such an entry right now), but until then, its your choice. 3. How do I make XFree86 use syscons? XFree86 version 2.0 has the code to detect and use the syscons virtual console (VTY) mechanisms. If you are running XFree86 version 1.3, all you have to do is grab the XFree86-2.0-SVGA.tar.gz file, extract the server and replace the /usr/X386/bin/XF86_SVGA program. When you next start X - it will tell you that it has seen syscons version 1.0, and which VTY has been allocated for this X display. 3a. But XFree86 1.2 and XFree86 1.3 are running just fine - why change? The problem is that neither XFree86 1.2 and 1.3 know about syscons VTYs. These versions of X use the pccons CONSOLE_X_MODE? ioctls to enter and exit X mode. As such, you are right back to same problem, and if you were loosing your keyboard with pccons, you will loose your keyboard in this mode. 3b. Why do I have to have a free VTY for X? The problem you are trying to avoid is having both X and tty mode on the device used as /dev/console. When this condition occurs under FreeBSD 1.0 RELEASE - X looses. As such, allowing X to use a free VTY leaves your actual console (/dev/ttyv0) in text mode and everything continues to work fine. As far as I am concerned: THIS IS A WORKAROUND TO A BUG IN FreeBSD. 3c. I only configured one VTY and X came up just fine - so what's the problem? If XFree86 2.0 is unable to find a free VTY, it will attempt to simply change the mode of the current VTY. Again, the problem is that you are back to the original pccons bug: you have both X and tty mode on the device used as /dev/console - X looses. 3d. So I have X started on a free VTY and now I see a collection of error messages after X starts on /dev/ttyv0 - why? xinit passes the stdout file descriptor to the .xinitrc script. Now that the console device is left in text mode, any errors being reported by that script are appearing on the stdout device. 3e. I run xdm and don't have a getty on /dev/vga, do I now have to run a getty on /dev/ttyv0? No - /dev/ttyv0 will remain an output only console device. 4. How do you switch from VTY to VTY in syscons? The default magic sequence is: hold down CTRL and ALT, then press the function key for the VTY which you want to switch to. For example, to switch to /dev/ttyv0 - hold down CTRL and ALT then press F1. This will work to switch back and forth between text and X sessions. 4a. I switched to a new VTY and now it thinks all my characters are control characters - why? There is a race condition when a VTY switch happens which causes the new VTY to sometimes become confused about the state of the CTRL and ALT keys. I have found that you need to hold both of these keys down until the screen stablizes then release them both. If you forget (as I often do), just press and release both buttons to reset the correct state. 5. Can I now run more than one X display? YES. The first time you start X (via either startx or xinit), X will default to using display 0, screen 0 (:0.0). To start another X session, you need to start another display, thus if you are using startx, you would type: startx -- :1 That would allocate the next available VTY, and start display one on that VTY. WARNING: Only use this command from a text mode VTY! 5a. Oops - I started X from within an xterm and now the display has gone crazy and I think my machine is burning up (actually, the speaker is crackling loudly). What happened? There seems to be a bug in syscons which causes it to get very confused when you use an ioctl to initiate a programmatic switch from a graphics mode VTY to a graphics mode VTY. I have found that sometimes you can get the console back by using the keyboard sequence to switch to another VTY - but generally this is reboot the system time. 6. Is there a utility program to get to some of the other syscons features? Yes - the syscons program allows you to change the screen saver timeout (or disable it altogether), change the screen size, change the keyboard delay and repeat rates, switch VTYs, program a function key, and install screen output maps, keyboard maps, and fonts. There is a man page available (man syscons) to describe how to use this program. 6a. Can I use the syscons program to add "Switch to VTY X" commands to my X window manager menus? NO. The following obvious command, executed from a VTY, does work: syscons -t 1 < /dev/ttyv0 However, as mentioned in 5a, syscons will get confused if you attempt to use an ioctl to programmatically switch from a VTY in graphics mode to a VTY in graphics mode. This WILL work to switch from X to a text mode VTY. 6b. Is there any programmatic method for switching between VTYs that does work? Yes - the \E[rz sequence seems to have no problem in switching between VTYs. Remember that r = 0 for /dev/ttyv0, thus the sequence is \E[0z to switch to the console. Remember that this sequence must be sent to a syscons terminal. I have found that echoing to stdout from my window manager works just fine, or you can echo directly to /dev/ttyv0 (or any syscons VTY). 6c. I want to switch to /dev/ttyv0 using syscons - why do I have to say: -t 1? Remember the /dev/com?? numbering issue? Unix devices typically start with 0, but syscons thinks the first VTY is number 1. Unlike the /dev/com issue (we are trying to forget DOS, right?), there is a reason for thinking of the first VTY as number 1 - the VTY numbering matches their corresponding function keys (F1 is VTY1, F2 is VTY2, etc.). 7. I have an ET4000 VGA card and like the 80x50 text mode, but when I start X it has clock selection problems. What's wrong? [The following is from /usr/X386/lib/X11/etc/README.tseng from the XFree86 version 2.0 distribution]. XFree86 has some problems getting the clock selection right with some ET4000 boards when the server is started from a high-resolution text mode. The clock selection is always correct when the server is started from a standard 80x25 text mode. This problem is indicated when the reported clocks are different when the server is started from the high-resolution text mode from what they are when it is started from the 80x25 text mode. To allow the server to work correctly from the high-resolution text mode, there are some Option flags that may be set in Xconfig. To find out which flags to set, start the server with the -probeonly flag from an 80x25 text mode and look at the information printed by the server. If the line: VGAXXX: ET4000: Initial hibit state: low is printed, put the following in the VGA256 and VGA2 sections of your Xconfig: Option "hibit_low" If the line: VGAXXX: ET4000: Initial hibit state: high is printed, put the following in the VGA256 and VGA2 sections of your Xconfig: Option "hibit_high" I hope this helps everyone avoid the mistakes I made. /dec Dwight E. Cass dec@nrtc.northrop.com | You are in a Automation Sciences Laboratory, Northrop Corporation | twisty maze of 8900 East Washington Blvd, Pico Rivera CA 90660-3783 | Sendmail rules, (310) 948-9981 | all obscure...