Compare commits

...
Author SHA1 Message Date
Joel Selvaraj 7f65149e69 device-oneplus-enchilada: start hexagonrpcd on boot and configure accelerometer
hexagonrpcd is necessary to provide access to the filesystem for the SDSP.
Also, OP6 accelerometer is mounted differently than the screen, adjust
it with a mount matrix. This way, screen rotations follow the actual
screen rotation by the user.
2023-05-20 08:02:00 +02:00
Joel Selvaraj 6de8d07ec7 firmware-oneplus-sdm845: install sensor firmware files
Sensor registry and DSP libraries are required for the SDSP
2023-05-20 08:01:52 +02:00
Dylan Van Assche b0ae6670ac device-shift-axolotl: start hexagonrpcd on boot
Necessary to provide access to the filesystem for the SDSP
2023-05-20 07:56:53 +02:00
Dylan Van Assche 0e3acd128e device-shift-axolotl: add accelerometer mount matrix
SHIFT6mq accelerometer is mounted differently than the screen,
adjust it with a mount matrix. This way, screen rotations follow
the actual screen rotation by the user.
2023-05-20 07:56:52 +02:00
Dylan Van Assche a06227241f firmware-shift-sdm845: install sensor firmware files
Sensor registry and DSP libraries are required for the SDSP
2023-05-20 07:56:51 +02:00
Dylan Van Assche 1000ca7cb5 temp/iio-sensor-proxy: fork from Alpine
Fork temporarily iio-sensor-proxy from Alpine to add support
for Qualcomm Snapdragon Sensor Core (SSC) sensors through libssc.
2023-05-20 07:56:49 +02:00
Dylan Van Assche 56b8eea5a6 temp/libssc: new aport
Add libssc for supporting Qualcomm Snapdragon Sensor Core sensors,
used by iio-sensor-proxy.
2023-05-20 07:56:48 +02:00
Dylan Van Assche aed833523b temp/libqmi: fork from Alpine
Support for QRTR-only QMI services.
2023-05-20 07:56:47 +02:00
Dylan Van Assche 32efcd3ce1 temp/hexagonrpcd: new aport
Qualcomm Hexagon virtual filesystem daemon is used by
Qualcomm DSPs to load files from the filesystem such
as the sensor registry, audio calibration files, etc.
2023-05-20 07:56:46 +02:00
34 changed files with 3302 additions and 21 deletions

No files matched your search

