Remote controllers: Difference between revisions

From LinuxTVWiki
Jump to navigation Jump to search
m (fixed link, minor rephrasing)
m (Voidxor moved page Remote Controllers to Remote controllers: Non-proper noun)
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
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.
===Remote Controllers===
Currently, most analog and digital devices have a Infrared input for remote controllers. Each manufacturer has their own type of control. It is not rare that the same manufacturer to ship different types of controls, depending on the device. Unfortunately, during several years, there weren't any effort to uniform the IR keycodes under different boards. This resulted that the same IR keyname to be mapped completely different on differnt IR's.
There were, however, an effort to keep those IR layouts at the same file (ir-common.c).


===Adding support for new IR's===
See [[ir-common.c]] IR summary by Aug, 26 2009 for a sample of the confusion.


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:
On Aug, 27 2009, having a common mapping for supported IR's became the subject of a [[Development: A proposal for a common IR keycode definition map|proposal]] which would allow userspace applications to make use of common keycode definitions. The table bellow reflects the expected keycode mappings for IR keys.
* 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===
===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 [[Development: A proposal for a common IR keycode definition map|proposal]] which would allow userspace applications to make use of common keycode definitions. The table bellow reflects the expected keycode mappings for IR keys.


{| border="1" cellpadding="2"
{| border="1" cellpadding="2"
!Key code
!Key code

Latest revision as of 07:10, 18 December 2016

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

Technical details about IR

http://linuxtv.org/wiki/index.php/Remote_controllers-V4L