C. Attaching, Detaching and Unloading
-It's possible to detach/attach the framebuffer console from the vt layer by
-echoing anything to the following sysfs attributes found
-/sys/class/graphics/fbcon.
+Before going on on how to attach, detach and unload the framebuffer console, an
+illustration of the dependencies may help.
- attach - attach framebuffer console to vt layer
- detach - detach framebuffer console to vt layer
+The console layer, as with most subsystems, needs a driver that interfaces with
+the hardware. Thus, in a VGA console:
-If fbcon is detached from the vt layer, your boot console driver (which is
+console ---> VGA driver ---> hardware.
+
+Assuming the VGA driver can be unloaded, one must first unbind the VGA driver
+from the console layer before unloading the driver. The VGA driver cannot be
+unloaded if it is still bound to the console layer. (See
+Documentation/console/console.txt for more information).
+
+This is more complicated in the case of the the framebuffer console (fbcon),
+because fbcon is an intermediate layer between the console and the drivers:
+
+console ---> fbcon ---> fbdev drivers ---> hardware
+
+The fbdev drivers cannot be unloaded if it's bound to fbcon, and fbcon cannot
+be unloaded if it's bound to the console layer.
+
+So to unload the fbdev drivers, one must first unbind fbcon from the console,
+then unbind the fbdev drivers from fbcon. Fortunately, unbinding fbcon from
+the console layer will automatically unbind framebuffer drivers from
+fbcon. Thus, there is no need to explicitly unbind the fbdev drivers from
+fbcon.
+
+So, how do we unbind fbcon from the console? Part of the answer is in
+Documentation/console/console.txt. To summarize:
+
+Echo the ID number of the 'frame buffer driver' to:
+
+sys/class/tty/console/bind - attach framebuffer console to console layer
+sys/class/tty/console/unbind - detach framebuffer console from console layer
+
+If fbcon is detached from the console layer, your boot console driver (which is
usually VGA text mode) will take over. A few drivers (rivafb and i810fb) will
restore VGA text mode for you. With the rest, before detaching fbcon, you
must take a few additional steps to make sure that your VGA text mode is
5. Now to detach fbcon:
- vbetool vbestate restore < <vga state file> && \
- echo 1 > /sys/class/graphics/fbcon/detach
+ 'cat /sys/class/tty/console/backend' and take note of the ID
-6. That's it, you're back to VGA mode. And if you compiled your drivers as
- modules, you can unload them at will. So if you want to change your driver
- from xxxfb to yyyfb, you can do this:
+The above is probably needed only once. Then:
- detach fbcon
- rmmod xxxfb
- modprobe yyyfb
+ vbetool vbestate restore < <vga state file> && \
+ echo <ID> > /sys/class/tty/console/unbind
- Of course, con2fbmap can do the same thing but will not work if xxxfb
- and yyyfb are not compatible (ie, cannot be loaded at the same time).
+6. That's it, you're back to VGA mode. And if you compiled fbcon as a module,
+ you can unload it by 'rmmod fbcon'
7. To reattach fbcon:
- echo 1 > /sys/class/graphics/fbcon/attach
+ echo <ID> > /sys/class/tty/console/bind
-8. Once the framebuffer console is detached, and if it is compiled as a module,
-the module can be unloaded with 'rmmod fbcon'. This feature is great for
-developers.
+8. Once fbcon is unbound, all drivers registered to the system will also
+become unbound. This means that fbcon and individual framebuffer drivers
+can be unloaded or reloaded at will. Reloading the drivers or fbcon will
+automatically bind the console, fbcon and the drivers together. Unloading
+all the drivers without unloading fbcon will make it impossible for the
+console to bind fbcon.
Notes for vesafb users:
=======================
c. Attach fbcon
vbetool vbestate restore < <vesa state file> && \
- echo 1 > /sys/class/graphics/fbcon/attach
-
Variation 2:
a. Before detaching fbcon, do:
+ echo <ID> > /sys/class/tty/console/bind
+
vbetool vbemode get
c. Attach fbcon:
vbetool vbemode set <mode number> && \
- echo 1 > /sys/class/graphics/fbcon/attach
+ echo <ID> > /sys/class/tty/console/bind
--
Antonino Daplas <adaplas@pol.net>