From patchwork Fri Dec 9 03:09:55 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roderick Colenbrander X-Patchwork-Id: 9467481 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 DF86E60231 for ; Fri, 9 Dec 2016 03:10:50 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D91A328591 for ; Fri, 9 Dec 2016 03:10:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CDF73285F9; Fri, 9 Dec 2016 03:10:50 +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.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,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 6FB9F28591 for ; Fri, 9 Dec 2016 03:10:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932667AbcLIDKt (ORCPT ); Thu, 8 Dec 2016 22:10:49 -0500 Received: from mail-pf0-f182.google.com ([209.85.192.182]:33547 "EHLO mail-pf0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932573AbcLIDKt (ORCPT ); Thu, 8 Dec 2016 22:10:49 -0500 Received: by mail-pf0-f182.google.com with SMTP id d2so1248150pfd.0 for ; Thu, 08 Dec 2016 19:10:48 -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=fNGwLGMPKV82fY47VAYxXRBNhjQnNgwPFpVGSX5Uucc=; b=ImTDeIdpZr4NiRWVy/cEipnSzTfNzRBYo9fMXwdtChYlQlKE07lzD5nJR9puR7y9Iw Qu2QuBPHviFX4BiNUslGuyNKG11sy25cywXlObId3Myp7NAmWPsmXeSL3iLHZuuNtPLA rdejXAQt/MibFVisyrP9AXMc+Ix6a/DwTjdRl4wjnNlP6W2YqjQPAPhT/G1pIKWOW/iF Z/HWsG7UmZH6aW596F45GcrVpEu7IBA2XEYQlhqlxl/18waMZRfiaDkMsCCvgl6VKlvE 0sUjWlBF8F1FdyzSLSuXPIWOxQz1yxQb+I11LAtu0Un7vVST84Ys4i1V37wnNBrZGizO DVNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fNGwLGMPKV82fY47VAYxXRBNhjQnNgwPFpVGSX5Uucc=; b=e6vXiLJ2PHATR1IhE3/eF7r6VSHoZ18iuZX/xk38vHnCW6yP6vhu6ZRKp54cMiLUB4 O3nr427caHSlCPG1QQ2HKKdpvdF24k4qDe+ujJz+VdEwtlV6YP/cYzfPxMDDX2T7zBxz Z70eo+7qCiWqjdwajNjn4clZ4A9fam84WPSCSsV1kOrxAgxCHPI8evvOcMu7yuXkHpI2 2/BA6av3LulpClhJshi6wsjuwvv/mV5p0wCTa1IR7u60QH0Bm5JBIpndFz7fgg+pNrj4 RikYoP0XSy+NVCGPUN89Cw6z1rU+iMACoSnG9lth1L4PRQyPdR8GLWajHwmdxmaewvc7 Nypg== X-Gm-Message-State: AKaTC02w8g+rsL0N9khkFGIHY1AOLJS/hJ+nF4pgFP+fypgAdMUekoYb6IiI6qKc122ZiCK6 X-Received: by 10.99.146.13 with SMTP id o13mr77262861pgd.3.1481253048445; Thu, 08 Dec 2016 19:10:48 -0800 (PST) Received: from konan1.dev.av1.ca.us.gaikai.int ([2607:fb90:4895:fcc2:b707:fa7d:679c:91b]) by smtp.gmail.com with ESMTPSA id q27sm53057416pfd.49.2016.12.08.19.10.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Dec 2016 19:10:48 -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 6/7] HID: sony: Report hardware timestamp for DS4 sensor values Date: Thu, 8 Dec 2016 19:09:55 -0800 Message-Id: <1481252996-25288-7-git-send-email-roderick@gaikai.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1481252996-25288-1-git-send-email-roderick@gaikai.com> References: <1481252996-25288-1-git-send-email-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);