aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/IR/ir-keytable.c5
-rw-r--r--drivers/media/dvb/siano/sms-cards.c1
-rw-r--r--drivers/media/dvb/siano/sms-cards.h2
-rw-r--r--drivers/media/dvb/siano/smsir.c254
-rw-r--r--drivers/media/dvb/siano/smsir.h62
5 files changed, 47 insertions, 277 deletions
diff --git a/drivers/media/IR/ir-keytable.c b/drivers/media/IR/ir-keytable.c
index 94a8577e72eb..15a0f192d413 100644
--- a/drivers/media/IR/ir-keytable.c
+++ b/drivers/media/IR/ir-keytable.c
@@ -497,8 +497,9 @@ int __ir_input_register(struct input_dev *input_dev,
497 goto out_event; 497 goto out_event;
498 } 498 }
499 499
500 IR_dprintk(1, "Registered input device on %s for %s remote.\n", 500 IR_dprintk(1, "Registered input device on %s for %s remote%s.\n",
501 driver_name, rc_tab->name); 501 driver_name, rc_tab->name,
502 ir_dev->props->driver_type == RC_DRIVER_IR_RAW ? " in raw mode" : "");
502 503
503 return 0; 504 return 0;
504 505
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c
index dcde60645960..25b43e587fa6 100644
--- a/drivers/media/dvb/siano/sms-cards.c
+++ b/drivers/media/dvb/siano/sms-cards.c
@@ -64,6 +64,7 @@ static struct sms_board sms_boards[] = {
64 .type = SMS_NOVA_B0, 64 .type = SMS_NOVA_B0,
65 .fw[DEVICE_MODE_ISDBT_BDA] = "sms1xxx-hcw-55xxx-isdbt-02.fw", 65 .fw[DEVICE_MODE_ISDBT_BDA] = "sms1xxx-hcw-55xxx-isdbt-02.fw",
66 .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", 66 .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
67 .rc_codes = RC_MAP_RC5_HAUPPAUGE_NEW,
67 .board_cfg.leds_power = 26, 68 .board_cfg.leds_power = 26,
68 .board_cfg.led0 = 27, 69 .board_cfg.led0 = 27,
69 .board_cfg.led1 = 28, 70 .board_cfg.led1 = 28,
diff --git a/drivers/media/dvb/siano/sms-cards.h b/drivers/media/dvb/siano/sms-cards.h
index 8f19fc000b46..d8cdf756f7cf 100644
--- a/drivers/media/dvb/siano/sms-cards.h
+++ b/drivers/media/dvb/siano/sms-cards.h
@@ -75,7 +75,7 @@ struct sms_board {
75 enum sms_device_type_st type; 75 enum sms_device_type_st type;
76 char *name, *fw[DEVICE_MODE_MAX]; 76 char *name, *fw[DEVICE_MODE_MAX];
77 struct sms_board_gpio_cfg board_cfg; 77 struct sms_board_gpio_cfg board_cfg;
78 enum ir_kb_type ir_kb_type; 78 char *rc_codes; /* Name of IR codes table */
79 79
80 /* gpios */ 80 /* gpios */
81 int led_power, led_hi, led_lo, lna_ctrl, rf_switch; 81 int led_power, led_hi, led_lo, lna_ctrl, rf_switch;
diff --git a/drivers/media/dvb/siano/smsir.c b/drivers/media/dvb/siano/smsir.c
index f8a4fd61e3dc..d0e4639ee9db 100644
--- a/drivers/media/dvb/siano/smsir.c
+++ b/drivers/media/dvb/siano/smsir.c
@@ -4,6 +4,11 @@
4 MDTV receiver kernel modules. 4 MDTV receiver kernel modules.
5 Copyright (C) 2006-2009, Uri Shkolnik 5 Copyright (C) 2006-2009, Uri Shkolnik
6 6
7 Copyright (c) 2010 - Mauro Carvalho Chehab
8 - Ported the driver to use rc-core
9 - IR raw event decoding is now done at rc-core
10 - Code almost re-written
11
7 This program is free software: you can redistribute it and/or modify 12 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 13 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 2 of the License, or 14 the Free Software Foundation, either version 2 of the License, or
@@ -22,227 +27,27 @@
22 27
23#include <linux/types.h> 28#include <linux/types.h>
24#include <linux/input.h> 29#include <linux/input.h>
25#include <media/ir-core.h>
26 30
27#include "smscoreapi.h" 31#include "smscoreapi.h"
28#include "smsir.h" 32#include "smsir.h"
29#include "sms-cards.h" 33#include "sms-cards.h"
30 34
31/* In order to add new IR remote control - 35#define MODULE_NAME "smsmdtv"
32 * 1) Add it to the <enum ir_kb_type> @ smsir,h,
33 * 2) Add its map to keyboard_layout_maps below
34 * 3) Set your board (sms-cards sub-module) to use it
35 */
36
37static struct keyboard_layout_map_t keyboard_layout_maps[] = {
38 [SMS_IR_KB_DEFAULT_TV] = {
39 .ir_protocol = IR_RC5,
40 .rc5_kbd_address = KEYBOARD_ADDRESS_TV1,
41 .keyboard_layout_map = {
42 KEY_0, KEY_1, KEY_2,
43 KEY_3, KEY_4, KEY_5,
44 KEY_6, KEY_7, KEY_8,
45 KEY_9, 0, 0, KEY_POWER,
46 KEY_MUTE, 0, 0,
47 KEY_VOLUMEUP, KEY_VOLUMEDOWN,
48 KEY_BRIGHTNESSUP,
49 KEY_BRIGHTNESSDOWN, KEY_CHANNELUP,
50 KEY_CHANNELDOWN,
51 0, 0, 0, 0, 0, 0, 0, 0,
52 0, 0, 0, 0, 0, 0, 0, 0,
53 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
56 }
57 },
58 [SMS_IR_KB_HCW_SILVER] = {
59 .ir_protocol = IR_RC5,
60 .rc5_kbd_address = KEYBOARD_ADDRESS_LIGHTING1,
61 .keyboard_layout_map = {
62 KEY_0, KEY_1, KEY_2,
63 KEY_3, KEY_4, KEY_5,
64 KEY_6, KEY_7, KEY_8,
65 KEY_9, KEY_TEXT, KEY_RED,
66 KEY_RADIO, KEY_MENU,
67 KEY_SUBTITLE,
68 KEY_MUTE, KEY_VOLUMEUP,
69 KEY_VOLUMEDOWN, KEY_PREVIOUS, 0,
70 KEY_UP, KEY_DOWN, KEY_LEFT,
71 KEY_RIGHT, KEY_VIDEO, KEY_AUDIO,
72 KEY_MHP, KEY_EPG, KEY_TV,
73 0, KEY_NEXTSONG, KEY_EXIT,
74 KEY_CHANNELUP, KEY_CHANNELDOWN,
75 KEY_CHANNEL, 0,
76 KEY_PREVIOUSSONG, KEY_ENTER,
77 KEY_SLEEP, 0, 0, KEY_BLUE,
78 0, 0, 0, 0, KEY_GREEN, 0,
79 KEY_PAUSE, 0, KEY_REWIND,
80 0, KEY_FASTFORWARD, KEY_PLAY,
81 KEY_STOP, KEY_RECORD,
82 KEY_YELLOW, 0, 0, KEY_SELECT,
83 KEY_ZOOM, KEY_POWER, 0, 0
84 }
85 },
86 { } /* Terminating entry */
87};
88
89static u32 ir_pos;
90static u32 ir_word;
91static u32 ir_toggle;
92
93#define RC5_PUSH_BIT(dst, bit, pos) \
94 { dst <<= 1; dst |= bit; pos++; }
95
96
97static void sms_ir_rc5_event(struct smscore_device_t *coredev,
98 u32 toggle, u32 addr, u32 cmd)
99{
100 bool toggle_changed;
101 u16 keycode;
102
103 sms_log("IR RC5 word: address %d, command %d, toggle %d",
104 addr, cmd, toggle);
105
106 toggle_changed = ir_toggle != toggle;
107 /* keep toggle */
108 ir_toggle = toggle;
109
110 if (addr !=
111 keyboard_layout_maps[coredev->ir.ir_kb_type].rc5_kbd_address)
112 return; /* Check for valid address */
113 36
114 keycode = 37void sms_ir_event(struct smscore_device_t *coredev, const char *buf, int len)
115 keyboard_layout_maps
116 [coredev->ir.ir_kb_type].keyboard_layout_map[cmd];
117
118 if (!toggle_changed &&
119 (keycode != KEY_VOLUMEUP && keycode != KEY_VOLUMEDOWN))
120 return; /* accept only repeated volume, reject other keys */
121
122 sms_log("kernel input keycode (from ir) %d", keycode);
123 input_report_key(coredev->ir.input_dev, keycode, 1);
124 input_sync(coredev->ir.input_dev);
125
126}
127
128/* decode raw bit pattern to RC5 code */
129/* taken from ir-functions.c */
130static u32 ir_rc5_decode(unsigned int code)
131{ 38{
132/* unsigned int org_code = code;*/
133 unsigned int pair;
134 unsigned int rc5 = 0;
135 int i; 39 int i;
40 const s32 *samples = (const void *)buf;
136 41
137 for (i = 0; i < 14; ++i) { 42 for (i = 0; i < len >> 2; i++) {
138 pair = code & 0x3;