Require CONFIG_HID_PLAYSTATION for DualSense key layout

Some olders kernels don't yet support HID_PLAYSTATION. While they are
working on supporting this driver, provide this temporary solution.

Before this patch, if the key layout is loaded, but there is no
HID_PLAYSTATION, then the mappings on the device will be incorrect.

With this patch, this key layout will not be loaded unless there is a
CONFIG_HID_PLAYSTATION enabled on the device.

Instead, when the main layout cannot be loaded, we make another attempt
to load a fallback layout. This way, the mappings on DualSense can be
correct even if the HID_PLAYSTATION module is not loaded.

In this CL, the fallback layout was tested using controllerTester.

Bug: 228005926
Test: tested mappings with a DualSense controller on a device that does
not have CONFIG_HID_PLAYSTATION

Change-Id: I7e46ae1943cd2c63b8c0b03fdf5d71adeea89f6f
Merged-In: I7e46ae1943cd2c63b8c0b03fdf5d71adeea89f6f
This commit is contained in:
Siarhei Vishniakou 2022-05-18 13:34:55 -07:00
parent 3e40b22290
commit 8169da18d8
5 changed files with 87 additions and 0 deletions

View File

@ -401,6 +401,7 @@ cc_library_shared {
// (e.g. gDefaultServiceManager)
"libbinder",
"libhidlbase", // libhwbinder is in here
"libvintf",
],
},
},

View File

@ -16,6 +16,8 @@
# Sony Playstation(R) DualSense Controller
#
# Only use this key layout if we have HID_PLAYSTATION!
requires_kernel_config CONFIG_HID_PLAYSTATION
# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html

View File

@ -0,0 +1,75 @@
# Copyright (C) 2022 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Sony Playstation(R) DualSense Controller
#
# Use this if HID_PLAYSTATION is not available
# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html
# Square
key 304 BUTTON_X
# Cross
key 305 BUTTON_A
# Circle
key 306 BUTTON_B
# Triangle
key 307 BUTTON_Y
key 308 BUTTON_L1
key 309 BUTTON_R1
key 310 BUTTON_L2
key 311 BUTTON_R2
# L2 axis
axis 0x03 LTRIGGER
# R2 axis
axis 0x04 RTRIGGER
# Left Analog Stick
axis 0x00 X
axis 0x01 Y
# Right Analog Stick
axis 0x02 Z
axis 0x05 RZ
# Left stick click
key 314 BUTTON_THUMBL
# Right stick click
key 315 BUTTON_THUMBR
# Hat
axis 0x10 HAT_X
axis 0x11 HAT_Y
# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt
# Share / "half-sun"
key 312 BUTTON_SELECT
# Options / three horizontal lines
key 313 BUTTON_START
# PS key
key 316 BUTTON_MODE
# Touchpad press
key 317 BUTTON_1
# SENSORs
sensor 0x00 ACCELEROMETER X
sensor 0x01 ACCELEROMETER Y
sensor 0x02 ACCELEROMETER Z
sensor 0x03 GYROSCOPE X
sensor 0x04 GYROSCOPE Y
sensor 0x05 GYROSCOPE Z

View File

@ -21,6 +21,7 @@ cc_binary_host {
cflags: [
"-Wall",
"-Werror",
"-Wextra",
],
static_libs: [
@ -31,6 +32,9 @@ cc_binary_host {
"liblog",
"libui-types",
],
shared_libs: [
"libvintf",
],
target: {
host_linux: {
static_libs: [

View File

@ -141,6 +141,11 @@ static bool validateFile(const char* filename) {
}
base::Result<std::shared_ptr<KeyLayoutMap>> ret = KeyLayoutMap::load(filename);
if (!ret.ok()) {
if (ret.error().message() == "Missing kernel config") {
// It means the layout is valid, but won't be loaded on this device because
// this layout requires a certain kernel config.
return true;
}
error("Error %s parsing key layout file.\n\n", ret.error().message().c_str());
return false;
}