diff --git a/projects/ROCKNIX/devices/SM8750/filesystem/usr/share/inputplumber/capability_maps/ayn_imu.yaml b/projects/ROCKNIX/devices/SM8750/filesystem/usr/share/inputplumber/capability_maps/ayn_imu.yaml new file mode 100644 index 00000000000..bb2bb210a35 --- /dev/null +++ b/projects/ROCKNIX/devices/SM8750/filesystem/usr/share/inputplumber/capability_maps/ayn_imu.yaml @@ -0,0 +1,52 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/ShadowBlip/InputPlumber/main/rootfs/usr/share/inputplumber/schema/capability_map_v2.json +# Schema version number +version: 2 + +# The type of configuration schema +kind: CapabilityMap + +# Name for the device event map +name: Ayn IMU + +# Unique identifier of the capability mapping +id: ayn_imu + +# List of mapped events +mapping: + - name: Accelerometer + source_events: + - evdev: + event_type: ABS + event_code: ABS_X + value_type: imu_x + - evdev: + event_type: ABS + event_code: ABS_Y + value_type: imu_y + - evdev: + event_type: ABS + event_code: ABS_Z + value_type: imu_z + target_event: + gamepad: + accelerometer: + name: Accelerometer + + - name: Gyro + source_events: + - evdev: + event_type: ABS + event_code: ABS_RX + value_type: imu_x + - evdev: + event_type: ABS + event_code: ABS_RY + value_type: imu_y + - evdev: + event_type: ABS + event_code: ABS_RZ + value_type: imu_z + target_event: + gamepad: + gyro: + name: Gyro diff --git a/projects/ROCKNIX/devices/SM8750/filesystem/usr/share/inputplumber/devices/01-ayn-controller.yaml b/projects/ROCKNIX/devices/SM8750/filesystem/usr/share/inputplumber/devices/01-ayn-controller.yaml index 8de5165a7af..47bacf3d8f3 100644 --- a/projects/ROCKNIX/devices/SM8750/filesystem/usr/share/inputplumber/devices/01-ayn-controller.yaml +++ b/projects/ROCKNIX/devices/SM8750/filesystem/usr/share/inputplumber/devices/01-ayn-controller.yaml @@ -11,15 +11,16 @@ name: AYN Layout # Only use this profile if *any* of the given matches matches. If this list is # empty, then the source devices will *always* be checked. # /sys/class/dmi/id/product_name -matches: - - udev: - sys_path: /sys/firmware/devicetree/base - attributes: - - name: model - value: AYN Odin 3 +#matches: +# - udev: +# sys_path: /sys/firmware/devicetree/base +# attributes: +# - name: model +# value: AYN Odin 3 +matches: [] -# Only allow a single source device per composite device of this type. -single_source: false +# Maximum number of source devices per CompositeDevice. +maximum_sources: 2 # One or more source devices to combine into a single virtual device. The events # from these devices will be watched and translated according to the key map. @@ -29,6 +30,10 @@ source_devices: phys_path: rsinput-gamepad/input0 handler: event* capability_map_id: ayn_mcu + - group: imu + fastrpc: + name: fastrpc-adsp-secure + capability_map_id: ayn_imu # Optional configuration for the composite device options: diff --git a/projects/ROCKNIX/devices/SM8750/options b/projects/ROCKNIX/devices/SM8750/options index 45c9ca83d11..e611209a165 100644 --- a/projects/ROCKNIX/devices/SM8750/options +++ b/projects/ROCKNIX/devices/SM8750/options @@ -53,7 +53,7 @@ FIRMWARE="" # Additional packages to install - ADDITIONAL_PACKAGES="gamepadcalibration rocknix-abl inputplumber extra-firmware" + ADDITIONAL_PACKAGES="gamepadcalibration rocknix-abl inputplumber extra-firmware sensor-firmware libssc qcom-fastrpc" # Debug tty path DEBUG_TTY="/dev/ttyMSM0" diff --git a/projects/ROCKNIX/packages/devel/libbsd/package.mk b/projects/ROCKNIX/packages/devel/libbsd/package.mk new file mode 100644 index 00000000000..adba1b7154d --- /dev/null +++ b/projects/ROCKNIX/packages/devel/libbsd/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2026-present ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="libbsd" +PKG_VERSION="0.12.2" +PKG_LICENSE="BSD-3-Clause" +PKG_SITE="https://gitlab.freedesktop.org/libbsd/libbsd" +PKG_URL="https://libbsd.freedesktop.org/releases/libbsd-${PKG_VERSION}.tar.xz" +PKG_DEPENDS_TARGET="toolchain libmd" +PKG_LONGDESC="Utility functions from BSD systems" +PKG_TOOLCHAIN="configure" \ No newline at end of file diff --git a/projects/ROCKNIX/packages/devel/libgudev/package.mk b/projects/ROCKNIX/packages/devel/libgudev/package.mk new file mode 100644 index 00000000000..4dd6af810fd --- /dev/null +++ b/projects/ROCKNIX/packages/devel/libgudev/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2026 ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="libgudev" +PKG_VERSION="bd531e8622e2c98a1da3d28a0a6df59c844f25c0" +PKG_LICENSE="LGPL-2.1-or-later" +PKG_SITE="https://gitlab.gnome.org/GNOME/libgudev" +PKG_URL="${PKG_SITE}/-/archive/${PKG_VERSION}/libgudev-${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain systemd ninja:host" +PKG_LONGDESC="Library providing GObject bindings for libudev" +PKG_TOOLCHAIN="meson" diff --git a/projects/ROCKNIX/packages/devel/libmd/package.mk b/projects/ROCKNIX/packages/devel/libmd/package.mk new file mode 100644 index 00000000000..06918610fa3 --- /dev/null +++ b/projects/ROCKNIX/packages/devel/libmd/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2026-present ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="libmd" +PKG_VERSION="1.2.0" +PKG_LICENSE="BSD-3-Clause" +PKG_SITE="https://www.hadrons.org/software/libmd/" +PKG_URL="https://libbsd.freedesktop.org/releases/libmd-${PKG_VERSION}.tar.xz" +PKG_DEPENDS_TARGET="toolchain" +PKG_LONGDESC="Provides message digest functions found on BSD systems" +PKG_TOOLCHAIN="autotools" \ No newline at end of file diff --git a/projects/ROCKNIX/packages/devel/libprotobuf-c/package.mk b/projects/ROCKNIX/packages/devel/libprotobuf-c/package.mk new file mode 100644 index 00000000000..d02fcb1098b --- /dev/null +++ b/projects/ROCKNIX/packages/devel/libprotobuf-c/package.mk @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2026 ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="libprotobuf-c" +PKG_VERSION="4719fdd7760624388c2c5b9d6759eb6a47490626" +PKG_LICENSE="BSD-2-Clause" +PKG_SITE="https://github.com/protobuf-c/protobuf-c" +PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain protobuf" +PKG_DEPENDS_HOST="toolchain:host protobuf:host" +PKG_LONGDESC="C implementation of the Google Protocol Buffers data serialization format" +PKG_TOOLCHAIN="autotools" + +post_makeinstall_target() { + rm -rf ${INSTALL}/usr/include + rm -rf ${INSTALL}/usr/bin +} \ No newline at end of file diff --git a/projects/ROCKNIX/packages/devel/libqmi/package.mk b/projects/ROCKNIX/packages/devel/libqmi/package.mk new file mode 100644 index 00000000000..afec8549b7d --- /dev/null +++ b/projects/ROCKNIX/packages/devel/libqmi/package.mk @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2026 ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="libqmi" +PKG_VERSION="0536681a4ab46021e13c1cf8fa94b0b13b93b0c6" +PKG_LICENSE="LGPL-2.1-or-later" +PKG_SITE="https://github.com/linux-mobile-broadband/libqmi" +PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain libgudev glib libqrtr-glib ninja:host" +PKG_LONGDESC="libqmi is a glib-based library for talking to WWAN modems and devices which speak the Qualcomm MSM Interface (QMI) protocol." +PKG_TOOLCHAIN="meson" + +pre_configure_target() { + PKG_MESON_OPTS_TARGET+=" -Dbash_completion=false \ + -Dmbim_qmux=false \ + -Dman=false \ + -Dintrospection=false" +} + +post_makeinstall_target() { + rm -rf ${INSTALL}/usr/include +} \ No newline at end of file diff --git a/projects/ROCKNIX/packages/devel/libqrtr-glib/package.mk b/projects/ROCKNIX/packages/devel/libqrtr-glib/package.mk new file mode 100644 index 00000000000..a4acc25a5fd --- /dev/null +++ b/projects/ROCKNIX/packages/devel/libqrtr-glib/package.mk @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2026 ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="libqrtr-glib" +PKG_VERSION="1689f8b96509314d569f06a05e986a887d6d6ce5" +PKG_LICENSE="LGPL-2.1-or-later" +PKG_SITE="https://github.com/linux-mobile-broadband/libqrtr-glib" +PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain glib" +PKG_DEPENDS_HOST="toolchain:host" +PKG_LONGDESC="libqrtr-glib is a glib-based library to use and manage the QRTR (Qualcomm IPC Router) bus." +PKG_TOOLCHAIN="meson" + +pre_configure_target() { + PKG_MESON_OPTS_TARGET+=" -Dintrospection=false" +} \ No newline at end of file diff --git a/projects/ROCKNIX/packages/devel/libssc/package.mk b/projects/ROCKNIX/packages/devel/libssc/package.mk new file mode 100644 index 00000000000..1a59a189c13 --- /dev/null +++ b/projects/ROCKNIX/packages/devel/libssc/package.mk @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2026 ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="libssc" +PKG_VERSION="fea9c0d9ecb5b8aecdf26554b26c1df6286526df" +PKG_LICENSE="GPLv3" +PKG_SITE="https://codeberg.org/DylanVanAssche/libssc" +PKG_URL="https://codeberg.org/DylanVanAssche/libssc/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain libprotobuf-c:host libprotobuf-c libqmi" +PKG_DEPENDS_HOST="toolchain:host" +PKG_LONGDESC="Library for exposing Qualcomm Sensor Core sensors to Linux." +PKG_TOOLCHAIN="meson" + +post_makeinstall_target() { + rm -rf ${INSTALL}/usr/include + rm -rf ${INSTALL}/usr/lib/python* +} \ No newline at end of file diff --git a/projects/ROCKNIX/packages/devel/libyaml/package.mk b/projects/ROCKNIX/packages/devel/libyaml/package.mk new file mode 100644 index 00000000000..2c5962b9940 --- /dev/null +++ b/projects/ROCKNIX/packages/devel/libyaml/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2026-present ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="libyaml" +PKG_VERSION="0.2.5" +PKG_LICENSE="MIT" +PKG_SITE="https://github.com/yaml/libyaml" +PKG_URL="${PKG_SITE}/releases/download/${PKG_VERSION}/yaml-${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain" +PKG_LONGDESC="A C library for parsing and emitting YAML" +PKG_TOOLCHAIN="autotools" \ No newline at end of file diff --git a/projects/ROCKNIX/packages/devel/protobuf/package.mk b/projects/ROCKNIX/packages/devel/protobuf/package.mk new file mode 100644 index 00000000000..dfd8be81155 --- /dev/null +++ b/projects/ROCKNIX/packages/devel/protobuf/package.mk @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2026 ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="protobuf" +PKG_VERSION="33.6" +PKG_LICENSE="BSD" +PKG_SITE="https://github.com/protocolbuffers/protobuf" +PKG_URL="${PKG_SITE}/releases/download/v${PKG_VERSION}/protobuf-${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain" +PKG_DEPENDS_HOST="toolchain:host" +PKG_LONGDESC="Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data" +PKG_TOOLCHAIN="cmake" + +PKG_CMAKE_OPTS_TARGET=" -Dprotobuf_BUILD_TESTS=OFF \ + -Dprotobuf_BUILD_EXAMPLES=OFF \ + -Dprotobuf_BUILD_PROTOC_BINARIES=OFF \ + -DBUILD_SHARED_LIBS=OFF \ + -Dprotobuf_ALLOW_CCACHE=ON" + +PKG_CMAKE_OPTS_HOST=${PKG_CMAKE_OPTS_TARGET} + +post_makeinstall_target() { + rm -rf ${INSTALL}/usr/lib + rm -rf ${INSTALL}/usr/include + rm -rf ${INSTALL}/usr/bin +} diff --git a/projects/ROCKNIX/packages/linux-firmware/sensor-firmware/package.mk b/projects/ROCKNIX/packages/linux-firmware/sensor-firmware/package.mk new file mode 100644 index 00000000000..93d7973569e --- /dev/null +++ b/projects/ROCKNIX/packages/linux-firmware/sensor-firmware/package.mk @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2026-present ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="sensor-firmware" +PKG_VERSION="ad572cb6627ee436cb1803bb7fc4ae86a9ea9003" +PKG_LICENSE="proprietary" +PKG_SITE="https://github.com/ROCKNIX/sensor-firmware" +PKG_URL="https://github.com/ROCKNIX/sensor-firmware/archive/${PKG_VERSION}.tar.gz" +PKG_LONGDESC="Extra kernel firmware needed for Qualcomm devices" +PKG_TOOLCHAIN="manual" + +makeinstall_target() { + mkdir -p ${INSTALL}/usr/share/qcom + + case "${DEVICE}" in + "SM8750") cp -ra devices/SM8750/* ${INSTALL}/usr/share/qcom ;; + esac +} \ No newline at end of file diff --git a/projects/ROCKNIX/packages/tools/inputplumber/package.mk b/projects/ROCKNIX/packages/tools/inputplumber/package.mk index 99b125fec4d..1290edb0806 100644 --- a/projects/ROCKNIX/packages/tools/inputplumber/package.mk +++ b/projects/ROCKNIX/packages/tools/inputplumber/package.mk @@ -2,19 +2,33 @@ # Copyright (C) 2025 ROCKNIX (https://github.com/ROCKNIX) PKG_NAME="inputplumber" -PKG_VERSION="v0.75.2" +PKG_VERSION="5ffb8b44d4daf377b9b0e1d7d1c26c65b7012d4b" PKG_LICENSE="GPLv3" -PKG_SITE="https://github.com/ShadowBlip/InputPlumber" -PKG_URL="https://github.com/ShadowBlip/InputPlumber/releases/download/${PKG_VERSION}/inputplumber-aarch64.tar.gz" +PKG_SITE="https://github.com/gio3k/InputPlumber" +PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain systemd libevdev libiio polkit" PKG_LONGDESC="Open source input router and remapper daemon for Linux" PKG_TOOLCHAIN="manual" +make_target() { + export LD_LIBRARY_PATH="${TOOLCHAIN}/lib" + export BINDGEN_EXTRA_CLANG_ARGS="--sysroot=${SYSROOT_PREFIX}" + + cargo build \ + --target ${TARGET_NAME} \ + --no-default-features +} + makeinstall_target() { - mkdir -p ${INSTALL}/usr - rsync -ar ${PKG_BUILD}/usr/ ${INSTALL}/usr/ + mkdir -p ${INSTALL} + cp -a ${PKG_BUILD}/rootfs/* ${INSTALL} + + mkdir -p ${INSTALL}/usr/bin + # TODO: change this from debug to release when this PR is ready to merge + # release builds take 10 minutes! + cp -a ${PKG_BUILD}/.${TARGET_NAME}/target/${TARGET_NAME}/debug/inputplumber ${INSTALL}/usr/bin } post_install() { enable_service inputplumber.service -} +} \ No newline at end of file diff --git a/projects/ROCKNIX/packages/tools/qcom-fastrpc/package.mk b/projects/ROCKNIX/packages/tools/qcom-fastrpc/package.mk new file mode 100644 index 00000000000..4f02a7f0b77 --- /dev/null +++ b/projects/ROCKNIX/packages/tools/qcom-fastrpc/package.mk @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2026-present ROCKNIX (https://github.com/ROCKNIX) + +PKG_NAME="qcom-fastrpc" +PKG_VERSION="1.0.5" +PKG_LICENSE="BSD-3-Clause" +PKG_SITE="https://github.com/qualcomm/fastrpc" +PKG_URL="${PKG_SITE}/archive/refs/tags/v${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain libyaml libmd libbsd meson" +PKG_LONGDESC="Qualcomm's userspace library that facilitates efficient remote procedure calls between the CPU and DSP" +PKG_TOOLCHAIN="autotools" + +PKG_CONFIGURE_OPTS_TARGET=" --with-config-base-dir=/usr/share/qcom \ + --with-systemdsystemunitdir=/usr/lib/systemd/system" + +post_makeinstall_target() { + cp -rf ${PKG_DIR}/scripts/* ${INSTALL}/usr/bin/ +} + +post_install() { + enable_service adsprpcd-sensorspd.service +} \ No newline at end of file diff --git a/projects/ROCKNIX/packages/tools/qcom-fastrpc/scripts/run-adsprpcd.sh b/projects/ROCKNIX/packages/tools/qcom-fastrpc/scripts/run-adsprpcd.sh new file mode 100755 index 00000000000..0ae54cda1d5 --- /dev/null +++ b/projects/ROCKNIX/packages/tools/qcom-fastrpc/scripts/run-adsprpcd.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2026 ROCKNIX (https://github.com/ROCKNIX) + +. /etc/profile + +# The sensor data structure works like this: +# /usr/share/qcom/base +# /usr/share/qcom/overlays/ + +MOUNT_OUTPUT_DIR="/tmp/qcom-hexagon-fs" + +SENSOR_DATA_BASE_DIR="/usr/share/qcom/base" +SENSOR_DATA_OVERLAY_DIR="/usr/share/qcom/overlays/${QUIRK_DEVICE}" +SENSOR_DATA_USER_DIR="/storage/.config/qcom-hexagon-fs" +SENSOR_DATA_WORK_DIR="/storage/.tmp/qcom-hexagon-fs-workdir" + +# If the base dir doesn't exist, there's nothing we can do +if [ ! -d "$SENSOR_DATA_BASE_DIR" ]; then + echo "Sensor data base directory for chip ${HW_DEVICE} not found at ${SENSOR_DATA_BASE_DIR}" + exit 1 +fi + +# Create our user dir if it doesn't exist +mkdir -p "$SENSOR_DATA_USER_DIR" + +# (Re)mount the sensor data using an overlayfs +mkdir -p "$MOUNT_OUTPUT_DIR" +umount "$MOUNT_OUTPUT_DIR" 2>/dev/null || true + +mkdir -p "$SENSOR_DATA_WORK_DIR" + +if [ -d "$SENSOR_DATA_OVERLAY_DIR" ]; then + echo "Mounting sensor data overlay (user dir, overlay dir, base dir)" + mount -t overlay overlay -o lowerdir="${SENSOR_DATA_OVERLAY_DIR}:${SENSOR_DATA_BASE_DIR}",upperdir="${SENSOR_DATA_USER_DIR}",workdir="${SENSOR_DATA_WORK_DIR}" $MOUNT_OUTPUT_DIR +else + echo "Mounting sensor data overlay (user dir, base dir)" + mount -t overlay overlay -o lowerdir="${SENSOR_DATA_BASE_DIR}",upperdir="${SENSOR_DATA_USER_DIR}",workdir="${SENSOR_DATA_WORK_DIR}" $MOUNT_OUTPUT_DIR +fi + +# FastRPC is odd and wants directories all over the place +mkdir -p "$MOUNT_OUTPUT_DIR"/mnt +mkdir -p "$MOUNT_OUTPUT_DIR"/mnt/vendor + +if [ -d "$MOUNT_OUTPUT_DIR"/vendor ]; then + # /vendor -> /mnt/vendor + echo "Mounting sensor data subpath: /vendor -> /mnt/vendor" + mount --rbind "$MOUNT_OUTPUT_DIR"/vendor "$MOUNT_OUTPUT_DIR"/mnt/vendor +fi + +echo "Running adsprpcd! (sensor data dir = $MOUNT_OUTPUT_DIR)" +export ADSP_LIBRARY_PATH=$MOUNT_OUTPUT_DIR +adsprpcd sensorspd adsp \ No newline at end of file diff --git a/projects/ROCKNIX/packages/tools/qcom-fastrpc/system.d/adsprpcd-sensorspd.service b/projects/ROCKNIX/packages/tools/qcom-fastrpc/system.d/adsprpcd-sensorspd.service new file mode 100644 index 00000000000..236b56af2b0 --- /dev/null +++ b/projects/ROCKNIX/packages/tools/qcom-fastrpc/system.d/adsprpcd-sensorspd.service @@ -0,0 +1,14 @@ +[Unit] +Description=Server for FastRPC remote procedure calls from Qualcomm Secure ADSP +After=dev-fastrpc-adsp-secure.device +ConditionPathExists=|/dev/fastrpc-adsp +ConditionPathExists=|/dev/fastrpc-adsp-secure + +[Service] +ExecStart=/usr/bin/run-adsprpcd.sh +Restart=on-failure +RestartSec=5 +User=root + +[Install] +WantedBy=multi-user.target inputplumber.service \ No newline at end of file