From 08e31bc7f0d214593e3b9f413f7fc26f9fd06d0e Mon Sep 17 00:00:00 2001 From: rohit bandi Date: Wed, 11 Sep 2019 13:55:38 -0700 Subject: [PATCH 1/4] HID: qvr: Decrease wait event interruptible timeout value To improve read calibration data latency use a minimum but enough timeout value. Change-Id: I629ae61ca5005d0f3d0a48e9780ad0940a1ca860 Signed-off-by: Rohit Bandi --- drivers/hid/hid-qvr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/hid/hid-qvr.c b/drivers/hid/hid-qvr.c index 646c8991ad7d..94f564d67b6f 100644 --- a/drivers/hid/hid-qvr.c +++ b/drivers/hid/hid-qvr.c @@ -45,7 +45,7 @@ #include "hid-ids.h" #include "hid-qvr.h" -#define WAIT_EVENT_INT_TOUT 1000 +#define WAIT_EVENT_INT_TOUT 20 #define QVR_START_IMU _IO('q', 1) #define QVR_STOP_IMU _IO('q', 2) From 2c6da3901648642750b08c8f2d4be38124482646 Mon Sep 17 00:00:00 2001 From: Rohit Bandi Date: Mon, 21 Oct 2019 11:34:21 -0700 Subject: [PATCH 2/4] HID: qvr: wait event interruptible timeout change To improve read calibration data latency use a minimum but enough timeout value. To improve consistency in controlling IMU stream use a different value. Change-Id: Iff196d055f0202e642de218020605f7797e3ae4a Signed-off-by: Rohit Bandi --- drivers/hid/hid-qvr.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/hid/hid-qvr.c b/drivers/hid/hid-qvr.c index 94f564d67b6f..c176e5321943 100644 --- a/drivers/hid/hid-qvr.c +++ b/drivers/hid/hid-qvr.c @@ -45,7 +45,8 @@ #include "hid-ids.h" #include "hid-qvr.h" -#define WAIT_EVENT_INT_TOUT 20 +#define TIME_OUT_START_STOP_MS 500 +#define TIME_OUT_READ_WRITE_MS 20 #define QVR_START_IMU _IO('q', 1) #define QVR_STOP_IMU _IO('q', 2) @@ -126,7 +127,7 @@ static int read_calibration_len(void) ret = wait_event_interruptible_timeout(wq, sensor->calib_data_len != -1, - msecs_to_jiffies(WAIT_EVENT_INT_TOUT)); + msecs_to_jiffies(TIME_OUT_READ_WRITE_MS)); if (ret == 0) { kfree(hid_buf); return -ETIME; @@ -171,7 +172,7 @@ static uint8_t *read_calibration_data(void) HID_REQ_SET_REPORT); ret = wait_event_interruptible_timeout(wq, sensor->calib_data_recv == 1, - msecs_to_jiffies(WAIT_EVENT_INT_TOUT)); + msecs_to_jiffies(TIME_OUT_READ_WRITE_MS)); if (ret == 0) { pr_err("%s:get calibration data timeout\n", __func__); kfree(hid_buf); @@ -219,7 +220,7 @@ static int control_imu_stream(bool status) HID_FEATURE_REPORT, HID_REQ_SET_REPORT); ret = wait_event_interruptible_timeout(wq, sensor->ext_ack == 1, - msecs_to_jiffies(WAIT_EVENT_INT_TOUT)); + msecs_to_jiffies(TIME_OUT_START_STOP_MS)); if (ret && status) { pr_debug("qvr: falling back - start IMU stream failed\n"); hid_buf[0] = QVR_HID_REPORT_ID_CAL; From 842de575e19cc120f651d0a671ca1f0e41ab64d2 Mon Sep 17 00:00:00 2001 From: Kedi Xu Date: Fri, 18 Jan 2019 19:18:18 +0800 Subject: [PATCH 3/4] HID:correct mag axis config for External viewer External viewer mag axis is different from ACCEL and Gyro, we need change it to Android coordinate system. Change-Id: I90b8427b3cbd176f5daea30e5ff01991ca146ae3 Signed-off-by: Kedi Xu --- drivers/hid/hid-qvr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/hid/hid-qvr.c b/drivers/hid/hid-qvr.c index c176e5321943..0abbfd5cd64e 100644 --- a/drivers/hid/hid-qvr.c +++ b/drivers/hid/hid-qvr.c @@ -282,8 +282,8 @@ static int qvr_send_package_wrap(u8 *message, int msize, struct hid_device *hid) data->gx = -imuData.gx0; data->gy = imuData.gy0; data->gz = -imuData.gz0; - data->mx = -imuData.mx0; - data->my = imuData.my0; + data->mx = -imuData.my0; + data->my = -imuData.mx0; data->mz = -imuData.mz0; index_buf->most_recent_index = buf_index; From 8d2a6df81e52ed1fa25cb16d1f4712d982eefe36 Mon Sep 17 00:00:00 2001 From: rbandi Date: Mon, 25 Nov 2019 15:05:37 -0800 Subject: [PATCH 4/4] HID: qvr: Correct axes orientation Some viewers report axes orientation different from others. Correct sensor axes orientation for certain viewers depending on certain fields in the IMU data. Change-Id: I4ace679cd5e147817185bcd878db4188569554fe Signed-off-by: rbandi --- drivers/hid/hid-qvr.c | 60 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/drivers/hid/hid-qvr.c b/drivers/hid/hid-qvr.c index 0abbfd5cd64e..fba56fedb6d8 100644 --- a/drivers/hid/hid-qvr.c +++ b/drivers/hid/hid-qvr.c @@ -105,6 +105,7 @@ struct qvr_external_sensor { static DECLARE_WAIT_QUEUE_HEAD(wq); static struct qvr_external_sensor qvr_external_sensor; +static uint8_t DEBUG_ORIENTATION; static int read_calibration_len(void) { @@ -237,7 +238,6 @@ static int control_imu_stream(bool status) return -ETIME; } - static int qvr_send_package_wrap(u8 *message, int msize, struct hid_device *hid) { struct qvr_external_sensor *sensor = &qvr_external_sensor; @@ -254,7 +254,32 @@ static int qvr_send_package_wrap(u8 *message, int msize, struct hid_device *hid) memcpy((void *)&imuData, (void *)message, sizeof(struct external_imu_format)); - + if (!sensor->ts_base) { + if (imuData.gNumerator == 1 && imuData.aNumerator == 1) + DEBUG_ORIENTATION = 1; + else + DEBUG_ORIENTATION = 0; + pr_debug("qvr msize = %d reportID=%d padding=%d\n" + "qvr version=%d numImu=%d nspip=%d pSize=%d\n" + "qvr imuID=%d sampleID=%d temp=%d\n", + msize, imuData.reportID, imuData.padding, + imuData.version, imuData.numIMUs, + imuData.numSamplesPerImuPacket, + imuData.totalPayloadSize, imuData.imuID, + imuData.sampleID, imuData.temperature); + pr_debug("qvr gts0=%llu num=%d denom=%d\n" + "qvr gx0=%d gy0=%d gz0=%d\n", + imuData.gts0, imuData.gNumerator, imuData.gDenominator, + imuData.gx0, imuData.gy0, imuData.gz0); + pr_debug("qvr ats0=%llu num=%d denom=%d\n" + "qvr ax0=%d ay0=%d az0=%d\n", + imuData.ats0, imuData.aNumerator, imuData.aDenominator, + imuData.ax0, imuData.ay0, imuData.az0); + pr_debug("qvr mts0=%llu num=%d denom=%d\n" + "mx0=%d my0=%d mz0=%d\n", + imuData.mts0, imuData.mNumerator, imuData.mDenominator, + imuData.mx0, imuData.my0, imuData.mz0); + } if (!sensor->ts_base) sensor->ts_base = ktime_to_ns(ktime_get_boottime()); if (!sensor->ts_offset) @@ -276,15 +301,28 @@ static int qvr_send_package_wrap(u8 *message, int msize, struct hid_device *hid) else data->mts = data->ats; data->gts = data->ats; - data->ax = -imuData.ax0; - data->ay = imuData.ay0; - data->az = -imuData.az0; - data->gx = -imuData.gx0; - data->gy = imuData.gy0; - data->gz = -imuData.gz0; - data->mx = -imuData.my0; - data->my = -imuData.mx0; - data->mz = -imuData.mz0; + + if (DEBUG_ORIENTATION == 1) { + data->ax = -imuData.ax0; + data->ay = imuData.ay0; + data->az = -imuData.az0; + data->gx = -imuData.gx0; + data->gy = imuData.gy0; + data->gz = -imuData.gz0; + data->mx = -imuData.my0; + data->my = -imuData.mx0; + data->mz = -imuData.mz0; + } else { + data->ax = -imuData.ay0; + data->ay = -imuData.ax0; + data->az = -imuData.az0; + data->gx = -imuData.gy0; + data->gy = -imuData.gx0; + data->gz = -imuData.gz0; + data->mx = -imuData.my0; + data->my = -imuData.mx0; + data->mz = -imuData.mz0; + } index_buf->most_recent_index = buf_index; buf_index = (buf_index == (8 - 1)) ? 0 : buf_index + 1;