Remote controllers
Currently, most analog and digital devices have an Infrared input for a remote control. Each manufacturer has their own type of control. It is not uncommon for the same manufacturer to ship different types of remote controls, depending on the device.
Adding support for new IR's
In order to add support for a new keyboard, you need first to discover how the IR code is sent to the device. There are several possibilities:
* IR sensor is directly connected with a GPIO pin of the PCI/USB bridge. This is a very common case nowadays. * This is probably the easiest way to add support, provided that the driver has already other similar devices. For an example, please see: add IR support for saa7134. * Bridge has an IR decoder inside. Some chipsets have already some internal decoder for IR, like dib0700 and em2884; * There's a small chip that does serial to parallel conversion, outputting the IR code at several GPIO pins.
The way to get the data is hardware specific. Once the driver is able to get an IR scancode, it is generally required to create a new table for it.
NOTE: before adding a new table, please check if the existing ones have already the proper mapping.
The first step to add a new map is to create an alias for it atinclude/media/rc-map.h:
/* Names of the several keytables defined in-kernel */
#define RC_MAP_ADSTECH_DVB_T_PCI "rc-adstech-dvb-t-pci" ... #define RC_MAP_VIDEOMATE_TV_PVR "rc-videomate-tv-pvr" #define RC_MAP_WINFAST "rc-winfast" #define RC_MAP_WINFAST_USBII_DELUXE "rc-winfast-usbii-deluxe" /* * Please, do not just append newer Remote Controller names at the end. * The names should be ordered in alphabetical order */
Just add a new line there with the IR name, on alphabetical order:
#define RC_MAP_NAME_OF_MY_NEW_BOARD_MAP "rc-name-of-my-new-board-map"
Then copy one of the existing keymaps, for example, drivers/media/IR/keymaps/rc-empty.c, replacing the names for the name of your new IR.
Remove all keys at static struct ir_scancode, and add your new keycodes.
For example, assuming that you have a driver with raw decode. By loading ir_core with debug=1, with:
modprobe ir_core debug=1 (be sure that ir_core weren't loaded before)
you'll start to generate lots of logs at the syslog. Use the dmesg command to get those codes:
dmesg |grep scancode
Let's assume that this get you the following results: for power key:
ir_nec_decode: NEC scancode 0x0300 ir_getkeycode: unknown key for scancode 0x0300
for channel up key:
ir_nec_decode: NEC scancode 0x030c ir_getkeycode: unknown key for scancode 0x030c
for channel down key:
ir_nec_decode: NEC scancode 0x0310 ir_getkeycode: unknown key for scancode 0x0310
All you need to do is to make sure that those codes are properly mapped at the keycode table, and to specify the ir_type (in this case, IR_TYPE_NEC). So, to support the above, the main content of the new rc map will be:
static struct ir_scancode name_of_my_new_keyboard[] = { { 0x0300, KEY_POWER2 }, { 0x030c, KEY_CHANNELUP }, { 0x0310, KEY_CHANNELDOWN }, }; static struct rc_keymap name_of_my_new_keyboard_map = { .map = { .scan = name_of_my_new_keyboard, .size = ARRAY_SIZE(name_of_my_new_keyboard), .ir_type = IR_TYPE_NEC, .name = RC_MAP_EMPTY, } };
Don't forget to add the new module at drivers/media/IR/keymaps/Makefile, otherwise, it won't be built.
IR Keycode map used by media devices
While there has been effort over the years to keep track of the varying IR layouts (documenting them within ir-common.c), unfortunately, there was never any effort to uniform the actual IR keycodes used by the different devices. This lack of uniformity resulted in cases where the same IR keyname was mapped completely different on different IR's. The overall state of confusion that existed is perhaps best demonstrated by viewing what ir-common.c IR summary looked like as of Aug, 26 2009.
On Aug, 27 2009, having a common mapping for supported IR's became the subject of a proposal which would allow userspace applications to make use of common keycode definitions. The table bellow reflects the expected keycode mappings for IR keys.
Key code | Meaning | Key examples on IR | Notes |
---|---|---|---|
Numeric keys | |||
KEY_0 | Keyboard digit 0 | 0 | |
KEY_1 | Keyboard digit 1 | 1 | |
KEY_2 | Keyboard digit 2 | 2 | |
KEY_3 | Keyboard digit 3 | 3 | |
KEY_4 | Keyboard digit 4 | 4 | |
KEY_5 | Keyboard digit 5 | 5 | |
KEY_6 | Keyboard digit 6 | 6 | |
KEY_7 | Keyboard digit 7 | 7 | |
KEY_8 | Keyboard digit 8 | 8 | |
KEY_9 | Keyboard digit 9 | 9 | |
Movie play control | |||
KEY_FORWARD | Instantly advance in time | >> / FORWARD | |
KEY_BACK | Instantly go back in time | <<< / BACK | |
KEY_FASTFORWARD | Play movie faster | >>> / FORWARD | |
KEY_REWIND | Play movie back | REWIND / BACKWARD | |
KEY_NEXT | Select next chapter / sub-chapter / interval | NEXT / SKIP | |
KEY_PREVIOUS | Select previous chapter / sub-chapter / interval | << / PREV / PREVIOUS | |
KEY_AGAIN | Repeat the video or a video interval | REPEAT / LOOP / RECALL | |
KEY_PAUSE | Pause stream | PAUSE / FREEZE | |
KEY_PLAY | Play movie at the normal timeshift | NORMAL TIMESHIFT / LIVE / > | |
KEY_PLAYPAUSE | Alternate between play and pause | PLAY / PAUSE | |
KEY_STOP | Stop stream | STOP | |
KEY_RECORD | Start/stop recording stream | CAPTURE / REC / RECORD/PAUSE | |
KEY_CAMERA | Take a picture of the image | CAMERA ICON / CAPTURE / SNAPSHOT | |
KEY_SHUFFLE | Enable shuffle mode | SHUFFLE | |
KEY_TIME | Activate time shift mode | TIME SHIFT | |
KEY_TITLE | Allow changing the chapter | CHAPTER | |
KEY_SUBTITLE | Allow changing the subtitle | SUBTITLE | |
Image control | |||
KEY_BRIGHTNESSDOWN | Decrease Brightness | BRIGHTNESS DECREASE | |
KEY_BRIGHTNESSUP | Increase Brightness | BRIGHTNESS INCREASE | |
KEY_ANGLE | Switch video camera angle (on videos with more than one angle stored) | ANGLE / SWAP | |
KEY_EPG | Open the Electronic Play Guide (EPG) | EPG / GUIDE | |
KEY_TEXT | Activate/change closed caption mode | CLOSED CAPTION/TELETEXT / DVD TEXT / TELETEXT / TTX | |
Audio control | |||
KEY_AUDIO | Change audio source | AUDIO SOURCE / AUDIO / MUSIC | |
KEY_MUTE | Mute/unmute audio | MUTE / DEMUTE / UNMUTE | |
KEY_VOLUMEDOWN | Decrease volume | VOLUME- / VOLUME DOWN | |
KEY_VOLUMEUP | Increase volume | VOLUME+ / VOLUME UP | |
KEY_MODE | Change sound mode | MONO/STEREO | |
KEY_LANGUAGE | Select Language | 1ST / 2ND LANGUAGE / DVD LANG / MTS/SAP / MTS SEL | |
Channel control | |||
KEY_CHANNEL | Go to the next favorite channel | ALT / CHANNEL / CH SURFING / SURF / FAV | |
KEY_CHANNELDOWN | Decrease channel sequencially | CHANNEL - / CHANNEL DOWN / DOWN | |
KEY_CHANNELUP | Increase channel sequencially | CHANNEL + / CHANNEL UP / UP | |
KEY_DIGITS | Use more than one digit for channel | PLUS / 100/ 1xx / xxx / -/-- / Single Double Triple Digit | |
KEY_SEARCH | Start channel autoscan | SCAN / AUTOSCAN | |
Colored keys | |||
KEY_BLUE | IR “Blue” key | BLUE | |
KEY_GREEN | IR “Green” Key | GREEN | |
KEY_RED | IR “Red” key | RED | |
KEY_YELLOW | IR “Yellow” key | YELLOW | |
Media selection | |||
KEY_CD | Change input source to Compact Disc | CD | |
KEY_DVD | Change input to DVD | DVD / DVD MENU | |
KEY_EJECTCLOSECD | Open/close the CD/DVD player | -> ) / CLOSE / OPEN | |
KEY_MEDIA | Turn on/off Media application | PC/TV / TURN ON/OFF APP | |
KEY_PC | Selects from TV to PC | PC | |
KEY_RADIO | Put into AM/FM radio mode | RADIO / TV/FM / TV/RADIO / FM / FM/RADIO | |
KEY_TV | Select tv mode | TV / LIVE TV | |
KEY_TV2 | Select Cable mode | AIR/CBL | |
KEY_VCR | Select VCR mode | VCR MODE / DTR | |
KEY_VIDEO | Alternate between input modes | SOURCE / SELECT / DISPLAY / SWITCH INPUTS / VIDEO | |
Power control | |||
KEY_POWER | Turn on/off computer | SYSTEM POWER / COMPUTER POWER | |
KEY_POWER2 | Turn on/off application | TV ON/OFF / POWER | |
KEY_SLEEP | Activate sleep timer | SLEEP / SLEEP TIMER | |
KEY_SUSPEND | Put computer into suspend mode | STANDBY / SUSPEND | |
Window control | |||
KEY_CLEAR | Stop stream and return to default input video/audio | CLEAR / RESET / BOSS KEY | |
KEY_CYCLEWINDOWS | Minimize windows and move to the next one | ALT-TAB / MINIMIZE / DESKTOP | |
KEY_FAVORITES | Open the favorites stream window | TV WALL / Favorites | |
KEY_MENU | Call application menu | 2ND CONTROLS (USA: MENU) / DVD/MENU / SHOW/HIDE CTRL | |
KEY_NEW | Open/Close Picture in Picture | PIP | |
KEY_OK | Send a confirmation code to application | OK / ENTER / RETURN | |
KEY_SCREEN | Select screen aspect ratio | 4:3 16:9 SELECT | |
KEY_ZOOM | Put device into zoom/full screen mode | ZOOM / FULL SCREEN / ZOOM+ / HIDE PANNEL / SWITCH | |
Navigation keys | |||
KEY_ESC | Cancel current operation | CANCEL / BACK | |
KEY_HELP | Open a Help window | HELP | |
KEY_HOMEPAGE | Navigate to Homepage | HOME | |
KEY_INFO | Open On Screen Display | DISPLAY INFORMATION / OSD | |
KEY_WWW | Open the default browser | WEB | |
KEY_UP | Up key | UP | On simpler IR's, without separate channel keys, you need to map UP as KEY_CHANNELUP |
KEY_DOWN | Down key | DOWN | On simpler IR's, without separate channel keys, you need to map DOWN as KEY_CHANNELDOWN |
KEY_LEFT | Left key | LEFT | On simpler IR's, without separate volume keys, you need to map LEFT as KEY_VOLUMEDOWN |
KEY_RIGHT | Right key | RIGHT | On simpler IR's, without separate volume keys, you need to map RIGHT as KEY_VOLUMEUP |
Miscelaneous keys | |||
KEY_DOT | Return a dot | . | |
KEY_FN | Select a function | FUNCTION |