Path: blob/master/Documentation/console/console.txt
10821 views
Console Drivers1===============23The linux kernel has 2 general types of console drivers. The first type is4assigned by the kernel to all the virtual consoles during the boot process.5This type will be called 'system driver', and only one system driver is allowed6to exist. The system driver is persistent and it can never be unloaded, though7it may become inactive.89The second type has to be explicitly loaded and unloaded. This will be called10'modular driver' by this document. Multiple modular drivers can coexist at11any time with each driver sharing the console with other drivers including12the system driver. However, modular drivers cannot take over the console13that is currently occupied by another modular driver. (Exception: Drivers that14call take_over_console() will succeed in the takeover regardless of the type15of driver occupying the consoles.) They can only take over the console that is16occupied by the system driver. In the same token, if the modular driver is17released by the console, the system driver will take over.1819Modular drivers, from the programmer's point of view, has to call:2021take_over_console() - load and bind driver to console layer22give_up_console() - unbind and unload driver2324In newer kernels, the following are also available:2526register_con_driver()27unregister_con_driver()2829If sysfs is enabled, the contents of /sys/class/vtconsole can be30examined. This shows the console backends currently registered by the31system which are named vtcon<n> where <n> is an integer from 0 to 15. Thus:3233ls /sys/class/vtconsole34. .. vtcon0 vtcon13536Each directory in /sys/class/vtconsole has 3 files:3738ls /sys/class/vtconsole/vtcon039. .. bind name uevent4041What do these files signify?42431. bind - this is a read/write file. It shows the status of the driver if44read, or acts to bind or unbind the driver to the virtual consoles45when written to. The possible values are:46470 - means the driver is not bound and if echo'ed, commands the driver48to unbind49501 - means the driver is bound and if echo'ed, commands the driver to51bind52532. name - read-only file. Shows the name of the driver in this format:5455cat /sys/class/vtconsole/vtcon0/name56(S) VGA+5758'(S)' stands for a (S)ystem driver, ie, it cannot be directly59commanded to bind or unbind6061'VGA+' is the name of the driver6263cat /sys/class/vtconsole/vtcon1/name64(M) frame buffer device6566In this case, '(M)' stands for a (M)odular driver, one that can be67directly commanded to bind or unbind.68693. uevent - ignore this file7071When unbinding, the modular driver is detached first, and then the system72driver takes over the consoles vacated by the driver. Binding, on the other73hand, will bind the driver to the consoles that are currently occupied by a74system driver.7576NOTE1: Binding and unbinding must be selected in Kconfig. It's under:7778Device Drivers -> Character devices -> Support for binding and unbinding79console drivers8081NOTE2: If any of the virtual consoles are in KD_GRAPHICS mode, then binding or82unbinding will not succeed. An example of an application that sets the console83to KD_GRAPHICS is X.8485How useful is this feature? This is very useful for console driver86developers. By unbinding the driver from the console layer, one can unload the87driver, make changes, recompile, reload and rebind the driver without any need88for rebooting the kernel. For regular users who may want to switch from89framebuffer console to VGA console and vice versa, this feature also makes90this possible. (NOTE NOTE NOTE: Please read fbcon.txt under Documentation/fb91for more details).9293Notes for developers:94=====================9596take_over_console() is now broken up into:9798register_con_driver()99bind_con_driver() - private function100101give_up_console() is a wrapper to unregister_con_driver(), and a driver must102be fully unbound for this call to succeed. con_is_bound() will check if the103driver is bound or not.104105Guidelines for console driver writers:106=====================================107108In order for binding to and unbinding from the console to properly work,109console drivers must follow these guidelines:1101111. All drivers, except system drivers, must call either register_con_driver()112or take_over_console(). register_con_driver() will just add the driver to113the console's internal list. It won't take over the114console. take_over_console(), as it name implies, will also take over (or115bind to) the console.1161172. All resources allocated during con->con_init() must be released in118con->con_deinit().1191203. All resources allocated in con->con_startup() must be released when the121driver, which was previously bound, becomes unbound. The console layer122does not have a complementary call to con->con_startup() so it's up to the123driver to check when it's legal to release these resources. Calling124con_is_bound() in con->con_deinit() will help. If the call returned125false(), then it's safe to release the resources. This balance has to be126ensured because con->con_startup() can be called again when a request to127rebind the driver to the console arrives.1281294. Upon exit of the driver, ensure that the driver is totally unbound. If the130condition is satisfied, then the driver must call unregister_con_driver()131or give_up_console().1321335. unregister_con_driver() can also be called on conditions which make it134impossible for the driver to service console requests. This can happen135with the framebuffer console that suddenly lost all of its drivers.136137The current crop of console drivers should still work correctly, but binding138and unbinding them may cause problems. With minimal fixes, these drivers can139be made to work correctly.140141==========================142Antonino Daplas <[email protected]>143144145146