@@ -0,0 +1,3 @@
# iio-sensor-proxy with libssc: accelerometer mount matrix
SUBSYSTEM=="misc", KERNEL=="fastrpc-*", ENV{ACCEL_MOUNT_MATRIX}+="-1, 0, 0; 0, 1, 0; 0, 0, -1"
@@ -3,8 +3,8 @@
pkgname=device-oneplus-enchilada
pkgdesc="OnePlus 6"
pkgver=9
pkgrel=1
pkgver=10
pkgrel=0
url="https://postmarketos.org"
license="MIT"
arch="aarch64"
@@ -23,6 +23,7 @@ source="
deviceinfo
phoc.ini
q6voiced.conf
81-libssc-oneplus-enchilada.rules
"
subpackages="$pkgname-nonfree-firmware:nonfree_firmware $pkgname-phosh"
@@ -36,11 +37,13 @@ package() {
nonfree_firmware() {
pkgdesc="Modem, WiFi and GPU Firmware, also needed for osk-sdl"
depends="firmware-oneplus-sdm845 firmware-oneplus-sdm845-initramfs
soc-qcom-sdm845-nonfree-firmware soc-qcom-sdm845-modem"
depends="firmware-oneplus-sdm845>=8 firmware-oneplus-sdm845-initramfs
soc-qcom-sdm845-nonfree-firmware soc-qcom-sdm845-modem hexagonrpcd"
install="$subpkgname.post-install $subpkgname.post-upgrade"
mkdir "$subpkgdir"
install -Dm644 q6voiced.conf "$subpkgdir"/etc/conf.d/q6voiced
install -Dm644 "$srcdir"/81-libssc-oneplus-enchilada.rules -t "$pkgdir"/usr/lib/udev/rules.d/
}
phosh() {
@@ -53,4 +56,5 @@ sha512sums="
6dd8948f6c23b35c60aa82c4db40b3c2aa766aa2cc53c84d86028f54cc2303201a80d70fe8830cd746f01a8ea2459f55ebbc2412c2e222a7e9e9e1649d9505a5 deviceinfo
65f74d29ab318b23f7ac8923a3661f2c4130049273a8c6be234ed2c8e00810b6a1254b54cf0932e42850a6d48f821dcd038900fbb836feeddfab2759afffae38 phoc.ini
fe9871c325a38c0cadc9631870801ec15ab9f5b786ee854325b93eb3d23e7d8b1ac4f1075572ffcd225d8ec514dec09b986972ddff12a89260c0218af6de7887 q6voiced.conf
f4961015c920c50182d35767de080f16ec348ff693a8cca91dd2593640cf19c31c1e6eac1e8a12a1d38946755eb21bdacad29c9e972adaec854500ab3a7ad3a0 81-libssc-oneplus-enchilada.rules
"
@@ -0,0 +1,2 @@
#!/bin/sh
rc-update add hexagonrpcd-sdsp
@@ -0,0 +1 @@
device-oneplus-enchilada-nonfree-firmware.post-install
@@ -0,0 +1,4 @@
# iio-sensor-proxy with libssc: accelerometer mount matrix
SUBSYSTEM=="misc", KERNEL=="fastrpc-*", ENV{ACCEL_MOUNT_MATRIX}+="-1, 0, 0; 0, -1, 0; 0, 0, -1"
@@ -4,8 +4,8 @@
pkgname=device-shift-axolotl
pkgdesc="SHIFT6mq"
pkgver=8
pkgrel=1
pkgver=10
pkgrel=0
url="https://postmarketos.org"
license="MIT"
arch="aarch64"
@@ -26,6 +26,7 @@ source="
deviceinfo
phoc.ini
q6voiced.conf
81-libssc-shift-axolotl.rules
"
subpackages="
$pkgname-nonfree-firmware:nonfree_firmware
@@ -42,11 +43,13 @@ package() {
nonfree_firmware() {
pkgdesc="Modem, GPU and WiFi Firmware, also needed for osk-sdl"
depends="firmware-shift-sdm845 firmware-shift-sdm845-initramfs
soc-qcom-sdm845-nonfree-firmware soc-qcom-sdm845-modem"
depends="firmware-shift-sdm845>=0.4 firmware-shift-sdm845-initramfs
soc-qcom-sdm845-nonfree-firmware soc-qcom-sdm845-modem hexagonrpcd"
install="$subpkgname.post-install $subpkgname.post-upgrade"
mkdir "$subpkgdir"
install -Dm644 q6voiced.conf "$subpkgdir"/etc/conf.d/q6voiced
install -Dm644 "$srcdir"/81-libssc-shift-axolotl.rules -t "$pkgdir"/usr/lib/udev/rules.d/
}
phosh() {
@@ -59,4 +62,5 @@ sha512sums="
a3e9ae292631233480b0fa60d90a7c0940162ea3876ae4bb8f2ad09ca4da94e9bcd6a0c690e8957ba4cd5d11ac50d3b32e7c89df5c44fd523aef6ea5e9c05c3d deviceinfo
65f74d29ab318b23f7ac8923a3661f2c4130049273a8c6be234ed2c8e00810b6a1254b54cf0932e42850a6d48f821dcd038900fbb836feeddfab2759afffae38 phoc.ini
2a3cbdad5aa91181d24a4e56e63986af6accf887c64fa4d1b6ddad1926e29050243c4b1e2fd892d38ca7c16e24dff8545a16552e5749ae31b6d01bf428468e51 q6voiced.conf
3bd3a82b88a7aca4e2df2f5522cee7a98d017994f1dc1a965a7e386be9c17632b9cdbe013feb737dec12e99d74f54a9e4599144193bb57ec18e6d6a18c94cf1f 81-libssc-shift-axolotl.rules
"
@@ -0,0 +1,2 @@
#!/bin/sh
rc-update add hexagonrpcd-sdsp
@@ -0,0 +1 @@
device-shift-axolotl-nonfree-firmware.post-install
@@ -1,22 +1,24 @@
# Maintainer: Caleb Connolly <caleb@connolly.tech>
pkgname=firmware-oneplus-sdm845
pkgver=7
pkgrel=1
pkgver=8
pkgrel=0
pkgdesc="Firmware for OnePlus 6 / 6T"
url="https://gitlab.com/sdm845-mainline/firmware-oneplus-sdm845"
arch="aarch64"
depends="linux-firmware-qcom linux-firmware-ath10k"
license="proprietary"
options="!check !strip !archcheck !tracedeps pmb:cross-native"
options="!check !strip !archcheck !tracedeps textrels pmb:cross-native"
_version="895bb1c8dd0695635df354bbd713740af48e47ce"
_version="dc9c77f220d104d7224c03fcbfc419a03a58765e"
source="$pkgname.tar.gz::$url/-/archive/$_version/$pkgname-$_version.tar.gz
firmware.files
sensor.files
30-gpu-firmware.files"
subpackages="
$pkgname-initramfs:firmware_initramfs"
$pkgname-initramfs:firmware_initramfs
$pkgname-sensors:firmware_sensors"
package() {
cd "$srcdir/$pkgname-$_version/"
@@ -35,8 +37,23 @@ firmware_initramfs() {
"$subpkgdir/usr/share/mkinitfs/files/30-gpu-firmware.files"
}
firmware_sensors() {
pkgdesc="Files to be included to add sensor support"
depends="$pkgname"
install_if="$pkgname-nonfree-firmware"
mkdir "$subpkgdir"
cd "$srcdir/$pkgname-$_version/"
while IFS="" read -r _i || [ -n "$_i" ]; do
[ ! -d $(dirname $_i) ] && mkdir -p $(dirname $_i)
echo $_i
install -Dm644 $_i "$pkgdir/$_i"
done < "$srcdir/sensor.files"
}
sha512sums="
59091452f1d6363fab0474ebc2738ec8fca6903c64837c3b6228eefb2030b0b4d5f0694770ddadf81f59f2ace4fad548459ad7a6604498aaa08a9064fb1dc736 firmware-oneplus-sdm845.tar.gz
d2295ba3346ded12e88bb1b27958418cb14ab6bb8f2c23e73a66168f53eac0cc8a10e4be28181724e92ff75ef8608c4483641e24bfd9f05c4ff7b351179ba784 firmware.files
d14b22434016cb12b8c04a3e7ac186451d77b92284e926a2771d958960d4da8ffb10cb9db555a200babcedd7be3379d2840882d19c26edc88805eee943310c2f firmware-oneplus-sdm845.tar.gz
2516cd2a3a9880fc5efd7f8e2dbdd6826531853068c3fe10eaeb8304d59c197e11744b1664a0e77a9907e9119344654e02264e224e15ab2347a1a858e3f93023 firmware.files
4e5c4f55d4b084c6c21810b93a63a75ad86dd04cd1c079497bd2387f8bd0a411053ca1e894974af8bfda77ddc79c92a6669550be3a48fbef01cf797b54d6cb67 sensor.files
bc6c329bf6bb9622320ab610f4f5fb944129e276855a4cf5646cb29a553f4c47cd9a4ef4305cbcd94a991471bc109b8f615cefd6871be99bf6a457fe0fa5aa19 30-gpu-firmware.files
"
@@ -8,6 +8,7 @@
./lib/firmware/qcom/sdm845/oneplus6/modemuw.jsn
./lib/firmware/qcom/sdm845/oneplus6/slpir.jsn
./lib/firmware/qcom/sdm845/oneplus6/slpius.jsn
./lib/firmware/qcom/sdm845/oneplus6/slpi.mbn
./lib/firmware/qcom/sdm845/oneplus6/venus.mbn
./lib/firmware/qcom/sdm845/oneplus6/wlanmdsp.mbn
./lib/firmware/qcom/sdm845/oneplus6/a630_zap.mbn
@@ -0,0 +1,450 @@
./etc/qcom/sensors.d/ak991x_dri_0.json
./etc/qcom/sensors.d/ak991x_polling_0.json
./etc/qcom/sensors.d/apds9251.json
./etc/qcom/sensors.d/bmi160_0.json
./etc/qcom/sensors.d/lsm6dsm_0_16g.json
./etc/qcom/sensors.d/lsm6dsm_0_8g.json
./etc/qcom/sensors.d/lsm6dso_0_16g.json
./etc/qcom/sensors.d/lsm6dso_0_8g.json
./etc/qcom/sensors.d/lsm6dst_0.json
./etc/qcom/sensors.d/mmc3530kj_0.json
./etc/qcom/sensors.d/mmc5603nj_0.json
./etc/qcom/sensors.d/sdm845_ak991x_0.json
./etc/qcom/sensors.d/sdm845_apds9251.json
./etc/qcom/sensors.d/sdm845_bma2x2_0.json
./etc/qcom/sensors.d/sdm845_bmg160_0.json
./etc/qcom/sensors.d/sdm845_bmi160_0.json
./etc/qcom/sensors.d/sdm845_bmm150_0.json
./etc/qcom/sensors.d/sdm845_default_sensors.json
./etc/qcom/sensors.d/sdm845_irq.json
./etc/qcom/sensors.d/sdm845_lsm6ds3c_0.json
./etc/qcom/sensors.d/sdm845_mmc3530kj_0.json
./etc/qcom/sensors.d/sdm845_mmc5630nj_0.json
./etc/qcom/sensors.d/sdm845_power_0.json
./etc/qcom/sensors.d/sdm845_qrd_power_0.json
./etc/qcom/sensors.d/sdm845_stk36xx_0.json
./etc/qcom/sensors.d/sdm845_stk3x3x_0.json
./etc/qcom/sensors.d/sdm845_svr_bma2x2_0.json
./etc/qcom/sensors.d/sdm845_svr_bmg160_0.json
./etc/qcom/sensors.d/sdm845_svr_rpr0521rs_0.json
./etc/qcom/sensors.d/sdm845_sx932x_0.json
./etc/qcom/sensors.d/sdm845_tcs3400.json
./etc/qcom/sensors.d/sdm845_tmd3702.json
./etc/qcom/sensors.d/sdm845_tmd3725.json
./etc/qcom/sensors.d/sns_amd.json
./etc/qcom/sensors.d/sns_amd_sw_disabled.json
./etc/qcom/sensors.d/sns_amd_sw_enabled.json
./etc/qcom/sensors.d/sns_aont.json
./etc/qcom/sensors.d/sns_basic_gestures.json
./etc/qcom/sensors.d/sns_bring_to_ear.json
./etc/qcom/sensors.d/sns_ccd.json
./etc/qcom/sensors.d/sns_ccd_v2_walk.json
./etc/qcom/sensors.d/sns_ccd_v3_walk.json
./etc/qcom/sensors.d/sns_cm.json
./etc/qcom/sensors.d/sns_dae.json
./etc/qcom/sensors.d/sns_device_orient.json
./etc/qcom/sensors.d/sns_diag_filter.json
./etc/qcom/sensors.d/sns_distance_bound.json
./etc/qcom/sensors.d/sns_dpc.json
./etc/qcom/sensors.d/sns_facing.json
./etc/qcom/sensors.d/sns_fmv.json
./etc/qcom/sensors.d/sns_geomag_rv.json
./etc/qcom/sensors.d/sns_gyro_cal.json
./etc/qcom/sensors.d/sns_heart_rate.json
./etc/qcom/sensors.d/sns_mag_cal.json
./etc/qcom/sensors.d/sns_mag_cal_legacy.json
./etc/qcom/sensors.d/sns_multishake.json
./etc/qcom/sensors.d/sns_pedometer.json
./etc/qcom/sensors.d/sns_rmd.json
./etc/qcom/sensors.d/sns_rotv.json
./etc/qcom/sensors.d/sns_smd.json
./etc/qcom/sensors.d/sns_tilt.json
./etc/qcom/sensors.d/sns_tilt_sw_disabled.json
./etc/qcom/sensors.d/sns_tilt_sw_enabled.json
./etc/qcom/sensors.d/sns_tilt_to_wake.json
./etc/qcom/sensors.d/sns_wrist_pedo.json
./etc/qcom/sensors.d/stk36xx_0.json
./etc/qcom/sensors.d/stk3x3x_0.json
./etc/qcom/sensors.d/sx932x_0.json
./etc/qcom/sensors.d/tcs3400.json
./etc/qcom/sensors.d/tmd3702.json
./etc/qcom/sensors.d/tmd3725.json
./etc/qcom/sns_reg.conf
./usr/lib/qcom/adsp/AlacDecoderModule.so.1
./usr/lib/qcom/adsp/ApeDecoderModule.so.1
./usr/lib/qcom/adsp/AudioContextDetection.so.1
./usr/lib/qcom/adsp/AudioSphereModule.so.1
./usr/lib/qcom/adsp/CFCMModule.so.1
./usr/lib/qcom/adsp/EtsiAmrWbPlusDecModule.so.1
./usr/lib/qcom/adsp/EtsiEaacPlusEncAndCmnModule.so.1
./usr/lib/qcom/adsp/FlacDecoderModule.so.1
./usr/lib/qcom/adsp/HeaacDecoderModule.so.1
./usr/lib/qcom/adsp/LdacModule.so.1
./usr/lib/qcom/adsp/SAPlusCmnModule.so.1
./usr/lib/qcom/adsp/SVACmnModule.so.1
./usr/lib/qcom/adsp/VoiceWakeup_V2_Module.so.1
./usr/lib/qcom/adsp/VorbisDecoderModule.so.1
./usr/lib/qcom/adsp/WmaProDecoderModule.so.1
./usr/lib/qcom/adsp/WmaStdDecoderModule.so.1
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_Bluetooth_cal.acdb
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_Codec_cal.acdb
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_General_cal.acdb
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_Global_cal.acdb
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_Handset_cal.acdb
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_Hdmi_cal.acdb
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_Headset_cal.acdb
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_Speaker_cal.acdb
./usr/lib/qcom/adsp/avs/acdbdata/MTP/MTP_workspaceFile.qwsp
./usr/lib/qcom/adsp/avs/acdbdata/adsp_avs_config.acdb
./usr/lib/qcom/adsp/fastrpc_shell_0
./usr/lib/qcom/adsp/fluence_voiceplus_module.so.1
./usr/lib/qcom/adsp/libstabilitydomain_skel.so
./usr/lib/qcom/adsp/libsysmon_skel.so
./usr/lib/qcom/adsp/libsysmondomain_skel.so
./usr/lib/qcom/adsp/map_AVS_SHARED_LIBS_845.adsp.prodQ.txt
./usr/lib/qcom/adsp/map_SHARED_LIBS_845.adsp.prodQ.txt
./usr/lib/qcom/adsp/mmecns_module.so.1
./usr/lib/qcom/cdsp/fastrpc_shell_3
./usr/lib/qcom/cdsp/libbenchmark_skel.so
./usr/lib/qcom/cdsp/libc++.so.1
./usr/lib/qcom/cdsp/libc++abi.so.1
./usr/lib/qcom/cdsp/libhcp_rpc_skel.so
./usr/lib/qcom/cdsp/libstabilitydomain_skel.so
./usr/lib/qcom/cdsp/libsysmon_skel.so
./usr/lib/qcom/cdsp/libsysmondomain_skel.so
./usr/lib/qcom/cdsp/libvpp_aie.so
./usr/lib/qcom/cdsp/libvpp_diagtools.so
./usr/lib/qcom/cdsp/libvpp_frc.so
./usr/lib/qcom/cdsp/libvpp_mvp.so
./usr/lib/qcom/cdsp/libvpp_nr.so
./usr/lib/qcom/cdsp/libvpp_qbr.so
./usr/lib/qcom/cdsp/libvpp_svc_skel.so
./usr/lib/qcom/cdsp/map_SHARED_LIBS_845.cdsp.prodQ.txt
./usr/lib/qcom/cdsp/ubwcdma_dynlib.so
./usr/lib/qcom/sdsp/cellinfo_tools.so
./usr/lib/qcom/sdsp/chre_app_coverage.so
./usr/lib/qcom/sdsp/chre_app_coverage2.so
./usr/lib/qcom/sdsp/chre_app_oem.so
./usr/lib/qcom/sdsp/chre_app_sensor_cfg.so
./usr/lib/qcom/sdsp/chre_drv_bt.so
./usr/lib/qcom/sdsp/chre_drv_gf.so
./usr/lib/qcom/sdsp/chre_drv_loc.so
./usr/lib/qcom/sdsp/chre_drv_modem.so
./usr/lib/qcom/sdsp/chre_drv_wifi.so
./usr/lib/qcom/sdsp/chre_pal.so
./usr/lib/qcom/sdsp/fastrpc_shell_2
./usr/lib/qcom/sdsp/libFastRPC_UTF_Forward_800s_sdm845_skel.so
./usr/lib/qcom/sdsp/libchre_slpi_skel.so
./usr/lib/qcom/sdsp/libstabilitydomain_skel.so
./usr/lib/qcom/sdsp/libsysmon_skel.so
./usr/lib/qcom/sdsp/libsysmondomain_skel.so
./usr/lib/qcom/sdsp/lowi_client.so
./usr/lib/qcom/sdsp/map_SHARED_LIBS_AAAAAAAAQ.txt
./usr/lib/qcom/sdsp/map_SSC_SLPI_USER_AAAAAAAAQ.txt
./usr/lib/qcom/sdsp/sensor_testapp_40.so
./var/lib/qcom/sensors/registry/ak0991x_0
./var/lib/qcom/sensors/registry/ak0991x_0.mag
./var/lib/qcom/sensors/registry/ak0991x_0.mag.config
./var/lib/qcom/sensors/registry/ak0991x_0.mag.config_2
./var/lib/qcom/sensors/registry/ak0991x_0_platform
./var/lib/qcom/sensors/registry/ak0991x_0_platform.config
./var/lib/qcom/sensors/registry/ak0991x_0_platform.mag
./var/lib/qcom/sensors/registry/ak0991x_0_platform.mag.fac_cal
./var/lib/qcom/sensors/registry/ak0991x_0_platform.mag.fac_cal.bias
./var/lib/qcom/sensors/registry/ak0991x_0_platform.mag.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/ak0991x_0_platform.orient
./var/lib/qcom/sensors/registry/ak0991x_0_platform.placement
./var/lib/qcom/sensors/registry/apds9251
./var/lib/qcom/sensors/registry/apds9251.ambient_light
./var/lib/qcom/sensors/registry/apds9251.ambient_light.config
./var/lib/qcom/sensors/registry/apds9251.ambient_temperature
./var/lib/qcom/sensors/registry/apds9251.ambient_temperature.config
./var/lib/qcom/sensors/registry/apds9251_platform
./var/lib/qcom/sensors/registry/apds9251_platform.ambient_light
./var/lib/qcom/sensors/registry/apds9251_platform.ambient_light.fac_cal
./var/lib/qcom/sensors/registry/apds9251_platform.ambient_temperature
./var/lib/qcom/sensors/registry/apds9251_platform.ambient_temperature.fac_cal
./var/lib/qcom/sensors/registry/apds9251_platform.config
./var/lib/qcom/sensors/registry/apds9251_platform.placement
./var/lib/qcom/sensors/registry/bmi160_0
./var/lib/qcom/sensors/registry/bmi160_0.accel
./var/lib/qcom/sensors/registry/bmi160_0.accel.config
./var/lib/qcom/sensors/registry/bmi160_0.gyro
./var/lib/qcom/sensors/registry/bmi160_0.gyro.config
./var/lib/qcom/sensors/registry/bmi160_0.md
./var/lib/qcom/sensors/registry/bmi160_0.md.config
./var/lib/qcom/sensors/registry/bmi160_0.temp
./var/lib/qcom/sensors/registry/bmi160_0.temp.config
./var/lib/qcom/sensors/registry/bmi160_0_platform
./var/lib/qcom/sensors/registry/bmi160_0_platform.accel
./var/lib/qcom/sensors/registry/bmi160_0_platform.accel.fac_cal
./var/lib/qcom/sensors/registry/bmi160_0_platform.accel.fac_cal.bias
./var/lib/qcom/sensors/registry/bmi160_0_platform.accel.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/bmi160_0_platform.config
./var/lib/qcom/sensors/registry/bmi160_0_platform.gyro
./var/lib/qcom/sensors/registry/bmi160_0_platform.gyro.fac_cal
./var/lib/qcom/sensors/registry/bmi160_0_platform.gyro.fac_cal.bias
./var/lib/qcom/sensors/registry/bmi160_0_platform.gyro.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/bmi160_0_platform.md
./var/lib/qcom/sensors/registry/bmi160_0_platform.md.config
./var/lib/qcom/sensors/registry/bmi160_0_platform.orient
./var/lib/qcom/sensors/registry/bmi160_0_platform.placement
./var/lib/qcom/sensors/registry/bmi160_0_platform.temp
./var/lib/qcom/sensors/registry/bmi160_0_platform.temp.fac_cal
./var/lib/qcom/sensors/registry/bmi160_0_platform.temp.fac_cal.bias
./var/lib/qcom/sensors/registry/bmi160_0_platform.temp.fac_cal.scale
./var/lib/qcom/sensors/registry/default_sensors
./var/lib/qcom/sensors/registry/default_sensors.accel
./var/lib/qcom/sensors/registry/default_sensors.accel.attr_0
./var/lib/qcom/sensors/registry/default_sensors.accel_cal
./var/lib/qcom/sensors/registry/default_sensors.accel_cal.attr_0
./var/lib/qcom/sensors/registry/default_sensors.ambient_light
./var/lib/qcom/sensors/registry/default_sensors.ambient_light.attr_0
./var/lib/qcom/sensors/registry/default_sensors.amd
./var/lib/qcom/sensors/registry/default_sensors.amd.attr_0
./var/lib/qcom/sensors/registry/default_sensors.fmv
./var/lib/qcom/sensors/registry/default_sensors.fmv.attr_0
./var/lib/qcom/sensors/registry/default_sensors.game_rv
./var/lib/qcom/sensors/registry/default_sensors.game_rv.attr_0
./var/lib/qcom/sensors/registry/default_sensors.geomag_rv
./var/lib/qcom/sensors/registry/default_sensors.geomag_rv.attr_0
./var/lib/qcom/sensors/registry/default_sensors.gravity
./var/lib/qcom/sensors/registry/default_sensors.gravity.attr_0
./var/lib/qcom/sensors/registry/default_sensors.gyro
./var/lib/qcom/sensors/registry/default_sensors.gyro.attr_0
./var/lib/qcom/sensors/registry/default_sensors.gyro_cal
./var/lib/qcom/sensors/registry/default_sensors.gyro_cal.attr_0
./var/lib/qcom/sensors/registry/default_sensors.gyro_rot_matrix
./var/lib/qcom/sensors/registry/default_sensors.gyro_rot_matrix.attr_0
./var/lib/qcom/sensors/registry/default_sensors.mag
./var/lib/qcom/sensors/registry/default_sensors.mag.attr_0
./var/lib/qcom/sensors/registry/default_sensors.mag_cal
./var/lib/qcom/sensors/registry/default_sensors.mag_cal.attr_0
./var/lib/qcom/sensors/registry/default_sensors.motion_detect
./var/lib/qcom/sensors/registry/default_sensors.motion_detect.attr_0
./var/lib/qcom/sensors/registry/default_sensors.proximity
./var/lib/qcom/sensors/registry/default_sensors.proximity.attr_0
./var/lib/qcom/sensors/registry/default_sensors.rotv
./var/lib/qcom/sensors/registry/default_sensors.rotv.attr_0
./var/lib/qcom/sensors/registry/default_sensors.sensor_temperature
./var/lib/qcom/sensors/registry/default_sensors.sensor_temperature.attr_0
./var/lib/qcom/sensors/registry/default_sensors.tilt
./var/lib/qcom/sensors/registry/default_sensors.tilt.attr_0
./var/lib/qcom/sensors/registry/lsm6ds3c_0
./var/lib/qcom/sensors/registry/lsm6ds3c_0.accel
./var/lib/qcom/sensors/registry/lsm6ds3c_0.accel.config
./var/lib/qcom/sensors/registry/lsm6ds3c_0.gyro
./var/lib/qcom/sensors/registry/lsm6ds3c_0.gyro.config
./var/lib/qcom/sensors/registry/lsm6ds3c_0.md
./var/lib/qcom/sensors/registry/lsm6ds3c_0.md.config
./var/lib/qcom/sensors/registry/lsm6ds3c_0.temp
./var/lib/qcom/sensors/registry/lsm6ds3c_0.temp.config
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.accel
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.accel.fac_cal
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.accel.fac_cal.bias
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.accel.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.config
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.gyro
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.gyro.fac_cal
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.gyro.fac_cal.bias
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.gyro.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.md
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.md.config
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.orient
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.placement
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.temp
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.temp.fac_cal
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.temp.fac_cal.bias
./var/lib/qcom/sensors/registry/lsm6ds3c_0_platform.temp.fac_cal.scale
./var/lib/qcom/sensors/registry/lsm6dsm_0
./var/lib/qcom/sensors/registry/lsm6dsm_0.accel
./var/lib/qcom/sensors/registry/lsm6dsm_0.accel.config
./var/lib/qcom/sensors/registry/lsm6dsm_0.gyro
./var/lib/qcom/sensors/registry/lsm6dsm_0.gyro.config
./var/lib/qcom/sensors/registry/lsm6dsm_0.md
./var/lib/qcom/sensors/registry/lsm6dsm_0.md.config
./var/lib/qcom/sensors/registry/lsm6dsm_0.temp
./var/lib/qcom/sensors/registry/lsm6dsm_0.temp.config
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.accel
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.accel.fac_cal
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.accel.fac_cal.bias
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.accel.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.config
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.gyro
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.gyro.fac_cal
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.gyro.fac_cal.bias
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.gyro.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.md
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.md.config
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.orient
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.placement
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.temp
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.temp.fac_cal
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.temp.fac_cal.bias
./var/lib/qcom/sensors/registry/lsm6dsm_0_platform.temp.fac_cal.scale
./var/lib/qcom/sensors/registry/mmc3530kj_0
./var/lib/qcom/sensors/registry/mmc3530kj_0.mag
./var/lib/qcom/sensors/registry/mmc3530kj_0.mag.config
./var/lib/qcom/sensors/registry/mmc3530kj_0_platform
./var/lib/qcom/sensors/registry/mmc3530kj_0_platform.config
./var/lib/qcom/sensors/registry/mmc3530kj_0_platform.mag
./var/lib/qcom/sensors/registry/mmc3530kj_0_platform.mag.fac_cal
./var/lib/qcom/sensors/registry/mmc3530kj_0_platform.mag.fac_cal.bias
./var/lib/qcom/sensors/registry/mmc3530kj_0_platform.mag.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/mmc3530kj_0_platform.orient
./var/lib/qcom/sensors/registry/mmc3530kj_0_platform.placement
./var/lib/qcom/sensors/registry/mmc5603nj_0
./var/lib/qcom/sensors/registry/mmc5603nj_0.mag
./var/lib/qcom/sensors/registry/mmc5603nj_0.mag.config
./var/lib/qcom/sensors/registry/mmc5603nj_0_platform
./var/lib/qcom/sensors/registry/mmc5603nj_0_platform.config
./var/lib/qcom/sensors/registry/mmc5603nj_0_platform.mag
./var/lib/qcom/sensors/registry/mmc5603nj_0_platform.mag.fac_cal
./var/lib/qcom/sensors/registry/mmc5603nj_0_platform.mag.fac_cal.bias
./var/lib/qcom/sensors/registry/mmc5603nj_0_platform.mag.fac_cal.corr_mat
./var/lib/qcom/sensors/registry/mmc5603nj_0_platform.orient
./var/lib/qcom/sensors/registry/mmc5603nj_0_platform.placement
./var/lib/qcom/sensors/registry/power
./var/lib/qcom/sensors/registry/power.gpio
./var/lib/qcom/sensors/registry/power.gpio.gpio_0
./var/lib/qcom/sensors/registry/power.gpio.gpio_1
./var/lib/qcom/sensors/registry/power.gpio.gpio_10
./var/lib/qcom/sensors/registry/power.gpio.gpio_11
./var/lib/qcom/sensors/registry/power.gpio.gpio_12
./var/lib/qcom/sensors/registry/power.gpio.gpio_13
./var/lib/qcom/sensors/registry/power.gpio.gpio_14
./var/lib/qcom/sensors/registry/power.gpio.gpio_15
./var/lib/qcom/sensors/registry/power.gpio.gpio_16
./var/lib/qcom/sensors/registry/power.gpio.gpio_17
./var/lib/qcom/sensors/registry/power.gpio.gpio_2
./var/lib/qcom/sensors/registry/power.gpio.gpio_3
./var/lib/qcom/sensors/registry/power.gpio.gpio_4
./var/lib/qcom/sensors/registry/power.gpio.gpio_5
./var/lib/qcom/sensors/registry/power.gpio.gpio_6
./var/lib/qcom/sensors/registry/power.gpio.gpio_7
./var/lib/qcom/sensors/registry/power.gpio.gpio_8
./var/lib/qcom/sensors/registry/power.gpio.gpio_9
./var/lib/qcom/sensors/registry/power.island
./var/lib/qcom/sensors/registry/sensors_settings
./var/lib/qcom/sensors/registry/sns_amd
./var/lib/qcom/sensors/registry/sns_aont
./var/lib/qcom/sensors/registry/sns_basic_gestures
./var/lib/qcom/sensors/registry/sns_bring_to_ear
./var/lib/qcom/sensors/registry/sns_cm
./var/lib/qcom/sensors/registry/sns_device_orient_platform
./var/lib/qcom/sensors/registry/sns_device_orient_platform.config
./var/lib/qcom/sensors/registry/sns_diag_config
./var/lib/qcom/sensors/registry/sns_diag_sensor_datatype
./var/lib/qcom/sensors/registry/sns_direct_channel
./var/lib/qcom/sensors/registry/sns_distance_bound_speed_for_motion_states
./var/lib/qcom/sensors/registry/sns_dpc
./var/lib/qcom/sensors/registry/sns_facing
./var/lib/qcom/sensors/registry/sns_fmv_platform
./var/lib/qcom/sensors/registry/sns_fmv_platform.config
./var/lib/qcom/sensors/registry/sns_geomag_rv
./var/lib/qcom/sensors/registry/sns_geomag_rv.config
./var/lib/qcom/sensors/registry/sns_gyro_cal_config
./var/lib/qcom/sensors/registry/sns_gyro_cal_persist
./var/lib/qcom/sensors/registry/sns_gyro_cal_persist.bias
./var/lib/qcom/sensors/registry/sns_gyro_cal_persist.compensation_matrix
./var/lib/qcom/sensors/registry/sns_gyro_cal_persist.scale_factor
./var/lib/qcom/sensors/registry/sns_gyro_cal_persist_s0
./var/lib/qcom/sensors/registry/sns_gyro_cal_persist_s0.bias
./var/lib/qcom/sensors/registry/sns_gyro_cal_persist_s0.compensation_matrix
./var/lib/qcom/sensors/registry/sns_gyro_cal_persist_s0.scale_factor
./var/lib/qcom/sensors/registry/sns_irq
./var/lib/qcom/sensors/registry/sns_mag_cal_config
./var/lib/qcom/sensors/registry/sns_multishake
./var/lib/qcom/sensors/registry/sns_pedometer
./var/lib/qcom/sensors/registry/sns_reg_config
./var/lib/qcom/sensors/registry/sns_rmd
./var/lib/qcom/sensors/registry/sns_rotv_platform
./var/lib/qcom/sensors/registry/sns_rotv_platform.config
./var/lib/qcom/sensors/registry/sns_smd
./var/lib/qcom/sensors/registry/sns_tilt
./var/lib/qcom/sensors/registry/sns_tilt_to_wake
./var/lib/qcom/sensors/registry/stk36xx_0
./var/lib/qcom/sensors/registry/stk36xx_0.ambient_light
./var/lib/qcom/sensors/registry/stk36xx_0.ambient_light.config
./var/lib/qcom/sensors/registry/stk36xx_0.proximity
./var/lib/qcom/sensors/registry/stk36xx_0.proximity.config
./var/lib/qcom/sensors/registry/stk36xx_0.rgb
./var/lib/qcom/sensors/registry/stk36xx_0.rgb.config
./var/lib/qcom/sensors/registry/stk36xx_0_platform
./var/lib/qcom/sensors/registry/stk36xx_0_platform.als
./var/lib/qcom/sensors/registry/stk36xx_0_platform.als.fac_cal
./var/lib/qcom/sensors/registry/stk36xx_0_platform.config
./var/lib/qcom/sensors/registry/stk36xx_0_platform.ps
./var/lib/qcom/sensors/registry/stk36xx_0_platform.ps.fac_cal
./var/lib/qcom/sensors/registry/stk36xx_0_platform.rgb
./var/lib/qcom/sensors/registry/stk36xx_0_platform.rgb.current_value
./var/lib/qcom/sensors/registry/stk36xx_0_platform.rgb.fac_cal
./var/lib/qcom/sensors/registry/stk36xx_0_platform.rgb.linear_info
./var/lib/qcom/sensors/registry/stk36xx_0_platform.rgb.matrix_value
./var/lib/qcom/sensors/registry/stk36xx_0_platform.rgb.target_value
./var/lib/qcom/sensors/registry/stk36xx_0_platform.rgb.target_value_new
./var/lib/qcom/sensors/registry/stk3x3x_0
./var/lib/qcom/sensors/registry/stk3x3x_0.ambient_light
./var/lib/qcom/sensors/registry/stk3x3x_0.ambient_light.config
./var/lib/qcom/sensors/registry/stk3x3x_0.proximity
./var/lib/qcom/sensors/registry/stk3x3x_0.proximity.config
./var/lib/qcom/sensors/registry/stk3x3x_0_platform
./var/lib/qcom/sensors/registry/stk3x3x_0_platform.als
./var/lib/qcom/sensors/registry/stk3x3x_0_platform.als.fac_cal
./var/lib/qcom/sensors/registry/stk3x3x_0_platform.config
./var/lib/qcom/sensors/registry/stk3x3x_0_platform.ps
./var/lib/qcom/sensors/registry/stk3x3x_0_platform.ps.fac_cal
./var/lib/qcom/sensors/registry/sx932x_0
./var/lib/qcom/sensors/registry/sx932x_0.sar
./var/lib/qcom/sensors/registry/sx932x_0.sar.config
./var/lib/qcom/sensors/registry/sx932x_0_platform
./var/lib/qcom/sensors/registry/sx932x_0_platform.config
./var/lib/qcom/sensors/registry/sx932x_0_platform.placement
./var/lib/qcom/sensors/registry/tcs3400
./var/lib/qcom/sensors/registry/tcs3400.als
./var/lib/qcom/sensors/registry/tcs3400.als.config
./var/lib/qcom/sensors/registry/tcs3400.rgb
./var/lib/qcom/sensors/registry/tcs3400.rgb.config
./var/lib/qcom/sensors/registry/tcs3400_platform
./var/lib/qcom/sensors/registry/tcs3400_platform.als
./var/lib/qcom/sensors/registry/tcs3400_platform.als.fac_cal
./var/lib/qcom/sensors/registry/tcs3400_platform.coefficient
./var/lib/qcom/sensors/registry/tcs3400_platform.config
./var/lib/qcom/sensors/registry/tcs3400_platform.rgb
./var/lib/qcom/sensors/registry/tcs3400_platform.rgb.fac_cal
./var/lib/qcom/sensors/registry/tmd3702
./var/lib/qcom/sensors/registry/tmd3702.als
./var/lib/qcom/sensors/registry/tmd3702.als.config
./var/lib/qcom/sensors/registry/tmd3702.prox
./var/lib/qcom/sensors/registry/tmd3702.prox.config
./var/lib/qcom/sensors/registry/tmd3702.rgb
./var/lib/qcom/sensors/registry/tmd3702.rgb.config
./var/lib/qcom/sensors/registry/tmd3702_platform
./var/lib/qcom/sensors/registry/tmd3702_platform.als
./var/lib/qcom/sensors/registry/tmd3702_platform.als.afac_cal
./var/lib/qcom/sensors/registry/tmd3702_platform.coefficient
./var/lib/qcom/sensors/registry/tmd3702_platform.config
./var/lib/qcom/sensors/registry/tmd3702_platform.prox
./var/lib/qcom/sensors/registry/tmd3702_platform.prox.pfac_cal
./var/lib/qcom/sensors/registry/tmd3702_platform.rgb
./var/lib/qcom/sensors/registry/tmd3702_platform.rgb.rfac_cal
./var/lib/qcom/sensors/registry/tmd3725
./var/lib/qcom/sensors/registry/tmd3725.als
./var/lib/qcom/sensors/registry/tmd3725.als.config
./var/lib/qcom/sensors/registry/tmd3725.prox
./var/lib/qcom/sensors/registry/tmd3725.prox.config
./var/lib/qcom/sensors/registry/tmd3725.rgb
./var/lib/qcom/sensors/registry/tmd3725.rgb.config
./var/lib/qcom/sensors/registry/tmd3725_platform
./var/lib/qcom/sensors/registry/tmd3725_platform.als
./var/lib/qcom/sensors/registry/tmd3725_platform.als.afac_cal
./var/lib/qcom/sensors/registry/tmd3725_platform.coefficient
./var/lib/qcom/sensors/registry/tmd3725_platform.config
./var/lib/qcom/sensors/registry/tmd3725_platform.prox
./var/lib/qcom/sensors/registry/tmd3725_platform.prox.pfac_cal
./var/lib/qcom/sensors/registry/tmd3725_platform.rgb
./var/lib/qcom/sensors/registry/tmd3725_platform.rgb.rfac_cal
./var/lib/qcom/sensors/sensors_list.txt
./var/lib/qcom/sensors/sns_reg_ctrl
@@ -1,8 +1,8 @@
# Maintainer: Alexander Martinz <amartinz@shiftphones.com>
pkgname=firmware-shift-sdm845
pkgver=0.3
pkgrel=1
pkgver=0.4
pkgrel=0
pkgdesc="Firmware for SHIFT sdm845 devices"
url="https://gitlab.com/sdm845-mainline/firmware-shift-sdm845"
arch="aarch64"
@@ -11,15 +11,18 @@ depends="
linux-firmware-qcom
"
license="proprietary"
options="!check !strip !archcheck !tracedeps pmb:cross-native"
# Textrels appear in DSP libraries which we cannot avoid
options="!check !strip !archcheck !tracedeps textrels pmb:cross-native"
_version="ce9d27bf03624cceeaa8e7466f2e6dc731f2ba5e"
_version="7f957e47c3bad1f89bae6da07aa9adfcf76b8c6a"
source="$pkgname.tar.gz::$url/-/archive/$_version/$pkgname-$_version.tar.gz
firmware.files
sensors.files
30-gpu-firmware.files"
subpackages="
$pkgname-initramfs:firmware_initramfs"
$pkgname-initramfs:firmware_initramfs
$pkgname-sensors:firmware_sensors"
package() {
cd "$srcdir/$pkgname-$_version/"
@@ -40,8 +43,23 @@ firmware_initramfs() {
"$subpkgdir/usr/share/mkinitfs/files/30-gpu-firmware.files"
}
firmware_sensors() {
pkgdesc="Firmware files of the sensor registry"
depends="$pkgname"
install_if="$pkgname-nonfree-firmware"
mkdir "$subpkgdir"
cd "$srcdir/$pkgname-$_version/"
while IFS="" read -r _i || [ -n "$_i" ]; do
[ ! -d $(dirname $_i) ] && mkdir -p $(dirname $_i)
echo $_i
install -Dm644 $_i "$pkgdir/$_i"
done < "$srcdir/sensors.files"
}
sha512sums="
86c3813a9f43e8f5f5e0df1215e37090011d6c468aad1a23f944a202e9fa740240869ed7b0b11ad032d35afaee72e903e24ca8d0e1de2f992902692f8c5983f8 firmware-shift-sdm845.tar.gz
6d9affb61e581e8752ed9293b5efec7a5940dca2d1e9ac12006daaae4b826ce7f1a9e1d588480a1cf90d70ab9d479daffb95a8bdd8a5c53c2d6cc95fd6d8be70 firmware-shift-sdm845.tar.gz
0b547cd027a9760cf16d80e63ebfb89282cff260bd07cc0bfea364513be7a5a32202a5f0aedbeb52dc5ca8087595a2842442a59f77dc7c9bcf5f154e905ceb15 firmware.files
be1aa0e7d1a5689d2f6b85d6244d0a2ec0729b92d3a165fc5162f039849ee2da49b311a4713cd11924ee70933dacb88c879b805504bb89709f10807d89207a15 sensors.files
8695a37da5578fdae506f373131ce9481be3db1a86f329c19893e7360b9cb0fadd47b0b1318b2e74702c5e76a9be022f58610940ad17becab49788689f6ca3f8 30-gpu-firmware.files
"
@@ -0,0 +1,196 @@
./etc/qcom/sns_reg.conf
./etc/qcom/sensors.d/bmp285_0.json
./etc/qcom/sensors.d/icm206xx_0.json
./etc/qcom/sensors.d/mmc5603x_0.json
./etc/qcom/sensors.d/sdm845_bmp285_0.json
./etc/qcom/sensors.d/sdm845_icm206xx_0.json
./etc/qcom/sensors.d/sdm845_mmc5603x_0.json
./etc/qcom/sensors.d/sdm845_stk3x1x_0.json
./etc/qcom/sensors.d/sns_amd.json
./etc/qcom/sensors.d/sns_amd_sw_disabled.json
./etc/qcom/sensors.d/sns_amd_sw_enabled.json
./etc/qcom/sensors.d/sns_aont.json
./etc/qcom/sensors.d/sns_basic_gestures.json
./etc/qcom/sensors.d/sns_bring_to_ear.json
./etc/qcom/sensors.d/sns_ccd.json
./etc/qcom/sensors.d/sns_ccd_v2_walk.json
./etc/qcom/sensors.d/sns_ccd_v3_walk.json
./etc/qcom/sensors.d/sns_cm.json
./etc/qcom/sensors.d/sns_dae.json
./etc/qcom/sensors.d/sns_device_orient.json
./etc/qcom/sensors.d/sns_diag_filter.json
./etc/qcom/sensors.d/sns_distance_bound.json
./etc/qcom/sensors.d/sns_dpc.json
./etc/qcom/sensors.d/sns_facing.json
./etc/qcom/sensors.d/sns_fmv.json
./etc/qcom/sensors.d/sns_geomag_rv.json
./etc/qcom/sensors.d/sns_gyro_cal.json
./etc/qcom/sensors.d/sns_heart_rate.json
./etc/qcom/sensors.d/sns_mag_cal.json
./etc/qcom/sensors.d/sns_mag_cal_legacy.json
./etc/qcom/sensors.d/sns_multishake.json
./etc/qcom/sensors.d/sns_pedometer.json
./etc/qcom/sensors.d/sns_rmd.json
./etc/qcom/sensors.d/sns_rotv.json
./etc/qcom/sensors.d/sns_smd.json
./etc/qcom/sensors.d/sns_tilt.json
./etc/qcom/sensors.d/sns_tilt_sw_disabled.json
./etc/qcom/sensors.d/sns_tilt_sw_enabled.json
./etc/qcom/sensors.d/sns_tilt_to_wake.json
./etc/qcom/sensors.d/stk3x1x_0.json
./usr/lib/qcom/adsp/AlacDecoderModule.so.1
./usr/lib/qcom/adsp/ApeDecoderModule.so.1
./usr/lib/qcom/adsp/AudioContextDetection.so.1
./usr/lib/qcom/adsp/AudioSphereModule.so.1
./usr/lib/qcom/adsp/cellinfo_tools.so
./usr/lib/qcom/adsp/CFCMModule.so.1
./usr/lib/qcom/adsp/chre_app_coverage2.so
./usr/lib/qcom/adsp/chre_app_coverage.so
./usr/lib/qcom/adsp/chre_app_oem.so
./usr/lib/qcom/adsp/chre_app_sensor_cfg.so
./usr/lib/qcom/adsp/chre_drv_bt.so
./usr/lib/qcom/adsp/chre_drv_gf.so
./usr/lib/qcom/adsp/chre_drv_loc.so
./usr/lib/qcom/adsp/chre_drv_modem.so
./usr/lib/qcom/adsp/chre_drv_wifi.so
./usr/lib/qcom/adsp/chre_pal.so
./usr/lib/qcom/adsp/EtsiAmrWbPlusDecModule.so.1
./usr/lib/qcom/adsp/EtsiEaacPlusEncAndCmnModule.so.1
./usr/lib/qcom/adsp/fastrpc_shell_0
./usr/lib/qcom/adsp/fastrpc_shell_2
./usr/lib/qcom/adsp/FlacDecoderModule.so.1
./usr/lib/qcom/adsp/fluence_voiceplus_module.so.1
./usr/lib/qcom/adsp/HeaacDecoderModule.so.1
./usr/lib/qcom/adsp/LdacModule.so.1
./usr/lib/qcom/adsp/libchre_slpi_skel.so
./usr/lib/qcom/adsp/libFastRPC_UTF_Forward_800s_sdm845_skel.so
./usr/lib/qcom/adsp/libstabilitydomain_skel.so
./usr/lib/qcom/adsp/libsysmondomain_skel.so
./usr/lib/qcom/adsp/libsysmon_skel.so
./usr/lib/qcom/adsp/lowi_client.so
./usr/lib/qcom/adsp/map_AVS_SHARED_LIBS_845.adsp.prodQ.txt
./usr/lib/qcom/adsp/map_SHARED_LIBS_845.adsp.prodQ.txt
./usr/lib/qcom/adsp/map_SHARED_LIBS_AAAAAAAAQ.txt
./usr/lib/qcom/adsp/map_SSC_SLPI_USER_AAAAAAAAQ.txt
./usr/lib/qcom/adsp/mmecns_module.so.1
./usr/lib/qcom/adsp/SAPlusCmnModule.so.1
./usr/lib/qcom/adsp/sensor_testapp_40.so
./usr/lib/qcom/adsp/SVACmnModule.so.1
./usr/lib/qcom/adsp/VoiceWakeup_V2_Module.so.1
./usr/lib/qcom/adsp/VorbisDecoderModule.so.1
./usr/lib/qcom/adsp/WmaProDecoderModule.so.1
./usr/lib/qcom/adsp/WmaStdDecoderModule.so.1
./usr/lib/qcom/adsp/avs/adsp_avs_config.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_Bluetooth_cal.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_Codec_cal.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_General_cal.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_Global_cal.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_Handset_cal.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_Hdmi_cal.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_Headset_cal.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_Speaker_cal.acdb
./usr/lib/qcom/adsp/avs/QRD/QRD_workspaceFile.qwsp
./var/lib/qcom/sensors/bmp285_0
./var/lib/qcom/sensors/bmp285_0_platform
./var/lib/qcom/sensors/bmp285_0_platform.config
./var/lib/qcom/sensors/bmp285_0_platform.placement
./var/lib/qcom/sensors/bmp285_0_platform.pressure
./var/lib/qcom/sensors/bmp285_0_platform.pressure.fac_cal
./var/lib/qcom/sensors/bmp285_0_platform.pressure.fac_cal.bias
./var/lib/qcom/sensors/bmp285_0_platform.pressure.fac_cal.scale
./var/lib/qcom/sensors/bmp285_0_platform.temp
./var/lib/qcom/sensors/bmp285_0_platform.temp.fac_cal
./var/lib/qcom/sensors/bmp285_0_platform.temp.fac_cal.bias
./var/lib/qcom/sensors/bmp285_0_platform.temp.fac_cal.scale
./var/lib/qcom/sensors/bmp285_0.pressure
./var/lib/qcom/sensors/bmp285_0.pressure.config
./var/lib/qcom/sensors/bmp285_0.temp
./var/lib/qcom/sensors/bmp285_0.temp.config
./var/lib/qcom/sensors/file1
./var/lib/qcom/sensors/file2
./var/lib/qcom/sensors/icm206xx_0
./var/lib/qcom/sensors/icm206xx_0.accel
./var/lib/qcom/sensors/icm206xx_0.accel.config
./var/lib/qcom/sensors/icm206xx_0.gyro
./var/lib/qcom/sensors/icm206xx_0.gyro.config
./var/lib/qcom/sensors/icm206xx_0.md
./var/lib/qcom/sensors/icm206xx_0.md.config
./var/lib/qcom/sensors/icm206xx_0_platform
./var/lib/qcom/sensors/icm206xx_0_platform.accel
./var/lib/qcom/sensors/icm206xx_0_platform.accel.fac_cal
./var/lib/qcom/sensors/icm206xx_0_platform.accel.fac_cal.bias
./var/lib/qcom/sensors/icm206xx_0_platform.accel.fac_cal.corr_mat
./var/lib/qcom/sensors/icm206xx_0_platform.config
./var/lib/qcom/sensors/icm206xx_0_platform.gyro
./var/lib/qcom/sensors/icm206xx_0_platform.gyro.fac_cal
./var/lib/qcom/sensors/icm206xx_0_platform.gyro.fac_cal.bias
./var/lib/qcom/sensors/icm206xx_0_platform.gyro.fac_cal.corr_mat
./var/lib/qcom/sensors/icm206xx_0_platform.md
./var/lib/qcom/sensors/icm206xx_0_platform.md.config
./var/lib/qcom/sensors/icm206xx_0_platform.orient
./var/lib/qcom/sensors/icm206xx_0_platform.placement
./var/lib/qcom/sensors/icm206xx_0_platform.temp
./var/lib/qcom/sensors/icm206xx_0_platform.temp.fac_cal
./var/lib/qcom/sensors/icm206xx_0_platform.temp.fac_cal.bias
./var/lib/qcom/sensors/icm206xx_0_platform.temp.fac_cal.scale
./var/lib/qcom/sensors/icm206xx_0.temp
./var/lib/qcom/sensors/icm206xx_0.temp.config
./var/lib/qcom/sensors/mmc5603x_0
./var/lib/qcom/sensors/mmc5603x_0.mag
./var/lib/qcom/sensors/mmc5603x_0.mag.config
./var/lib/qcom/sensors/mmc5603x_0.mag.config_2
./var/lib/qcom/sensors/mmc5603x_0_platform
./var/lib/qcom/sensors/mmc5603x_0_platform.config
./var/lib/qcom/sensors/mmc5603x_0_platform.mag
./var/lib/qcom/sensors/mmc5603x_0_platform.mag.fac_cal
./var/lib/qcom/sensors/mmc5603x_0_platform.mag.fac_cal.bias
./var/lib/qcom/sensors/mmc5603x_0_platform.mag.fac_cal.corr_mat
./var/lib/qcom/sensors/mmc5603x_0_platform.orient
./var/lib/qcom/sensors/mmc5603x_0_platform.placement
./var/lib/qcom/sensors/sensors_list.txt
./var/lib/qcom/sensors/sensors_registry
./var/lib/qcom/sensors/sensors_settings
./var/lib/qcom/sensors/sns_amd
./var/lib/qcom/sensors/sns_aont
./var/lib/qcom/sensors/sns_basic_gestures
./var/lib/qcom/sensors/sns_bring_to_ear
./var/lib/qcom/sensors/sns_cm
./var/lib/qcom/sensors/sns_device_orient_platform
./var/lib/qcom/sensors/sns_device_orient_platform.config
./var/lib/qcom/sensors/sns_diag_config
./var/lib/qcom/sensors/sns_diag_sensor_datatype
./var/lib/qcom/sensors/sns_distance_bound_speed_for_motion_states
./var/lib/qcom/sensors/sns_dpc
./var/lib/qcom/sensors/sns_facing
./var/lib/qcom/sensors/sns_fmv_platform
./var/lib/qcom/sensors/sns_fmv_platform.config
./var/lib/qcom/sensors/sns_geomag_rv
./var/lib/qcom/sensors/sns_geomag_rv.config
./var/lib/qcom/sensors/sns_gyro_cal_config
./var/lib/qcom/sensors/sns_gyro_cal_persist_s0
./var/lib/qcom/sensors/sns_gyro_cal_persist_s0.bias
./var/lib/qcom/sensors/sns_gyro_cal_persist_s0.compensation_matrix
./var/lib/qcom/sensors/sns_gyro_cal_persist_s0.scale_factor
./var/lib/qcom/sensors/sns_mag_cal_persist_s0c0
./var/lib/qcom/sensors/sns_mag_cal_persist_s0c0.bias
./var/lib/qcom/sensors/sns_multishake
./var/lib/qcom/sensors/sns_pedometer
./var/lib/qcom/sensors/sns_reg_config
./var/lib/qcom/sensors/sns_reg_version
./var/lib/qcom/sensors/sns_rmd
./var/lib/qcom/sensors/sns_rotv_platform
./var/lib/qcom/sensors/sns_rotv_platform.config
./var/lib/qcom/sensors/sns_smd
./var/lib/qcom/sensors/sns_tilt
./var/lib/qcom/sensors/sns_tilt_to_wake
./var/lib/qcom/sensors/stk3x1x_0
./var/lib/qcom/sensors/stk3x1x_0.ambient_light
./var/lib/qcom/sensors/stk3x1x_0.ambient_light.config
./var/lib/qcom/sensors/stk3x1x_0_platform
./var/lib/qcom/sensors/stk3x1x_0_platform.als
./var/lib/qcom/sensors/stk3x1x_0_platform.als.fac_cal
./var/lib/qcom/sensors/stk3x1x_0_platform.config
./var/lib/qcom/sensors/stk3x1x_0_platform.ps
./var/lib/qcom/sensors/stk3x1x_0_platform.ps.fac_cal
./var/lib/qcom/sensors/stk3x1x_0.proximity
./var/lib/qcom/sensors/stk3x1x_0.proximity.config
+45
View File
@@ -0,0 +1,45 @@
# Hexagonrpcd for SDM670/SDM845
pkgname=hexagonrpcd
pkgver=0.0.0_git20230325
pkgrel=0
pkgdesc="Qualcomm Hexagon RPC daemon"
url="https://gitlab.com/flamingradian/sensh/"
arch="all"
license="GPL3-or-later"
makedepends="linux-headers meson"
subpackages="$pkgname-openrc"
_commit="ae73e4b07b2afd59cc60e059761047b8dd19c673"
source="https://gitlab.com/flamingradian/sensh/-/archive/$_commit/sensh-$_commit.tar.gz
$pkgname-adsp.initd
$pkgname-sdsp.initd
"
options="!check"
builddir="$srcdir/sensh-$_commit/fastrpc"
build() {
abuild-meson \
. output
meson compile -C output
}
package() {
DESTDIR="$pkgdir" meson install --no-rebuild -C output
}
openrc() {
pkgdesc="$pkgdesc (OpenRC init scripts)"
install_if="openrc $pkgname=$pkgver-r$pkgrel"
default_openrc
install -Dm755 "$srcdir"/$pkgname-adsp.initd "$subpkgdir"/etc/init.d/$pkgname-adsp
install -Dm755 "$srcdir"/$pkgname-sdsp.initd "$subpkgdir"/etc/init.d/$pkgname-sdsp
}
sha512sums="
bfcca095b761b69dc0840ee062673448cb6905e22e519a00b36b8aa3aa0ea4b6e3966f4d93e854a1c624351b718497f2f10a4049de89bad73c889def66511014 sensh-ae73e4b07b2afd59cc60e059761047b8dd19c673.tar.gz
627a443bdeb104cded634b759d8cce3dcbc033bb179004b173bf687759d5d306ddaaa80fa103c39aa5d36bd4041d254ff29993edad1b3166d6b51873ebe40677 hexagonrpcd-adsp.initd
9f64b0bb926d12df0454c3367a6d83c30fff01a581852e89221ca90e396412c9c29e3b3968d4a2aba46279f21a9e0ab766228e36fb2e41221c1b0e2c5fff1630 hexagonrpcd-sdsp.initd
"
+8
View File
@@ -0,0 +1,8 @@
#!/sbin/openrc-run
supervisor=supervise-daemon
name="Hexagonrpcd ADSP"
description="Daemon to support Qualcomm Hexagon ADSP virtual filesystem"
command=/usr/sbin/hexagonrpcd
command_args="-f /dev/fastrpc-adsp"
+8
View File
@@ -0,0 +1,8 @@
#!/sbin/openrc-run
supervisor=supervise-daemon
name="Hexagonrpcd SDSP"
description="Daemon to support Qualcomm Hexagon SDSP virtual filesystem"
command=/usr/sbin/hexagonrpcd
command_args="-f /dev/fastrpc-sdsp -s"
@@ -0,0 +1,274 @@
From 4fd3611f93b0a35e8311c6a6e3fe03545154d8bb Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Sun, 23 Apr 2023 16:54:10 +0200
Subject: [PATCH 1/7] iio-sensor-proxy: depend on libssc
---
data/80-iio-sensor-proxy.rules | 2 +
meson.build | 3 +
meson_options.txt | 4 ++
src/drivers.h | 7 ++
src/drv-ssc-proximity.c | 121 +++++++++++++++++++++++++++++++++
src/iio-sensor-proxy.c | 21 +++++-
src/meson.build | 7 ++
7 files changed, 164 insertions(+), 1 deletion(-)
create mode 100644 src/drv-ssc-proximity.c
diff --git a/data/80-iio-sensor-proxy.rules b/data/80-iio-sensor-proxy.rules
index 85d93f9..bd917b2 100644
--- a/data/80-iio-sensor-proxy.rules
+++ b/data/80-iio-sensor-proxy.rules
@@ -16,6 +16,8 @@ SUBSYSTEM=="iio", TEST=="scan_elements/in_intensity_both_en", ENV{IIO_SENSOR_PRO
SUBSYSTEM=="iio", TEST=="in_proximity_raw", ENV{IIO_SENSOR_PROXY_TYPE}+="iio-poll-proximity"
SUBSYSTEM=="input", ENV{ID_INPUT_ACCELEROMETER}=="1", ENV{IIO_SENSOR_PROXY_TYPE}+="input-accel"
+SUBSYSTEM=="misc", KERNEL=="fastrpc-sdsp", ENV{IIO_SENSOR_PROXY_TYPE}+="ssc-accel"
+
ENV{IIO_SENSOR_PROXY_TYPE}=="", GOTO="iio_sensor_proxy_end"
# We got here because we have a sensor type, which means we need the service
diff --git a/meson.build b/meson.build
index b45493f..bef4209 100644
--- a/meson.build
+++ b/meson.build
@@ -46,6 +46,9 @@ gio_dep = dependency('gio-2.0')
gudev_dep = dependency('gudev-1.0', version: '>= 237')
polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.91')
polkit_policy_directory = polkit_gobject_dep.get_pkgconfig_variable('policydir')
+if get_option('ssc-support')
+ libssc_dep = dependency('libssc-glib')
+endif
xmllint = find_program('xmllint', required: false)
diff --git a/meson_options.txt b/meson_options.txt
index de5fbf4..2b60f82 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -18,6 +18,10 @@ option('geoclue-user',
description: 'The USER (existing) as which geoclue service is running',
type: 'string',
value: 'geoclue')
+option('ssc-support',
+ description: 'Enable Qualcomm SSC support',
+ type: 'boolean',
+ value: false)
option('gtk_doc',
type: 'boolean',
value: false,
diff --git a/src/drivers.h b/src/drivers.h
index b760faa..895cb55 100644
--- a/src/drivers.h
+++ b/src/drivers.h
@@ -160,4 +160,11 @@ extern SensorDriver iio_buffer_light;
extern SensorDriver iio_buffer_compass;
extern SensorDriver iio_poll_proximity;
+#ifdef LIBSSC
+extern SensorDriver ssc_accel;
+extern SensorDriver ssc_light;
+extern SensorDriver ssc_compass;
+extern SensorDriver ssc_proximity;
+#endif
+
gboolean drv_check_udev_sensor_type (GUdevDevice *device, const gchar *match, const char *name);
diff --git a/src/drv-ssc-proximity.c b/src/drv-ssc-proximity.c
new file mode 100644
index 0000000..5e06967
--- /dev/null
+++ b/src/drv-ssc-proximity.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2023 Dylan Van Assche
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published by
+ * the Free Software Foundation.
+ */
+
+#include "drivers.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <libssc-sensor.h>
+#include <libssc-sensor-proximity.h>
+
+#define QRTR_DEVICE_URI "qrtr://9"
+#define UDEV_DEVICE_NAME "fastrpc-sdsp"
+#define PROXIMITY_NEAR_LEVEL "PROXIMITY_NEAR_LEVEL"
+
+typedef struct DrvData {
+ SSCSensorProximity *sensor;
+ guint measurement_id;
+} DrvData;
+
+static gboolean
+ssc_proximity_discover (GUdevDevice *device)
+{
+ g_autoptr (SSCSensorProximity) sensor = NULL;
+ g_autoptr (GFile) file = g_file_new_for_uri (QRTR_DEVICE_URI);
+ g_autoptr (GError) error = NULL;
+
+ g_debug ("SUBSYSTEM: %s | NAME: %s", g_udev_device_get_subsystem (device), g_udev_device_get_name (device));
+ if (g_strcmp0 (g_udev_device_get_name (device), UDEV_DEVICE_NAME))
+ return FALSE;
+
+ sensor = ssc_sensor_proximity_new_sync (file, NULL, &error);
+
+ return sensor ? TRUE : FALSE;
+}
+
+static void
+measurement_cb (SSCSensorProximity *sensor, gboolean near, gpointer user_data)
+{
+ SensorDevice *sensor_device = user_data;
+ ProximityReadings readings;
+
+ readings.is_near = near ? PROXIMITY_NEAR_TRUE : PROXIMITY_NEAR_FALSE;
+ g_debug ("SSC Proximity sensor '%s': near: %s", sensor_device->name, readings.is_near ? "NEAR" : "FAR");
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
+}
+
+static SensorDevice *
+ssc_proximity_open (GUdevDevice *device)
+{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ g_autoptr (GFile) file = g_file_new_for_uri (QRTR_DEVICE_URI);
+ g_autoptr (GError) error = NULL;
+
+ sensor_device = g_new0 (SensorDevice, 1);
+ sensor_device->priv = g_new0 (DrvData, 1);
+ drv_data = (DrvData *) sensor_device->priv;
+
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_proximity_new_sync (file, NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC proximity sensor failed: %s", error ? error->message : "UNKNOWN");
+ return NULL;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_proximity_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC proximity sensor failed: %s", error ? error->message : "UNKNOWN");
+ g_object_unref (sensor_device);
+ return NULL;
+ }
+
+ return sensor_device;
+}
+
+static void
+ssc_proximity_close (SensorDevice *sensor_device)
+{
+ g_autoptr (GError) error = NULL;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_proximity_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC proximity sensor failed: %s", error ? error->message : "UNKNOWN");
+
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+}
+
+SensorDriver ssc_proximity = {
+ .driver_name = "SSC proximity sensor",
+ .type = DRIVER_TYPE_PROXIMITY,
+
+ .discover = ssc_proximity_discover,
+ .open = ssc_proximity_open,
+ .close = ssc_proximity_close,
+};
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index 836e742..17debbb 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -73,6 +73,12 @@ static const SensorDriver * const drivers[] = {
&fake_light,
&iio_buffer_compass,
&iio_poll_proximity,
+#ifdef HAS_LIBSSC
+ &ssc_accel,
+ &ssc_light,
+ &ssc_compass,
+ &ssc_proximity,
+#endif
};
static ReadingsUpdateFunc driver_type_to_callback_func (DriverType type);
@@ -122,6 +128,11 @@ find_sensors (GUdevClient *client,
platform = g_udev_client_query_by_subsystem (client, "platform");
devices = g_list_concat (devices, input);
devices = g_list_concat (devices, platform);
+#ifdef HAS_LIBSSC
+ GList *fastrpc;
+ fastrpc = g_udev_client_query_by_subsystem (client, "misc");
+ devices = g_list_concat (devices, fastrpc);
+#endif
/* Find the devices */
for (l = devices; l != NULL; l = l->next) {
@@ -684,7 +695,15 @@ name_acquired_handler (GDBusConnection *connection,
gpointer user_data)
{
SensorData *data = user_data;
- const gchar * const subsystems[] = { "iio", "input", "platform", NULL };
+ const gchar * const subsystems[] = {
+ "iio",
+ "input",
+ "platform",
+#ifdef HAS_LIBSSC
+ "misc",
+#endif
+ NULL
+ };
guint i;
data->client = g_udev_client_new (subsystems);
diff --git a/src/meson.build b/src/meson.build
index 8ddd37b..90d550d 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,5 +1,8 @@
config_h = configuration_data()
config_h.set_quoted('VERSION', meson.project_version())
+if get_option('ssc-support')
+ config_h.set_quoted('HAS_LIBSSC', '1')
+endif
config_h_files = configure_file(
output: 'config.h',
configuration: config_h
@@ -7,6 +10,10 @@ config_h_files = configure_file(
deps = [ gio_dep, gudev_dep, mathlib_dep, polkit_gobject_dep ]
+if get_option('ssc-support')
+ deps = deps + [ libssc_dep ]
+endif
+
resources = gnome.compile_resources(
'iio-sensor-proxy-resources', 'iio-sensor-proxy.gresource.xml',
c_name: 'iio_sensor_proxy',
--
2.40.0
@@ -0,0 +1,116 @@
From 0f9327f15d1d76bc6b7772929e302930d428f167 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Sun, 23 Apr 2023 17:54:46 +0200
Subject: [PATCH 2/7] proximity: support SSC proximity sensor
---
src/drivers.h | 5 +----
src/drv-ssc-proximity.c | 18 ++++--------------
src/iio-sensor-proxy.c | 3 ---
src/meson.build | 1 +
4 files changed, 6 insertions(+), 21 deletions(-)
diff --git a/src/drivers.h b/src/drivers.h
index 895cb55..5dcac8a 100644
--- a/src/drivers.h
+++ b/src/drivers.h
@@ -160,10 +160,7 @@ extern SensorDriver iio_buffer_light;
extern SensorDriver iio_buffer_compass;
extern SensorDriver iio_poll_proximity;
-#ifdef LIBSSC
-extern SensorDriver ssc_accel;
-extern SensorDriver ssc_light;
-extern SensorDriver ssc_compass;
+#ifdef HAS_LIBSSC
extern SensorDriver ssc_proximity;
#endif
diff --git a/src/drv-ssc-proximity.c b/src/drv-ssc-proximity.c
index 5e06967..c87a796 100644
--- a/src/drv-ssc-proximity.c
+++ b/src/drv-ssc-proximity.c
@@ -18,8 +18,6 @@
#include <libssc-sensor.h>
#include <libssc-sensor-proximity.h>
-#define QRTR_DEVICE_URI "qrtr://9"
-#define UDEV_DEVICE_NAME "fastrpc-sdsp"
#define PROXIMITY_NEAR_LEVEL "PROXIMITY_NEAR_LEVEL"
typedef struct DrvData {
@@ -30,17 +28,11 @@ typedef struct DrvData {
static gboolean
ssc_proximity_discover (GUdevDevice *device)
{
- g_autoptr (SSCSensorProximity) sensor = NULL;
- g_autoptr (GFile) file = g_file_new_for_uri (QRTR_DEVICE_URI);
- g_autoptr (GError) error = NULL;
-
- g_debug ("SUBSYSTEM: %s | NAME: %s", g_udev_device_get_subsystem (device), g_udev_device_get_name (device));
- if (g_strcmp0 (g_udev_device_get_name (device), UDEV_DEVICE_NAME))
+ if (!drv_check_udev_sensor_type (device, "ssc-proximity", NULL))
return FALSE;
- sensor = ssc_sensor_proximity_new_sync (file, NULL, &error);
-
- return sensor ? TRUE : FALSE;
+ g_debug ("Found SSC proximity at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
}
static void
@@ -50,7 +42,6 @@ measurement_cb (SSCSensorProximity *sensor, gboolean near, gpointer user_data)
ProximityReadings readings;
readings.is_near = near ? PROXIMITY_NEAR_TRUE : PROXIMITY_NEAR_FALSE;
- g_debug ("SSC Proximity sensor '%s': near: %s", sensor_device->name, readings.is_near ? "NEAR" : "FAR");
sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
}
@@ -59,7 +50,6 @@ ssc_proximity_open (GUdevDevice *device)
{
SensorDevice *sensor_device;
DrvData *drv_data;
- g_autoptr (GFile) file = g_file_new_for_uri (QRTR_DEVICE_URI);
g_autoptr (GError) error = NULL;
sensor_device = g_new0 (SensorDevice, 1);
@@ -67,7 +57,7 @@ ssc_proximity_open (GUdevDevice *device)
drv_data = (DrvData *) sensor_device->priv;
/* Create sensor */
- drv_data->sensor = ssc_sensor_proximity_new_sync (file, NULL, &error);
+ drv_data->sensor = ssc_sensor_proximity_new_sync (NULL, &error);
if (!drv_data->sensor) {
g_warning ("Creating SSC proximity sensor failed: %s", error ? error->message : "UNKNOWN");
return NULL;
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index 17debbb..dbd3f6e 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -74,9 +74,6 @@ static const SensorDriver * const drivers[] = {
&iio_buffer_compass,
&iio_poll_proximity,
#ifdef HAS_LIBSSC
- &ssc_accel,
- &ssc_light,
- &ssc_compass,
&ssc_proximity,
#endif
};
diff --git a/src/meson.build b/src/meson.build
index 90d550d..7019b1c 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -35,6 +35,7 @@ sources = [
'drv-iio-buffer-light.c',
'drv-iio-buffer-compass.c',
'drv-iio-poll-proximity.c',
+ 'drv-ssc-proximity.c',
'iio-buffer-utils.c',
'accel-mount-matrix.c',
'accel-scale.c',
--
2.40.0
@@ -0,0 +1,170 @@
From 59f184ccecf212196c0d76b1cb705eab59c51826 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Mon, 24 Apr 2023 16:56:20 +0200
Subject: [PATCH 3/7] light: support SSC light sensor
---
src/drivers.h | 1 +
src/drv-ssc-light.c | 112 +++++++++++++++++++++++++++++++++++++++++
src/iio-sensor-proxy.c | 1 +
src/meson.build | 1 +
4 files changed, 115 insertions(+)
create mode 100644 src/drv-ssc-light.c
diff --git a/src/drivers.h b/src/drivers.h
index 5dcac8a..a97528b 100644
--- a/src/drivers.h
+++ b/src/drivers.h
@@ -162,6 +162,7 @@ extern SensorDriver iio_poll_proximity;
#ifdef HAS_LIBSSC
extern SensorDriver ssc_proximity;
+extern SensorDriver ssc_light;
#endif
gboolean drv_check_udev_sensor_type (GUdevDevice *device, const gchar *match, const char *name);
diff --git a/src/drv-ssc-light.c b/src/drv-ssc-light.c
new file mode 100644
index 0000000..689eca5
--- /dev/null
+++ b/src/drv-ssc-light.c
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2023 Dylan Van Assche
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published by
+ * the Free Software Foundation.
+ */
+
+#include "drivers.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <libssc-sensor.h>
+#include <libssc-sensor-light.h>
+
+#define UDEV_DEVICE_NAME "fastrpc-"
+
+typedef struct DrvData {
+ SSCSensorLight *sensor;
+ guint measurement_id;
+} DrvData;
+
+static gboolean
+ssc_light_discover (GUdevDevice *device)
+{
+ if (!drv_check_udev_sensor_type (device, "ssc-light", NULL))
+ return FALSE;
+
+ g_debug ("Found SSC light at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
+static void
+measurement_cb (SSCSensorLight *sensor, gfloat intensity, gpointer user_data)
+{
+ SensorDevice *sensor_device = user_data;
+ LightReadings readings;
+
+ readings.level = intensity;
+ readings.uses_lux = TRUE;
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
+}
+
+static SensorDevice *
+ssc_light_open (GUdevDevice *device)
+{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ g_autoptr (GError) error = NULL;
+
+ sensor_device = g_new0 (SensorDevice, 1);
+ sensor_device->priv = g_new0 (DrvData, 1);
+ drv_data = (DrvData *) sensor_device->priv;
+
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_light_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC light sensor failed: %s", error ? error->message : "UNKNOWN");
+ return NULL;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_light_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC light sensor failed: %s", error ? error->message : "UNKNOWN");
+ g_object_unref (sensor_device);
+ return NULL;
+ }
+
+ return sensor_device;
+}
+
+static void
+ssc_light_close (SensorDevice *sensor_device)
+{
+ g_autoptr (GError) error = NULL;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_light_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC light sensor failed: %s", error ? error->message : "UNKNOWN");
+
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+}
+
+SensorDriver ssc_light = {
+ .driver_name = "SSC light sensor",
+ .type = DRIVER_TYPE_LIGHT,
+
+ .discover = ssc_light_discover,
+ .open = ssc_light_open,
+ .close = ssc_light_close,
+};
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index dbd3f6e..f70e996 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -75,6 +75,7 @@ static const SensorDriver * const drivers[] = {
&iio_poll_proximity,
#ifdef HAS_LIBSSC
&ssc_proximity,
+ &ssc_light,
#endif
};
diff --git a/src/meson.build b/src/meson.build
index 7019b1c..104143c 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -36,6 +36,7 @@ sources = [
'drv-iio-buffer-compass.c',
'drv-iio-poll-proximity.c',
'drv-ssc-proximity.c',
+ 'drv-ssc-light.c',
'iio-buffer-utils.c',
'accel-mount-matrix.c',
'accel-scale.c',
--
2.40.0
@@ -0,0 +1,172 @@
From fe8b7e42a7f813842ff51f4d8f194a7c20534bcb Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Mon, 24 Apr 2023 17:01:10 +0200
Subject: [PATCH 4/7] accelerometer: support SSC accelerometer sensor
---
src/drivers.h | 2 +
src/drv-ssc-accel.c | 113 +++++++++++++++++++++++++++++++++++++++++
src/iio-sensor-proxy.c | 1 +
src/meson.build | 1 +
4 files changed, 117 insertions(+)
create mode 100644 src/drv-ssc-accel.c
diff --git a/src/drivers.h b/src/drivers.h
index a97528b..a68fcbb 100644
--- a/src/drivers.h
+++ b/src/drivers.h
@@ -163,6 +163,8 @@ extern SensorDriver iio_poll_proximity;
#ifdef HAS_LIBSSC
extern SensorDriver ssc_proximity;
extern SensorDriver ssc_light;
+extern SensorDriver ssc_accel;
+extern SensorDriver ssc_compass;
#endif
gboolean drv_check_udev_sensor_type (GUdevDevice *device, const gchar *match, const char *name);
diff --git a/src/drv-ssc-accel.c b/src/drv-ssc-accel.c
new file mode 100644
index 0000000..a9b5eec
--- /dev/null
+++ b/src/drv-ssc-accel.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2023 Dylan Van Assche
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published by
+ * the Free Software Foundation.
+ */
+
+#include "drivers.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <libssc-sensor.h>
+#include <libssc-sensor-accelerometer.h>
+
+typedef struct DrvData {
+ SSCSensorAccelerometer *sensor;
+ guint measurement_id;
+} DrvData;
+
+static gboolean
+ssc_accelerometer_discover (GUdevDevice *device)
+{
+ if (!drv_check_udev_sensor_type (device, "ssc-accel", NULL))
+ return FALSE;
+
+ g_debug ("Found SSC accelerometer at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
+static void
+measurement_cb (SSCSensorAccelerometer *sensor, gfloat accel_x, gfloat accel_y, gfloat accel_z, gpointer user_data)
+{
+ SensorDevice *sensor_device = user_data;
+ AccelReadings readings;
+
+ readings.accel_x = accel_x;
+ readings.accel_y = accel_y;
+ readings.accel_z = accel_z;
+ set_accel_scale (&readings.scale, 1.0);
+
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
+}
+
+static SensorDevice *
+ssc_accelerometer_open (GUdevDevice *device)
+{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ g_autoptr (GError) error = NULL;
+
+ sensor_device = g_new0 (SensorDevice, 1);
+ sensor_device->priv = g_new0 (DrvData, 1);
+ drv_data = (DrvData *) sensor_device->priv;
+
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_accelerometer_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC accelerometer sensor failed: %s", error ? error->message : "UNKNOWN");
+ return NULL;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_accelerometer_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC accelerometer sensor failed: %s", error ? error->message : "UNKNOWN");
+ g_object_unref (sensor_device);
+ return NULL;
+ }
+
+ return sensor_device;
+}
+
+static void
+ssc_accelerometer_close (SensorDevice *sensor_device)
+{
+ g_autoptr (GError) error = NULL;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_accelerometer_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC accelerometer sensor failed: %s", error ? error->message : "UNKNOWN");
+
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+}
+
+SensorDriver ssc_accel = {
+ .driver_name = "SSC accelerometer sensor",
+ .type = DRIVER_TYPE_ACCEL,
+
+ .discover = ssc_accelerometer_discover,
+ .open = ssc_accelerometer_open,
+ .close = ssc_accelerometer_close,
+};
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index f70e996..644e835 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -76,6 +76,7 @@ static const SensorDriver * const drivers[] = {
#ifdef HAS_LIBSSC
&ssc_proximity,
&ssc_light,
+ &ssc_accel,
#endif
};
diff --git a/src/meson.build b/src/meson.build
index 104143c..e44338b 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -37,6 +37,7 @@ sources = [
'drv-iio-poll-proximity.c',
'drv-ssc-proximity.c',
'drv-ssc-light.c',
+ 'drv-ssc-accel.c',
'iio-buffer-utils.c',
'accel-mount-matrix.c',
'accel-scale.c',
--
2.40.0
@@ -0,0 +1,157 @@
From 20ab71eb279869eec770c497aed6832b64c7df15 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Mon, 24 Apr 2023 18:29:15 +0200
Subject: [PATCH 5/7] compass: support SSC compass sensor
---
src/drv-ssc-compass.c | 112 +++++++++++++++++++++++++++++++++++++++++
src/iio-sensor-proxy.c | 1 +
src/meson.build | 1 +
3 files changed, 114 insertions(+)
create mode 100644 src/drv-ssc-compass.c
diff --git a/src/drv-ssc-compass.c b/src/drv-ssc-compass.c
new file mode 100644
index 0000000..7a367b3
--- /dev/null
+++ b/src/drv-ssc-compass.c
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2023 Dylan Van Assche
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published by
+ * the Free Software Foundation.
+ */
+
+#include "drivers.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <libssc-sensor.h>
+#include <libssc-sensor-compass.h>
+
+#define UDEV_DEVICE_NAME "fastrpc-"
+
+typedef struct DrvData {
+ SSCSensorCompass *sensor;
+ guint measurement_id;
+} DrvData;
+
+static gboolean
+ssc_compass_discover (GUdevDevice *device)
+{
+ if (!drv_check_udev_sensor_type (device, "ssc-compass", NULL))
+ return FALSE;
+
+ g_debug ("Found SSC compass at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
+static void
+measurement_cb (SSCSensorCompass *sensor, gfloat azimuth, gpointer user_data)
+{
+ SensorDevice *sensor_device = user_data;
+ CompassReadings readings;
+
+ readings.heading = azimuth;
+
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
+}
+
+static SensorDevice *
+ssc_compass_open (GUdevDevice *device)
+{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ g_autoptr (GError) error = NULL;
+
+ sensor_device = g_new0 (SensorDevice, 1);
+ sensor_device->priv = g_new0 (DrvData, 1);
+ drv_data = (DrvData *) sensor_device->priv;
+
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_compass_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
+ return NULL;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_compass_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
+ g_object_unref (sensor_device);
+ return NULL;
+ }
+
+ return sensor_device;
+}
+
+static void
+ssc_compass_close (SensorDevice *sensor_device)
+{
+ g_autoptr (GError) error = NULL;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_compass_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
+
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+}
+
+SensorDriver ssc_compass = {
+ .driver_name = "SSC compass sensor",
+ .type = DRIVER_TYPE_COMPASS,
+
+ .discover = ssc_compass_discover,
+ .open = ssc_compass_open,
+ .close = ssc_compass_close,
+};
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index 644e835..5414677 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -77,6 +77,7 @@ static const SensorDriver * const drivers[] = {
&ssc_proximity,
&ssc_light,
&ssc_accel,
+ &ssc_compass,
#endif
};
diff --git a/src/meson.build b/src/meson.build
index e44338b..08b25e6 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -38,6 +38,7 @@ sources = [
'drv-ssc-proximity.c',
'drv-ssc-light.c',
'drv-ssc-accel.c',
+ 'drv-ssc-compass.c',
'iio-buffer-utils.c',
'accel-mount-matrix.c',
'accel-scale.c',
--
2.40.0
@@ -0,0 +1,81 @@
From 8c15df3b56af5a5414b90abd746f824990a3441c Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Tue, 25 Apr 2023 18:34:45 +0200
Subject: [PATCH 6/7] accelerometer: apply accel attributes
Mount matrix, location, and scaling
---
src/drv-ssc-accel.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/src/drv-ssc-accel.c b/src/drv-ssc-accel.c
index a9b5eec..a64f28e 100644
--- a/src/drv-ssc-accel.c
+++ b/src/drv-ssc-accel.c
@@ -7,6 +7,7 @@
*/
#include "drivers.h"
+#include "accel-mount-matrix.h"
#include <fcntl.h>
#include <unistd.h>
@@ -21,6 +22,9 @@
typedef struct DrvData {
SSCSensorAccelerometer *sensor;
guint measurement_id;
+ AccelVec3 *mount_matrix;
+ AccelLocation location;
+ AccelScale scale;
} DrvData;
static gboolean
@@ -37,12 +41,21 @@ static void
measurement_cb (SSCSensorAccelerometer *sensor, gfloat accel_x, gfloat accel_y, gfloat accel_z, gpointer user_data)
{
SensorDevice *sensor_device = user_data;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
AccelReadings readings;
+ AccelVec3 tmp;
+
+ tmp.x = accel_x;
+ tmp.y = accel_y;
+ tmp.z = accel_z;
- readings.accel_x = accel_x;
- readings.accel_y = accel_y;
- readings.accel_z = accel_z;
- set_accel_scale (&readings.scale, 1.0);
+ if (!apply_mount_matrix (drv_data->mount_matrix, &tmp))
+ g_warning ("Could not apply mount matrix");
+
+ readings.accel_x = tmp.x;
+ readings.accel_y = tmp.y;
+ readings.accel_z = tmp.z;
+ copy_accel_scale (&readings.scale, drv_data->scale);
sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
}
@@ -58,6 +71,11 @@ ssc_accelerometer_open (GUdevDevice *device)
sensor_device->priv = g_new0 (DrvData, 1);
drv_data = (DrvData *) sensor_device->priv;
+ /* Setup accel attributes */
+ drv_data->mount_matrix = setup_mount_matrix (device);
+ drv_data->location = setup_accel_location (device);
+ set_accel_scale (&drv_data->scale, 1.0);
+
/* Create sensor */
drv_data->sensor = ssc_sensor_accelerometer_new_sync (NULL, &error);
if (!drv_data->sensor) {
@@ -99,6 +117,7 @@ ssc_accelerometer_close (SensorDevice *sensor_device)
g_warning ("Closing SSC accelerometer sensor failed: %s", error ? error->message : "UNKNOWN");
g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&drv_data->mount_matrix, g_free);
g_clear_pointer (&sensor_device->priv, g_free);
g_free (sensor_device);
}
--
2.40.0
@@ -0,0 +1,64 @@
From 6a8c37f8f180ed3d0589948d28b1d9322a0cae3c Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Wed, 26 Apr 2023 18:54:07 +0200
Subject: [PATCH 7/7] data: add libssc udev rules
---
data/80-iio-sensor-proxy-libssc.rules | 11 +++++++++++
data/80-iio-sensor-proxy.rules | 2 --
data/meson.build | 10 +++++++++-
3 files changed, 20 insertions(+), 3 deletions(-)
create mode 100644 data/80-iio-sensor-proxy-libssc.rules
diff --git a/data/80-iio-sensor-proxy-libssc.rules b/data/80-iio-sensor-proxy-libssc.rules
new file mode 100644
index 0000000..c4fad16
--- /dev/null
+++ b/data/80-iio-sensor-proxy-libssc.rules
@@ -0,0 +1,11 @@
+# iio-sensor-proxy: libssc
+# IIO sensor to D-Bus proxy with libssc support
+
+ACTION=="remove", GOTO="iio_sensor_proxy_libssc_end"
+
+# Set the sensor type for all the types we recognise for SDSP/ADSP.
+# Some devices expose the sensors via a separate SDSP while others re-use ADSP.
+# These DSPs expose itself as /dev/fastrpc-* in the misc subsystem.
+SUBSYSTEM=="misc", KERNEL=="fastrpc-*", ENV{IIO_SENSOR_PROXY_TYPE}+="ssc-accel ssc-light ssc-proximity ssc-compass"
+
+LABEL="iio_sensor_proxy_libssc_end"
diff --git a/data/80-iio-sensor-proxy.rules b/data/80-iio-sensor-proxy.rules
index bd917b2..85d93f9 100644
--- a/data/80-iio-sensor-proxy.rules
+++ b/data/80-iio-sensor-proxy.rules
@@ -16,8 +16,6 @@ SUBSYSTEM=="iio", TEST=="scan_elements/in_intensity_both_en", ENV{IIO_SENSOR_PRO
SUBSYSTEM=="iio", TEST=="in_proximity_raw", ENV{IIO_SENSOR_PROXY_TYPE}+="iio-poll-proximity"
SUBSYSTEM=="input", ENV{ID_INPUT_ACCELEROMETER}=="1", ENV{IIO_SENSOR_PROXY_TYPE}+="input-accel"
-SUBSYSTEM=="misc", KERNEL=="fastrpc-sdsp", ENV{IIO_SENSOR_PROXY_TYPE}+="ssc-accel"
-
ENV{IIO_SENSOR_PROXY_TYPE}=="", GOTO="iio_sensor_proxy_end"
# We got here because we have a sensor type, which means we need the service
diff --git a/data/meson.build b/data/meson.build
index 97dbc07..8b78125 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -1,5 +1,13 @@
+rules = files(
+ '80-iio-sensor-proxy.rules'
+)
+
+if get_option('ssc-support')
+ rules += files('80-iio-sensor-proxy-libssc.rules')
+endif
+
install_data(
- '80-iio-sensor-proxy.rules',
+ rules,
install_dir: udev_rules_dir
)
--
2.40.0
+62
View File
@@ -0,0 +1,62 @@
# Forked from Alpine to add Qualcomm SSC support with libssc
pkgname=iio-sensor-proxy
pkgver=9999
pkgrel=0
pkgdesc="IIO sensors to D-Bus proxy"
url="https://gitlab.freedesktop.org/hadess/iio-sensor-proxy"
arch="all"
license="GPL-2.0-or-later"
depends="dbus"
makedepends="
eudev-dev
glib-dev
libgudev-dev
meson
polkit-dev
libssc-dev
"
subpackages="$pkgname-openrc"
_commit="48cb957c41b8d51d882219866e1366c45e21c352"
builddir="$srcdir/$pkgname-$_commit"
source="https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/archive/$_commit/iio-sensor-proxy-$_commit.tar.gz
iio-sensor-proxy.initd
0001-iio-sensor-proxy-depend-on-libssc.patch
0002-proximity-support-SSC-proximity-sensor.patch
0003-light-support-SSC-light-sensor.patch
0004-accelerometer-support-SSC-accelerometer-sensor.patch
0005-compass-support-SSC-compass-sensor.patch
0006-accelerometer-apply-accel-attributes.patch
0007-data-add-libssc-udev-rules.patch
"
build() {
abuild-meson \
-Db_lto=true \
-Dssc-support=true \
-Dsystemdsystemunitdir=/no \
. output
meson compile -C output
}
check() {
meson test --no-rebuild --print-errorlogs -C output
}
package() {
DESTDIR="$pkgdir" meson install --no-rebuild -C output
rm -r "$pkgdir"/no
install -Dm755 "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname
}
sha512sums="
f899058ba346b272c5174de0f2c0870bf6a13782f0c0c248163bc6cec7fbebca689ed97a0fbebd770a8857212cfc760849ad97034eaaec7fef40b7e58d811f31 iio-sensor-proxy-48cb957c41b8d51d882219866e1366c45e21c352.tar.gz
b25df94e249ca46fe96926e5a866c20dc913fa52a2d9259fb7a3594861c6b2f246fc7fef8a21f5b021f3a71401f734ae27210137b0b1917a7daaffb5e3221f2e iio-sensor-proxy.initd
43bf2ce5928c996ef56939a5ff232160f6af5a40cc673753763facbcb18511b1f551fa1a91f55ac9d0d4cbe544de7326208617ffc032cfeb9e39a5ab6538e825 0001-iio-sensor-proxy-depend-on-libssc.patch
c6eb40824d5f4fe8b46d26f3ed4773502c9ff3ed58ec82df4a4f570bdcba81c39ff41f6d400bcece13fc46486272d13238d58afc34982b0972894b4d01a81309 0002-proximity-support-SSC-proximity-sensor.patch
2e909a9a2a8c95d5255e14f6e0280f329e83e02dce8c16555df77c818a3cda658a7ebfb4c27d3e251e6830de2374f5f1bf2735be09af09ff0255c902125601ea 0003-light-support-SSC-light-sensor.patch
cb627cb4fc40e195683dcf1a7837f2fc902851310f3cee42ab18e42d6243b8fafc92accf699b5805670f9a8c76cf0cc422a201be64836efe9e5b943f6d151d70 0004-accelerometer-support-SSC-accelerometer-sensor.patch
045d76e0399ea2a5e99955d56a77f4fab9b5bc7d50512c60ae1a6dfd8e56e209690743545582bef35451fbd1a03f67d58e7143c2c91811d402a0e8e908f22bbc 0005-compass-support-SSC-compass-sensor.patch
17eab0005d6d4989e57ef6f37a7bfbd7541c19c129c9dc481000635884b981a8da0b9f264bc61059ac27882cd653eff7a78ec231ecbd158773f71d55e6ab8e9b 0006-accelerometer-apply-accel-attributes.patch
5495aa9d9ba3b83c0845556bcc1ef66d72a76d9685b791c15080dece62c00d93c76a2dce0e146ba0f3027ed2c34957d0019def9cee0fd133ec72c554ccfeb2d3 0007-data-add-libssc-udev-rules.patch
"
@@ -0,0 +1,8 @@
#!/sbin/openrc-run
supervisor=supervise-daemon
command="/usr/libexec/iio-sensor-proxy"
depend() {
need dbus
}
@@ -0,0 +1,377 @@
From 508dbb40b9cb2970759909c97b46698336f0ce37 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Wed, 21 Dec 2022 19:45:54 +0100
Subject: [PATCH 1/7] data: qmi-service-ssc: add SSC service
The SSC service is the Qualcomm Snapdragon Sensor Core (SSC) which is a
remoteproc exposing the sensor devices in the latest Qualcomm SoCs.
The SSC manages the power to the sensors, sample rates, etc. which
can be used over QMI. In contrast to other QMI services, the SSC uses
QMI only as a transport mechamism. The actual messages are Protobuf
messages encoded in the QMI messages and indications.
Therefore, only 1 QMI message is used and 2 QMI indications.
The SSC may emit QMI indications with a small data size or much bigger,
they are indentical besides the data size and ID.
---
data/qmi-collection-basic.json | 6 +-
data/qmi-service-ssc.json | 87 +++++++++++++++++++
.../libqmi-glib/libqmi-glib-common.sections | 6 ++
.../libqmi-glib/libqmi-glib-docs.xml | 14 +++
meson.build | 2 +-
src/libqmi-glib/generated/meson.build | 3 +-
src/libqmi-glib/libqmi-glib.h | 2 +
src/libqmi-glib/meson.build | 1 +
src/libqmi-glib/qmi-device.c | 6 ++
src/libqmi-glib/qmi-enums-ssc.h | 40 +++++++++
src/libqmi-glib/qmi-enums.h | 2 +
src/libqmi-glib/qmi-message.c | 6 ++
src/qmicli/qmicli.c | 1 +
13 files changed, 173 insertions(+), 3 deletions(-)
create mode 100644 data/qmi-service-ssc.json
create mode 100644 src/libqmi-glib/qmi-enums-ssc.h
diff --git a/data/qmi-collection-basic.json b/data/qmi-collection-basic.json
index ba0e33e0..a16d1f16 100644
--- a/data/qmi-collection-basic.json
+++ b/data/qmi-collection-basic.json
@@ -211,5 +211,9 @@
"QMI_MESSAGE_DSD_GET_SYSTEM_STATUS",
"QMI_MESSAGE_DSD_SYSTEM_STATUS_CHANGE",
- "QMI_INDICATION_DSD_SYSTEM_STATUS"
+ "QMI_INDICATION_DSD_SYSTEM_STATUS",
+
+ "QMI_MESSAGE_SSC_MESSAGE",
+ "QMI_INDICATION_SSC_REPORT_SMALL",
+ "QMI_INDICATION_SSC_REPORT_LARGE"
]
diff --git a/data/qmi-service-ssc.json b/data/qmi-service-ssc.json
new file mode 100644
index 00000000..9ef4d9ad
--- /dev/null
+++ b/data/qmi-service-ssc.json
@@ -0,0 +1,87 @@
+[
+ // *********************************************************************************
+ { "name" : "SSC",
+ "type" : "Service" },
+
+ // *********************************************************************************
+ { "name" : "QMI Client SSC",
+ "type" : "Client",
+ "since" : "1.34" },
+
+ // *********************************************************************************
+ { "name" : "QMI Message SSC",
+ "type" : "Message-ID-Enum" },
+
+ // *********************************************************************************
+ { "name" : "QMI Indication SSC",
+ "type" : "Indication-ID-Enum" },
+
+ // *********************************************************************************
+ { "name" : "Control",
+ "type" : "Message",
+ "service" : "SSC",
+ "id" : "0x0020",
+ "since" : "1.34",
+ "input" : [ { "name" : "Protobuf Data",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.34",
+ "format" : "array",
+ "size-prefix-format" : "guint16",
+ "array-element" : { "format" : "guint8" }
+ },
+ { "name" : "Unknown Value",
+ "id" : "0x10",
+ "type" : "TLV",
+ "since" : "1.34",
+ "format" : "guint8" } ],
+ "output" : [ { "common-ref" : "Operation Result" },
+ { "name" : "Client ID",
+ "id" : "0x10",
+ "type" : "TLV",
+ "since" : "1.34",
+ "format" : "guint64",
+ "prerequisites": [ { "common-ref" : "Success" } ] },
+ { "name" : "Response",
+ "id" : "0x11",
+ "type" : "TLV",
+ "since" : "1.34",
+ "format" : "guint32",
+ "prerequisites": [ { "common-ref" : "Success" } ] } ] },
+ // *********************************************************************************
+ { "name" : "Report Small",
+ "type" : "Indication",
+ "service" : "SSC",
+ "id" : "0x0021",
+ "since" : "1.34",
+ "output" : [ { "name" : "Client ID",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.34",
+ "format" : "guint64" },
+ { "name" : "Protobuf Data",
+ "id" : "0x02",
+ "type" : "TLV",
+ "since" : "1.34",
+ "format" : "array",
+ "size-prefix-format" : "guint16",
+ "array-element" : { "format" : "guint8" } } ] },
+ // *********************************************************************************
+ { "name" : "Report Large",
+ "type" : "Indication",
+ "service" : "SSC",
+ "id" : "0x0022",
+ "since" : "1.34",
+ "output" : [ { "name" : "Client ID",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.34",
+ "format" : "guint64" },
+ { "name" : "Protobuf Data",
+ "id" : "0x02",
+ "type" : "TLV",
+ "since" : "1.34",
+ "format" : "array",
+ "size-prefix-format" : "guint16",
+ "array-element" : { "format" : "guint8" } } ] }
+]
diff --git a/docs/reference/libqmi-glib/libqmi-glib-common.sections b/docs/reference/libqmi-glib/libqmi-glib-common.sections
index c812dcf6..f9cc6a67 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-common.sections
+++ b/docs/reference/libqmi-glib/libqmi-glib-common.sections
@@ -30,6 +30,7 @@ HAVE_QMI_SERVICE_WDS
HAVE_QMI_SERVICE_WMS
HAVE_QMI_SERVICE_DPM
HAVE_QMI_SERVICE_FOX
+HAVE_QMI_SERVICE_SSC
</SECTION>
<SECTION>
@@ -1602,6 +1603,11 @@ QMI_TYPE_FOX_FIRMWARE_VERSION_TYPE
qmi_fox_firmware_version_type_get_type
</SECTION>
+<SECTION>
+<FILE>qmi-enums-ssc</FILE>
+<TITLE>SSC enumerations and flags</TITLE>
+</SECTION>
+
<SECTION>
<FILE>qmi-errors</FILE>
<TITLE>Errors</TITLE>
diff --git a/docs/reference/libqmi-glib/libqmi-glib-docs.xml b/docs/reference/libqmi-glib/libqmi-glib-docs.xml
index f20b2049..604f5213 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-docs.xml
+++ b/docs/reference/libqmi-glib/libqmi-glib-docs.xml
@@ -573,6 +573,20 @@
</section>
</chapter>
+ <chapter>
+ <title>Snapdragon Sensor Core Service (SSC)</title>
+ <xi:include href="xml/qmi-client-ssc.xml"/>
+ <section>
+ <title>SSC Indications</title>
+ <xi:include href="xml/qmi-indication-ssc-report-small.xml"/>
+ <xi:include href="xml/qmi-indication-ssc-report-large.xml"/>
+ </section>
+ <section>
+ <title>SSC Requests</title>
+ <xi:include href="xml/qmi-message-ssc-control.xml"/>
+ </section>
+ </chapter>
+
<chapter>
<title>Compatibility with older versions</title>
<xi:include href="xml/qmi-compat.xml"/>
diff --git a/meson.build b/meson.build
index 8711e0a0..898a2475 100644
--- a/meson.build
+++ b/meson.build
@@ -3,7 +3,7 @@
project(
'libqmi', 'c',
- version: '1.33.5',
+ version: '1.33.6',
license: 'GPL2',
default_options: [
'buildtype=debugoptimized',
diff --git a/src/libqmi-glib/generated/meson.build b/src/libqmi-glib/generated/meson.build
index a41acc0e..6fe8e10b 100644
--- a/src/libqmi-glib/generated/meson.build
+++ b/src/libqmi-glib/generated/meson.build
@@ -67,7 +67,7 @@ gen_headers += custom_target(
command: [
python,
qmi_mkenums,
- '--fhead', '#ifndef __LIBQMI_GLIB_ENUM_TYPES_H__\n#define __LIBQMI_GLIB_ENUM_TYPES_H__\n#include "qmi-enums.h"\n#include "qmi-enums-wds.h"\n#include "qmi-enums-dms.h"\n#include "qmi-enums-nas.h"\n#include "qmi-enums-wms.h"\n#include "qmi-enums-pds.h"\n#include "qmi-enums-pdc.h"\n#include "qmi-enums-pbm.h"\n#include "qmi-enums-uim.h"\n#include "qmi-enums-sar.h"\n#include "qmi-enums-oma.h"\n#include "qmi-enums-wda.h"\n#include "qmi-enums-voice.h"\n#include "qmi-enums-loc.h"\n#include "qmi-enums-qos.h"\n#include "qmi-enums-gas.h"\n#include "qmi-enums-dsd.h"\n#include "qmi-enums-fox.h"\n#include "qmi-device.h"\n',
+ '--fhead', '#ifndef __LIBQMI_GLIB_ENUM_TYPES_H__\n#define __LIBQMI_GLIB_ENUM_TYPES_H__\n#include "qmi-enums.h"\n#include "qmi-enums-wds.h"\n#include "qmi-enums-dms.h"\n#include "qmi-enums-nas.h"\n#include "qmi-enums-wms.h"\n#include "qmi-enums-pds.h"\n#include "qmi-enums-pdc.h"\n#include "qmi-enums-pbm.h"\n#include "qmi-enums-uim.h"\n#include "qmi-enums-sar.h"\n#include "qmi-enums-oma.h"\n#include "qmi-enums-wda.h"\n#include "qmi-enums-voice.h"\n#include "qmi-enums-loc.h"\n#include "qmi-enums-qos.h"\n#include "qmi-enums-gas.h"\n#include "qmi-enums-dsd.h"\n#include "qmi-enums-fox.h"\n#include "qmi-enums-ssc.h"\n#include "qmi-device.h"\n',
'--template', files(templates_dir / enum_types + '.h.template'),
'--ftail', '#endif /* __LIBQMI_GLIB_ENUM_TYPES_H__ */\n',
'@INPUT@'],
@@ -180,6 +180,7 @@ services = [
'pds',
'qos',
'sar',
+ 'ssc',
'uim',
'voice',
'wda',
diff --git a/src/libqmi-glib/libqmi-glib.h b/src/libqmi-glib/libqmi-glib.h
index 867429f7..5f88684d 100644
--- a/src/libqmi-glib/libqmi-glib.h
+++ b/src/libqmi-glib/libqmi-glib.h
@@ -99,6 +99,8 @@
#include "qmi-enums-fox.h"
#include "qmi-fox.h"
+#include "qmi-ssc.h"
+
/* generated */
#include "qmi-error-types.h"
#include "qmi-enum-types.h"
diff --git a/src/libqmi-glib/meson.build b/src/libqmi-glib/meson.build
index 84c8e636..39e5454b 100644
--- a/src/libqmi-glib/meson.build
+++ b/src/libqmi-glib/meson.build
@@ -20,6 +20,7 @@ qmi_enums_headers = files(
'qmi-enums-pds.h',
'qmi-enums-qos.h',
'qmi-enums-sar.h',
+ 'qmi-enums-ssc.h',
'qmi-enums-uim.h',
'qmi-enums-voice.h',
'qmi-enums-wda.h',
diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
index 01e7ba13..f119d5fe 100644
--- a/src/libqmi-glib/qmi-device.c
+++ b/src/libqmi-glib/qmi-device.c
@@ -57,6 +57,7 @@
#include "qmi-dsd.h"
#include "qmi-dpm.h"
#include "qmi-fox.h"
+#include "qmi-ssc.h"
#include "qmi-utils.h"
#include "qmi-helpers.h"
#include "qmi-error-types.h"
@@ -1310,6 +1311,11 @@ qmi_device_allocate_client (QmiDevice *self,
case QMI_SERVICE_FOX:
#if defined HAVE_QMI_SERVICE_FOX
ctx->client_type = QMI_TYPE_CLIENT_FOX;
+#endif
+ break;
+ case QMI_SERVICE_SSC:
+#if defined HAVE_QMI_SERVICE_SSC
+ ctx->client_type = QMI_TYPE_CLIENT_SSC;
#endif
break;
diff --git a/src/libqmi-glib/qmi-enums-ssc.h b/src/libqmi-glib/qmi-enums-ssc.h
new file mode 100644
index 00000000..7b3b619c
--- /dev/null
+++ b/src/libqmi-glib/qmi-enums-ssc.h
@@ -0,0 +1,40 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * libqmi-glib -- GLib/GIO based library to control QMI devices
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2022 Dylan Van Assche <me@dylanvanassche.be>
+ */
+
+#ifndef _LIBQMI_GLIB_QMI_ENUMS_SSC_H_
+#define _LIBQMI_GLIB_QMI_ENUMS_SSC_H_
+
+#if !defined (__LIBQMI_GLIB_H_INSIDE__) && !defined (LIBQMI_GLIB_COMPILATION)
+#error "Only <libqmi-glib.h> can be included directly."
+#endif
+
+/**
+ * SECTION: qmi-enums-ssc
+ * @title: SSC enumerations and flags
+ * @short_description: Enumerations and flags in the SSC service.
+ *
+ * This section defines enumerations and flags used in the SSC service
+ * interface.
+ */
+
+#endif /* _LIBQMI_GLIB_QMI_ENUMS_SSC_H_ */
+
diff --git a/src/libqmi-glib/qmi-enums.h b/src/libqmi-glib/qmi-enums.h
index b50841c2..4f77097c 100644
--- a/src/libqmi-glib/qmi-enums.h
+++ b/src/libqmi-glib/qmi-enums.h
@@ -86,6 +86,7 @@
* @QMI_SERVICE_RMS: Remote Management Service.
* @QMI_SERVICE_OMA: Open Mobile Alliance device management service.
* @QMI_SERVICE_FOX: Foxconn General Modem Service. Since: 1.32.
+ * @QMI_SERVICE_SSC: Snapdragon Sensore Core Service. Since: 1.34.
* @QMI_SERVICE_FOTA: Firmware Over The Air service. Since: 1.24.
* @QMI_SERVICE_GMS: Telit General Modem Service. Since: 1.24.
* @QMI_SERVICE_GAS: Telit General Application Service. Since: 1.24.
@@ -148,6 +149,7 @@ typedef enum { /*< since=1.0 >*/
QMI_SERVICE_FOTA = 0xE6,
QMI_SERVICE_GMS = 0xE7,
QMI_SERVICE_GAS = 0xE8,
+ QMI_SERVICE_SSC = 0x190,
} QmiService;
/**
diff --git a/src/libqmi-glib/qmi-message.c b/src/libqmi-glib/qmi-message.c
index a51b77e1..dff0be39 100644
--- a/src/libqmi-glib/qmi-message.c
+++ b/src/libqmi-glib/qmi-message.c
@@ -1728,6 +1728,11 @@ qmi_message_get_printable_full (QmiMessage *self,
case QMI_SERVICE_FOX:
#if defined HAVE_QMI_SERVICE_FOX
contents = __qmi_message_fox_get_printable (self, context, line_prefix);
+#endif
+ break;
+ case QMI_SERVICE_SSC:
+#if defined HAVE_QMI_SERVICE_SSC
+ contents = __qmi_message_ssc_get_printable (self, context, line_prefix);
#endif
break;
@@ -1846,6 +1851,7 @@ __qmi_message_is_abortable (QmiMessage *self,
case QMI_SERVICE_DSD:
case QMI_SERVICE_QOS:
case QMI_SERVICE_FOX:
+ case QMI_SERVICE_SSC:
default:
return FALSE;
}
diff --git a/src/qmicli/qmicli.c b/src/qmicli/qmicli.c
index a37eaab6..d2834450 100644
--- a/src/qmicli/qmicli.c
+++ b/src/qmicli/qmicli.c
@@ -510,6 +510,7 @@ allocate_client_ready (QmiDevice *dev,
case QMI_SERVICE_FOTA:
case QMI_SERVICE_PDS:
case QMI_SERVICE_OMA:
+ case QMI_SERVICE_SSC:
default:
break;
}
--
2.39.2
@@ -0,0 +1,369 @@
From 34e99dad0623d7ad4fc14b36dd77fb345da5d5f5 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Tue, 28 Mar 2023 20:19:58 +0200
Subject: [PATCH 2/7] libqmi-glib,message: handle QMUX and QRTR messages
Handle QMUX and QRTR messages in QMI Message:
- Set a different marker for services > G_MAXUINT8
- Handle different markers in helper methods
- Print QMI Messages differently depending on marker
---
src/libqmi-glib/qmi-message.c | 157 +++++++++++++++++++++++++---------
src/libqmi-glib/qmi-message.h | 23 ++++-
2 files changed, 139 insertions(+), 41 deletions(-)
diff --git a/src/libqmi-glib/qmi-message.c b/src/libqmi-glib/qmi-message.c
index dff0be39..812c8b92 100644
--- a/src/libqmi-glib/qmi-message.c
+++ b/src/libqmi-glib/qmi-message.c
@@ -64,13 +64,19 @@
#define PACKED __attribute__((packed))
-struct qmux {
+struct qmux_header {
guint16 length;
guint8 flags;
guint8 service;
guint8 client;
} PACKED;
+struct qrtr_header {
+ guint16 length;
+ guint16 service;
+ guint8 client;
+} PACKED;
+
struct control_header {
guint8 flags;
guint8 transaction;
@@ -103,7 +109,10 @@ struct service_message {
struct full_message {
guint8 marker;
- struct qmux qmux;
+ union {
+ struct qmux_header qmux;
+ struct qrtr_header qrtr;
+ } header;
union {
struct control_message control;
struct service_message service;
@@ -113,26 +122,39 @@ struct full_message {
static inline gboolean
message_is_control (QmiMessage *self)
{
- return ((struct full_message *)(self->data))->qmux.service == QMI_SERVICE_CTL;
+ if (((struct full_message *)(self->data))->marker == QMI_MESSAGE_QMUX_MARKER)
+ return ((struct full_message *)(self->data))->header.qmux.service == QMI_SERVICE_CTL;
+
+ return ((struct full_message *)(self->data))->header.qrtr.service == QMI_SERVICE_CTL;
}
static inline guint16
get_qmux_length (QmiMessage *self)
{
- return GUINT16_FROM_LE (((struct full_message *)(self->data))->qmux.length);
+ if (((struct full_message *)(self->data))->marker == QMI_MESSAGE_QMUX_MARKER)
+ return GUINT16_FROM_LE (((struct full_message *)(self->data))->header.qmux.length);
+
+ return GUINT16_FROM_LE (((struct full_message *)(self->data))->header.qrtr.length);
}
static inline void
set_qmux_length (QmiMessage *self,
guint16 length)
{
- ((struct full_message *)(self->data))->qmux.length = GUINT16_TO_LE (length);
+ if (((struct full_message *)(self->data))->marker == QMI_MESSAGE_QMUX_MARKER)
+ ((struct full_message *)(self->data))->header.qmux.length = GUINT16_TO_LE (length);
+ else
+ ((struct full_message *)(self->data))->header.qrtr.length = GUINT16_TO_LE (length);
}
static inline guint8
get_qmux_flags (QmiMessage *self)
{
- return ((struct full_message *)(self->data))->qmux.flags;
+ if (((struct full_message *)(self->data))->marker == QMI_MESSAGE_QMUX_MARKER)
+ return ((struct full_message *)(self->data))->header.qmux.flags;
+
+ /* QMI_MESSAGE_QRTR_MARKER does not support flags */
+ return 0x00;
}
static inline guint8
@@ -183,7 +205,10 @@ qmi_message_get_service (QmiMessage *self)
{
g_return_val_if_fail (self != NULL, QMI_SERVICE_UNKNOWN);
- return (QmiService)((struct full_message *)(self->data))->qmux.service;
+ if (((struct full_message *)(self->data))->marker == QMI_MESSAGE_QMUX_MARKER)
+ return (QmiService)((struct full_message *)(self->data))->header.qmux.service;
+ else
+ return (QmiService)((struct full_message *)(self->data))->header.qrtr.service;
}
guint8
@@ -191,7 +216,10 @@ qmi_message_get_client_id (QmiMessage *self)
{
g_return_val_if_fail (self != NULL, 0);
- return ((struct full_message *)(self->data))->qmux.client;
+ if (((struct full_message *)(self->data))->marker == QMI_MESSAGE_QMUX_MARKER)
+ return ((struct full_message *)(self->data))->header.qmux.client;
+
+ return ((struct full_message *)(self->data))->header.qrtr.client;
}
guint16
@@ -319,16 +347,17 @@ message_check (QmiMessage *self,
guint8 *end;
struct tlv *tlv;
- if (self->len < (1 + sizeof (struct qmux))) {
+ if (self->len < (1 + sizeof (struct qmux_header))) {
g_set_error (error,
QMI_CORE_ERROR,
QMI_CORE_ERROR_INVALID_MESSAGE,
"QMUX length too short for QMUX header (%u < %" G_GSIZE_FORMAT ")",
- self->len, 1 + sizeof (struct qmux));
+ self->len, 1 + sizeof (struct qmux_header));
return FALSE;
}
- if (((struct full_message *)(self->data))->marker != QMI_MESSAGE_QMUX_MARKER) {
+ if (((struct full_message *)(self->data))->marker != QMI_MESSAGE_QMUX_MARKER &&
+ ((struct full_message *)(self->data))->marker != QMI_MESSAGE_QRTR_MARKER) {
g_set_error (error,
QMI_CORE_ERROR,
QMI_CORE_ERROR_INVALID_MESSAGE,
@@ -352,9 +381,9 @@ message_check (QmiMessage *self,
return FALSE;
}
- header_length = sizeof (struct qmux) + (message_is_control (self) ?
- sizeof (struct control_header) :
- sizeof (struct service_header));
+ header_length = sizeof (struct qmux_header) + (message_is_control (self) ?
+ sizeof (struct control_header) :
+ sizeof (struct service_header));
if (qmux_length < header_length) {
g_set_error (error,
@@ -418,9 +447,10 @@ qmi_message_new (QmiService service,
NULL);
/* Create array with enough size for the QMUX marker, the QMUX header and
- * the QMI header */
+ * the QMI header. Use the qmux_header size for both QMUX and QRTR messages
+ * as they are the same size. */
buffer_len = (1 +
- sizeof (struct qmux) +
+ sizeof (struct qmux_header) +
(service == QMI_SERVICE_CTL ? sizeof (struct control_header) : sizeof (struct service_header)));
/* NOTE:
@@ -435,10 +465,17 @@ qmi_message_new (QmiService service,
g_byte_array_set_size (self, buffer_len);
buffer = (struct full_message *)(self->data);
- buffer->marker = QMI_MESSAGE_QMUX_MARKER;
- buffer->qmux.flags = 0;
- buffer->qmux.service = service;
- buffer->qmux.client = client_id;
+ /* QMI messages of services up to 255 are QMUX compatible */
+ if (service <= G_MAXUINT8) {
+ buffer->marker = QMI_MESSAGE_QMUX_MARKER;
+ buffer->header.qmux.flags = 0;
+ buffer->header.qmux.service = service;
+ buffer->header.qmux.client = client_id;
+ } else {
+ buffer->marker = QMI_MESSAGE_QRTR_MARKER;
+ buffer->header.qrtr.service = service;
+ buffer->header.qrtr.client = client_id;
+ }
if (service == QMI_SERVICE_CTL) {
buffer->qmi.control.header.flags = 0;
@@ -480,18 +517,28 @@ qmi_message_new_from_data (QmiService service,
message_len = sizeof (struct service_header) +
((struct service_message *)(qmi_data->data))->header.tlv_length;
}
- buffer_len = (1 + sizeof (struct qmux) + message_len);
+
+ /* Use the size of qmux_header for both QMUX and QRTR as they are the same */
+ buffer_len = (1 + sizeof (struct qmux_header) + message_len);
+
/* Create the GByteArray with buffer_len bytes preallocated */
self = g_byte_array_sized_new (buffer_len);
g_byte_array_set_size (self, buffer_len);
/* Set up fake QMUX header */
buffer = (struct full_message *)(self->data);
- buffer->marker = QMI_MESSAGE_QMUX_MARKER;
- buffer->qmux.length = GUINT16_TO_LE (buffer_len - 1);
- buffer->qmux.flags = 0;
- buffer->qmux.service = service;
- buffer->qmux.client = client_id;
+ if (service <= G_MAXUINT8) {
+ buffer->marker = QMI_MESSAGE_QMUX_MARKER;
+ buffer->header.qmux.length = GUINT16_TO_LE (buffer_len - 1);
+ buffer->header.qmux.flags = 0;
+ buffer->header.qmux.service = service;
+ buffer->header.qmux.client = client_id;
+ } else {
+ buffer->marker = QMI_MESSAGE_QRTR_MARKER;
+ buffer->header.qrtr.length = GUINT16_TO_LE (buffer_len - 1);
+ buffer->header.qrtr.service = service;
+ buffer->header.qrtr.client = client_id;
+ }
/* Move bytes from the qmi_data array to the newly created message */
memcpy (&buffer->qmi, qmi_data->data, message_len);
@@ -520,7 +567,8 @@ qmi_message_response_new (QmiMessage *request,
qmi_message_get_message_id (request));
/* Set sender type flag */
- ((struct full_message *)(((GByteArray *)response)->data))->qmux.flags = 0x80;
+ if (qmi_message_get_service (request) <= G_MAXUINT8)
+ ((struct full_message *)(((GByteArray *)response)->data))->header.qmux.flags = 0x80;
/* Set the response flag */
if (message_is_control (request))
@@ -556,6 +604,15 @@ qmi_message_unref (QmiMessage *self)
g_byte_array_unref (self);
}
+guint8
+qmi_message_get_marker (QmiMessage *self)
+{
+ if (self == NULL)
+ return 0x00;
+
+ return ((struct full_message *)(self->data))->marker;
+}
+
const guint8 *
qmi_message_get_raw (QmiMessage *self,
gsize *length,
@@ -1503,18 +1560,26 @@ qmi_message_new_from_raw (GByteArray *raw,
GError **error)
{
GByteArray *self;
+ gsize header_len;
gsize message_len;
g_return_val_if_fail (raw != NULL, NULL);
+ if (((struct full_message *)raw->data)->marker == QMI_MESSAGE_QMUX_MARKER) {
+ header_len = sizeof (struct qmux_header);
+ message_len = GUINT16_FROM_LE (((struct full_message *)raw->data)->header.qmux.length);
+ } else {
+ header_len = sizeof (struct qrtr_header);
+ message_len = GUINT16_FROM_LE (((struct full_message *)raw->data)->header.qrtr.length);
+ }
+
/* If we didn't even read the QMUX header (comes after the 1-byte marker),
* leave */
- if (raw->len < (sizeof (struct qmux) + 1))
+ if (raw->len < (header_len + 1))
return NULL;
/* We need to have read the length reported by the QMUX header (plus the
* initial 1-byte marker) */
- message_len = GUINT16_FROM_LE (((struct full_message *)raw->data)->qmux.length);
if (raw->len < (message_len + 1))
return NULL;
@@ -1605,17 +1670,29 @@ qmi_message_get_printable_full (QmiMessage *self,
line_prefix = "";
printable = g_string_new ("");
- g_string_append_printf (printable,
- "%sQMUX:\n"
- "%s length = %u\n"
- "%s flags = 0x%02x\n"
- "%s service = \"%s\"\n"
- "%s client = %u\n",
- line_prefix,
- line_prefix, get_qmux_length (self),
- line_prefix, get_qmux_flags (self),
- line_prefix, qmi_service_get_string (qmi_message_get_service (self)),
- line_prefix, qmi_message_get_client_id (self));
+ if (qmi_message_get_marker(self) == QMI_MESSAGE_QMUX_MARKER) {
+ g_string_append_printf (printable,
+ "%sQMUX:\n"
+ "%s length = %u\n"
+ "%s flags = 0x%02x\n"
+ "%s service = \"%s\"\n"
+ "%s client = %u\n",
+ line_prefix,
+ line_prefix, get_qmux_length (self),
+ line_prefix, get_qmux_flags (self),
+ line_prefix, qmi_service_get_string (qmi_message_get_service (self)),
+ line_prefix, qmi_message_get_client_id (self));
+ } else {
+ g_string_append_printf (printable,
+ "%sQRTR:\n"
+ "%s length = %u\n"
+ "%s service = \"%s\"\n"
+ "%s client = %u\n",
+ line_prefix,
+ line_prefix, get_qmux_length (self),
+ line_prefix, qmi_service_get_string (qmi_message_get_service (self)),
+ line_prefix, qmi_message_get_client_id (self));
+ }
if (qmi_message_get_service (self) == QMI_SERVICE_CTL)
qmi_flags_str = qmi_ctl_flag_build_string_from_mask (get_qmi_flags (self));
diff --git a/src/libqmi-glib/qmi-message.h b/src/libqmi-glib/qmi-message.h
index 7cf6ee74..cf2b0e54 100644
--- a/src/libqmi-glib/qmi-message.h
+++ b/src/libqmi-glib/qmi-message.h
@@ -57,12 +57,21 @@ G_BEGIN_DECLS
/**
* QMI_MESSAGE_QMUX_MARKER:
*
- * First byte of every QMI message.
+ * First byte of every QMI QMUX message.
*
* Since: 1.0
*/
#define QMI_MESSAGE_QMUX_MARKER (guint8) 0x01
+/**
+ * QMI_MESSAGE_QRTR_MARKER:
+ *
+ * First byte of every QRTR QMI message.
+ *
+ * Since: 1.34
+ */
+#define QMI_MESSAGE_QRTR_MARKER (guint8) 0x02
+
/**
* QmiMessage:
*
@@ -304,6 +313,18 @@ const guint8 *qmi_message_get_data (QmiMessage *self,
gsize *length,
GError **error);
+/**
+ * qmi_message_get_marker:
+ * @self: a #QmiMessage.
+ *
+ * Gets the marker of the #QmiMessage.
+ *
+ * Returns: The message marker, or 0x00 if message is NULL.
+ *
+ * Since: 1.34
+ */
+guint8 qmi_message_get_marker (QmiMessage *self);
+
/*****************************************************************************/
/* TLV builder & writer */
--
2.39.2
@@ -0,0 +1,83 @@
From 929894825c0caa1876e73bd30190e093af2a5022 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Wed, 29 Mar 2023 16:43:12 +0200
Subject: [PATCH 3/7] libqmi-glib,proxy: handle QMUX and QRTR messages
Handle QMUX and QRTR messages in QMI Message:
- Use QmiService enum instead of guint8
- Handle service ID extraction from QMI message based on marker
- Allow messages with QMUX and QRTR marker
---
src/libqmi-glib/qmi-proxy.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/libqmi-glib/qmi-proxy.c b/src/libqmi-glib/qmi-proxy.c
index eeff4bf0..8fc49071 100644
--- a/src/libqmi-glib/qmi-proxy.c
+++ b/src/libqmi-glib/qmi-proxy.c
@@ -596,7 +596,7 @@ track_cid (Client *client,
guint16 error_status;
guint16 error_code;
GError *error = NULL;
- guint8 service_tmp;
+ QmiService service_tmp;
QmiClientInfo info;
gint i;
@@ -616,13 +616,14 @@ track_cid (Client *client,
offset = 0;
if (((init_offset = qmi_message_tlv_read_init (message, QMI_MESSAGE_OUTPUT_TLV_ALLOCATION_INFO, NULL, &error)) == 0) ||
- !qmi_message_tlv_read_guint8 (message, init_offset, &offset, &service_tmp, &error) ||
+ (qmi_message_get_marker (message) == QMI_MESSAGE_QMUX_MARKER && !qmi_message_tlv_read_guint8 (message, init_offset, &offset, (guint8 *) &service_tmp, &error)) ||
+ (qmi_message_get_marker (message) == QMI_MESSAGE_QRTR_MARKER && !qmi_message_tlv_read_guint16 (message, init_offset, &offset, QMI_ENDIAN_LITTLE, (guint16 *) &service_tmp, &error)) ||
!qmi_message_tlv_read_guint8 (message, init_offset, &offset, &(info.cid), &error)) {
g_warning ("invalid 'CTL allocate CID' response: missing or invalid allocation info TLV: %s", error->message);
g_error_free (error);
return;
}
- info.service = (QmiService)service_tmp;
+ info.service = service_tmp;
/* Check if it already exists */
i = qmi_client_info_array_lookup_cid (client->qmi_client_info_array, info.service, info.cid);
@@ -643,7 +644,7 @@ untrack_cid (QmiProxy *self,
gsize offset = 0;
gsize init_offset;
GError *error = NULL;
- guint8 service_tmp;
+ QmiService service_tmp;
QmiClientInfo info;
gint i;
@@ -651,13 +652,14 @@ untrack_cid (QmiProxy *self,
g_assert (qmi_message_is_request (message));
if (((init_offset = qmi_message_tlv_read_init (message, QMI_MESSAGE_INPUT_TLV_RELEASE_INFO, NULL, &error)) == 0) ||
- !qmi_message_tlv_read_guint8 (message, init_offset, &offset, &service_tmp, &error) ||
+ (qmi_message_get_marker (message) == QMI_MESSAGE_QMUX_MARKER && !qmi_message_tlv_read_guint8 (message, init_offset, &offset, (guint8 *) &service_tmp, &error)) ||
+ (qmi_message_get_marker (message) == QMI_MESSAGE_QRTR_MARKER && !qmi_message_tlv_read_guint16 (message, init_offset, &offset, QMI_ENDIAN_LITTLE, (guint16 *) &service_tmp, &error)) ||
!qmi_message_tlv_read_guint8 (message, init_offset, &offset, &(info.cid), &error)) {
g_warning ("invalid 'CTL release CID' request: missing or invalid release info TLV: %s", error->message);
g_error_free (error);
return;
}
- info.service = (QmiService)service_tmp;
+ info.service = service_tmp;
/* Check if it already exists in the client */
i = qmi_client_info_array_lookup_cid (client->qmi_client_info_array, info.service, info.cid);
@@ -918,7 +920,8 @@ parse_request (QmiProxy *self,
* If we broke framing, an error should be reported and the device
* should get closed */
if (client->buffer->len > 0 &&
- client->buffer->data[0] != QMI_MESSAGE_QMUX_MARKER) {
+ client->buffer->data[0] != QMI_MESSAGE_QMUX_MARKER &&
+ client->buffer->data[0] != QMI_MESSAGE_QRTR_MARKER) {
/* TODO: Report fatal error */
g_warning ("QMI framing error detected");
return;
--
2.39.2
@@ -0,0 +1,29 @@
From 141f9627bb1ba36dcfba166d8823daa541416432 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Thu, 30 Mar 2023 19:55:02 +0200
Subject: [PATCH 4/7] libqmi-glib,endpoint: handle QMUX and QRTR messages
Handle QMUX and QRTR messages in QMI Message:
- Allow QMI messages with both QMUX and QRTR markers
---
src/libqmi-glib/qmi-endpoint.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/libqmi-glib/qmi-endpoint.c b/src/libqmi-glib/qmi-endpoint.c
index 4743e253..97503b29 100644
--- a/src/libqmi-glib/qmi-endpoint.c
+++ b/src/libqmi-glib/qmi-endpoint.c
@@ -67,7 +67,8 @@ qmi_endpoint_parse_buffer (QmiEndpoint *self,
* If we broke framing, an error should be reported and the device
* should get closed */
if (self->priv->buffer->len > 0 &&
- self->priv->buffer->data[0] != QMI_MESSAGE_QMUX_MARKER) {
+ self->priv->buffer->data[0] != QMI_MESSAGE_QMUX_MARKER &&
+ self->priv->buffer->data[0] != QMI_MESSAGE_QRTR_MARKER) {
g_set_error (error,
QMI_PROTOCOL_ERROR,
QMI_PROTOCOL_ERROR_MALFORMED_MESSAGE,
--
2.39.2
@@ -0,0 +1,298 @@
From 4284ca2fb0ac4e73f05e659739c6b24aed2a3405 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Thu, 30 Mar 2023 20:38:43 +0200
Subject: [PATCH 5/7] libqmi-glib,device: handle QMUX and QRTR messages
Handle QMUX and QRTR messages in QMI Message:
- Add internal calls for CTL service which is handled by QRTR endpoint
- Adjust QMI Device to send internal CTL service messages when services
are out of reach of QMUX compatible endpoints.
---
data/qmi-service-ctl.json | 57 ++++++++++++-
src/libqmi-glib/qmi-device.c | 152 +++++++++++++++++++++++++++++++----
2 files changed, 192 insertions(+), 17 deletions(-)
diff --git a/data/qmi-service-ctl.json b/data/qmi-service-ctl.json
index 63f2a142..2c567ec3 100644
--- a/data/qmi-service-ctl.json
+++ b/data/qmi-service-ctl.json
@@ -168,6 +168,61 @@
"type" : "TLV",
"since" : "1.8",
"format" : "string" } ],
- "output" : [ { "common-ref" : "Operation Result" } ] }
+ "output" : [ { "common-ref" : "Operation Result" } ] },
+ // *********************************************************************************
+ // Internal
+ { "name" : "Allocate CID QRTR",
+ "type" : "Message",
+ "service" : "CTL",
+ "id" : "0xFF22",
+ "since" : "1.0",
+ "input" : [ { "name" : "Service",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.0",
+ "format" : "guint16" ,
+ "public-format" : "QmiService" } ],
+ "output" : [ { "common-ref" : "Operation Result" },
+ { "name" : "Allocation Info",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.0",
+ "format" : "sequence",
+ "contents" : [ { "name" : "Service",
+ "format" : "guint16",
+ "public-format" : "QmiService" },
+ { "name" : "Cid",
+ "format" : "guint8" } ],
+ "prerequisites": [ { "common-ref" : "Success" } ] } ] },
+
+ // *********************************************************************************
+ // Internal
+ { "name" : "Release CID QRTR",
+ "type" : "Message",
+ "service" : "CTL",
+ "id" : "0xFF23",
+ "since" : "1.0",
+ "input" : [ { "name" : "Release Info",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.0",
+ "format" : "sequence",
+ "contents" : [ { "name" : "Service",
+ "format" : "guint16",
+ "public-format" : "QmiService" },
+ { "name" : "Cid",
+ "format" : "guint8" } ] } ],
+ "output" : [ { "common-ref" : "Operation Result" },
+ { "name" : "Release Info",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.0",
+ "format" : "sequence",
+ "contents" : [ { "name" : "Service",
+ "format" : "guint16",
+ "public-format" : "QmiService" },
+ { "name" : "Cid",
+ "format" : "guint8" } ],
+ "prerequisites": [ { "common-ref" : "Success" } ] } ] }
]
diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
index f119d5fe..75ab3419 100644
--- a/src/libqmi-glib/qmi-device.c
+++ b/src/libqmi-glib/qmi-device.c
@@ -1137,7 +1137,7 @@ allocate_cid_ready (QmiClientCtl *client_ctl,
/* Check result of the async operation */
output = qmi_client_ctl_allocate_cid_finish (client_ctl, res, &error);
if (!output) {
- g_prefix_error (&error, "CID allocation failed in the CTL client: ");
+ g_prefix_error (&error, "CID allocation failed in the CTL client (QMUX): ");
g_task_return_error (task, error);
g_object_unref (task);
return;
@@ -1161,7 +1161,7 @@ allocate_cid_ready (QmiClientCtl *client_ctl,
task,
QMI_CORE_ERROR,
QMI_CORE_ERROR_FAILED,
- "CID allocation failed in the CTL client: "
+ "CID allocation failed in the CTL client (QMUX): "
"Service mismatch (requested '%s', got '%s')",
qmi_service_get_string (ctx->service),
qmi_service_get_string (service));
@@ -1175,6 +1175,58 @@ allocate_cid_ready (QmiClientCtl *client_ctl,
qmi_message_ctl_allocate_cid_output_unref (output);
}
+static void
+allocate_cid_qrtr_ready (QmiClientCtl *client_ctl,
+ GAsyncResult *res,
+ GTask *task)
+{
+ QmiMessageCtlAllocateCidQrtrOutput *output;
+ QmiService service;
+ guint8 cid;
+ GError *error = NULL;
+ AllocateClientContext *ctx;
+
+ /* Check result of the async operation */
+ output = qmi_client_ctl_allocate_cid_qrtr_finish (client_ctl, res, &error);
+ if (!output) {
+ g_prefix_error (&error, "CID allocation failed in the CTL client (QRTR): ");
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ /* Check result of the QMI operation */
+ if (!qmi_message_ctl_allocate_cid_qrtr_output_get_result (output, &error)) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ qmi_message_ctl_allocate_cid_qrtr_output_unref (output);
+ return;
+ }
+
+ /* Allocation info is mandatory when result is success */
+ g_assert (qmi_message_ctl_allocate_cid_qrtr_output_get_allocation_info (output, &service, &cid, NULL));
+
+ ctx = g_task_get_task_data (task);
+
+ if (service != ctx->service) {
+ g_task_return_new_error (
+ task,
+ QMI_CORE_ERROR,
+ QMI_CORE_ERROR_FAILED,
+ "CID allocation failed in the CTL client (QRTR): "
+ "Service mismatch (requested '%s', got '%s')",
+ qmi_service_get_string (ctx->service),
+ qmi_service_get_string (service));
+ g_object_unref (task);
+ qmi_message_ctl_allocate_cid_qrtr_output_unref (output);
+ return;
+ }
+
+ ctx->cid = cid;
+ build_client_object (task);
+ qmi_message_ctl_allocate_cid_qrtr_output_unref (output);
+}
+
void
qmi_device_allocate_client (QmiDevice *self,
QmiService service,
@@ -1365,13 +1417,13 @@ qmi_device_allocate_client (QmiDevice *self,
}
/* Allocate a new CID for the client to be created */
- if (cid == QMI_CID_NONE) {
+ if (cid == QMI_CID_NONE && ctx->service <= G_MAXUINT8) {
QmiMessageCtlAllocateCidInput *input;
input = qmi_message_ctl_allocate_cid_input_new ();
qmi_message_ctl_allocate_cid_input_set_service (input, ctx->service, NULL);
- g_debug ("[%s] allocating new client ID...",
+ g_debug ("[%s] allocating new client ID (QMUX)...",
qmi_file_get_path_display (self->priv->file));
qmi_client_ctl_allocate_cid (self->priv->client_ctl,
input,
@@ -1382,6 +1434,23 @@ qmi_device_allocate_client (QmiDevice *self,
qmi_message_ctl_allocate_cid_input_unref (input);
return;
+ } else if (cid == QMI_CID_NONE) {
+ QmiMessageCtlAllocateCidQrtrInput *input;
+
+ input = qmi_message_ctl_allocate_cid_qrtr_input_new ();
+ qmi_message_ctl_allocate_cid_qrtr_input_set_service (input, ctx->service, NULL);
+
+ g_debug ("[%s] allocating new client ID (QRTR)...",
+ qmi_file_get_path_display (self->priv->file));
+ qmi_client_ctl_allocate_cid_qrtr (self->priv->client_ctl,
+ input,
+ timeout,
+ cancellable,
+ (GAsyncReadyCallback)allocate_cid_qrtr_ready,
+ task);
+
+ qmi_message_ctl_allocate_cid_qrtr_input_unref (input);
+ return;
}
/* Reuse the given CID */
@@ -1435,6 +1504,38 @@ client_ctl_release_cid_ready (QmiClientCtl *client_ctl,
qmi_message_ctl_release_cid_output_unref (output);
}
+static void
+client_ctl_release_cid_qrtr_ready (QmiClientCtl *client_ctl,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+ QmiMessageCtlReleaseCidQrtrOutput *output;
+
+ /* Note: even if we return an error, the client is to be considered
+ * released! (so shouldn't be used) */
+
+ /* Check result of the async operation */
+ output = qmi_client_ctl_release_cid_qrtr_finish (client_ctl, res, &error);
+ if (!output) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ /* Check result of the QMI operation */
+ if (!qmi_message_ctl_release_cid_qrtr_output_get_result (output, &error)) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ qmi_message_ctl_release_cid_qrtr_output_unref (output);
+ return;
+ }
+
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+ qmi_message_ctl_release_cid_qrtr_output_unref (output);
+}
+
void
qmi_device_release_client (QmiDevice *self,
QmiClient *client,
@@ -1498,21 +1599,40 @@ qmi_device_release_client (QmiDevice *self,
g_object_unref (client);
if (flags & QMI_DEVICE_RELEASE_CLIENT_FLAGS_RELEASE_CID) {
- QmiMessageCtlReleaseCidInput *input;
+ if (service <= G_MAXUINT8) {
+ QmiMessageCtlReleaseCidInput *input;
- /* And now, really try to release the CID */
- input = qmi_message_ctl_release_cid_input_new ();
- qmi_message_ctl_release_cid_input_set_release_info (input, service, cid, NULL);
+ /* And now, really try to release the CID */
+ input = qmi_message_ctl_release_cid_input_new ();
+ qmi_message_ctl_release_cid_input_set_release_info (input, service, cid, NULL);
- qmi_client_ctl_release_cid (self->priv->client_ctl,
- input,
- timeout,
- cancellable,
- (GAsyncReadyCallback)client_ctl_release_cid_ready,
- task);
+ qmi_client_ctl_release_cid (self->priv->client_ctl,
+ input,
+ timeout,
+ cancellable,
+ (GAsyncReadyCallback)client_ctl_release_cid_ready,
+ task);
- qmi_message_ctl_release_cid_input_unref (input);
- return;
+ qmi_message_ctl_release_cid_input_unref (input);
+ return;
+ } else {
+ QmiMessageCtlReleaseCidQrtrInput *input;
+
+ /* And now, really try to release the CID */
+ input = qmi_message_ctl_release_cid_qrtr_input_new ();
+ qmi_message_ctl_release_cid_qrtr_input_set_release_info (input, service, cid, NULL);
+
+ qmi_client_ctl_release_cid_qrtr (self->priv->client_ctl,
+ input,
+ timeout,
+ cancellable,
+ (GAsyncReadyCallback)client_ctl_release_cid_qrtr_ready,
+ task);
+
+ qmi_message_ctl_release_cid_qrtr_input_unref (input);
+ return;
+
+ }
}
/* No need to release the CID, so just done */
--
2.39.2
@@ -0,0 +1,119 @@
From d70669657d1c475ff2127528a26f71fed71d257f Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Wed, 29 Mar 2023 16:37:26 +0200
Subject: [PATCH 6/7] libqmi-glib,endpoint-qrtr: handle QMUX and QRTR messages
Handle QMUX and QRTR messages in QMI Message:
- Use QmiService enum instead of guint where possible
- Bump service ID size from guint8 to guint6 when constructing TLVs
- Extract service IDs from QMI messages depending on marker
---
src/libqmi-glib/qmi-endpoint-qrtr.c | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/src/libqmi-glib/qmi-endpoint-qrtr.c b/src/libqmi-glib/qmi-endpoint-qrtr.c
index 8c4007a1..7ab84afa 100644
--- a/src/libqmi-glib/qmi-endpoint-qrtr.c
+++ b/src/libqmi-glib/qmi-endpoint-qrtr.c
@@ -43,6 +43,8 @@
/* Constants for allocating/releasing clients */
#define QMI_MESSAGE_CTL_ALLOCATE_CID 0x0022
#define QMI_MESSAGE_CTL_RELEASE_CID 0x0023
+#define QMI_MESSAGE_CTL_ALLOCATE_CID_QRTR 0xFF22
+#define QMI_MESSAGE_CTL_RELEASE_CID_QRTR 0xFF23
#define QMI_MESSAGE_TLV_ALLOCATION_INFO 0x01
#define QMI_MESSAGE_INPUT_TLV_SERVICE 0x01
@@ -137,7 +139,7 @@ client_message_cb (QrtrClient *qrtr_client,
QmiEndpointQrtr *self)
{
QmiMessage *message;
- guint service;
+ QmiService service;
guint cid;
g_autoptr(GError) error = NULL;
@@ -262,7 +264,7 @@ release_client (QmiEndpointQrtr *self,
static gboolean
construct_alloc_tlv (QmiMessage *message,
- guint8 service,
+ guint16 service,
guint8 client)
{
gsize init_offset;
@@ -270,8 +272,14 @@ construct_alloc_tlv (QmiMessage *message,
init_offset = qmi_message_tlv_write_init (message,
QMI_MESSAGE_TLV_ALLOCATION_INFO,
NULL);
+ if (service > G_MAXUINT8)
+ return init_offset &&
+ qmi_message_tlv_write_guint16 (message, QMI_ENDIAN_LITTLE, service, NULL) &&
+ qmi_message_tlv_write_guint8 (message, client, NULL) &&
+ qmi_message_tlv_write_complete (message, init_offset, NULL);
+
return init_offset &&
- qmi_message_tlv_write_guint8 (message, service, NULL) &&
+ qmi_message_tlv_write_guint8 (message, (guint8) service, NULL) &&
qmi_message_tlv_write_guint8 (message, client, NULL) &&
qmi_message_tlv_write_complete (message, init_offset, NULL);
}
@@ -282,13 +290,14 @@ handle_alloc_cid (QmiEndpointQrtr *self,
{
gsize offset = 0;
gsize init_offset;
- guint8 service;
+ QmiService service;
guint cid;
g_autoptr(QmiMessage) response = NULL;
g_autoptr(GError) error = NULL;
if (((init_offset = qmi_message_tlv_read_init (message, QMI_MESSAGE_TLV_ALLOCATION_INFO, NULL, &error)) == 0) ||
- !qmi_message_tlv_read_guint8 (message, init_offset, &offset, &service, &error)) {
+ (qmi_message_get_message_id (message) == QMI_MESSAGE_CTL_ALLOCATE_CID && !qmi_message_tlv_read_guint8 (message, init_offset, &offset, (guint8 *) &service, &error)) ||
+ (qmi_message_get_message_id (message) == QMI_MESSAGE_CTL_ALLOCATE_CID_QRTR && !qmi_message_tlv_read_guint16 (message, init_offset, &offset, QMI_ENDIAN_LITTLE, (guint16 *) &service, &error))) {
g_debug ("[%s] error allocating CID: could not parse message: %s",
qmi_endpoint_get_name (QMI_ENDPOINT (self)), error->message);
response = qmi_message_response_new (message, QMI_PROTOCOL_ERROR_MALFORMED_MESSAGE);
@@ -299,6 +308,8 @@ handle_alloc_cid (QmiEndpointQrtr *self,
return;
}
+ g_debug("Extracted service: %d", service);
+
cid = allocate_client (self, service, &error);
if (!cid) {
g_debug ("[%s] error allocating CID: %s",
@@ -327,13 +338,14 @@ handle_release_cid (QmiEndpointQrtr *self,
{
gsize offset = 0;
gsize init_offset;
- guint8 service;
+ QmiService service;
guint8 cid;
g_autoptr(QmiMessage) response = NULL;
g_autoptr(GError) error = NULL;
if (((init_offset = qmi_message_tlv_read_init (message, QMI_MESSAGE_TLV_ALLOCATION_INFO, NULL, &error)) == 0) ||
- !qmi_message_tlv_read_guint8 (message, init_offset, &offset, &service, &error) ||
+ (qmi_message_get_message_id (message) == QMI_MESSAGE_CTL_RELEASE_CID && !qmi_message_tlv_read_guint8 (message, init_offset, &offset, (guint8 *) &service, &error)) ||
+ (qmi_message_get_message_id (message) == QMI_MESSAGE_CTL_RELEASE_CID_QRTR && !qmi_message_tlv_read_guint16 (message, init_offset, &offset, QMI_ENDIAN_LITTLE, (guint16 *) &service, &error)) ||
!qmi_message_tlv_read_guint8 (message, init_offset, &offset, &cid, &error)) {
g_debug ("[%s] error releasing CID: could not parse message: %s",
qmi_endpoint_get_name (QMI_ENDPOINT (self)), error->message);
@@ -389,9 +401,11 @@ handle_ctl_message (QmiEndpointQrtr *self,
{
switch (qmi_message_get_message_id (message)) {
case QMI_MESSAGE_CTL_ALLOCATE_CID:
+ case QMI_MESSAGE_CTL_ALLOCATE_CID_QRTR:
handle_alloc_cid (self, message);
break;
case QMI_MESSAGE_CTL_RELEASE_CID:
+ case QMI_MESSAGE_CTL_RELEASE_CID_QRTR:
handle_release_cid (self, message);
break;
case QMI_MESSAGE_CTL_SYNC:
--
2.39.2
@@ -0,0 +1,35 @@
From cf67304f5bae53a2ca7624351c9056f61fc28650 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Fri, 31 Mar 2023 14:32:30 +0200
Subject: [PATCH 7/7] libqmi-glib,port-context: handle QMUX and QRTR messages
Handle QMUX and QRTR messages in QMI Message:
- Allow QMI messages with both QMUX and QRTR markers
---
src/libqmi-glib/test/test-port-context.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/libqmi-glib/test/test-port-context.c b/src/libqmi-glib/test/test-port-context.c
index 72407c2f..c647e8a3 100644
--- a/src/libqmi-glib/test/test-port-context.c
+++ b/src/libqmi-glib/test/test-port-context.c
@@ -114,11 +114,13 @@ process_next_command (TestPortContext *ctx,
gchar *received;
GByteArray *response;
- /* Every message received must start with the QMUX marker.
+ /* Every message received must start with the QMUX or QRTR marker.
* If it doesn't, we broke framing :-/
* If we broke framing, an error should be reported and the device
* should get closed */
- if (buffer->len > 0 && buffer->data[0] != QMI_MESSAGE_QMUX_MARKER)
+ if (buffer->len > 0 &&
+ buffer->data[0] != QMI_MESSAGE_QMUX_MARKER &&
+ buffer->data[0] != QMI_MESSAGE_QRTR_MARKER)
g_assert_not_reached ();
message = qmi_message_new_from_raw (buffer, &error);
--
2.39.2
+71
View File
@@ -0,0 +1,71 @@
# Forked from Alpine to support QRTR-only services
pkgname=libqmi
pkgver=9999_git20230324
pkgrel=0
pkgdesc="QMI modem protocol helper library"
url="https://www.freedesktop.org/wiki/Software/libqmi"
arch="all"
license="GPL-2.0-or-later AND LGPL-2.1-or-later"
makedepends="
bash-completion
glib-dev
gobject-introspection-dev
help2man
libgudev-dev
libmbim-dev
libqrtr-glib-dev
linux-headers
meson
python3
"
subpackages="
$pkgname-dev
$pkgname-doc
$pkgname-bash-completion
qmi-utils
"
_commit="0d1980eef16cc0f1357d555b70606f852db2dc97"
source="https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/archive/$_commit/libqmi-$_commit.tar.gz
0001-data-qmi-service-ssc-add-SSC-service.patch
0002-libqmi-glib-message-handle-QMUX-and-QRTR-messages.patch
0003-libqmi-glib-proxy-handle-QMUX-and-QRTR-messages.patch
0004-libqmi-glib-endpoint-handle-QMUX-and-QRTR-messages.patch
0005-libqmi-glib-device-handle-QMUX-and-QRTR-messages.patch
0006-libqmi-glib-endpoint-qrtr-handle-QMUX-and-QRTR-messa.patch
0007-libqmi-glib-port-context-handle-QMUX-and-QRTR-messag.patch
"
builddir="$srcdir/$pkgname-$_commit"
build() {
abuild-meson \
-Db_lto=true \
. output
meson compile -C output
}
check() {
meson test --no-rebuild --print-errorlogs -C output
}
package() {
DESTDIR="$pkgdir" meson install --no-rebuild -C output
}
utils() {
pkgdesc="$pkgdesc (CLI utilities)"
amove usr/bin
}
sha512sums="
c1faffbb8d26023c06e3ab3aab8e0b394232da13eaa84bedc7c9e30f95cffe6116160c6fd943c9dad4114dfd73a48e9e586991080fb077bc0b216d1d9f89e5bf libqmi-0d1980eef16cc0f1357d555b70606f852db2dc97.tar.gz
3cc7e723119905d01d47852334c4a4cb6523a9f027b5524cddb8d9b7433522c49978ff7a2b1172517585e5576beeae7ab3f835d72a26ca41f16721b791b0859b 0001-data-qmi-service-ssc-add-SSC-service.patch
88bf3673bea0906beecbfea93a577b8bf80019b9c53ba95c8e8a0242a085271f695100032624a38ec82be43796bc3bf90d16fed34cd10691ca45a8b9d59aac04 0002-libqmi-glib-message-handle-QMUX-and-QRTR-messages.patch
b320d9d28d862c486104cf91b4fef45bb0e3931551af0603f7e1823f4884a0b3a9095b33449fed11b4637883b731ebf949129a46a79f98925031ebbf034217dc 0003-libqmi-glib-proxy-handle-QMUX-and-QRTR-messages.patch
f217c49925fd7206ffc6767ae106b3e52a59c563f63e1512dfe374087013d7ab4aa128d834e9ca69e6d0b6e4c544fa3ff991275f3b05191a0af4c9de9ec78a21 0004-libqmi-glib-endpoint-handle-QMUX-and-QRTR-messages.patch
8e82a9f029aebb48cced514d2760cfca9d7afdb3bb8e9d1bafa24b1af20a9f41c7dacee8892c99cdb4d92b74997557681fad4d78367bd969fdaed5026b753b9a 0005-libqmi-glib-device-handle-QMUX-and-QRTR-messages.patch
b6cf531de814d2cf0c9c6039978f5ba5f904fe09252da7724d1f018cdbe8793a99634818ec9ec68041d8b4bccfa47397d2cb59bbbb2ad7518be55366e2a5f211 0006-libqmi-glib-endpoint-qrtr-handle-QMUX-and-QRTR-messa.patch
e85f547291c38cf8cf457b72049f6dd5809b9f1f7429572c8440465f762e8461dff96ed72a92d02f0ae155a476e74f9da94997a3d2cddaa58f6773803ac1ecc3 0007-libqmi-glib-port-context-handle-QMUX-and-QRTR-messag.patch
"
+32
View File
@@ -0,0 +1,32 @@
# Kept from Alpine until stable
# Maintainer: Dylan Van Assche <me@dylanvanassche.be>
pkgname=libssc
pkgver=0.1.1
pkgrel=0
pkgdesc="Library to expose Qualcomm Sensor Core sensors"
url="https://codeberg.org/DylanVanAssche/libssc"
arch="all"
license="GPL-3.0-or-later"
makedepends="linux-headers libqmi-dev glib-dev protobuf-c-dev meson libgudev-dev eudev-dev"
options="!check" # no tests yet
subpackages="$pkgname-dbg $pkgname-dev"
builddir="$srcdir/$pkgname"
source="$pkgname-$pkgver.tar.gz::https://codeberg.org/DylanVanAssche/libssc/archive/$pkgver.tar.gz
"
build() {
abuild-meson \
-Db_lto=true \
. output
meson compile -C output
}
package() {
DESTDIR="$pkgdir" meson install --no-rebuild -C output
}
sha512sums="
eb1184930651b6e68cceed91bf5f2469380db9180c1f1a69738f0711286b8397a3b1855122d31df80551957dd53788da52de7e8c766094078dec13c003b13624 libssc-0.1.1.tar.gz
"