1 /****************************************************************
3 Siano Mobile Silicon, Inc.
4 MDTV receiver kernel modules.
5 Copyright (C) 2006-2009, Uri Shkolnik
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
12 This program is free software: you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation, either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 ****************************************************************/
28 #include <linux/types.h>
29 #include <linux/input.h>
31 #include "smscoreapi.h"
33 #include "sms-cards.h"
35 #define MODULE_NAME "smsmdtv"
37 void sms_ir_event(struct smscore_device_t
*coredev
, const char *buf
, int len
)
40 const s32
*samples
= (const void *)buf
;
42 for (i
= 0; i
< len
>> 2; i
++) {
43 DEFINE_IR_RAW_EVENT(ev
);
45 ev
.duration
= abs(samples
[i
]) * 1000; /* Convert to ns */
46 ev
.pulse
= (samples
[i
] > 0) ? false : true;
48 ir_raw_event_store(coredev
->ir
.dev
, &ev
);
50 ir_raw_event_handle(coredev
->ir
.dev
);
53 int sms_ir_init(struct smscore_device_t
*coredev
)
56 int board_id
= smscore_get_board_id(coredev
);
59 sms_log("Allocating rc device");
60 dev
= rc_allocate_device();
62 sms_err("Not enough memory");
66 coredev
->ir
.controller
= 0; /* Todo: vega/nova SPI number */
67 coredev
->ir
.timeout
= IR_DEFAULT_TIMEOUT
;
68 sms_log("IR port %d, timeout %d ms",
69 coredev
->ir
.controller
, coredev
->ir
.timeout
);
71 snprintf(coredev
->ir
.name
, sizeof(coredev
->ir
.name
),
72 "SMS IR (%s)", sms_get_board(board_id
)->name
);
74 strlcpy(coredev
->ir
.phys
, coredev
->devpath
, sizeof(coredev
->ir
.phys
));
75 strlcat(coredev
->ir
.phys
, "/ir0", sizeof(coredev
->ir
.phys
));
77 dev
->input_name
= coredev
->ir
.name
;
78 dev
->input_phys
= coredev
->ir
.phys
;
79 dev
->dev
.parent
= coredev
->device
;
82 /* TODO: properly initialize the parameters bellow */
83 dev
->input_id
.bustype
= BUS_USB
;
84 dev
->input_id
.version
= 1;
85 dev
->input_id
.vendor
= le16_to_cpu(dev
->udev
->descriptor
.idVendor
);
86 dev
->input_id
.product
= le16_to_cpu(dev
->udev
->descriptor
.idProduct
);
90 dev
->driver_type
= RC_DRIVER_IR_RAW
;
91 rc_set_allowed_protocols(dev
, RC_BIT_ALL
);
92 dev
->map_name
= sms_get_board(board_id
)->rc_codes
;
93 dev
->driver_name
= MODULE_NAME
;
95 sms_log("Input device (IR) %s is set for key events", dev
->input_name
);
97 err
= rc_register_device(dev
);
99 sms_err("Failed to register device");
104 coredev
->ir
.dev
= dev
;
108 void sms_ir_exit(struct smscore_device_t
*coredev
)
111 rc_unregister_device(coredev
->ir
.dev
);