^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) =======================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) The Framebuffer Console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) =======================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) The framebuffer console (fbcon), as its name implies, is a text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) console running on top of the framebuffer device. It has the functionality of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) any standard text console driver, such as the VGA console, with the added
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) features that can be attributed to the graphical nature of the framebuffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) In the x86 architecture, the framebuffer console is optional, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) some even treat it as a toy. For other architectures, it is the only available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) display device, text or graphical.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) What are the features of fbcon? The framebuffer console supports
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) high resolutions, varying font types, display rotation, primitive multihead,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) etc. Theoretically, multi-colored fonts, blending, aliasing, and any feature
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) made available by the underlying graphics card are also possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) A. Configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) ================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) The framebuffer console can be enabled by using your favorite kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) configuration tool. It is under Device Drivers->Graphics Support->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) Console display driver support->Framebuffer Console Support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) Select 'y' to compile support statically or 'm' for module support. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) module will be fbcon.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) In order for fbcon to activate, at least one framebuffer driver is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) required, so choose from any of the numerous drivers available. For x86
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) systems, they almost universally have VGA cards, so vga16fb and vesafb will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) always be available. However, using a chipset-specific driver will give you
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) more speed and features, such as the ability to change the video mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) dynamically.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) To display the penguin logo, choose any logo available in Graphics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) support->Bootup logo.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) Also, you will need to select at least one compiled-in font, but if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) you don't do anything, the kernel configuration tool will select one for you,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) usually an 8x16 font.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) GOTCHA: A common bug report is enabling the framebuffer without enabling the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) framebuffer console. Depending on the driver, you may get a blanked or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) garbled display, but the system still boots to completion. If you are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) fortunate to have a driver that does not alter the graphics chip, then you
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) will still get a VGA console.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) B. Loading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ==========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) Possible scenarios:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 1. Driver and fbcon are compiled statically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) Usually, fbcon will automatically take over your console. The notable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) exception is vesafb. It needs to be explicitly activated with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) vga= boot option parameter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) 2. Driver is compiled statically, fbcon is compiled as a module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) Depending on the driver, you either get a standard console, or a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) garbled display, as mentioned above. To get a framebuffer console,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) do a 'modprobe fbcon'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) 3. Driver is compiled as a module, fbcon is compiled statically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) You get your standard console. Once the driver is loaded with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) 'modprobe xxxfb', fbcon automatically takes over the console with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) the possible exception of using the fbcon=map:n option. See below.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 4. Driver and fbcon are compiled as a module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) You can load them in any order. Once both are loaded, fbcon will take
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) over the console.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) C. Boot options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) The framebuffer console has several, largely unknown, boot options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) that can change its behavior.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) 1. fbcon=font:<name>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) Select the initial font to use. The value 'name' can be any of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) compiled-in fonts: 10x18, 6x10, 6x8, 7x14, Acorn8x8, MINI4x6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) PEARL8x8, ProFont6x11, SUN12x22, SUN8x16, TER16x32, VGA8x16, VGA8x8.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) Note, not all drivers can handle font with widths not divisible by 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) such as vga16fb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) 2. fbcon=map:<0123>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) This is an interesting option. It tells which driver gets mapped to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) which console. The value '0123' is a sequence that gets repeated until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) the total length is 64 which is the number of consoles available. In
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) the above example, it is expanded to 012301230123... and the mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) will be::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) tty | 1 2 3 4 5 6 7 8 9 ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) fb | 0 1 2 3 0 1 2 3 0 ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) ('cat /proc/fb' should tell you what the fb numbers are)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) One side effect that may be useful is using a map value that exceeds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) the number of loaded fb drivers. For example, if only one driver is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) available, fb0, adding fbcon=map:1 tells fbcon not to take over the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) console.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) Later on, when you want to map the console the to the framebuffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) device, you can use the con2fbmap utility.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 3. fbcon=vc:<n1>-<n2>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) This option tells fbcon to take over only a range of consoles as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) specified by the values 'n1' and 'n2'. The rest of the consoles
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) outside the given range will still be controlled by the standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) console driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) NOTE: For x86 machines, the standard console is the VGA console which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) is typically located on the same video card. Thus, the consoles that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) are controlled by the VGA console will be garbled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 4. fbcon=rotate:<n>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) This option changes the orientation angle of the console display. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) value 'n' accepts the following:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) - 0 - normal orientation (0 degree)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) - 1 - clockwise orientation (90 degrees)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) - 2 - upside down orientation (180 degrees)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) - 3 - counterclockwise orientation (270 degrees)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) The angle can be changed anytime afterwards by 'echoing' the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) numbers to any one of the 2 attributes found in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /sys/class/graphics/fbcon:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) - rotate - rotate the display of the active console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) - rotate_all - rotate the display of all consoles
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) Console rotation will only become available if Framebuffer Console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) Rotation support is compiled in your kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) NOTE: This is purely console rotation. Any other applications that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) use the framebuffer will remain at their 'normal' orientation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) Actually, the underlying fb driver is totally ignorant of console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) rotation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 5. fbcon=margin:<color>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) This option specifies the color of the margins. The margins are the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) leftover area at the right and the bottom of the screen that are not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) used by text. By default, this area will be black. The 'color' value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) is an integer number that depends on the framebuffer driver being used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 6. fbcon=nodefer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) If the kernel is compiled with deferred fbcon takeover support, normally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) the framebuffer contents, left in place by the firmware/bootloader, will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) be preserved until there actually is some text is output to the console.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) This option causes fbcon to bind immediately to the fbdev device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 7. fbcon=logo-pos:<location>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) The only possible 'location' is 'center' (without quotes), and when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) given, the bootup logo is moved from the default top-left corner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) location to the center of the framebuffer. If more than one logo is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) displayed due to multiple CPUs, the collected line of logos is moved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) as a whole.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 8. fbcon=logo-count:<n>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) The value 'n' overrides the number of bootup logos. 0 disables the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) logo, and -1 gives the default which is the number of online CPUs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) C. Attaching, Detaching and Unloading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) Before going on to how to attach, detach and unload the framebuffer console, an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) illustration of the dependencies may help.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) The console layer, as with most subsystems, needs a driver that interfaces with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) the hardware. Thus, in a VGA console::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) console ---> VGA driver ---> hardware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) Assuming the VGA driver can be unloaded, one must first unbind the VGA driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) from the console layer before unloading the driver. The VGA driver cannot be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) unloaded if it is still bound to the console layer. (See
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) Documentation/driver-api/console.rst for more information).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) This is more complicated in the case of the framebuffer console (fbcon),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) because fbcon is an intermediate layer between the console and the drivers::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) console ---> fbcon ---> fbdev drivers ---> hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) The fbdev drivers cannot be unloaded if bound to fbcon, and fbcon cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) be unloaded if it's bound to the console layer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) So to unload the fbdev drivers, one must first unbind fbcon from the console,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) then unbind the fbdev drivers from fbcon. Fortunately, unbinding fbcon from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) the console layer will automatically unbind framebuffer drivers from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) fbcon. Thus, there is no need to explicitly unbind the fbdev drivers from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) fbcon.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) So, how do we unbind fbcon from the console? Part of the answer is in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) Documentation/driver-api/console.rst. To summarize:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) Echo a value to the bind file that represents the framebuffer console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) driver. So assuming vtcon1 represents fbcon, then::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) echo 1 > sys/class/vtconsole/vtcon1/bind - attach framebuffer console to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) console layer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) echo 0 > sys/class/vtconsole/vtcon1/bind - detach framebuffer console from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) console layer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) If fbcon is detached from the console layer, your boot console driver (which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) usually VGA text mode) will take over. A few drivers (rivafb and i810fb) will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) restore VGA text mode for you. With the rest, before detaching fbcon, you
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) must take a few additional steps to make sure that your VGA text mode is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) restored properly. The following is one of the several methods that you can do:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 1. Download or install vbetool. This utility is included with most
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) distributions nowadays, and is usually part of the suspend/resume tool.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 2. In your kernel configuration, ensure that CONFIG_FRAMEBUFFER_CONSOLE is set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) to 'y' or 'm'. Enable one or more of your favorite framebuffer drivers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 3. Boot into text mode and as root run::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) vbetool vbestate save > <vga state file>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) The above command saves the register contents of your graphics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) hardware to <vga state file>. You need to do this step only once as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) the state file can be reused.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 4. If fbcon is compiled as a module, load fbcon by doing::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) modprobe fbcon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 5. Now to detach fbcon::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) vbetool vbestate restore < <vga state file> && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) echo 0 > /sys/class/vtconsole/vtcon1/bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 6. That's it, you're back to VGA mode. And if you compiled fbcon as a module,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) you can unload it by 'rmmod fbcon'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 7. To reattach fbcon::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) echo 1 > /sys/class/vtconsole/vtcon1/bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 8. Once fbcon is unbound, all drivers registered to the system will also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) become unbound. This means that fbcon and individual framebuffer drivers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) can be unloaded or reloaded at will. Reloading the drivers or fbcon will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) automatically bind the console, fbcon and the drivers together. Unloading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) all the drivers without unloading fbcon will make it impossible for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) console to bind fbcon.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) Notes for vesafb users:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) =======================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) Unfortunately, if your bootline includes a vga=xxx parameter that sets the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) hardware in graphics mode, such as when loading vesafb, vgacon will not load.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) Instead, vgacon will replace the default boot console with dummycon, and you
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) won't get any display after detaching fbcon. Your machine is still alive, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) you can reattach vesafb. However, to reattach vesafb, you need to do one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) the following:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) Variation 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) a. Before detaching fbcon, do::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) vbetool vbemode save > <vesa state file> # do once for each vesafb mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) # the file can be reused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) b. Detach fbcon as in step 5.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) c. Attach fbcon::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) vbetool vbestate restore < <vesa state file> && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) echo 1 > /sys/class/vtconsole/vtcon1/bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) Variation 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) a. Before detaching fbcon, do::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) echo <ID> > /sys/class/tty/console/bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) vbetool vbemode get
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) b. Take note of the mode number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) b. Detach fbcon as in step 5.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) c. Attach fbcon::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) vbetool vbemode set <mode number> && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) echo 1 > /sys/class/vtconsole/vtcon1/bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) Samples:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) ========
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) Here are 2 sample bash scripts that you can use to bind or unbind the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) framebuffer console driver if you are on an X86 box::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) # Unbind fbcon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) # Change this to where your actual vgastate file is located
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) # Or Use VGASTATE=$1 to indicate the state file at runtime
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) VGASTATE=/tmp/vgastate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) # path to vbetool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) VBETOOL=/usr/local/bin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) for (( i = 0; i < 16; i++))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) if test -x /sys/class/vtconsole/vtcon$i; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) = 1 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if test -x $VBETOOL/vbetool; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) echo Unbinding vtcon$i
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) $VBETOOL/vbetool vbestate restore < $VGASTATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) echo 0 > /sys/class/vtconsole/vtcon$i/bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) ---------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) ::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) # Bind fbcon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) for (( i = 0; i < 16; i++))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if test -x /sys/class/vtconsole/vtcon$i; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) = 1 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) echo Unbinding vtcon$i
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) echo 1 > /sys/class/vtconsole/vtcon$i/bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) Antonino Daplas <adaplas@pol.net>