From 0b4a60eb78a44df9187d96cf74b0d311a01143b9 Mon Sep 17 00:00:00 2001 From: John Sullivan Date: Mon, 21 Sep 2020 23:17:06 -0700 Subject: [PATCH 1/3] New package: alsa-ucm-conf-1.2.3 --- srcpkgs/alsa-ucm-conf/template | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 srcpkgs/alsa-ucm-conf/template diff --git a/srcpkgs/alsa-ucm-conf/template b/srcpkgs/alsa-ucm-conf/template new file mode 100644 index 00000000000..8be8f503980 --- /dev/null +++ b/srcpkgs/alsa-ucm-conf/template @@ -0,0 +1,17 @@ +# Template file for 'alsa-ucm-conf' +pkgname=alsa-ucm-conf +version=1.2.3 +revision=1 +short_desc="ALSA Use Case Manager configuration (and topologies)" +maintainer="John Sullivan " +license="BSD-3-Clause" +homepage="https://alsa-project.org/" +distfiles="https://www.alsa-project.org/files/pub/lib/${pkgname}-${version}.tar.bz2" +checksum=1bc24da04bb27a75e323c9f0fb03e44705b6bb8a8baf255b94b41d457d590d00 + +do_install() { + vmkdir usr/share/alsa + vcopy ucm2 usr/share/alsa + + vlicense LICENSE +} From ee498554f1dda199835cfc1c6b7e8c3ff68dacaa Mon Sep 17 00:00:00 2001 From: John Sullivan Date: Fri, 25 Sep 2020 00:44:17 -0700 Subject: [PATCH 2/3] New package: atinout-0.9.1 --- srcpkgs/atinout/template | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 srcpkgs/atinout/template diff --git a/srcpkgs/atinout/template b/srcpkgs/atinout/template new file mode 100644 index 00000000000..e292bf9c9c7 --- /dev/null +++ b/srcpkgs/atinout/template @@ -0,0 +1,14 @@ +# Template file for 'atinout' +pkgname=atinout +version=0.9.1 +revision=1 +build_style=gnu-makefile +short_desc="Send AT commands to modem and print responses" +maintainer="John Sullivan " +license="GPL-3.0-or-later" +homepage="http://atinout.sourceforge.net" +distfiles="${SOURCEFORGE_SITE}/project/${pkgname}/v${version}/${pkgname}-${version}.tar.gz" +checksum=4d15c8288aca414e11cd304686b172696104c5e42bf776300311c005634854a2 + +# Disable -Werror (GCC9+ turns switch fallthrough into error) +CFLAGS="-W -Wall -Wextra -DVERSION=\\\"${version}\\\" -g" From d24d14e5aa232a543bb244f12b0851d5790346a4 Mon Sep 17 00:00:00 2001 From: John Sullivan Date: Fri, 25 Sep 2020 01:48:43 -0700 Subject: [PATCH 3/3] pinephone-base: add support for modem setup and audio routing. --- srcpkgs/pinephone-base/files/COPYING | 14 ++ .../files/pinephone-modem-setup | 118 ++++++++++++++ srcpkgs/pinephone-base/files/ucm/HiFi.conf | 142 +++++++++++++++++ .../pinephone-base/files/ucm/VoiceCall.conf | 144 ++++++++++++++++++ .../files/ucm/sun50i-a64-audio.conf | 11 ++ srcpkgs/pinephone-base/template | 14 +- 6 files changed, 440 insertions(+), 3 deletions(-) create mode 100644 srcpkgs/pinephone-base/files/COPYING create mode 100755 srcpkgs/pinephone-base/files/pinephone-modem-setup create mode 100644 srcpkgs/pinephone-base/files/ucm/HiFi.conf create mode 100644 srcpkgs/pinephone-base/files/ucm/VoiceCall.conf create mode 100644 srcpkgs/pinephone-base/files/ucm/sun50i-a64-audio.conf diff --git a/srcpkgs/pinephone-base/files/COPYING b/srcpkgs/pinephone-base/files/COPYING new file mode 100644 index 00000000000..78727726e1e --- /dev/null +++ b/srcpkgs/pinephone-base/files/COPYING @@ -0,0 +1,14 @@ +The following list of files are copyright of postmarketOS, and are used with +some modifications under the terms of the MIT license +https://opensource.org/licenses/MIT + +90-modem-eg25.rules +pinephone-modem-setup +ucm/sun50i-a64-audio.conf +ucm/HiFi.conf +ucm/VoiceCall.conf + +--- + +see for sources: +https://gitlab.com/postmarketOS/pmaports/-/tree/master/device/community/device-pine64-pinephone \ No newline at end of file diff --git a/srcpkgs/pinephone-base/files/pinephone-modem-setup b/srcpkgs/pinephone-base/files/pinephone-modem-setup new file mode 100755 index 00000000000..8bc08f02a9b --- /dev/null +++ b/srcpkgs/pinephone-base/files/pinephone-modem-setup @@ -0,0 +1,118 @@ +#!/bin/sh + +CMD=$(basename "$0") + +log() { + echo "$@" | logger -t "$CMD" -s +} + +# Exit if atinout isn't installed +if ! which atinout >/dev/null; then + log "atinout not available; exiting" + exit 1 +fi + +# Need root +if [ "$(id -u)" != "0" ]; then + log "Please run $CMD as root" + exit 1 +fi + +QCFG_RISIGNALTYPE_CONFIG="physical" +QMBNCFG_CONFIG="1" +QCFG_IMS_CONFIG="1" + +if [ -z "$1" ] +then + DEV="/dev/EG25.AT" +else + DEV="$1" +fi + +log "Powering up" +echo 1 > /sys/class/modem-power/modem-power/device/powered_blocking + +# The modem might not be fully initialized yet, so give it some time to +# initialize +# +# We'll try to query for the firmware version for 15 seconds after which we'll +# consider the initialization failed + +log "Waiting for the modem to initialize" +INITIALIZED=false +for second in $(seq 1 15) +do + if echo "AT+QDAI?" | atinout - $DEV - | grep -q OK + then + INITIALIZED=true + break + fi + + log "Waited for $second seconds..." + + sleep 1 +done + +if $INITIALIZED +then + log "Modem initialized" +else + log "Modem failed to initialize" + exit 1 +fi + +# Read current config +QCFG_RISIGNALTYPE_ACTUAL_CONFIG=$(echo 'AT+QCFG="risignaltype"' | atinout - $DEV -) +QMBNCFG_ACTUAL_CONFIG=$(echo 'AT+QMBNCFG="AutoSel"' | atinout - $DEV -) +QCFG_IMS_ACTUAL_CONFIG=$(echo 'AT+QCFG="ims"' | atinout - $DEV -) + +if echo $QCFG_RISIGNALTYPE_ACTUAL_CONFIG | grep -q $QCFG_RISIGNALTYPE_CONFIG && \ + echo $QMBNCFG_ACTUAL_CONFIG | grep -q $QMBNCFG_CONFIG && \ + echo $QCFG_IMS_ACTUAL_CONFIG | grep -q $QCFG_IMS_CONFIG +then + log "Modem already configured" + exit 0 +fi + +# Modem not configured, we need to send it the digital interface configuration, +# then reboot it + +# Configure ring device +RET=$(echo "AT+QCFG=\"risignaltype\",\"$QCFG_RISIGNALTYPE_CONFIG\"" | atinout - $DEV -) + +if ! echo $RET | grep -q OK +then + log "Failed to configure modem ring wakeup: $RET" + exit 1 +fi + +# Configure VoLTE auto selecting profile +RET=$(echo "AT+QMBNCFG=\"AutoSel\",$QMBNCFG_CONFIG" | atinout - $DEV -) + +if ! echo $RET | grep -q OK +then + log "Failed to enable VoLTE profile auto selecting: $RET" + exit 1 +fi + +# Enable VoLTE +RET=$(echo "AT+QCFG=\"ims\",$QCFG_IMS_CONFIG" | atinout - $DEV -) + +if ! echo $RET | grep -q OK +then + log "Failed to enable VoLTE: $RET" + exit 1 +fi + +# Reset module +# +# 1 Set the mode to full functionality (vs 4: no RF, and 1: min functionality) +# 1 Reset the modem before changing mode (only available with 1 above) +# +RET=$(echo "AT+CFUN=1,1" | atinout - $DEV -) + +if ! echo $RET | grep -q OK +then + log "Failed to reset the module: $RET" + exit 1 +fi diff --git a/srcpkgs/pinephone-base/files/ucm/HiFi.conf b/srcpkgs/pinephone-base/files/ucm/HiFi.conf new file mode 100644 index 00000000000..0a332c31c9a --- /dev/null +++ b/srcpkgs/pinephone-base/files/ucm/HiFi.conf @@ -0,0 +1,142 @@ +SectionVerb { + EnableSequence [ + cset "name='Headphone Playback Switch' off" + cset "name='Headphone Source Playback Route' DAC" + cset "name='Line In Playback Switch' off" + cset "name='Line Out Playback Switch' off" + cset "name='Line Out Source Playback Route' Mono Differential" + cset "name='Mic1 Playback Switch' off" + cset "name='Mic2 Playback Switch' off" + cset "name='AIF1 DA0 Playback Volume' 160" + cset "name='AIF1 Loopback Switch' off" + cset "name='AIF2 Loopback Switch' off" + cset "name='AIF3 Loopback Switch' off" + cset "name='AIF3 ADC Capture Route' None" + cset "name='AIF3 DAC Playback Route' None" + cset "name='DAC Playback Switch' on" + cset "name='DAC Playback Volume' 160" + cset "name='DAC Mixer ADC Playback Switch' off" + cset "name='DAC Mixer AIF1 DA0 Playback Switch' on" + cset "name='DAC Mixer AIF2 DAC Playback Switch' off" + cset "name='DAC Reversed Playback Switch' off" + cset "name='Earpiece Playback Switch' off" + cset "name='Earpiece Source Playback Route' DACL" + + cset "name='Line In Capture Switch' off" + cset "name='Mic1 Capture Switch' off" + cset "name='Mic1 Boost Volume' 7" + cset "name='Mic2 Capture Switch' off" + cset "name='Mic2 Boost Volume' 7" + cset "name='Mixer Capture Switch' off" + cset "name='Mixer Reversed Capture Switch' off" + cset "name='ADC Capture Volume' 160" + cset "name='ADC Gain Capture Volume' 7" + cset "name='AIF1 AD0 Capture Volume' 160" + cset "name='AIF1 AD0 Mixer ADC Capture Switch' on" + cset "name='AIF2 ADC Mixer ADC Capture Switch' off" + cset "name='AIF2 ADC Mixer AIF1 DA0 Capture Switch' off" + cset "name='AIF2 ADC Mixer AIF2 DAC Rev Capture Switch' off" + cset "name='AIF2 ADC Mixer AIF1 DA0 Capture Switch' off" + cset "name='AIF2 ADC Mixer AIF1 DA0 Capture Switch' off" + ] + + Value { + PlaybackPCM "hw:${CardId},0" + CapturePCM "hw:${CardId},0" + } +} + +SectionDevice."Speaker" { + Comment "Internal speaker" + EnableSequence [ + cset "name='AIF1 DA0 Stereo Playback Route' Mix Mono" + cset "name='Line Out Playback Switch' on" + cset "name='Line Out Playback Volume' 100%" + ] + + DisableSequence [ + cset "name='Line Out Playback Switch' off" + ] + + Value { + PlaybackVolume "Line Out Playback Volume" + PlaybackSwitch "Line Out Playback Switch" + PlaybackChannels 2 + PlaybackPriority 300 + PlaybackPCM "hw:${CardId},0" + } +} +SectionDevice."Earpiece" { + Comment "Internal Earpiece" + EnableSequence [ + cset "name='AIF1 DA0 Stereo Playback Route' Mix Mono" + cset "name='Earpiece Playback Switch' on" + cset "name='Earpiece Playback Volume' 100%" + ] + + DisableSequence [ + cset "name='Earpiece Playback Switch' off" + ] + + Value { + PlaybackVolume "Earpiece Playback Volume" + PlaybackSwitch "Earpiece Playback Switch" + PlaybackChannels 2 + PlaybackPriority 200 + PlaybackPCM "hw:${CardId},0" + } +} +SectionDevice."Mic" { + Comment "Internal Microphone" + ConflictingDevice [ + "Headset" + ] + EnableSequence [ + cset "name='Mic1 Capture Switch' on" + ] + DisableSequence [ + cset "name='Mic1 Capture Switch' off" + ] + Value { + CapturePriority 500 + CapturePCM "hw:${CardId},0" + CaptureChannels 2 + } +} +SectionDevice."Headset" { + Comment "Headset Microphone" + ConflictingDevice [ + "Mic" + ] + EnableSequence [ + cset "name='Mic2 Capture Switch' on" + ] + DisableSequence [ + cset "name='Mic2 Capture Switch' off" + ] + Value { + CapturePriority 100 + CapturePCM "hw:${CardId},0" + CaptureChannels 2 + } +} +SectionDevice."Headphones" { + Comment "Headset" + EnableSequence [ + cset "name='AIF1 DA0 Stereo Playback Route' Reverse Stereo" + cset "name='Headphone Playback Switch' on" + cset "name='Headphone Playback Volume' 40%" + ] + + DisableSequence [ + cset "name='Headphone Playback Switch' off" + ] + + Value { + PlaybackVolume "Headphone Playback Volume" + PlaybackSwitch "Headphone Playback Switch" + PlaybackChannels 2 + PlaybackPriority 100 + PlaybackPCM "hw:${CardId},0" + } +} diff --git a/srcpkgs/pinephone-base/files/ucm/VoiceCall.conf b/srcpkgs/pinephone-base/files/ucm/VoiceCall.conf new file mode 100644 index 00000000000..ad1bf2a41f0 --- /dev/null +++ b/srcpkgs/pinephone-base/files/ucm/VoiceCall.conf @@ -0,0 +1,144 @@ +SectionVerb { + EnableSequence [ + cset "name='Headphone Playback Switch' off" + cset "name='Headphone Source Playback Route' DAC" + cset "name='Line In Playback Switch' off" + cset "name='Line Out Playback Switch' off" + cset "name='Line Out Source Playback Route' Mono Differential" + cset "name='Mic1 Playback Switch' off" + cset "name='Mic2 Playback Switch' off" + cset "name='AIF1 DA0 Playback Volume' 160" + cset "name='AIF1 Loopback Switch' off" + cset "name='AIF2 Loopback Switch' off" + cset "name='AIF2 DAC Playback Volume' 160" + cset "name='AIF3 Loopback Switch' off" + cset "name='AIF3 ADC Capture Route' None" + cset "name='AIF3 DAC Playback Route' None" + cset "name='DAC Playback Switch' on" + cset "name='DAC Playback Volume' 160" + cset "name='DAC Mixer ADC Playback Switch' off" + cset "name='DAC Mixer AIF1 DA0 Playback Switch' on" + cset "name='DAC Mixer AIF2 DAC Playback Switch' on" + cset "name='DAC Reversed Playback Switch' off" + cset "name='Earpiece Playback Switch' off" + cset "name='Earpiece Source Playback Route' DACL" + + cset "name='Line In Capture Switch' off" + cset "name='Mic1 Capture Switch' off" + cset "name='Mic1 Boost Volume' 7" + cset "name='Mic2 Capture Switch' off" + cset "name='Mic2 Boost Volume' 7" + cset "name='Mixer Capture Switch' off" + cset "name='Mixer Reversed Capture Switch' off" + cset "name='ADC Capture Volume' 160" + cset "name='ADC Gain Capture Volume' 7" + cset "name='AIF1 AD0 Capture Volume' 160" + cset "name='AIF1 AD0 Mixer ADC Capture Switch' on" + cset "name='AIF2 ADC Capture Volume' 160" + cset "name='AIF2 ADC Mixer ADC Capture Switch' on" + cset "name='AIF2 ADC Mixer AIF1 DA0 Capture Switch' off" + cset "name='AIF2 ADC Mixer AIF2 DAC Rev Capture Switch' off" + cset "name='AIF2 ADC Mixer AIF1 DA0 Capture Switch' off" + cset "name='AIF2 ADC Mixer AIF1 DA0 Capture Switch' off" + ] + + Value { + PlaybackPCM "hw:${CardId},0" + CapturePCM "hw:${CardId},0" + } +} + +SectionDevice."Speaker" { + Comment "Internal speaker" + EnableSequence [ + cset "name='AIF1 DA0 Stereo Playback Route' Mix Mono" + cset "name='Line Out Playback Switch' on" + cset "name='Line Out Playback Volume' 100%" + ] + + DisableSequence [ + cset "name='Line Out Playback Switch' off" + ] + + Value { + PlaybackVolume "Line Out Playback Volume" + PlaybackSwitch "Line Out Playback Switch" + PlaybackChannels 2 + PlaybackPriority 300 + PlaybackPCM "hw:${CardId},0" + } +} +SectionDevice."Earpiece" { + Comment "Internal Earpiece" + EnableSequence [ + cset "name='AIF1 DA0 Stereo Playback Route' Mix Mono" + cset "name='Earpiece Playback Switch' on" + cset "name='Earpiece Playback Volume' 100%" + ] + + DisableSequence [ + cset "name='Earpiece Playback Switch' off" + ] + + Value { + PlaybackVolume "Earpiece Playback Volume" + PlaybackSwitch "Earpiece Playback Switch" + PlaybackChannels 2 + PlaybackPriority 500 + PlaybackPCM "hw:${CardId},0" + } +} +SectionDevice."Mic" { + Comment "Internal Microphone" + ConflictingDevice [ + "Headset" + ] + EnableSequence [ + cset "name='Mic1 Capture Switch' on" + ] + DisableSequence [ + cset "name='Mic1 Capture Switch' off" + ] + Value { + CapturePriority 200 + CapturePCM "hw:${CardId},0" + CaptureChannels 2 + } +} +SectionDevice."Headset" { + Comment "Headset Microphone" + ConflictingDevice [ + "Mic" + ] + EnableSequence [ + cset "name='Mic2 Capture Switch' on" + ] + DisableSequence [ + cset "name='Mic2 Capture Switch' off" + ] + Value { + CapturePriority 100 + CapturePCM "hw:${CardId},0" + CaptureChannels 2 + } +} +SectionDevice."Headphones" { + Comment "Headset" + EnableSequence [ + cset "name='AIF1 DA0 Stereo Playback Route' Stereo" + cset "name='Headphone Playback Switch' on" + cset "name='Headphone Playback Volume' 40%" + ] + + DisableSequence [ + cset "name='Headphone Playback Switch' off" + ] + + Value { + PlaybackVolume "Headphone Playback Volume" + PlaybackSwitch "Headphone Playback Switch" + PlaybackChannels 2 + PlaybackPriority 100 + PlaybackPCM "hw:${CardId},0" + } +} diff --git a/srcpkgs/pinephone-base/files/ucm/sun50i-a64-audio.conf b/srcpkgs/pinephone-base/files/ucm/sun50i-a64-audio.conf new file mode 100644 index 00000000000..9a8ea12b28a --- /dev/null +++ b/srcpkgs/pinephone-base/files/ucm/sun50i-a64-audio.conf @@ -0,0 +1,11 @@ +Syntax 2 + +SectionUseCase."HiFi" { + File "HiFi.conf" + Comment "Play HiFi quality music" +} + +SectionUseCase."Voice Call" { + File "VoiceCall.conf" + Comment "Make a phone call" +} diff --git a/srcpkgs/pinephone-base/template b/srcpkgs/pinephone-base/template index 6c750a92bd5..921820cbc93 100644 --- a/srcpkgs/pinephone-base/template +++ b/srcpkgs/pinephone-base/template @@ -1,15 +1,23 @@ # Template file for 'pinephone-base' pkgname=pinephone-base -version=0.1 +version=0.2 revision=1 archs="aarch64*" build_style=meta -depends="pinephone-kernel pinephone-uboot" +depends="pinephone-kernel pinephone-uboot alsa-ucm-conf" short_desc="Void Linux PinePhone platform package" maintainer="John Sullivan " -license="Public Domain" +license="MIT" homepage="https://www.voidlinux.org" do_install() { vinstall "${FILESDIR}/90-modem-eg25.rules" 644 usr/lib/udev/rules.d + vbin "${FILESDIR}/pinephone-modem-setup" + + # Note: 'sun50i-a64-audi' is not a mistake, alsaucm doesn't work if you + # correct this + vmkdir usr/share/alsa/ucm2 + vcopy "${FILESDIR}/ucm" usr/share/alsa/ucm2/sun50i-a64-audi + + vlicense "${FILESDIR}/COPYING" }