From patchwork Fri Feb 3 00:21:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roderick Colenbrander X-Patchwork-Id: 9553381 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3A38B60453 for ; Fri, 3 Feb 2017 00:21:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2AAC021F61 for ; Fri, 3 Feb 2017 00:21:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1FA5E228C9; Fri, 3 Feb 2017 00:21:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C435A223B2 for ; Fri, 3 Feb 2017 00:21:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751638AbdBCAVe (ORCPT ); Thu, 2 Feb 2017 19:21:34 -0500 Received: from mail-pg0-f48.google.com ([74.125.83.48]:35622 "EHLO mail-pg0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751622AbdBCAVd (ORCPT ); Thu, 2 Feb 2017 19:21:33 -0500 Received: by mail-pg0-f48.google.com with SMTP id 194so1226489pgd.2 for ; Thu, 02 Feb 2017 16:21:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gaikai-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6RR0IOZfC/ZO0j6xxPUF3IbyTNDrg9VGw4qj2cpdfSk=; b=aV6nDV2XHs9Skt6k/oV0yThn6aO6w56J2zaWskNLjE3pd3XqmoJDx78b6TXHsiD4/N F3jk/PgD2zRE4ozSPqCK/o2/j8ceOhRzoKmQU/4rq536ynqJ6ilQgC7yR3og5XeCGaTv yX6vXVAaELp+Blkp2F/DoaH54l7uo8PiWQOe2qjoqOnpBENwY+5yMjYgfeDXwGVdqGXy 2IhJvstV5gln1y7g5Jd1niUI1Thh8HSutmKrMQea/ImmoW90Ok2xjUdxB1rLXDdRsaOM 031+vAKDz5X3YgbY2YYBVeEL5nqUpP+qJxvUlW19Mcr3EmhI38sXV5dzDHYG9zA9G1+M ewXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6RR0IOZfC/ZO0j6xxPUF3IbyTNDrg9VGw4qj2cpdfSk=; b=bdLaag/5GM2mVEAIzMOm/jKeCd1OnsNR3BCo+gx9vCQhUFhqGImwa4KBLzLlCKoNUJ CGEUG10WKNIxmIqn2yGIlpkHr0wSbIXi0TcBkcWuPpWjvigsUllTv0UMcMqq4amrXMAT iKtIfGW7tTHow/chkDv9g4NmmPHmM5a6o/CKXxwT+l/pUsJnCn3j2V4KUepxReyYv6Qh k5Jke9lppQIDBpAFvV5YMrq+jMgKTGIpkN882RIRGlLQP7QVfML7WtxN+ypnhl/tvGVb iAh5xWJGjJUD+hZuLkX+Q4ghcfw/cop/W0Zunm1Pfb9XE0OYFNNnt5ExiNnKa6tuvs5u zEUQ== X-Gm-Message-State: AIkVDXI8xRPlTeHqYwmKcO/uWGUmtWMtFaqS7ydAYHCrXHtH0mARyfQJtwgMF3C4FC0rYoBQ X-Received: by 10.99.172.2 with SMTP id v2mr14105852pge.100.1486081292486; Thu, 02 Feb 2017 16:21:32 -0800 (PST) Received: from konan1.dev.biz ([100.42.98.197]) by smtp.gmail.com with ESMTPSA id x81sm61343282pff.69.2017.02.02.16.21.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Feb 2017 16:21:32 -0800 (PST) From: Roderick Colenbrander To: linux-input@vger.kernel.org Cc: Dmitry Torokhov , Jiri Kosina , Benjamin Tissoires , Simon Wood , Frank Praznik , Tim Bird , Roderick Colenbrander Subject: [PATCH v3 3/7] HID: sony: Report hardware timestamp for DS4 sensor values Date: Thu, 2 Feb 2017 16:21:02 -0800 Message-Id: <20170203002106.23225-4-roderick@gaikai.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170203002106.23225-1-roderick@gaikai.com> References: <20170203002106.23225-1-roderick@gaikai.com> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Roderick Colenbrander Report the hardware timestamp inside each HID report through MSC_TIMESTAMP for motion sensor values. Signed-off-by: Roderick Colenbrander --- drivers/hid/hid-sony.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index a7a3692..9f79d1b 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -781,6 +781,7 @@ struct motion_output_report_02 { * additional +2. */ #define DS4_INPUT_REPORT_BUTTON_OFFSET 5 +#define DS4_INPUT_REPORT_TIMESTAMP_OFFSET 10 #define DS4_INPUT_REPORT_GYRO_X_OFFSET 13 #define DS4_INPUT_REPORT_BATTERY_OFFSET 30 #define DS4_INPUT_REPORT_TOUCHPAD_OFFSET 33 @@ -838,6 +839,11 @@ struct sony_sc { u8 led_delay_on[MAX_LEDS]; u8 led_delay_off[MAX_LEDS]; u8 led_count; + + bool timestamp_initialized; + u16 prev_timestamp; + unsigned int timestamp_us; + bool ds4_dongle_connected; /* DS4 calibration data */ struct ds4_calibration_data ds4_calib_data[6]; @@ -1032,6 +1038,7 @@ static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size) unsigned long flags; int n, m, offset, num_touch_data, max_touch_data; u8 cable_state, battery_capacity, battery_charging; + u16 timestamp; /* When using Bluetooth the header is 2 bytes longer, so skip these. */ int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 0 : 2; @@ -1040,6 +1047,24 @@ static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size) offset = data_offset + DS4_INPUT_REPORT_BUTTON_OFFSET; input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2); + /* Convert timestamp (in 5.33us unit) to timestamp_us */ + offset = data_offset + DS4_INPUT_REPORT_TIMESTAMP_OFFSET; + timestamp = get_unaligned_le16(&rd[offset]); + if (!sc->timestamp_initialized) { + sc->timestamp_us = ((unsigned int)timestamp * 16) / 3; + sc->timestamp_initialized = true; + } else { + u16 delta; + + if (sc->prev_timestamp > timestamp) + delta = (U16_MAX - sc->prev_timestamp + timestamp + 1); + else + delta = timestamp - sc->prev_timestamp; + sc->timestamp_us += (delta * 16) / 3; + } + sc->prev_timestamp = timestamp; + input_event(sc->sensor_dev, EV_MSC, MSC_TIMESTAMP, sc->timestamp_us); + offset = data_offset + DS4_INPUT_REPORT_GYRO_X_OFFSET; for (n = 0; n < 6; n++) { /* Store data in int for more precision during mult_frac. */ @@ -1386,6 +1411,8 @@ static int sony_register_sensors(struct sony_sc *sc) input_abs_set_res(sc->sensor_dev, ABS_RY, DS4_GYRO_RES_PER_DEG_S); input_abs_set_res(sc->sensor_dev, ABS_RZ, DS4_GYRO_RES_PER_DEG_S); + __set_bit(EV_MSC, sc->sensor_dev->evbit); + __set_bit(MSC_TIMESTAMP, sc->sensor_dev->mscbit); __set_bit(INPUT_PROP_ACCELEROMETER, sc->sensor_dev->propbit); ret = input_register_device(sc->sensor_dev);