From patchwork Wed Nov 23 22:07:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roderick Colenbrander X-Patchwork-Id: 9444423 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 BF48560235 for ; Wed, 23 Nov 2016 22:08:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B952127D76 for ; Wed, 23 Nov 2016 22:08:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ACD5127DC2; Wed, 23 Nov 2016 22:08:38 +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 507D227D76 for ; Wed, 23 Nov 2016 22:08:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933205AbcKWWIc (ORCPT ); Wed, 23 Nov 2016 17:08:32 -0500 Received: from mail-yw0-f178.google.com ([209.85.161.178]:34825 "EHLO mail-yw0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934039AbcKWWIT (ORCPT ); Wed, 23 Nov 2016 17:08:19 -0500 Received: by mail-yw0-f178.google.com with SMTP id i145so23768911ywg.2 for ; Wed, 23 Nov 2016 14:08:19 -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=/W4p9Sybq0L0H/GQQXEQdf1LFMqGjk8UsVMlQoGulWE=; b=0uJ3SIAzx9zkKY081HPRRfi7d0errgIgDLoO0gjhQww9NilgfuBDvNKN3R2YnYbccl aicgro0zWCFFA7N8HOmFADPb1mkuVajcMsQUJnKT2OUMmgw16uFVTbx/00EV/ml+dASn jo9XuMvLhtuIYYkwZix0OcdSn3NrWdIPur8nxVAm2RNtijS1pyx/tSM+LXp92E9zINRz c3vwwjJgRm2iG0pjmljwHxKfj34U6DLZ6su+5vuOLNhiI59ugOZHMyoqPQQLio5vsbhK voyDvi6rgiSZp0Xy5HWwtJZftaeg3i4gazBzo4wVy5Vby7Gzy0ZDrJzzHDGFY75DsJwO swpw== 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=/W4p9Sybq0L0H/GQQXEQdf1LFMqGjk8UsVMlQoGulWE=; b=Ivura4NI5s+JSbDIt/1OGblj39iZIuj/HbDKQB7aeLGrYXsvLQlW0lDlH8SEUDoXzt dglW5tshZkXAlM0NrX3LLm3ZtbU3VQZLNVdQbH2trpMR9WPPXoZPd2UKLZpDBJe78t96 +lbIho5WuKHVUGZbqPYHNis2Zd7lZjELyTsnchHwSF5R5NZZUJhEiV6yVDP1C4mcnLch h6PtDMXZDp2FOGXC15zKmSV1SYB0tO8uo9pT6ml//jRJbGCcmlafp9Wt20vg363YWluZ ou1Pu7b+8Zuygv+EEH8PMbhI9kiv2KTqp+Exs8YvYTSF3GQ+sEEnWIXbok6D7KTyFHZS uewA== X-Gm-Message-State: AKaTC03PhqyAnVdthlVLjE9oLwMd+8OFQbnWYHTLYNYVbvn6069SERRIP1mNvVa/hkYHYsZ6 X-Received: by 10.129.56.10 with SMTP id f10mr6265609ywa.45.1479938898516; Wed, 23 Nov 2016 14:08:18 -0800 (PST) Received: from konan1.dev.biz ([100.42.98.197]) by smtp.gmail.com with ESMTPSA id u134sm12154004ywg.31.2016.11.23.14.08.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Nov 2016 14:08:18 -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 8/8] HID: sony: Report hardware timestamp for DS4 sensor values Date: Wed, 23 Nov 2016 14:07:13 -0800 Message-Id: <1479938833-26424-9-git-send-email-roderick@gaikai.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1479938833-26424-1-git-send-email-roderick@gaikai.com> References: <1479938833-26424-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 | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index d9e5254..2127613 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 @@ -839,6 +840,10 @@ struct sony_sc { u8 led_delay_off[MAX_LEDS]; u8 led_count; + bool timestamp_initialized; + u16 prev_timestamp; + unsigned int timestamp_us; + /* DS4 calibration data */ struct ds4_calibration_data ds4_calib_data[6]; }; @@ -1030,6 +1035,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; @@ -1038,6 +1044,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. */ @@ -1359,6 +1383,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);