| rfkill - RF switch subsystem support |
| ==================================== |
| |
| 1 Implementation details |
| 2 Driver support |
| 3 Userspace support |
| |
| =============================================================================== |
| 1: Implementation details |
| |
| The rfkill switch subsystem exists to add a generic interface to circuitry that |
| can enable or disable the RF output of a radio *transmitter* of any type. |
| |
| When a rfkill switch is in the RFKILL_STATE_ON, the radio transmitter is |
| *enabled*. When the rfkill switch is in the RFKILL_STATE_OFF, the radio |
| transmitter is *disabled*. |
| |
| The rfkill switch subsystem offers support for keys often found on laptops |
| to enable wireless devices like WiFi and Bluetooth. |
| |
| This is done by providing the user 3 possibilities: |
| 1 - The rfkill system handles all events; userspace is not aware of events. |
| 2 - The rfkill system handles all events; userspace is informed about the events. |
| 3 - The rfkill system does not handle events; userspace handles all events. |
| |
| The buttons to enable and disable the wireless radios are important in |
| situations where the user is for example using his laptop on a location where |
| wireless radios _must_ be disabled (e.g. airplanes). |
| Because of this requirement, userspace support for the keys should not be |
| made mandatory. Because userspace might want to perform some additional smarter |
| tasks when the key is pressed, rfkill still provides userspace the possibility |
| to take over the task to handle the key events. |
| |
| The system inside the kernel has been split into 2 separate sections: |
| 1 - RFKILL |
| 2 - RFKILL_INPUT |
| |
| The first option enables rfkill support and will make sure userspace will |
| be notified of any events through the input device. It also creates several |
| sysfs entries which can be used by userspace. See section "Userspace support". |
| |
| The second option provides an rfkill input handler. This handler will |
| listen to all rfkill key events and will toggle the radio accordingly. |
| With this option enabled userspace could either do nothing or simply |
| perform monitoring tasks. |
| |
| ==================================== |
| 2: Driver support |
| |
| To build a driver with rfkill subsystem support, the driver should |
| depend on the Kconfig symbol RFKILL; it should _not_ depend on |
| RKFILL_INPUT. |
| |
| Unless key events trigger an interrupt to which the driver listens, polling |
| will be required to determine the key state changes. For this the input |
| layer providers the input-polldev handler. |
| |
| A driver should implement a few steps to correctly make use of the |
| rfkill subsystem. First for non-polling drivers: |
| |
| - rfkill_allocate() |
| - input_allocate_device() |
| - rfkill_register() |
| - input_register_device() |
| |
| For polling drivers: |
| |
| - rfkill_allocate() |
| - input_allocate_polled_device() |
| - rfkill_register() |
| - input_register_polled_device() |
| |
| When a key event has been detected, the correct event should be |
| sent over the input device which has been registered by the driver. |
| |
| ==================================== |
| 3: Userspace support |
| |
| For each key an input device will be created which will send out the correct |
| key event when the rfkill key has been pressed. |
| |
| The following sysfs entries will be created: |
| |
| name: Name assigned by driver to this key (interface or driver name). |
| type: Name of the key type ("wlan", "bluetooth", etc). |
| state: Current state of the key. 1: On, 0: Off. |
| claim: 1: Userspace handles events, 0: Kernel handles events |
| |
| Both the "state" and "claim" entries are also writable. For the "state" entry |
| this means that when 1 or 0 is written all radios, not yet in the requested |
| state, will be will be toggled accordingly. |
| For the "claim" entry writing 1 to it means that the kernel no longer handles |
| key events even though RFKILL_INPUT input was enabled. When "claim" has been |
| set to 0, userspace should make sure that it listens for the input events or |
| check the sysfs "state" entry regularly to correctly perform the required |
| tasks when the rkfill key is pressed. |