From patchwork Sat Apr 7 17:24:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans-Frieder Vogt X-Patchwork-Id: 10601 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1SGZjB-0003xu-7o for patchwork@linuxtv.org; Sat, 07 Apr 2012 19:47:09 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-2) with esmtp for id 1SGZjA-000653-I7; Sat, 07 Apr 2012 19:47:09 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753319Ab2DGRrG (ORCPT ); Sat, 7 Apr 2012 13:47:06 -0400 Received: from mailout-de.gmx.net ([213.165.64.22]:41634 "HELO mailout-de.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752375Ab2DGRrF (ORCPT ); Sat, 7 Apr 2012 13:47:05 -0400 Received: (qmail invoked by alias); 07 Apr 2012 17:24:50 -0000 Received: from p4FC08728.dip0.t-ipconnect.de (EHLO maximilian.localnet) [79.192.135.40] by mail.gmx.net (mp002) with SMTP; 07 Apr 2012 19:24:50 +0200 X-Authenticated: #24390674 X-Provags-ID: V01U2FsdGVkX18b8ddCKT0b/V0MZT/+8nJ+h1yKE/PWeRHoMRtfzR t640Sd3CZno8WC From: "Hans-Frieder Vogt" To: Antti Palosaari Subject: [PATCH] af9035: add remote control support Date: Sat, 7 Apr 2012 19:24:44 +0200 User-Agent: KMail/1.13.7 (Linux/3.3.1-a64; KDE/4.7.4; x86_64; ; ) Cc: linux-media@vger.kernel.org, Michael =?iso-8859-1?q?B=FCsch?= , Gianluca Gennari MIME-Version: 1.0 Message-Id: <201204071924.44679.hfvogt@gmx.net> X-Y-GMX-Trusted: 0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.4.7.173041 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_3000_3999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __CT 0, __CTE 0, __CT_TEXT_PLAIN 0, __HAS_MSGID 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __STOCK_PHRASE_7 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __URI_NO_WWW 0, __URI_NS , __USER_AGENT 0' af9035: support remote controls. Currently, for remotes using the NEC protocol, the map of the TERRATEC_CINERGY_XS remote is loaded, for RC6 the map of RC_MAP_RC6_MCE. Signed-off-by: Hans-Frieder Vogt drivers/media/dvb/dvb-usb/af9035.c | 72 +++++++++++++++++++++++++++++++++++++ drivers/media/dvb/dvb-usb/af9035.h | 3 + 2 files changed, 75 insertions(+) Hans-Frieder Vogt e-mail: hfvogt gmx .dot. net --- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff -Nupr a/drivers/media/dvb/dvb-usb/af9035.c b/drivers/media/dvb/dvb-usb/af9035.c --- a/drivers/media/dvb/dvb-usb/af9035.c 2012-04-07 15:59:56.000000000 +0200 +++ b/drivers/media/dvb/dvb-usb/af9035.c 2012-04-07 19:17:55.044874329 +0200 @@ -313,6 +313,41 @@ static struct i2c_algorithm af9035_i2c_a .functionality = af9035_i2c_functionality, }; +#define AF9035_POLL 250 +static int af9035_rc_query(struct dvb_usb_device *d) +{ + unsigned int key; + unsigned char b[4]; + int ret; + struct usb_req req = { CMD_IR_GET, 0, 0, NULL, 4, b }; + + if (!af9035_config.raw_ir) + return 0; + + ret = af9035_ctrl_msg(d->udev, &req); + if (ret < 0) + goto err; + + if ((b[2] + b[3]) == 0xff) { + if ((b[0] + b[1]) == 0xff) { + /* NEC */ + key = b[0] << 8 | b[2]; + } else { + /* ext. NEC */ + key = b[0] << 16 | b[1] << 8 | b[2]; + } + } else { + key = b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]; + } + + if (d->rc_dev != NULL) + rc_keydown(d->rc_dev, key, 0); + +err: + /* ignore errors */ + return 0; +} + static int af9035_init(struct dvb_usb_device *d) { int ret, i; @@ -627,6 +662,34 @@ static int af9035_read_mac_address(struc for (i = 0; i < af9035_properties[0].num_adapters; i++) af9035_af9033_config[i].clock = clock_lut[tmp]; + ret = af9035_rd_reg(d, EEPROM_IR_MODE, &tmp); + if (ret < 0) + goto err; + pr_debug("%s: ir_mode=%02x\n", __func__, tmp); + af9035_config.raw_ir = tmp == 5; + + if (af9035_config.raw_ir) { + ret = af9035_rd_reg(d, EEPROM_IR_TYPE, &tmp); + if (ret < 0) + goto err; + pr_debug("%s: ir_type=%02x\n", __func__, tmp); + + switch (tmp) { + case 0: /* NEC */ + default: + af9035_config.ir_rc6 = false; + d->props.rc.core.protocol = RC_TYPE_NEC; + d->props.rc.core.rc_codes = + RC_MAP_NEC_TERRATEC_CINERGY_XS; + break; + case 1: /* RC6 */ + af9035_config.ir_rc6 = true; + d->props.rc.core.protocol = RC_TYPE_RC6; + d->props.rc.core.rc_codes = RC_MAP_RC6_MCE; + break; + } + } + return 0; err: @@ -1003,6 +1066,15 @@ static struct dvb_usb_device_properties .i2c_algo = &af9035_i2c_algo, + .rc.core = { + .protocol = RC_TYPE_NEC, + .module_name = "af9035", + .rc_query = af9035_rc_query, + .rc_interval = AF9035_POLL, + .allowed_protos = RC_TYPE_NEC | RC_TYPE_RC6, + .rc_codes = RC_MAP_EMPTY, /* may be changed in + af9035_read_mac_address */ + }, .num_device_descs = 5, .devices = { { diff -Nupr a/drivers/media/dvb/dvb-usb/af9035.h b/drivers/media/dvb/dvb-usb/af9035.h --- a/drivers/media/dvb/dvb-usb/af9035.h 2012-04-07 15:58:43.000000000 +0200 +++ b/drivers/media/dvb/dvb-usb/af9035.h 2012-04-07 17:35:08.517840044 +0200 @@ -49,6 +49,8 @@ struct usb_req { struct config { bool dual_mode; + bool raw_ir; + bool ir_rc6; bool hw_not_supported; }; @@ -96,6 +98,7 @@ u32 clock_lut_it9135[] = { #define CMD_MEM_WR 0x01 #define CMD_I2C_RD 0x02 #define CMD_I2C_WR 0x03 +#define CMD_IR_GET 0x18 #define CMD_FW_DL 0x21 #define CMD_FW_QUERYINFO 0x22 #define CMD_FW_BOOT 0x23