Initial commit - project started Aug 2020 (!)

This commit is contained in:
Tony Garnock-Jones 2022-03-09 16:37:19 +01:00
commit a0cdf56b1b
78 changed files with 97667 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
github-cache/
package-cache/
SqueakDebug.log
squeak-output.log
fonts/from-github/Roboto*ttf

45
DevSupport.st Normal file
View File

@ -0,0 +1,45 @@
AbstractLauncher subclass: #LinuxIODevStartup
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'DevSupport-LinuxIO'!
!LinuxIODevStartup methods!
startUp
| i |
FileDirectory setDefaultDirectory: (UnixProcess env at: 'HOME'), '/src/squeak-phone'.
Utilities authorInitials: (UnixProcess env at: 'USER').
NetNameResolver localHostName caseOf: {
['zip'] -> [
PhoneWorldMorph uninstall.
DisplayScreen fullScreenOn.
].
} otherwise: [].
i := Installer mc directory: (UnixProcess env at: 'HOME'), '/Archives/Monticello'.
self update: 'SyndicatedActors' from: i.
self update: 'LinuxIO' from: i.
self update: 'SqueakPhone' from: i.
"If we run the following either here directly, or in the UI
process, it appears to lock up the image at 100% CPU usage."
[RFBServer allowEmptyPasswords: true; stop; start] forkAt: Processor lowestPriority + 1.
!
update: packageName from: anInstaller
| wc |
wc := MCWorkingCopy allManagers detect: [:m | m package name = packageName] ifNone: [nil].
(wc isNil or: [wc modified not]) ifTrue: [anInstaller install: packageName]
!
!
LinuxIODevStartup activate!
Utilities commonRequestStrings: 'DisplayDevice fixDPI "Autodetect"
DisplayDevice fixDPI: 500 "Cellphoneish"
DisplayDevice fixDPI: 256 "Comfortable on my 27-inch monitor"
DisplayDevice fixDPI: 163 "Nominal for a 4k 27-inch monitor"
-
', Utilities commonRequestStrings contents!
SyndicateSnippets stdio1!

30
Makefile Normal file
View File

@ -0,0 +1,30 @@
.PHONY: build-images untag untag-all veryclean dev sudo-dev
SQUEAKERFLAGS=
BUILDFLAGS=
build-images:
squeaker $(SQUEAKERFLAGS) build $(BUILDFLAGS) -t squeak-phone-base -f Squeakerfile.phone-base.st .
squeaker $(SQUEAKERFLAGS) build $(BUILDFLAGS) -t squeak-phone -f Squeakerfile.phone.st .
squeaker $(SQUEAKERFLAGS) build $(BUILDFLAGS) -t squeak-phone-dev -f Squeakerfile.phone-dev.st .
untag:
squeaker untag squeak-phone squeak-phone-dev
untag-all: untag
squeaker untag squeak-phone-base
clean: untag
squeaker gc
veryclean: untag-all
squeaker gc
dev: build-images
squeaker run squeak-phone-dev
sudo-dev: build-images
squeaker run --root squeak-phone-dev
images/%: build-images
squeaker create squeak-phone "$@"

1
MorphicForCellphone.1.cs Normal file
View File

@ -0,0 +1 @@
'From Squeak6.0alpha of 8 October 2020 [latest update: #19909] on 29 November 2021 at 12:41:42 pm'! !AbstractResizerMorph class methodsFor: 'preferences' stamp: 'tonyg 10/6/2020 00:49'! gripThickness "A number in pixels that encodes the area were the user can target splitters or edge grips." <preference: 'Grip Thickness' category: 'windows' description: 'A number in pixels that encodes the area were the user can target splitters or edge grips such as in application windows. Bigger grips make it easier to click on them.' type: #Number> ^ GripThickness ifNil: [(UserInterfaceTheme current get: #gripThickness) ifNil: [4]]! ! !AbstractResizerMorph class methodsFor: 'preferences' stamp: 'tonyg 10/6/2020 01:03'! handleLength <preference: 'Handle Length' category: 'windows' description: 'AThe size of a grip handle if shown. Can be interpreted as width or height, depending of the resizer orientation. Does not affect the clickable area. See grip thickness for that.' type: #Number> ^ HandleLength ifNil: [(UserInterfaceTheme current get: #handleLength) ifNil: [25]]! ! !ScrollPane class methodsFor: 'defaults' stamp: 'tonyg 10/6/2020 11:21'! scrollBarThickness ^ Preferences scrollBarsNarrow ifTrue: [(UserInterfaceTheme current get: #scrollBarThicknessNarrow) ifNil: [10]] ifFalse: [(UserInterfaceTheme current get: #scrollBarThickness) ifNil: [14]]! !

67
README.md Normal file
View File

@ -0,0 +1,67 @@
# How to use pmbootstrap
Switching devices:
pmbootstrap config device <new_device>
e.g.
pmbootstrap config device pine64-pinephone
pmbootstrap config device samsung-herolte
pmbootstrap config device qemu-amd64
Building for Samsung Galaxy S7 (samsung-herolte):
pmbootstrap install --android-recovery-zip
Building for Pinephone (pine64-pinephone):
pmbootstrap install --sdcard BLOCKDEV
Building for qemu-amd64:
pmbootstrap install
pmbootstrap qemu
# How to install on Samsung Galaxy S7
(See https://wiki.postmarketos.org/wiki/Installation_from_recovery_mode )
Reboot holding power + home + volup to enter the recovery. Choose
Advanced, ADB sideload.
Then run
pmbootstrap flasher --method adb sideload
# How to use RNDIS to connect via ssh over USB
(See https://wiki.postmarketos.org/wiki/USB_Network )
For pinephone, which *does* get a MAC address for the RNDIS device:
sudo ip a del 10.42.0.1/32 dev usb0
sudo ip a add 172.16.42.2/32 dev usb0
sudo ip r add 172.16.0.0/16 dev usb0
SSH_AUTH_SOCK= ssh user@172.16.42.1
... or, huh, just use DHCP to get an address from the phone! It turns
out to work.
The equivalent for samsung-herolte is similar but requires inventing a
MAC address and assigning it at the link layer:
sudo ip link set dev eth0 address 12:12:12:12:12:12
sudo ip a add 172.16.42.2/32 dev eth0
sudo ip r add 172.16.0.0/16 dev eth0
SSH_AUTH_SOCK= ssh user@172.16.42.1
# How to set up WiFi on a running instance
(See https://wiki.postmarketos.org/wiki/WiFi)
When you pick "none" UI, you get no nmcli *or* wpa_supplicant.
Pick "console". Then you get both.
sudo nmcli device wifi connect <SSID> password <PASSWORD> ifname wlan0

View File

@ -0,0 +1 @@
from: 'http://files.squeak.org/6.0alpha/Squeak6.0alpha-21379-64bit/Squeak6.0alpha-21379-64bit.zip'! World submorphs select: [:m | (m isKindOf: PreferenceWizardMorph) or: [m isSystemWindow and: [m label beginsWith: 'Welcome to Squeak']]] thenDo: [:m | m delete]. ! "Preferences." CommunityTheme createDark apply. Model useColorfulWindows: true. [Preferences setDemoFonts] valueSupplyingAnswer: true. Cursor useBiggerCursors: true. Preferences enable: #mouseOverForKeyboardFocus. Preferences disable: #balloonHelpEnabled. Preferences disable: #alternativeBrowseIt. TextEditor autoEnclose: false. Model windowActiveOnFirstClick: true. ! MCMcmUpdater default doUpdate: false! Metacello new configuration: 'FFI'; load! Installer ss project: 'OSProcess'; install: 'OSProcess'! Installer ss project: 'CommandShell'; install: 'CommandShell'! Installer ss project: 'JSON'; install: 'JSON'! Installer ss project: 'Snarl'; install: 'Snarl'. Project current instVarNamed: #uiManager put: nil. !

View File

@ -0,0 +1 @@
from: #'squeak-phone'! fileIn: 'DevSupport.st'!

1
Squeakerfile.phone.st Normal file
View File

@ -0,0 +1 @@
from: #'squeak-phone-base'! MCMcmUpdater default doUpdate: false! resource: 'fonts/from-github/Roboto-Regular.ttf' ! | description | description := TTFontDescription addFromTTFile: 'fonts/from-github/Roboto-Regular.ttf'. TTCFont newTextStyleFromTT: description first. TTCFont registerAll. "TTCFont installFromFileNames: #('fonts/from-github/Roboto-Regular.ttf')." TTCFont glyphCacheSize: 8000. ! Installer ss project: 'BitSyntax'; install: 'BitSyntax-Core'! (Installer squeak project: 'ss') install: 'RFB'! Installer ss project: 'Preserves'; install: 'Preserves'! Installer ss project: 'TouchScrolling'; install: 'TouchScrolling'! Installer ss project: 'TiledMaps'; install: 'TiledMaps'! (Installer mc directory: '/home/tonyg/Archives/Monticello') install: 'BTree-Collections'; install: 'SyndicatedActors'! (Installer mc directory: '/home/tonyg/Archives/Monticello') install: 'LinuxIO'! (Installer mc directory: '/home/tonyg/Archives/Monticello') install: 'SqueakPhone'! CellphoneTheme createDark apply! PhoneWorldMorph install. LinuxInputIndex instance. LinuxInputDaemon instance. MachineConfiguration instance. WidgetDaemon instance. CallManager instance. AppRegistryDaemon instance. BacklightControlDaemon instance. ! resource: 'fonts/Font-Awesome/metadata/icons.json'! FontAwesome load: 'fonts/Font-Awesome'!

46
backup-pm-home.sh Executable file
View File

@ -0,0 +1,46 @@
#!/bin/sh
# 2021-11-10
# revised 2022-01-06 for multiple devices
set -e
set -u
eval "$(ssh pm-rndis cat /etc/deviceinfo)"
if [ -z "${deviceinfo_codename}" ]
then
echo Cannot device which device is connected!
exit 1
fi
echo Connected device: $deviceinfo_codename
rsnapshot_conf=/tmp/rsnapshot.backups-pm-${deviceinfo_codename}.conf
cat > $rsnapshot_conf <<EOF
config_version 1.2
snapshot_root /home/tonyg/src/squeak-phone/devices/${deviceinfo_codename}/backups/home-user
no_create_root 0
cmd_cp /usr/bin/cp
cmd_rm /usr/bin/rm
cmd_rsync /usr/bin/rsync
cmd_ssh /usr/bin/ssh
cmd_logger /usr/bin/logger
logfile /tmp/rsnapshot.backups-pm-${deviceinfo_codename}.log
lockfile /tmp/rsnapshot.backups-pm-${deviceinfo_codename}.pid
retain adhoc 10000
verbose 2
one_fs 1
sync_first 1
backup user@pm-rndis:/home/user ./
EOF
rsnapshot -c ${rsnapshot_conf} sync
rsnapshot -c ${rsnapshot_conf} adhoc

1
devices/pine64-pinephone/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
backups/

View File

@ -0,0 +1,104 @@
## Anatomy of an incoming call
Regular call strength indicators, but immediately prior to
registration changing (just before the call -- did it move me to a new
cell for the call because it was a better fit for the traffic that was
about to start?):
09:42:34.644010+01:00 [HayesModem]: +QIND: "csq",99,99
Interestingly the first 99 there means "not known or not detectable",
maybe because we're changing cell and it doesn't know what the signal
strength will be like there yet.
Here we change cell:
09:42:34.644037+01:00 [HayesModem]: +CREG: 1,"1950","0ADC20C",2
09:42:34.644046+01:00 [HayesModem]: +CGREG: 1,"1950","0ADC20C",2
Oh! A call! The CLIP's final 0 tells us the CLI is "valid". The DSCI
tells us call #2 is MT (1), incoming (4), voice (0), from my main
phone, which is in international format (145):
09:42:34.889393+01:00 [HayesModem]: +CRING: VOICE
09:42:34.889410+01:00 [HayesModem]: +CLIP: "+31612345678",145,,,,0
09:42:34.889418+01:00 [HayesModem]: ^DSCI: 2,1,4,0,+31612345678,145
We learn the signal strength at the new cell:
09:42:38.160627+01:00 [HayesModem]: +QIND: "csq",12,99
We get a time signal from the network:
09:42:40.069934+01:00 [HayesModem]: +CTZE: "+04",0,"2021/12/16,08:42:39"
Another ring:
09:42:40.893283+01:00 [HayesModem]: +CRING: VOICE
09:42:40.893309+01:00 [HayesModem]: +CLIP: "+31612345678",145,,,,0
Another:
09:42:47.003871+01:00 [HayesModem]: +CRING: VOICE
09:42:47.003906+01:00 [HayesModem]: +CLIP: "+31612345678",145,,,,0
I hung up on the other end. DSCI says call #2, MT, state CALL_END (6), voice (0).
09:42:47.354649+01:00 [HayesModem]: ^DSCI: 2,1,6,0,+31612345678,145
09:42:47.365856+01:00 [HayesModem]: NO CARRIER
09:42:49.361249+01:00 [HayesModem]: +QIND: "csq",20,99
Back (?) to the old cell (?):
09:42:49.368473+01:00 [HayesModem]: +CREG: 1,"FD21","12B1B20",7
09:42:49.368493+01:00 [HayesModem]: +CGREG: 1,"FD21","12B1B20",7
And back to regular signal strength indicators:
09:42:50.151209+01:00 [HayesModem]: +QIND: "csq",14,99
09:42:52.186241+01:00 [HayesModem]: +QIND: "csq",19,99
09:43:01.303893+01:00 [HayesModem]: +QIND: "csq",16,99
09:43:03.586971+01:00 [HayesModem]: +QIND: "csq",20,99
# Audio
Here's the audio config from the factory:
+QDAI: 1,1,0,1,0,0,1,1
I'm trying the following on advice from https://xnux.eu/devices/feature/modem-pp.html:
AT+QDAI=1,0,0,2,0,1,1,1
Oh, that sucks. Horribly noisy output. Going back to the defaults
produces somewhat workable audio:
AT+QDAI=1,1,0,1,0,0,1,1
Some experiments:
AT+QDAI=1,1,0,1,0,0,1,1
ok, has a click (default)
AT+QDAI=1,0,0,1,0,0,1,1
noisy, horrible
AT+QDAI=1,1,0,2,0,1,1,1
semi-noisy, underwater mic sound on remote end
AT+QDAI=1,1,0,1,0,1,1,1
ok, has a click
AT+QDAI=1,1,0,2,0,0,1,1
semi-noisy, underwater mic sound on remote end
# Network
https://techship.com/faq/how-to-step-by-step-set-up-a-data-connection-over-qmi-interface-using-qmicli-and-in-kernel-driver-qmi-wwan-in-linux/
ifconfig wwan0 down
echo Y | tee /sys/class/net/wwan0/qmi/raw_ip
ifconfig wwan0 up
qmicli --device=/dev/cdc-wdm0 --device-open-proxy --wds-start-network=ip-type=4 --client-no-release-cid
udhcpc -v -q -f -n -i wwan0

View File

@ -0,0 +1,672 @@
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 11
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -5200
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2400
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2400
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 15
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -2400
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 28
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -450
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 'Mix Mono'
value.1 'Mix Mono'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 'Sum Mono'
value.1 'Sum Mono'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 Mixer
value.1 Mixer
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 'Mono Differential'
value.1 'Mono Differential'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value 'Left Mixer'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

View File

@ -0,0 +1,672 @@
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 15
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -4800
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2400
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2400
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 15
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -2400
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 31
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 0
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 'Mix Mono'
value.1 'Mix Mono'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 'Sum Mono'
value.1 'Sum Mono'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 Mixer
value.1 Mixer
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 'Mono Differential'
value.1 'Mono Differential'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value 'Left Mixer'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

View File

@ -0,0 +1,672 @@
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 15
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -4800
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2400
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2400
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 0
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 -450
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 15
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -2400
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 31
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 0
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 'Mix Mono'
value.1 'Mix Mono'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 'Sum Mono'
value.1 'Sum Mono'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 false
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 Mixer
value.1 Mixer
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 'Mono Differential'
value.1 'Mono Differential'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value 'Left Mixer'
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

View File

@ -0,0 +1,672 @@
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 43
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -2000
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 16
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -2250
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 17
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -2100
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 DAC
value.1 DAC
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 'Mono Differential'
value.1 'Mono Differential'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value DACR
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

View File

@ -0,0 +1,672 @@
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value true
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value true
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 40
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -2300
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 24
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -1050
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 24
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -1050
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 DAC
value.1 DAC
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 'Mono Differential'
value.1 'Mono Differential'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value DACR
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

View File

@ -0,0 +1,672 @@
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value true
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value true
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 43
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -2000
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 16
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -2250
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 17
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -2100
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 DAC
value.1 DAC
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 'Mono Differential'
value.1 'Mono Differential'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value DACR
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

View File

@ -0,0 +1,672 @@
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 40
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -2300
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2400
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 1
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2400
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 24
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -1050
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 25
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -900
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 'Reverse Stereo'
value.1 'Reverse Stereo'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 DAC
value.1 DAC
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value DACR
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

View File

@ -0,0 +1,672 @@
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 40
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -2300
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 24
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -1050
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 24
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -1050
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 DAC
value.1 DAC
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 'Mono Differential'
value.1 'Mono Differential'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value DACR
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value true
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

View File

@ -0,0 +1,673 @@
Usage: alsactl
state.PinePhone {
control.1 {
iface CARD
name 'Headphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.2 {
iface CARD
name 'Headset Microphone Jack'
value false
comment {
access read
type BOOLEAN
count 1
}
}
control.3 {
iface MIXER
name 'AIF1 AD0 Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.4 {
iface MIXER
name 'AIF1 DA0 Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.5 {
iface MIXER
name 'AIF2 ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.6 {
iface MIXER
name 'AIF2 DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.7 {
iface MIXER
name 'ADC Capture Volume'
value.0 0
value.1 0
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 -9999999
dbvalue.1 -9999999
}
}
control.8 {
iface MIXER
name 'DAC Playback Volume'
value.0 160
value.1 160
comment {
access 'read write'
type INTEGER
count 2
range '0 - 192'
dbmin -9999999
dbmax 2400
dbvalue.0 0
dbvalue.1 0
}
}
control.9 {
iface MIXER
name 'Headphone Playback Volume'
value 43
comment {
access 'read write'
type INTEGER
count 1
range '0 - 63'
dbmin -9999999
dbmax 0
dbvalue.0 -2000
}
}
control.10 {
iface MIXER
name 'Mic1 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.11 {
iface MIXER
name 'Mic1 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.12 {
iface MIXER
name 'Mic2 Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.13 {
iface MIXER
name 'Mic2 Boost Volume'
value 2
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin 0
dbmax 4200
dbvalue.0 2700
}
}
control.14 {
iface MIXER
name 'ADC Gain Capture Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.15 {
iface MIXER
name 'Line In Playback Volume'
value 3
comment {
access 'read write'
type INTEGER
count 1
range '0 - 7'
dbmin -450
dbmax 600
dbvalue.0 0
}
}
control.16 {
iface MIXER
name 'Line Out Playback Volume'
value 16
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -2250
}
}
control.17 {
iface MIXER
name 'Earpiece Playback Volume'
value 17
comment {
access 'read write'
type INTEGER
count 1
range '0 - 31'
dbmin -9999999
dbmax 0
dbvalue.0 -9999999
}
}
control.18 {
iface MIXER
name 'AIF1 AD0 Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.19 {
iface MIXER
name 'AIF2 ADC Stereo Capture Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.20 {
iface MIXER
name 'AIF3 ADC Source Capture Route'
value None
comment {
access 'read write'
type ENUMERATED
count 1
item.0 None
item.1 'AIF2 ADCL'
item.2 'AIF2 ADCR'
}
}
control.21 {
iface MIXER
name 'AIF1 Slot 0 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.22 {
iface MIXER
name 'AIF2 Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.23 {
iface MIXER
name 'AIF1 Data Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.24 {
iface MIXER
name 'AIF2 Inv Digital ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.25 {
iface MIXER
name 'AIF2 ADC Mixer AIF1 DA0 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.26 {
iface MIXER
name 'AIF2 ADC Mixer AIF2 DAC Rev Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.27 {
iface MIXER
name 'AIF2 ADC Mixer ADC Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.28 {
iface MIXER
name 'AIF2 DAC Source Playback Route'
value AIF2
comment {
access 'read write'
type ENUMERATED
count 1
item.0 AIF2
item.1 AIF3+2
item.2 AIF2+3
}
}
control.29 {
iface MIXER
name 'AIF1 DA0 Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.30 {
iface MIXER
name 'AIF2 DAC Stereo Playback Route'
value.0 Stereo
value.1 Stereo
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Reverse Stereo'
item.2 'Sum Mono'
item.3 'Mix Mono'
}
}
control.31 {
iface MIXER
name 'AIF1 Slot 0 Digital DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.32 {
iface MIXER
name 'AIF2 Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.33 {
iface MIXER
name 'ADC Digital DAC Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.34 {
iface MIXER
name 'Headphone Source Playback Route'
value.0 DAC
value.1 DAC
comment {
access 'read write'
type ENUMERATED
count 2
item.0 DAC
item.1 Mixer
}
}
control.35 {
iface MIXER
name 'Headphone Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.36 {
iface MIXER
name 'Line Out Source Playback Route'
value.0 'Mono Differential'
value.1 'Mono Differential'
comment {
access 'read write'
type ENUMERATED
count 2
item.0 Stereo
item.1 'Mono Differential'
}
}
control.37 {
iface MIXER
name 'Line Out Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.38 {
iface MIXER
name 'Earpiece Source Playback Route'
value DACR
comment {
access 'read write'
type ENUMERATED
count 1
item.0 DACR
item.1 DACL
item.2 'Right Mixer'
item.3 'Left Mixer'
}
}
control.39 {
iface MIXER
name 'Earpiece Playback Switch'
value false
comment {
access 'read write'
type BOOLEAN
count 1
}
}
control.40 {
iface MIXER
name 'Mic1 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.41 {
iface MIXER
name 'Mic2 Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.42 {
iface MIXER
name 'Line In Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.43 {
iface MIXER
name 'DAC Playback Switch'
value.0 true
value.1 true
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.44 {
iface MIXER
name 'DAC Reversed Playback Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.45 {
iface MIXER
name 'Mic1 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.46 {
iface MIXER
name 'Mic2 Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.47 {
iface MIXER
name 'Line In Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.48 {
iface MIXER
name 'Mixer Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
control.49 {
iface MIXER
name 'Mixer Reversed Capture Switch'
value.0 false
value.1 false
comment {
access 'read write'
type BOOLEAN
count 2
}
}
}
state.sun9ihdmi {
control.1 {
iface PCM
name 'Playback Channel Map'
value.0 0
value.1 0
value.2 0
value.3 0
value.4 0
value.5 0
value.6 0
value.7 0
comment {
access read
type INTEGER
count 8
range '0 - 36'
}
}
control.2 {
iface PCM
name 'IEC958 Playback Mask'
value ffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
comment {
access read
type IEC958
count 1
}
}
control.3 {
iface PCM
name 'IEC958 Playback Default'
value '0400000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read write'
type IEC958
count 1
}
}
control.4 {
iface PCM
name ELD
value '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
comment {
access 'read volatile'
type BYTES
count 128
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,669 @@
2022-01-06T22:59:33+01:00,99
2022-01-06T23:00:34+01:00,99
2022-01-06T23:01:34+01:00,97
2022-01-06T23:02:34+01:00,95
2022-01-06T23:03:34+01:00,95
2022-01-06T23:04:34+01:00,95
2022-01-06T23:05:34+01:00,94
2022-01-06T23:06:34+01:00,94
2022-01-06T23:07:34+01:00,94
2022-01-06T23:08:34+01:00,94
2022-01-06T23:09:34+01:00,94
2022-01-06T23:10:34+01:00,94
2022-01-06T23:11:34+01:00,94
2022-01-06T23:12:34+01:00,94
2022-01-06T23:13:34+01:00,94
2022-01-06T23:14:34+01:00,93
2022-01-06T23:15:34+01:00,93
2022-01-06T23:16:34+01:00,93
2022-01-06T23:17:34+01:00,93
2022-01-06T23:18:34+01:00,93
2022-01-06T23:19:34+01:00,93
2022-01-06T23:20:34+01:00,93
2022-01-06T23:21:34+01:00,93
2022-01-06T23:22:34+01:00,93
2022-01-06T23:23:34+01:00,93
2022-01-06T23:24:34+01:00,93
2022-01-06T23:25:34+01:00,93
2022-01-06T23:26:34+01:00,93
2022-01-06T23:27:34+01:00,93
2022-01-06T23:28:34+01:00,93
2022-01-06T23:29:34+01:00,92
2022-01-06T23:30:34+01:00,92
2022-01-06T23:31:34+01:00,92
2022-01-06T23:32:34+01:00,92
2022-01-06T23:33:34+01:00,92
2022-01-06T23:34:34+01:00,92
2022-01-06T23:35:34+01:00,92
2022-01-06T23:36:34+01:00,92
2022-01-06T23:37:34+01:00,92
2022-01-06T23:38:34+01:00,92
2022-01-06T23:39:34+01:00,92
2022-01-06T23:40:34+01:00,92
2022-01-06T23:41:34+01:00,92
2022-01-06T23:42:34+01:00,92
2022-01-06T23:43:34+01:00,92
2022-01-06T23:44:34+01:00,91
2022-01-06T23:45:34+01:00,91
2022-01-06T23:46:34+01:00,91
2022-01-06T23:47:34+01:00,91
2022-01-06T23:48:34+01:00,91
2022-01-06T23:49:34+01:00,91
2022-01-06T23:50:34+01:00,91
2022-01-06T23:51:34+01:00,90
2022-01-06T23:52:34+01:00,90
2022-01-06T23:53:34+01:00,90
2022-01-06T23:54:34+01:00,90
2022-01-06T23:55:34+01:00,90
2022-01-06T23:56:34+01:00,90
2022-01-06T23:57:34+01:00,90
2022-01-06T23:58:34+01:00,89
2022-01-06T23:59:34+01:00,89
2022-01-07T00:00:34+01:00,89
2022-01-07T00:01:34+01:00,89
2022-01-07T00:02:34+01:00,89
2022-01-07T00:03:34+01:00,89
2022-01-07T00:04:34+01:00,89
2022-01-07T00:05:35+01:00,88
2022-01-07T00:06:35+01:00,88
2022-01-07T00:07:35+01:00,88
2022-01-07T00:08:35+01:00,88
2022-01-07T00:09:35+01:00,88
2022-01-07T00:10:35+01:00,88
2022-01-07T00:11:35+01:00,88
2022-01-07T00:12:35+01:00,88
2022-01-07T00:13:35+01:00,87
2022-01-07T00:14:35+01:00,87
2022-01-07T00:15:35+01:00,87
2022-01-07T00:16:35+01:00,87
2022-01-07T00:17:35+01:00,87
2022-01-07T00:18:35+01:00,87
2022-01-07T00:19:35+01:00,87
2022-01-07T00:20:35+01:00,86
2022-01-07T00:21:35+01:00,86
2022-01-07T00:22:35+01:00,86
2022-01-07T00:23:35+01:00,86
2022-01-07T00:24:35+01:00,86
2022-01-07T00:25:35+01:00,85
2022-01-07T00:26:35+01:00,85
2022-01-07T00:27:35+01:00,85
2022-01-07T00:28:35+01:00,85
2022-01-07T00:29:35+01:00,85
2022-01-07T00:30:35+01:00,85
2022-01-07T00:31:35+01:00,85
2022-01-07T00:32:35+01:00,85
2022-01-07T00:33:35+01:00,85
2022-01-07T00:34:35+01:00,84
2022-01-07T00:35:35+01:00,84
2022-01-07T00:36:35+01:00,84
2022-01-07T00:37:35+01:00,84
2022-01-07T00:38:35+01:00,84
2022-01-07T00:39:35+01:00,84
2022-01-07T00:40:35+01:00,83
2022-01-07T00:41:35+01:00,83
2022-01-07T00:42:35+01:00,83
2022-01-07T00:43:35+01:00,83
2022-01-07T00:44:35+01:00,83
2022-01-07T00:45:35+01:00,82
2022-01-07T00:46:35+01:00,82
2022-01-07T00:47:35+01:00,82
2022-01-07T00:48:35+01:00,82
2022-01-07T00:49:35+01:00,82
2022-01-07T00:50:35+01:00,81
2022-01-07T00:51:35+01:00,81
2022-01-07T00:52:35+01:00,81
2022-01-07T00:53:35+01:00,80
2022-01-07T00:54:35+01:00,80
2022-01-07T00:55:35+01:00,80
2022-01-07T00:56:35+01:00,80
2022-01-07T00:57:35+01:00,80
2022-01-07T00:58:35+01:00,79
2022-01-07T00:59:35+01:00,79
2022-01-07T01:00:35+01:00,79
2022-01-07T01:01:35+01:00,79
2022-01-07T01:02:35+01:00,78
2022-01-07T01:03:35+01:00,78
2022-01-07T01:04:35+01:00,78
2022-01-07T01:05:35+01:00,78
2022-01-07T01:06:35+01:00,77
2022-01-07T01:07:35+01:00,77
2022-01-07T01:08:35+01:00,77
2022-01-07T01:09:35+01:00,76
2022-01-07T01:10:36+01:00,75
2022-01-07T01:11:36+01:00,75
2022-01-07T01:12:36+01:00,75
2022-01-07T01:13:36+01:00,75
2022-01-07T01:14:36+01:00,75
2022-01-07T01:15:36+01:00,74
2022-01-07T01:16:36+01:00,74
2022-01-07T01:17:36+01:00,74
2022-01-07T01:18:36+01:00,74
2022-01-07T01:19:36+01:00,73
2022-01-07T01:20:36+01:00,73
2022-01-07T01:21:36+01:00,73
2022-01-07T01:22:36+01:00,73
2022-01-07T01:23:36+01:00,73
2022-01-07T01:24:36+01:00,72
2022-01-07T01:25:36+01:00,72
2022-01-07T01:26:36+01:00,72
2022-01-07T01:27:36+01:00,72
2022-01-07T01:28:36+01:00,72
2022-01-07T01:29:36+01:00,72
2022-01-07T01:30:36+01:00,72
2022-01-07T01:31:36+01:00,71
2022-01-07T01:32:36+01:00,71
2022-01-07T01:33:36+01:00,71
2022-01-07T01:34:36+01:00,71
2022-01-07T01:35:36+01:00,71
2022-01-07T01:36:36+01:00,70
2022-01-07T01:37:36+01:00,70
2022-01-07T01:38:36+01:00,70
2022-01-07T01:39:36+01:00,70
2022-01-07T01:40:36+01:00,70
2022-01-07T01:41:36+01:00,70
2022-01-07T01:42:36+01:00,70
2022-01-07T01:43:36+01:00,69
2022-01-07T01:44:36+01:00,69
2022-01-07T01:45:36+01:00,69
2022-01-07T01:46:36+01:00,69
2022-01-07T01:47:36+01:00,69
2022-01-07T01:48:36+01:00,69
2022-01-07T01:49:36+01:00,69
2022-01-07T01:50:36+01:00,68
2022-01-07T01:51:36+01:00,68
2022-01-07T01:52:36+01:00,68
2022-01-07T01:53:36+01:00,68
2022-01-07T01:54:36+01:00,68
2022-01-07T01:55:36+01:00,68
2022-01-07T01:56:36+01:00,67
2022-01-07T01:57:36+01:00,67
2022-01-07T01:58:36+01:00,67
2022-01-07T01:59:36+01:00,67
2022-01-07T02:00:36+01:00,67
2022-01-07T02:01:36+01:00,67
2022-01-07T02:02:36+01:00,67
2022-01-07T02:03:36+01:00,66
2022-01-07T02:04:36+01:00,66
2022-01-07T02:05:36+01:00,66
2022-01-07T02:06:36+01:00,66
2022-01-07T02:07:36+01:00,66
2022-01-07T02:08:36+01:00,66
2022-01-07T02:09:36+01:00,66
2022-01-07T02:10:36+01:00,65
2022-01-07T02:11:36+01:00,65
2022-01-07T02:12:36+01:00,65
2022-01-07T02:13:36+01:00,65
2022-01-07T02:14:36+01:00,64
2022-01-07T02:15:36+01:00,64
2022-01-07T02:16:36+01:00,64
2022-01-07T02:17:37+01:00,63
2022-01-07T02:18:37+01:00,63
2022-01-07T02:19:37+01:00,63
2022-01-07T02:20:37+01:00,63
2022-01-07T02:21:37+01:00,63
2022-01-07T02:22:37+01:00,63
2022-01-07T02:23:37+01:00,62
2022-01-07T02:24:37+01:00,62
2022-01-07T02:25:37+01:00,62
2022-01-07T02:26:37+01:00,62
2022-01-07T02:27:37+01:00,62
2022-01-07T02:28:37+01:00,62
2022-01-07T02:29:37+01:00,61
2022-01-07T02:30:37+01:00,61
2022-01-07T02:31:37+01:00,61
2022-01-07T02:32:37+01:00,61
2022-01-07T02:33:37+01:00,61
2022-01-07T02:34:37+01:00,61
2022-01-07T02:35:37+01:00,60
2022-01-07T02:36:37+01:00,60
2022-01-07T02:37:37+01:00,60
2022-01-07T02:38:37+01:00,60
2022-01-07T02:39:37+01:00,59
2022-01-07T02:40:37+01:00,59
2022-01-07T02:41:37+01:00,59
2022-01-07T02:42:37+01:00,59
2022-01-07T02:43:37+01:00,58
2022-01-07T02:44:37+01:00,58
2022-01-07T02:45:37+01:00,58
2022-01-07T02:46:37+01:00,58
2022-01-07T02:47:37+01:00,58
2022-01-07T02:48:37+01:00,57
2022-01-07T02:49:37+01:00,57
2022-01-07T02:50:37+01:00,57
2022-01-07T02:51:37+01:00,57
2022-01-07T02:52:37+01:00,57
2022-01-07T02:53:37+01:00,56
2022-01-07T02:54:37+01:00,56
2022-01-07T02:55:37+01:00,56
2022-01-07T02:56:37+01:00,56
2022-01-07T02:57:37+01:00,56
2022-01-07T02:58:37+01:00,55
2022-01-07T02:59:37+01:00,55
2022-01-07T03:00:37+01:00,55
2022-01-07T03:01:37+01:00,55
2022-01-07T03:02:37+01:00,55
2022-01-07T03:03:37+01:00,54
2022-01-07T03:04:37+01:00,54
2022-01-07T03:05:37+01:00,54
2022-01-07T03:06:37+01:00,54
2022-01-07T03:07:37+01:00,54
2022-01-07T03:08:37+01:00,53
2022-01-07T03:09:37+01:00,53
2022-01-07T03:10:37+01:00,53
2022-01-07T03:11:37+01:00,53
2022-01-07T03:12:37+01:00,52
2022-01-07T03:13:37+01:00,52
2022-01-07T03:14:37+01:00,52
2022-01-07T03:15:37+01:00,52
2022-01-07T03:16:37+01:00,52
2022-01-07T03:17:37+01:00,52
2022-01-07T03:18:37+01:00,52
2022-01-07T03:19:37+01:00,51
2022-01-07T03:20:37+01:00,51
2022-01-07T03:21:37+01:00,51
2022-01-07T03:22:37+01:00,51
2022-01-07T03:23:37+01:00,51
2022-01-07T03:24:37+01:00,51
2022-01-07T03:25:37+01:00,50
2022-01-07T03:26:37+01:00,50
2022-01-07T03:27:37+01:00,50
2022-01-07T03:28:37+01:00,50
2022-01-07T03:29:37+01:00,50
2022-01-07T03:30:37+01:00,49
2022-01-07T03:31:37+01:00,49
2022-01-07T03:32:37+01:00,49
2022-01-07T03:33:37+01:00,49
2022-01-07T03:34:37+01:00,48
2022-01-07T03:35:38+01:00,48
2022-01-07T03:36:38+01:00,48
2022-01-07T03:37:38+01:00,48
2022-01-07T03:38:38+01:00,48
2022-01-07T03:39:38+01:00,48
2022-01-07T03:40:38+01:00,47
2022-01-07T03:41:38+01:00,47
2022-01-07T03:42:38+01:00,47
2022-01-07T03:43:38+01:00,47
2022-01-07T03:44:38+01:00,47
2022-01-07T03:45:38+01:00,47
2022-01-07T03:46:38+01:00,47
2022-01-07T03:47:38+01:00,47
2022-01-07T03:48:38+01:00,46
2022-01-07T03:49:38+01:00,46
2022-01-07T03:50:38+01:00,46
2022-01-07T03:51:38+01:00,46
2022-01-07T03:52:38+01:00,45
2022-01-07T03:53:38+01:00,45
2022-01-07T03:54:38+01:00,45
2022-01-07T03:55:38+01:00,45
2022-01-07T03:56:38+01:00,45
2022-01-07T03:57:38+01:00,45
2022-01-07T03:58:38+01:00,45
2022-01-07T03:59:38+01:00,44
2022-01-07T04:00:38+01:00,44
2022-01-07T04:01:38+01:00,44
2022-01-07T04:02:38+01:00,44
2022-01-07T04:03:38+01:00,44
2022-01-07T04:04:38+01:00,44
2022-01-07T04:05:38+01:00,44
2022-01-07T04:06:38+01:00,43
2022-01-07T04:07:38+01:00,43
2022-01-07T04:08:38+01:00,43
2022-01-07T04:09:38+01:00,43
2022-01-07T04:10:38+01:00,42
2022-01-07T04:11:38+01:00,42
2022-01-07T04:12:38+01:00,42
2022-01-07T04:13:38+01:00,42
2022-01-07T04:14:38+01:00,42
2022-01-07T04:15:38+01:00,41
2022-01-07T04:16:38+01:00,41
2022-01-07T04:17:38+01:00,41
2022-01-07T04:18:38+01:00,41
2022-01-07T04:19:38+01:00,41
2022-01-07T04:20:38+01:00,40
2022-01-07T04:21:38+01:00,40
2022-01-07T04:22:38+01:00,40
2022-01-07T04:23:38+01:00,40
2022-01-07T04:24:38+01:00,40
2022-01-07T04:25:38+01:00,40
2022-01-07T04:26:38+01:00,39
2022-01-07T04:27:38+01:00,39
2022-01-07T04:28:38+01:00,39
2022-01-07T04:29:38+01:00,39
2022-01-07T04:30:38+01:00,39
2022-01-07T04:31:38+01:00,39
2022-01-07T04:32:38+01:00,39
2022-01-07T04:33:38+01:00,39
2022-01-07T04:34:38+01:00,38
2022-01-07T04:35:38+01:00,38
2022-01-07T04:36:38+01:00,38
2022-01-07T04:37:38+01:00,38
2022-01-07T04:38:38+01:00,38
2022-01-07T04:39:38+01:00,38
2022-01-07T04:40:39+01:00,38
2022-01-07T04:41:39+01:00,37
2022-01-07T04:42:39+01:00,37
2022-01-07T04:43:39+01:00,37
2022-01-07T04:44:39+01:00,37
2022-01-07T04:45:39+01:00,37
2022-01-07T04:46:39+01:00,37
2022-01-07T04:47:39+01:00,36
2022-01-07T04:48:39+01:00,36
2022-01-07T04:49:39+01:00,36
2022-01-07T04:50:39+01:00,36
2022-01-07T04:51:39+01:00,36
2022-01-07T04:52:39+01:00,35
2022-01-07T04:53:39+01:00,35
2022-01-07T04:54:39+01:00,35
2022-01-07T04:55:39+01:00,35
2022-01-07T04:56:39+01:00,35
2022-01-07T04:57:39+01:00,35
2022-01-07T04:58:39+01:00,35
2022-01-07T04:59:39+01:00,35
2022-01-07T05:00:39+01:00,34
2022-01-07T05:01:39+01:00,34
2022-01-07T05:02:39+01:00,34
2022-01-07T05:03:39+01:00,34
2022-01-07T05:04:39+01:00,34
2022-01-07T05:05:39+01:00,34
2022-01-07T05:06:39+01:00,34
2022-01-07T05:07:39+01:00,34
2022-01-07T05:08:39+01:00,33
2022-01-07T05:09:39+01:00,33
2022-01-07T05:10:39+01:00,33
2022-01-07T05:11:39+01:00,33
2022-01-07T05:12:39+01:00,33
2022-01-07T05:13:39+01:00,33
2022-01-07T05:14:39+01:00,33
2022-01-07T05:15:39+01:00,32
2022-01-07T05:16:39+01:00,32
2022-01-07T05:17:39+01:00,32
2022-01-07T05:18:39+01:00,32
2022-01-07T05:19:39+01:00,32
2022-01-07T05:20:39+01:00,32
2022-01-07T05:21:39+01:00,31
2022-01-07T05:22:39+01:00,31
2022-01-07T05:23:39+01:00,31
2022-01-07T05:24:39+01:00,31
2022-01-07T05:25:39+01:00,30
2022-01-07T05:26:39+01:00,30
2022-01-07T05:27:39+01:00,30
2022-01-07T05:28:39+01:00,30
2022-01-07T05:29:39+01:00,30
2022-01-07T05:30:39+01:00,30
2022-01-07T05:31:39+01:00,29
2022-01-07T05:32:39+01:00,29
2022-01-07T05:33:39+01:00,29
2022-01-07T05:34:39+01:00,29
2022-01-07T05:35:39+01:00,29
2022-01-07T05:36:39+01:00,29
2022-01-07T05:37:39+01:00,29
2022-01-07T05:38:39+01:00,29
2022-01-07T05:39:39+01:00,29
2022-01-07T05:40:39+01:00,29
2022-01-07T05:41:39+01:00,29
2022-01-07T05:42:39+01:00,29
2022-01-07T05:43:39+01:00,29
2022-01-07T05:44:39+01:00,28
2022-01-07T05:45:39+01:00,28
2022-01-07T05:46:39+01:00,28
2022-01-07T05:47:39+01:00,28
2022-01-07T05:48:40+01:00,28
2022-01-07T05:49:40+01:00,28
2022-01-07T05:50:40+01:00,28
2022-01-07T05:51:40+01:00,28
2022-01-07T05:52:40+01:00,28
2022-01-07T05:53:40+01:00,28
2022-01-07T05:54:40+01:00,28
2022-01-07T05:55:40+01:00,28
2022-01-07T05:56:40+01:00,28
2022-01-07T05:57:40+01:00,27
2022-01-07T05:58:40+01:00,27
2022-01-07T05:59:40+01:00,27
2022-01-07T06:00:40+01:00,27
2022-01-07T06:01:40+01:00,27
2022-01-07T06:02:40+01:00,27
2022-01-07T06:03:40+01:00,27
2022-01-07T06:04:40+01:00,27
2022-01-07T06:05:40+01:00,27
2022-01-07T06:06:40+01:00,27
2022-01-07T06:07:40+01:00,26
2022-01-07T06:08:40+01:00,26
2022-01-07T06:09:40+01:00,26
2022-01-07T06:10:40+01:00,26
2022-01-07T06:11:40+01:00,25
2022-01-07T06:12:40+01:00,25
2022-01-07T06:13:40+01:00,25
2022-01-07T06:14:40+01:00,25
2022-01-07T06:15:40+01:00,25
2022-01-07T06:16:40+01:00,25
2022-01-07T06:17:40+01:00,25
2022-01-07T06:18:40+01:00,24
2022-01-07T06:19:40+01:00,24
2022-01-07T06:20:40+01:00,24
2022-01-07T06:21:40+01:00,24
2022-01-07T06:22:40+01:00,24
2022-01-07T06:23:40+01:00,24
2022-01-07T06:24:40+01:00,24
2022-01-07T06:25:40+01:00,24
2022-01-07T06:26:40+01:00,24
2022-01-07T06:27:40+01:00,24
2022-01-07T06:28:40+01:00,24
2022-01-07T06:29:40+01:00,24
2022-01-07T06:30:40+01:00,24
2022-01-07T06:31:40+01:00,24
2022-01-07T06:32:40+01:00,24
2022-01-07T06:33:40+01:00,23
2022-01-07T06:34:40+01:00,23
2022-01-07T06:35:40+01:00,23
2022-01-07T06:36:40+01:00,23
2022-01-07T06:37:40+01:00,23
2022-01-07T06:38:40+01:00,23
2022-01-07T06:39:40+01:00,23
2022-01-07T06:40:40+01:00,23
2022-01-07T06:41:40+01:00,23
2022-01-07T06:42:40+01:00,22
2022-01-07T06:43:40+01:00,22
2022-01-07T06:44:40+01:00,22
2022-01-07T06:45:40+01:00,22
2022-01-07T06:46:40+01:00,22
2022-01-07T06:47:40+01:00,22
2022-01-07T06:48:40+01:00,22
2022-01-07T06:49:40+01:00,22
2022-01-07T06:50:40+01:00,22
2022-01-07T06:51:40+01:00,22
2022-01-07T06:52:40+01:00,21
2022-01-07T06:53:40+01:00,21
2022-01-07T06:54:40+01:00,21
2022-01-07T06:55:40+01:00,21
2022-01-07T06:56:40+01:00,21
2022-01-07T06:57:40+01:00,21
2022-01-07T06:58:40+01:00,21
2022-01-07T06:59:40+01:00,21
2022-01-07T07:00:40+01:00,21
2022-01-07T07:01:40+01:00,21
2022-01-07T07:02:40+01:00,21
2022-01-07T07:03:40+01:00,21
2022-01-07T07:04:40+01:00,21
2022-01-07T07:05:40+01:00,21
2022-01-07T07:06:40+01:00,20
2022-01-07T07:07:40+01:00,20
2022-01-07T07:08:41+01:00,20
2022-01-07T07:09:41+01:00,20
2022-01-07T07:10:41+01:00,20
2022-01-07T07:11:41+01:00,20
2022-01-07T07:12:41+01:00,20
2022-01-07T07:13:41+01:00,20
2022-01-07T07:14:41+01:00,19
2022-01-07T07:15:41+01:00,19
2022-01-07T07:16:41+01:00,19
2022-01-07T07:17:41+01:00,19
2022-01-07T07:18:41+01:00,19
2022-01-07T07:19:41+01:00,19
2022-01-07T07:20:41+01:00,19
2022-01-07T07:21:41+01:00,18
2022-01-07T07:22:41+01:00,18
2022-01-07T07:23:41+01:00,18
2022-01-07T07:24:41+01:00,18
2022-01-07T07:25:41+01:00,18
2022-01-07T07:26:41+01:00,18
2022-01-07T07:27:41+01:00,18
2022-01-07T07:28:41+01:00,17
2022-01-07T07:29:41+01:00,17
2022-01-07T07:30:41+01:00,17
2022-01-07T07:31:41+01:00,17
2022-01-07T07:32:41+01:00,17
2022-01-07T07:33:41+01:00,16
2022-01-07T07:34:41+01:00,16
2022-01-07T07:35:41+01:00,16
2022-01-07T07:36:41+01:00,16
2022-01-07T07:37:41+01:00,16
2022-01-07T07:38:41+01:00,16
2022-01-07T07:39:41+01:00,16
2022-01-07T07:40:41+01:00,16
2022-01-07T07:41:41+01:00,16
2022-01-07T07:42:41+01:00,16
2022-01-07T07:43:41+01:00,16
2022-01-07T07:44:41+01:00,15
2022-01-07T07:45:41+01:00,15
2022-01-07T07:46:41+01:00,15
2022-01-07T07:47:41+01:00,15
2022-01-07T07:48:41+01:00,15
2022-01-07T07:49:41+01:00,15
2022-01-07T07:50:41+01:00,15
2022-01-07T07:51:41+01:00,15
2022-01-07T07:52:41+01:00,15
2022-01-07T07:53:41+01:00,15
2022-01-07T07:54:41+01:00,15
2022-01-07T07:55:41+01:00,14
2022-01-07T07:56:41+01:00,14
2022-01-07T07:57:41+01:00,14
2022-01-07T07:58:41+01:00,14
2022-01-07T07:59:41+01:00,14
2022-01-07T08:00:41+01:00,14
2022-01-07T08:01:41+01:00,14
2022-01-07T08:02:41+01:00,14
2022-01-07T08:03:41+01:00,14
2022-01-07T08:04:41+01:00,14
2022-01-07T08:05:41+01:00,13
2022-01-07T08:06:41+01:00,13
2022-01-07T08:07:41+01:00,13
2022-01-07T08:08:41+01:00,13
2022-01-07T08:09:41+01:00,13
2022-01-07T08:10:41+01:00,13
2022-01-07T08:11:41+01:00,13
2022-01-07T08:12:41+01:00,13
2022-01-07T08:13:41+01:00,13
2022-01-07T08:14:41+01:00,12
2022-01-07T08:15:41+01:00,12
2022-01-07T08:16:41+01:00,12
2022-01-07T08:17:41+01:00,12
2022-01-07T08:18:41+01:00,11
2022-01-07T08:19:41+01:00,11
2022-01-07T08:20:41+01:00,11
2022-01-07T08:21:41+01:00,11
2022-01-07T08:22:41+01:00,10
2022-01-07T08:23:41+01:00,10
2022-01-07T08:24:41+01:00,10
2022-01-07T08:25:41+01:00,10
2022-01-07T08:26:41+01:00,10
2022-01-07T08:27:41+01:00,9
2022-01-07T08:28:42+01:00,9
2022-01-07T08:29:42+01:00,9
2022-01-07T08:30:42+01:00,9
2022-01-07T08:31:42+01:00,9
2022-01-07T08:32:42+01:00,8
2022-01-07T08:33:42+01:00,8
2022-01-07T08:34:42+01:00,8
2022-01-07T08:35:42+01:00,8
2022-01-07T08:36:42+01:00,8
2022-01-07T08:37:42+01:00,7
2022-01-07T08:38:42+01:00,7
2022-01-07T08:39:42+01:00,7
2022-01-07T08:40:42+01:00,7
2022-01-07T08:41:42+01:00,7
2022-01-07T08:42:42+01:00,7
2022-01-07T08:43:42+01:00,7
2022-01-07T08:44:42+01:00,7
2022-01-07T08:45:42+01:00,7
2022-01-07T08:46:42+01:00,7
2022-01-07T08:47:42+01:00,7
2022-01-07T08:48:42+01:00,6
2022-01-07T08:49:42+01:00,6
2022-01-07T08:50:42+01:00,6
2022-01-07T08:51:42+01:00,6
2022-01-07T08:52:42+01:00,6
2022-01-07T08:53:42+01:00,6
2022-01-07T08:54:42+01:00,6
2022-01-07T08:55:42+01:00,6
2022-01-07T08:56:42+01:00,6
2022-01-07T08:57:42+01:00,6
2022-01-07T08:58:42+01:00,6
2022-01-07T08:59:42+01:00,5
2022-01-07T09:00:42+01:00,5
2022-01-07T09:01:42+01:00,5
2022-01-07T09:02:42+01:00,5
2022-01-07T09:03:42+01:00,5
2022-01-07T09:04:42+01:00,5
2022-01-07T09:05:42+01:00,5
2022-01-07T09:06:42+01:00,5
2022-01-07T09:07:42+01:00,5
2022-01-07T09:08:42+01:00,5
2022-01-07T09:09:42+01:00,5
2022-01-07T09:10:42+01:00,5
2022-01-07T09:11:42+01:00,4
2022-01-07T09:12:42+01:00,4
2022-01-07T09:13:42+01:00,4
2022-01-07T09:14:42+01:00,4
2022-01-07T09:15:42+01:00,4
2022-01-07T09:16:42+01:00,4
2022-01-07T09:17:42+01:00,4
2022-01-07T09:18:42+01:00,4
2022-01-07T09:19:42+01:00,4
2022-01-07T09:20:42+01:00,3
2022-01-07T09:21:42+01:00,3
2022-01-07T09:22:42+01:00,3
2022-01-07T09:23:42+01:00,3
2022-01-07T09:24:42+01:00,3
2022-01-07T09:25:42+01:00,2
2022-01-07T09:26:42+01:00,2
2022-01-07T09:27:42+01:00,2
2022-01-07T09:28:42+01:00,2
2022-01-07T09:29:42+01:00,2
2022-01-07T09:30:42+01:00,2
2022-01-07T09:31:42+01:00,2
2022-01-07T09:32:42+01:00,2
2022-01-07T09:33:42+01:00,2
2022-01-07T09:34:42+01:00,2
2022-01-07T09:35:42+01:00,2
2022-01-07T09:36:42+01:00,1
2022-01-07T09:37:42+01:00,1
2022-01-07T09:38:42+01:00,1
2022-01-07T09:39:42+01:00,1
2022-01-07T09:40:42+01:00,1
2022-01-07T09:41:43+01:00,1
2022-01-07T09:42:43+01:00,1
2022-01-07T09:43:43+01:00,1
2022-01-07T09:44:43+01:00,1
2022-01-07T09:45:43+01:00,1
2022-01-07T09:46:43+01:00,1
2022-01-07T09:47:43+01:00,1
2022-01-07T09:48:43+01:00,1
2022-01-07T09:49:43+01:00,1
2022-01-07T09:50:43+01:00,1
2022-01-07T09:51:43+01:00,1
2022-01-07T09:52:43+01:00,0
2022-01-07T09:53:43+01:00,0
2022-01-07T09:54:43+01:00,0
2022-01-07T09:55:43+01:00,0
2022-01-07T09:56:43+01:00,0
2022-01-07T09:57:43+01:00,0
2022-01-07T09:58:43+01:00,0
2022-01-07T09:59:43+01:00,0
2022-01-07T10:00:43+01:00,0
2022-01-07T10:01:43+01:00,0
2022-01-07T10:02:43+01:00,0
2022-01-07T10:03:43+01:00,0
2022-01-07T10:04:43+01:00,0
2022-01-07T10:05:43+01:00,0
2022-01-07T10:06:43+01:00,0
2022-01-07T10:07:43+01:00,0
1 2022-01-06T22:59:33+01:00 99
2 2022-01-06T23:00:34+01:00 99
3 2022-01-06T23:01:34+01:00 97
4 2022-01-06T23:02:34+01:00 95
5 2022-01-06T23:03:34+01:00 95
6 2022-01-06T23:04:34+01:00 95
7 2022-01-06T23:05:34+01:00 94
8 2022-01-06T23:06:34+01:00 94
9 2022-01-06T23:07:34+01:00 94
10 2022-01-06T23:08:34+01:00 94
11 2022-01-06T23:09:34+01:00 94
12 2022-01-06T23:10:34+01:00 94
13 2022-01-06T23:11:34+01:00 94
14 2022-01-06T23:12:34+01:00 94
15 2022-01-06T23:13:34+01:00 94
16 2022-01-06T23:14:34+01:00 93
17 2022-01-06T23:15:34+01:00 93
18 2022-01-06T23:16:34+01:00 93
19 2022-01-06T23:17:34+01:00 93
20 2022-01-06T23:18:34+01:00 93
21 2022-01-06T23:19:34+01:00 93
22 2022-01-06T23:20:34+01:00 93
23 2022-01-06T23:21:34+01:00 93
24 2022-01-06T23:22:34+01:00 93
25 2022-01-06T23:23:34+01:00 93
26 2022-01-06T23:24:34+01:00 93
27 2022-01-06T23:25:34+01:00 93
28 2022-01-06T23:26:34+01:00 93
29 2022-01-06T23:27:34+01:00 93
30 2022-01-06T23:28:34+01:00 93
31 2022-01-06T23:29:34+01:00 92
32 2022-01-06T23:30:34+01:00 92
33 2022-01-06T23:31:34+01:00 92
34 2022-01-06T23:32:34+01:00 92
35 2022-01-06T23:33:34+01:00 92
36 2022-01-06T23:34:34+01:00 92
37 2022-01-06T23:35:34+01:00 92
38 2022-01-06T23:36:34+01:00 92
39 2022-01-06T23:37:34+01:00 92
40 2022-01-06T23:38:34+01:00 92
41 2022-01-06T23:39:34+01:00 92
42 2022-01-06T23:40:34+01:00 92
43 2022-01-06T23:41:34+01:00 92
44 2022-01-06T23:42:34+01:00 92
45 2022-01-06T23:43:34+01:00 92
46 2022-01-06T23:44:34+01:00 91
47 2022-01-06T23:45:34+01:00 91
48 2022-01-06T23:46:34+01:00 91
49 2022-01-06T23:47:34+01:00 91
50 2022-01-06T23:48:34+01:00 91
51 2022-01-06T23:49:34+01:00 91
52 2022-01-06T23:50:34+01:00 91
53 2022-01-06T23:51:34+01:00 90
54 2022-01-06T23:52:34+01:00 90
55 2022-01-06T23:53:34+01:00 90
56 2022-01-06T23:54:34+01:00 90
57 2022-01-06T23:55:34+01:00 90
58 2022-01-06T23:56:34+01:00 90
59 2022-01-06T23:57:34+01:00 90
60 2022-01-06T23:58:34+01:00 89
61 2022-01-06T23:59:34+01:00 89
62 2022-01-07T00:00:34+01:00 89
63 2022-01-07T00:01:34+01:00 89
64 2022-01-07T00:02:34+01:00 89
65 2022-01-07T00:03:34+01:00 89
66 2022-01-07T00:04:34+01:00 89
67 2022-01-07T00:05:35+01:00 88
68 2022-01-07T00:06:35+01:00 88
69 2022-01-07T00:07:35+01:00 88
70 2022-01-07T00:08:35+01:00 88
71 2022-01-07T00:09:35+01:00 88
72 2022-01-07T00:10:35+01:00 88
73 2022-01-07T00:11:35+01:00 88
74 2022-01-07T00:12:35+01:00 88
75 2022-01-07T00:13:35+01:00 87
76 2022-01-07T00:14:35+01:00 87
77 2022-01-07T00:15:35+01:00 87
78 2022-01-07T00:16:35+01:00 87
79 2022-01-07T00:17:35+01:00 87
80 2022-01-07T00:18:35+01:00 87
81 2022-01-07T00:19:35+01:00 87
82 2022-01-07T00:20:35+01:00 86
83 2022-01-07T00:21:35+01:00 86
84 2022-01-07T00:22:35+01:00 86
85 2022-01-07T00:23:35+01:00 86
86 2022-01-07T00:24:35+01:00 86
87 2022-01-07T00:25:35+01:00 85
88 2022-01-07T00:26:35+01:00 85
89 2022-01-07T00:27:35+01:00 85
90 2022-01-07T00:28:35+01:00 85
91 2022-01-07T00:29:35+01:00 85
92 2022-01-07T00:30:35+01:00 85
93 2022-01-07T00:31:35+01:00 85
94 2022-01-07T00:32:35+01:00 85
95 2022-01-07T00:33:35+01:00 85
96 2022-01-07T00:34:35+01:00 84
97 2022-01-07T00:35:35+01:00 84
98 2022-01-07T00:36:35+01:00 84
99 2022-01-07T00:37:35+01:00 84
100 2022-01-07T00:38:35+01:00 84
101 2022-01-07T00:39:35+01:00 84
102 2022-01-07T00:40:35+01:00 83
103 2022-01-07T00:41:35+01:00 83
104 2022-01-07T00:42:35+01:00 83
105 2022-01-07T00:43:35+01:00 83
106 2022-01-07T00:44:35+01:00 83
107 2022-01-07T00:45:35+01:00 82
108 2022-01-07T00:46:35+01:00 82
109 2022-01-07T00:47:35+01:00 82
110 2022-01-07T00:48:35+01:00 82
111 2022-01-07T00:49:35+01:00 82
112 2022-01-07T00:50:35+01:00 81
113 2022-01-07T00:51:35+01:00 81
114 2022-01-07T00:52:35+01:00 81
115 2022-01-07T00:53:35+01:00 80
116 2022-01-07T00:54:35+01:00 80
117 2022-01-07T00:55:35+01:00 80
118 2022-01-07T00:56:35+01:00 80
119 2022-01-07T00:57:35+01:00 80
120 2022-01-07T00:58:35+01:00 79
121 2022-01-07T00:59:35+01:00 79
122 2022-01-07T01:00:35+01:00 79
123 2022-01-07T01:01:35+01:00 79
124 2022-01-07T01:02:35+01:00 78
125 2022-01-07T01:03:35+01:00 78
126 2022-01-07T01:04:35+01:00 78
127 2022-01-07T01:05:35+01:00 78
128 2022-01-07T01:06:35+01:00 77
129 2022-01-07T01:07:35+01:00 77
130 2022-01-07T01:08:35+01:00 77
131 2022-01-07T01:09:35+01:00 76
132 2022-01-07T01:10:36+01:00 75
133 2022-01-07T01:11:36+01:00 75
134 2022-01-07T01:12:36+01:00 75
135 2022-01-07T01:13:36+01:00 75
136 2022-01-07T01:14:36+01:00 75
137 2022-01-07T01:15:36+01:00 74
138 2022-01-07T01:16:36+01:00 74
139 2022-01-07T01:17:36+01:00 74
140 2022-01-07T01:18:36+01:00 74
141 2022-01-07T01:19:36+01:00 73
142 2022-01-07T01:20:36+01:00 73
143 2022-01-07T01:21:36+01:00 73
144 2022-01-07T01:22:36+01:00 73
145 2022-01-07T01:23:36+01:00 73
146 2022-01-07T01:24:36+01:00 72
147 2022-01-07T01:25:36+01:00 72
148 2022-01-07T01:26:36+01:00 72
149 2022-01-07T01:27:36+01:00 72
150 2022-01-07T01:28:36+01:00 72
151 2022-01-07T01:29:36+01:00 72
152 2022-01-07T01:30:36+01:00 72
153 2022-01-07T01:31:36+01:00 71
154 2022-01-07T01:32:36+01:00 71
155 2022-01-07T01:33:36+01:00 71
156 2022-01-07T01:34:36+01:00 71
157 2022-01-07T01:35:36+01:00 71
158 2022-01-07T01:36:36+01:00 70
159 2022-01-07T01:37:36+01:00 70
160 2022-01-07T01:38:36+01:00 70
161 2022-01-07T01:39:36+01:00 70
162 2022-01-07T01:40:36+01:00 70
163 2022-01-07T01:41:36+01:00 70
164 2022-01-07T01:42:36+01:00 70
165 2022-01-07T01:43:36+01:00 69
166 2022-01-07T01:44:36+01:00 69
167 2022-01-07T01:45:36+01:00 69
168 2022-01-07T01:46:36+01:00 69
169 2022-01-07T01:47:36+01:00 69
170 2022-01-07T01:48:36+01:00 69
171 2022-01-07T01:49:36+01:00 69
172 2022-01-07T01:50:36+01:00 68
173 2022-01-07T01:51:36+01:00 68
174 2022-01-07T01:52:36+01:00 68
175 2022-01-07T01:53:36+01:00 68
176 2022-01-07T01:54:36+01:00 68
177 2022-01-07T01:55:36+01:00 68
178 2022-01-07T01:56:36+01:00 67
179 2022-01-07T01:57:36+01:00 67
180 2022-01-07T01:58:36+01:00 67
181 2022-01-07T01:59:36+01:00 67
182 2022-01-07T02:00:36+01:00 67
183 2022-01-07T02:01:36+01:00 67
184 2022-01-07T02:02:36+01:00 67
185 2022-01-07T02:03:36+01:00 66
186 2022-01-07T02:04:36+01:00 66
187 2022-01-07T02:05:36+01:00 66
188 2022-01-07T02:06:36+01:00 66
189 2022-01-07T02:07:36+01:00 66
190 2022-01-07T02:08:36+01:00 66
191 2022-01-07T02:09:36+01:00 66
192 2022-01-07T02:10:36+01:00 65
193 2022-01-07T02:11:36+01:00 65
194 2022-01-07T02:12:36+01:00 65
195 2022-01-07T02:13:36+01:00 65
196 2022-01-07T02:14:36+01:00 64
197 2022-01-07T02:15:36+01:00 64
198 2022-01-07T02:16:36+01:00 64
199 2022-01-07T02:17:37+01:00 63
200 2022-01-07T02:18:37+01:00 63
201 2022-01-07T02:19:37+01:00 63
202 2022-01-07T02:20:37+01:00 63
203 2022-01-07T02:21:37+01:00 63
204 2022-01-07T02:22:37+01:00 63
205 2022-01-07T02:23:37+01:00 62
206 2022-01-07T02:24:37+01:00 62
207 2022-01-07T02:25:37+01:00 62
208 2022-01-07T02:26:37+01:00 62
209 2022-01-07T02:27:37+01:00 62
210 2022-01-07T02:28:37+01:00 62
211 2022-01-07T02:29:37+01:00 61
212 2022-01-07T02:30:37+01:00 61
213 2022-01-07T02:31:37+01:00 61
214 2022-01-07T02:32:37+01:00 61
215 2022-01-07T02:33:37+01:00 61
216 2022-01-07T02:34:37+01:00 61
217 2022-01-07T02:35:37+01:00 60
218 2022-01-07T02:36:37+01:00 60
219 2022-01-07T02:37:37+01:00 60
220 2022-01-07T02:38:37+01:00 60
221 2022-01-07T02:39:37+01:00 59
222 2022-01-07T02:40:37+01:00 59
223 2022-01-07T02:41:37+01:00 59
224 2022-01-07T02:42:37+01:00 59
225 2022-01-07T02:43:37+01:00 58
226 2022-01-07T02:44:37+01:00 58
227 2022-01-07T02:45:37+01:00 58
228 2022-01-07T02:46:37+01:00 58
229 2022-01-07T02:47:37+01:00 58
230 2022-01-07T02:48:37+01:00 57
231 2022-01-07T02:49:37+01:00 57
232 2022-01-07T02:50:37+01:00 57
233 2022-01-07T02:51:37+01:00 57
234 2022-01-07T02:52:37+01:00 57
235 2022-01-07T02:53:37+01:00 56
236 2022-01-07T02:54:37+01:00 56
237 2022-01-07T02:55:37+01:00 56
238 2022-01-07T02:56:37+01:00 56
239 2022-01-07T02:57:37+01:00 56
240 2022-01-07T02:58:37+01:00 55
241 2022-01-07T02:59:37+01:00 55
242 2022-01-07T03:00:37+01:00 55
243 2022-01-07T03:01:37+01:00 55
244 2022-01-07T03:02:37+01:00 55
245 2022-01-07T03:03:37+01:00 54
246 2022-01-07T03:04:37+01:00 54
247 2022-01-07T03:05:37+01:00 54
248 2022-01-07T03:06:37+01:00 54
249 2022-01-07T03:07:37+01:00 54
250 2022-01-07T03:08:37+01:00 53
251 2022-01-07T03:09:37+01:00 53
252 2022-01-07T03:10:37+01:00 53
253 2022-01-07T03:11:37+01:00 53
254 2022-01-07T03:12:37+01:00 52
255 2022-01-07T03:13:37+01:00 52
256 2022-01-07T03:14:37+01:00 52
257 2022-01-07T03:15:37+01:00 52
258 2022-01-07T03:16:37+01:00 52
259 2022-01-07T03:17:37+01:00 52
260 2022-01-07T03:18:37+01:00 52
261 2022-01-07T03:19:37+01:00 51
262 2022-01-07T03:20:37+01:00 51
263 2022-01-07T03:21:37+01:00 51
264 2022-01-07T03:22:37+01:00 51
265 2022-01-07T03:23:37+01:00 51
266 2022-01-07T03:24:37+01:00 51
267 2022-01-07T03:25:37+01:00 50
268 2022-01-07T03:26:37+01:00 50
269 2022-01-07T03:27:37+01:00 50
270 2022-01-07T03:28:37+01:00 50
271 2022-01-07T03:29:37+01:00 50
272 2022-01-07T03:30:37+01:00 49
273 2022-01-07T03:31:37+01:00 49
274 2022-01-07T03:32:37+01:00 49
275 2022-01-07T03:33:37+01:00 49
276 2022-01-07T03:34:37+01:00 48
277 2022-01-07T03:35:38+01:00 48
278 2022-01-07T03:36:38+01:00 48
279 2022-01-07T03:37:38+01:00 48
280 2022-01-07T03:38:38+01:00 48
281 2022-01-07T03:39:38+01:00 48
282 2022-01-07T03:40:38+01:00 47
283 2022-01-07T03:41:38+01:00 47
284 2022-01-07T03:42:38+01:00 47
285 2022-01-07T03:43:38+01:00 47
286 2022-01-07T03:44:38+01:00 47
287 2022-01-07T03:45:38+01:00 47
288 2022-01-07T03:46:38+01:00 47
289 2022-01-07T03:47:38+01:00 47
290 2022-01-07T03:48:38+01:00 46
291 2022-01-07T03:49:38+01:00 46
292 2022-01-07T03:50:38+01:00 46
293 2022-01-07T03:51:38+01:00 46
294 2022-01-07T03:52:38+01:00 45
295 2022-01-07T03:53:38+01:00 45
296 2022-01-07T03:54:38+01:00 45
297 2022-01-07T03:55:38+01:00 45
298 2022-01-07T03:56:38+01:00 45
299 2022-01-07T03:57:38+01:00 45
300 2022-01-07T03:58:38+01:00 45
301 2022-01-07T03:59:38+01:00 44
302 2022-01-07T04:00:38+01:00 44
303 2022-01-07T04:01:38+01:00 44
304 2022-01-07T04:02:38+01:00 44
305 2022-01-07T04:03:38+01:00 44
306 2022-01-07T04:04:38+01:00 44
307 2022-01-07T04:05:38+01:00 44
308 2022-01-07T04:06:38+01:00 43
309 2022-01-07T04:07:38+01:00 43
310 2022-01-07T04:08:38+01:00 43
311 2022-01-07T04:09:38+01:00 43
312 2022-01-07T04:10:38+01:00 42
313 2022-01-07T04:11:38+01:00 42
314 2022-01-07T04:12:38+01:00 42
315 2022-01-07T04:13:38+01:00 42
316 2022-01-07T04:14:38+01:00 42
317 2022-01-07T04:15:38+01:00 41
318 2022-01-07T04:16:38+01:00 41
319 2022-01-07T04:17:38+01:00 41
320 2022-01-07T04:18:38+01:00 41
321 2022-01-07T04:19:38+01:00 41
322 2022-01-07T04:20:38+01:00 40
323 2022-01-07T04:21:38+01:00 40
324 2022-01-07T04:22:38+01:00 40
325 2022-01-07T04:23:38+01:00 40
326 2022-01-07T04:24:38+01:00 40
327 2022-01-07T04:25:38+01:00 40
328 2022-01-07T04:26:38+01:00 39
329 2022-01-07T04:27:38+01:00 39
330 2022-01-07T04:28:38+01:00 39
331 2022-01-07T04:29:38+01:00 39
332 2022-01-07T04:30:38+01:00 39
333 2022-01-07T04:31:38+01:00 39
334 2022-01-07T04:32:38+01:00 39
335 2022-01-07T04:33:38+01:00 39
336 2022-01-07T04:34:38+01:00 38
337 2022-01-07T04:35:38+01:00 38
338 2022-01-07T04:36:38+01:00 38
339 2022-01-07T04:37:38+01:00 38
340 2022-01-07T04:38:38+01:00 38
341 2022-01-07T04:39:38+01:00 38
342 2022-01-07T04:40:39+01:00 38
343 2022-01-07T04:41:39+01:00 37
344 2022-01-07T04:42:39+01:00 37
345 2022-01-07T04:43:39+01:00 37
346 2022-01-07T04:44:39+01:00 37
347 2022-01-07T04:45:39+01:00 37
348 2022-01-07T04:46:39+01:00 37
349 2022-01-07T04:47:39+01:00 36
350 2022-01-07T04:48:39+01:00 36
351 2022-01-07T04:49:39+01:00 36
352 2022-01-07T04:50:39+01:00 36
353 2022-01-07T04:51:39+01:00 36
354 2022-01-07T04:52:39+01:00 35
355 2022-01-07T04:53:39+01:00 35
356 2022-01-07T04:54:39+01:00 35
357 2022-01-07T04:55:39+01:00 35
358 2022-01-07T04:56:39+01:00 35
359 2022-01-07T04:57:39+01:00 35
360 2022-01-07T04:58:39+01:00 35
361 2022-01-07T04:59:39+01:00 35
362 2022-01-07T05:00:39+01:00 34
363 2022-01-07T05:01:39+01:00 34
364 2022-01-07T05:02:39+01:00 34
365 2022-01-07T05:03:39+01:00 34
366 2022-01-07T05:04:39+01:00 34
367 2022-01-07T05:05:39+01:00 34
368 2022-01-07T05:06:39+01:00 34
369 2022-01-07T05:07:39+01:00 34
370 2022-01-07T05:08:39+01:00 33
371 2022-01-07T05:09:39+01:00 33
372 2022-01-07T05:10:39+01:00 33
373 2022-01-07T05:11:39+01:00 33
374 2022-01-07T05:12:39+01:00 33
375 2022-01-07T05:13:39+01:00 33
376 2022-01-07T05:14:39+01:00 33
377 2022-01-07T05:15:39+01:00 32
378 2022-01-07T05:16:39+01:00 32
379 2022-01-07T05:17:39+01:00 32
380 2022-01-07T05:18:39+01:00 32
381 2022-01-07T05:19:39+01:00 32
382 2022-01-07T05:20:39+01:00 32
383 2022-01-07T05:21:39+01:00 31
384 2022-01-07T05:22:39+01:00 31
385 2022-01-07T05:23:39+01:00 31
386 2022-01-07T05:24:39+01:00 31
387 2022-01-07T05:25:39+01:00 30
388 2022-01-07T05:26:39+01:00 30
389 2022-01-07T05:27:39+01:00 30
390 2022-01-07T05:28:39+01:00 30
391 2022-01-07T05:29:39+01:00 30
392 2022-01-07T05:30:39+01:00 30
393 2022-01-07T05:31:39+01:00 29
394 2022-01-07T05:32:39+01:00 29
395 2022-01-07T05:33:39+01:00 29
396 2022-01-07T05:34:39+01:00 29
397 2022-01-07T05:35:39+01:00 29
398 2022-01-07T05:36:39+01:00 29
399 2022-01-07T05:37:39+01:00 29
400 2022-01-07T05:38:39+01:00 29
401 2022-01-07T05:39:39+01:00 29
402 2022-01-07T05:40:39+01:00 29
403 2022-01-07T05:41:39+01:00 29
404 2022-01-07T05:42:39+01:00 29
405 2022-01-07T05:43:39+01:00 29
406 2022-01-07T05:44:39+01:00 28
407 2022-01-07T05:45:39+01:00 28
408 2022-01-07T05:46:39+01:00 28
409 2022-01-07T05:47:39+01:00 28
410 2022-01-07T05:48:40+01:00 28
411 2022-01-07T05:49:40+01:00 28
412 2022-01-07T05:50:40+01:00 28
413 2022-01-07T05:51:40+01:00 28
414 2022-01-07T05:52:40+01:00 28
415 2022-01-07T05:53:40+01:00 28
416 2022-01-07T05:54:40+01:00 28
417 2022-01-07T05:55:40+01:00 28
418 2022-01-07T05:56:40+01:00 28
419 2022-01-07T05:57:40+01:00 27
420 2022-01-07T05:58:40+01:00 27
421 2022-01-07T05:59:40+01:00 27
422 2022-01-07T06:00:40+01:00 27
423 2022-01-07T06:01:40+01:00 27
424 2022-01-07T06:02:40+01:00 27
425 2022-01-07T06:03:40+01:00 27
426 2022-01-07T06:04:40+01:00 27
427 2022-01-07T06:05:40+01:00 27
428 2022-01-07T06:06:40+01:00 27
429 2022-01-07T06:07:40+01:00 26
430 2022-01-07T06:08:40+01:00 26
431 2022-01-07T06:09:40+01:00 26
432 2022-01-07T06:10:40+01:00 26
433 2022-01-07T06:11:40+01:00 25
434 2022-01-07T06:12:40+01:00 25
435 2022-01-07T06:13:40+01:00 25
436 2022-01-07T06:14:40+01:00 25
437 2022-01-07T06:15:40+01:00 25
438 2022-01-07T06:16:40+01:00 25
439 2022-01-07T06:17:40+01:00 25
440 2022-01-07T06:18:40+01:00 24
441 2022-01-07T06:19:40+01:00 24
442 2022-01-07T06:20:40+01:00 24
443 2022-01-07T06:21:40+01:00 24
444 2022-01-07T06:22:40+01:00 24
445 2022-01-07T06:23:40+01:00 24
446 2022-01-07T06:24:40+01:00 24
447 2022-01-07T06:25:40+01:00 24
448 2022-01-07T06:26:40+01:00 24
449 2022-01-07T06:27:40+01:00 24
450 2022-01-07T06:28:40+01:00 24
451 2022-01-07T06:29:40+01:00 24
452 2022-01-07T06:30:40+01:00 24
453 2022-01-07T06:31:40+01:00 24
454 2022-01-07T06:32:40+01:00 24
455 2022-01-07T06:33:40+01:00 23
456 2022-01-07T06:34:40+01:00 23
457 2022-01-07T06:35:40+01:00 23
458 2022-01-07T06:36:40+01:00 23
459 2022-01-07T06:37:40+01:00 23
460 2022-01-07T06:38:40+01:00 23
461 2022-01-07T06:39:40+01:00 23
462 2022-01-07T06:40:40+01:00 23
463 2022-01-07T06:41:40+01:00 23
464 2022-01-07T06:42:40+01:00 22
465 2022-01-07T06:43:40+01:00 22
466 2022-01-07T06:44:40+01:00 22
467 2022-01-07T06:45:40+01:00 22
468 2022-01-07T06:46:40+01:00 22
469 2022-01-07T06:47:40+01:00 22
470 2022-01-07T06:48:40+01:00 22
471 2022-01-07T06:49:40+01:00 22
472 2022-01-07T06:50:40+01:00 22
473 2022-01-07T06:51:40+01:00 22
474 2022-01-07T06:52:40+01:00 21
475 2022-01-07T06:53:40+01:00 21
476 2022-01-07T06:54:40+01:00 21
477 2022-01-07T06:55:40+01:00 21
478 2022-01-07T06:56:40+01:00 21
479 2022-01-07T06:57:40+01:00 21
480 2022-01-07T06:58:40+01:00 21
481 2022-01-07T06:59:40+01:00 21
482 2022-01-07T07:00:40+01:00 21
483 2022-01-07T07:01:40+01:00 21
484 2022-01-07T07:02:40+01:00 21
485 2022-01-07T07:03:40+01:00 21
486 2022-01-07T07:04:40+01:00 21
487 2022-01-07T07:05:40+01:00 21
488 2022-01-07T07:06:40+01:00 20
489 2022-01-07T07:07:40+01:00 20
490 2022-01-07T07:08:41+01:00 20
491 2022-01-07T07:09:41+01:00 20
492 2022-01-07T07:10:41+01:00 20
493 2022-01-07T07:11:41+01:00 20
494 2022-01-07T07:12:41+01:00 20
495 2022-01-07T07:13:41+01:00 20
496 2022-01-07T07:14:41+01:00 19
497 2022-01-07T07:15:41+01:00 19
498 2022-01-07T07:16:41+01:00 19
499 2022-01-07T07:17:41+01:00 19
500 2022-01-07T07:18:41+01:00 19
501 2022-01-07T07:19:41+01:00 19
502 2022-01-07T07:20:41+01:00 19
503 2022-01-07T07:21:41+01:00 18
504 2022-01-07T07:22:41+01:00 18
505 2022-01-07T07:23:41+01:00 18
506 2022-01-07T07:24:41+01:00 18
507 2022-01-07T07:25:41+01:00 18
508 2022-01-07T07:26:41+01:00 18
509 2022-01-07T07:27:41+01:00 18
510 2022-01-07T07:28:41+01:00 17
511 2022-01-07T07:29:41+01:00 17
512 2022-01-07T07:30:41+01:00 17
513 2022-01-07T07:31:41+01:00 17
514 2022-01-07T07:32:41+01:00 17
515 2022-01-07T07:33:41+01:00 16
516 2022-01-07T07:34:41+01:00 16
517 2022-01-07T07:35:41+01:00 16
518 2022-01-07T07:36:41+01:00 16
519 2022-01-07T07:37:41+01:00 16
520 2022-01-07T07:38:41+01:00 16
521 2022-01-07T07:39:41+01:00 16
522 2022-01-07T07:40:41+01:00 16
523 2022-01-07T07:41:41+01:00 16
524 2022-01-07T07:42:41+01:00 16
525 2022-01-07T07:43:41+01:00 16
526 2022-01-07T07:44:41+01:00 15
527 2022-01-07T07:45:41+01:00 15
528 2022-01-07T07:46:41+01:00 15
529 2022-01-07T07:47:41+01:00 15
530 2022-01-07T07:48:41+01:00 15
531 2022-01-07T07:49:41+01:00 15
532 2022-01-07T07:50:41+01:00 15
533 2022-01-07T07:51:41+01:00 15
534 2022-01-07T07:52:41+01:00 15
535 2022-01-07T07:53:41+01:00 15
536 2022-01-07T07:54:41+01:00 15
537 2022-01-07T07:55:41+01:00 14
538 2022-01-07T07:56:41+01:00 14
539 2022-01-07T07:57:41+01:00 14
540 2022-01-07T07:58:41+01:00 14
541 2022-01-07T07:59:41+01:00 14
542 2022-01-07T08:00:41+01:00 14
543 2022-01-07T08:01:41+01:00 14
544 2022-01-07T08:02:41+01:00 14
545 2022-01-07T08:03:41+01:00 14
546 2022-01-07T08:04:41+01:00 14
547 2022-01-07T08:05:41+01:00 13
548 2022-01-07T08:06:41+01:00 13
549 2022-01-07T08:07:41+01:00 13
550 2022-01-07T08:08:41+01:00 13
551 2022-01-07T08:09:41+01:00 13
552 2022-01-07T08:10:41+01:00 13
553 2022-01-07T08:11:41+01:00 13
554 2022-01-07T08:12:41+01:00 13
555 2022-01-07T08:13:41+01:00 13
556 2022-01-07T08:14:41+01:00 12
557 2022-01-07T08:15:41+01:00 12
558 2022-01-07T08:16:41+01:00 12
559 2022-01-07T08:17:41+01:00 12
560 2022-01-07T08:18:41+01:00 11
561 2022-01-07T08:19:41+01:00 11
562 2022-01-07T08:20:41+01:00 11
563 2022-01-07T08:21:41+01:00 11
564 2022-01-07T08:22:41+01:00 10
565 2022-01-07T08:23:41+01:00 10
566 2022-01-07T08:24:41+01:00 10
567 2022-01-07T08:25:41+01:00 10
568 2022-01-07T08:26:41+01:00 10
569 2022-01-07T08:27:41+01:00 9
570 2022-01-07T08:28:42+01:00 9
571 2022-01-07T08:29:42+01:00 9
572 2022-01-07T08:30:42+01:00 9
573 2022-01-07T08:31:42+01:00 9
574 2022-01-07T08:32:42+01:00 8
575 2022-01-07T08:33:42+01:00 8
576 2022-01-07T08:34:42+01:00 8
577 2022-01-07T08:35:42+01:00 8
578 2022-01-07T08:36:42+01:00 8
579 2022-01-07T08:37:42+01:00 7
580 2022-01-07T08:38:42+01:00 7
581 2022-01-07T08:39:42+01:00 7
582 2022-01-07T08:40:42+01:00 7
583 2022-01-07T08:41:42+01:00 7
584 2022-01-07T08:42:42+01:00 7
585 2022-01-07T08:43:42+01:00 7
586 2022-01-07T08:44:42+01:00 7
587 2022-01-07T08:45:42+01:00 7
588 2022-01-07T08:46:42+01:00 7
589 2022-01-07T08:47:42+01:00 7
590 2022-01-07T08:48:42+01:00 6
591 2022-01-07T08:49:42+01:00 6
592 2022-01-07T08:50:42+01:00 6
593 2022-01-07T08:51:42+01:00 6
594 2022-01-07T08:52:42+01:00 6
595 2022-01-07T08:53:42+01:00 6
596 2022-01-07T08:54:42+01:00 6
597 2022-01-07T08:55:42+01:00 6
598 2022-01-07T08:56:42+01:00 6
599 2022-01-07T08:57:42+01:00 6
600 2022-01-07T08:58:42+01:00 6
601 2022-01-07T08:59:42+01:00 5
602 2022-01-07T09:00:42+01:00 5
603 2022-01-07T09:01:42+01:00 5
604 2022-01-07T09:02:42+01:00 5
605 2022-01-07T09:03:42+01:00 5
606 2022-01-07T09:04:42+01:00 5
607 2022-01-07T09:05:42+01:00 5
608 2022-01-07T09:06:42+01:00 5
609 2022-01-07T09:07:42+01:00 5
610 2022-01-07T09:08:42+01:00 5
611 2022-01-07T09:09:42+01:00 5
612 2022-01-07T09:10:42+01:00 5
613 2022-01-07T09:11:42+01:00 4
614 2022-01-07T09:12:42+01:00 4
615 2022-01-07T09:13:42+01:00 4
616 2022-01-07T09:14:42+01:00 4
617 2022-01-07T09:15:42+01:00 4
618 2022-01-07T09:16:42+01:00 4
619 2022-01-07T09:17:42+01:00 4
620 2022-01-07T09:18:42+01:00 4
621 2022-01-07T09:19:42+01:00 4
622 2022-01-07T09:20:42+01:00 3
623 2022-01-07T09:21:42+01:00 3
624 2022-01-07T09:22:42+01:00 3
625 2022-01-07T09:23:42+01:00 3
626 2022-01-07T09:24:42+01:00 3
627 2022-01-07T09:25:42+01:00 2
628 2022-01-07T09:26:42+01:00 2
629 2022-01-07T09:27:42+01:00 2
630 2022-01-07T09:28:42+01:00 2
631 2022-01-07T09:29:42+01:00 2
632 2022-01-07T09:30:42+01:00 2
633 2022-01-07T09:31:42+01:00 2
634 2022-01-07T09:32:42+01:00 2
635 2022-01-07T09:33:42+01:00 2
636 2022-01-07T09:34:42+01:00 2
637 2022-01-07T09:35:42+01:00 2
638 2022-01-07T09:36:42+01:00 1
639 2022-01-07T09:37:42+01:00 1
640 2022-01-07T09:38:42+01:00 1
641 2022-01-07T09:39:42+01:00 1
642 2022-01-07T09:40:42+01:00 1
643 2022-01-07T09:41:43+01:00 1
644 2022-01-07T09:42:43+01:00 1
645 2022-01-07T09:43:43+01:00 1
646 2022-01-07T09:44:43+01:00 1
647 2022-01-07T09:45:43+01:00 1
648 2022-01-07T09:46:43+01:00 1
649 2022-01-07T09:47:43+01:00 1
650 2022-01-07T09:48:43+01:00 1
651 2022-01-07T09:49:43+01:00 1
652 2022-01-07T09:50:43+01:00 1
653 2022-01-07T09:51:43+01:00 1
654 2022-01-07T09:52:43+01:00 0
655 2022-01-07T09:53:43+01:00 0
656 2022-01-07T09:54:43+01:00 0
657 2022-01-07T09:55:43+01:00 0
658 2022-01-07T09:56:43+01:00 0
659 2022-01-07T09:57:43+01:00 0
660 2022-01-07T09:58:43+01:00 0
661 2022-01-07T09:59:43+01:00 0
662 2022-01-07T10:00:43+01:00 0
663 2022-01-07T10:01:43+01:00 0
664 2022-01-07T10:02:43+01:00 0
665 2022-01-07T10:03:43+01:00 0
666 2022-01-07T10:04:43+01:00 0
667 2022-01-07T10:05:43+01:00 0
668 2022-01-07T10:06:43+01:00 0
669 2022-01-07T10:07:43+01:00 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -0,0 +1,19 @@
#lang racket
(require plot)
(require 2htdp/batch-io)
(define percentages
(read-csv-file/rows "battery-rundown-log.csv"
(lambda (row) (string->number (second row)))))
(plot (lines (for/list [(p percentages)
(i (in-naturals))]
(vector (/ i 60.0) p))
;#:label "PinePhone battery discharge curve"
)
#:width 640
#:title "PinePhone battery discharge curve"
#:x-label "Hours elapsed"
#:y-label "Percentage capacity remaining"
)

View File

@ -0,0 +1,393 @@
/*
* Voice call audio setup tool
*
* Copyright (C) 2020 Ondřej Jirman <megous@megous.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* 2020-09-29: Updated for the new Samuel's digital codec driver
*/
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <inttypes.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sound/asound.h>
#include <sound/tlv.h>
#define ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0]))
void syscall_error(int is_err, const char* fmt, ...)
{
va_list ap;
if (!is_err)
return;
printf("ERROR: ");
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
printf(": %s\n", strerror(errno));
exit(1);
}
void error(const char* fmt, ...)
{
va_list ap;
printf("ERROR: ");
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
printf("\n");
exit(1);
}
struct audio_control_state {
char name[128];
union {
int64_t i[4];
const char* e[4];
} vals;
bool used;
};
static bool audio_restore_state(struct audio_control_state* controls, int n_controls)
{
int fd;
int ret;
fd = open("/dev/snd/controlC0", O_CLOEXEC | O_NONBLOCK);
if (fd < 0)
error("failed to open card\n");
struct snd_ctl_elem_list el = {
.offset = 0,
.space = 0,
};
ret = ioctl(fd, SNDRV_CTL_IOCTL_ELEM_LIST, &el);
syscall_error(ret < 0, "SNDRV_CTL_IOCTL_ELEM_LIST failed");
struct snd_ctl_elem_id ids[el.count];
el.pids = ids;
el.space = el.count;
ret = ioctl(fd, SNDRV_CTL_IOCTL_ELEM_LIST, &el);
syscall_error(ret < 0, "SNDRV_CTL_IOCTL_ELEM_LIST failed");
for (int i = 0; i < el.used; i++) {
struct snd_ctl_elem_info inf = {
.id = ids[i],
};
ret = ioctl(fd, SNDRV_CTL_IOCTL_ELEM_INFO, &inf);
syscall_error(ret < 0, "SNDRV_CTL_IOCTL_ELEM_INFO failed");
if ((inf.access & SNDRV_CTL_ELEM_ACCESS_READ) && (inf.access & SNDRV_CTL_ELEM_ACCESS_WRITE)) {
struct snd_ctl_elem_value val = {
.id = ids[i],
};
int64_t cval = 0;
ret = ioctl(fd, SNDRV_CTL_IOCTL_ELEM_READ, &val);
syscall_error(ret < 0, "SNDRV_CTL_IOCTL_ELEM_READ failed");
struct audio_control_state* cs = NULL;
for (int j = 0; j < n_controls; j++) {
if (!strcmp(controls[j].name, ids[i].name)) {
cs = &controls[j];
break;
}
}
if (!cs) {
printf("Control \"%s\" si not defined in the controls state\n", ids[i].name);
continue;
}
cs->used = 1;
// check if value needs changing
switch (inf.type) {
case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
case SNDRV_CTL_ELEM_TYPE_INTEGER:
for (int j = 0; j < inf.count; j++) {
if (cs->vals.i[j] != val.value.integer.value[j]) {
// update
//printf("%s <=[%d]= %"PRIi64"\n", ids[i].name, j, cs->vals.i[j]);
val.value.integer.value[j] = cs->vals.i[j];
ret = ioctl(fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &val);
syscall_error(ret < 0, "SNDRV_CTL_IOCTL_ELEM_WRITE failed");
}
}
break;
case SNDRV_CTL_ELEM_TYPE_INTEGER64:
for (int j = 0; j < inf.count; j++) {
if (cs->vals.i[j] != val.value.integer64.value[j]) {
// update
//printf("%s <=[%d]= %"PRIi64"\n", ids[i].name, j, cs->vals.i[j]);
val.value.integer64.value[j] = cs->vals.i[j];
ret = ioctl(fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &val);
syscall_error(ret < 0, "SNDRV_CTL_IOCTL_ELEM_WRITE failed");
}
}
break;
case SNDRV_CTL_ELEM_TYPE_ENUMERATED: {
for (int k = 0; k < inf.count; k++) {
int eval = -1;
for (int j = 0; j < inf.value.enumerated.items; j++) {
inf.value.enumerated.item = j;
ret = ioctl(fd, SNDRV_CTL_IOCTL_ELEM_INFO, &inf);
syscall_error(ret < 0, "SNDRV_CTL_IOCTL_ELEM_INFO failed");
if (!strcmp(cs->vals.e[k], inf.value.enumerated.name)) {
eval = j;
break;
}
}
if (eval < 0)
error("enum value %s not found\n", cs->vals.e[k]);
if (eval != val.value.enumerated.item[k]) {
// update
//printf("%s <=%d= %s\n", ids[i].name, k, cs->vals.e[k]);
val.value.enumerated.item[k] = eval;
ret = ioctl(fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &val);
syscall_error(ret < 0, "SNDRV_CTL_IOCTL_ELEM_WRITE failed");
}
}
break;
}
}
}
}
for (int j = 0; j < n_controls; j++)
if (!controls[j].used)
printf("Control \"%s\" is defined in state but not present on the card\n", controls[j].name);
close(fd);
return true;
}
struct audio_setup {
bool mic_on;
bool spk_on;
bool hp_on;
bool ear_on;
bool hpmic_on;
// when sending audio to modem from AIF1 R, also play that back
// to me locally (just like AIF1 L plays just to me)
//
// this is to monitor what SW is playing to the modem (so that
// I can hear my robocaller talking)
bool modem_playback_monitor;
// enable modem routes to DAC/from ADC (spk/mic)
// digital paths to AIF1 are always on
bool to_modem_on;
bool from_modem_on;
// shut off/enable all digital paths to the modem:
// keep this off until the call starts, then turn it on
bool dai2_en;
int mic_gain;
int hpmic_gain;
int spk_vol;
int ear_vol;
int hp_vol;
};
static void audio_set_controls(struct audio_setup* s)
{
struct audio_control_state controls[] = {
//
// Analog input:
//
// Mic 1 (daughterboard)
{ .name = "Mic1 Boost Volume", .vals.i = { s->mic_gain } },
// Mic 2 (headphones)
{ .name = "Mic2 Boost Volume", .vals.i = { s->hpmic_gain } },
// Line in (unused on PP)
// no controls yet
// Input mixers before ADC
{ .name = "Mic1 Capture Switch", .vals.i = { !!s->mic_on, !!s->mic_on } },
{ .name = "Mic2 Capture Switch", .vals.i = { !!s->hpmic_on, !!s->hpmic_on } },
{ .name = "Line In Capture Switch", .vals.i = { 0, 0 } }, // Out Mix -> In Mix
{ .name = "Mixer Capture Switch", .vals.i = { 0, 0 } },
{ .name = "Mixer Reversed Capture Switch", .vals.i = { 0, 0 } },
// ADC
{ .name = "ADC Gain Capture Volume", .vals.i = { 0 } },
{ .name = "ADC Capture Volume", .vals.i = { 160, 160 } }, // digital gain
//
// Digital paths:
//
// AIF1 (SoC)
// AIF1 slot0 capture mixer sources
{ .name = "AIF1 Data Digital ADC Capture Switch", .vals.i = { 1, 0 } },
{ .name = "AIF1 Slot 0 Digital ADC Capture Switch", .vals.i = { 0, 0 } },
{ .name = "AIF2 Digital ADC Capture Switch", .vals.i = { 0, 1 } },
{ .name = "AIF2 Inv Digital ADC Capture Switch", .vals.i = { 0, 0 } }, //XXX: capture right from the left AIF2?
// AIF1 slot0 capture/playback mono mixing/digital volume
{ .name = "AIF1 AD0 Capture Volume", .vals.i = { 160, 160 } },
{ .name = "AIF1 AD0 Stereo Capture Route", .vals.e = { "Stereo", "Stereo" } },
{ .name = "AIF1 DA0 Playback Volume", .vals.i = { 160, 160 } },
{ .name = "AIF1 DA0 Stereo Playback Route", .vals.e = { "Stereo", "Stereo" } },
// AIF2 (modem)
// AIF2 capture mixer sources
{ .name = "AIF2 ADC Mixer ADC Capture Switch", .vals.i = { !!s->to_modem_on && !!s->dai2_en, 0 } }, // from adc/mic
{ .name = "AIF2 ADC Mixer AIF1 DA0 Capture Switch", .vals.i = { 0, 1 } }, // from aif1 R
{ .name = "AIF2 ADC Mixer AIF2 DAC Rev Capture Switch", .vals.i = { 0, 0 } },
// AIF2 capture/playback mono mixing/digital volume
{ .name = "AIF2 ADC Capture Volume", .vals.i = { 160, 160 } },
{ .name = "AIF2 DAC Playback Volume", .vals.i = { 160, 160 } },
{ .name = "AIF2 ADC Stereo Capture Route", .vals.e = { "Mix Mono", "Mix Mono" } }, // we mix because we're sending two channels (from mic and AIF1 R)
{ .name = "AIF2 DAC Stereo Playback Route", .vals.e = { "Sum Mono", "Sum Mono" } }, // we sum because modem is sending a single channel
// AIF3 (bluetooth)
{ .name = "AIF3 ADC Source Capture Route", .vals.e = { "None" } },
{ .name = "AIF2 DAC Source Playback Route", .vals.e = { "AIF2" } },
// DAC
// DAC input mixers (sources from ADC, and AIF1/2)
{ .name = "ADC Digital DAC Playback Switch", .vals.i = { 0, 0 } }, // we don't play our mic to ourselves
{ .name = "AIF1 Slot 0 Digital DAC Playback Switch", .vals.i = { 1, !!s->modem_playback_monitor } },
{ .name = "AIF2 Digital DAC Playback Switch", .vals.i = { 0, !!s->dai2_en && !!s->from_modem_on } },
//
// Analog output:
//
// Output mixer after DAC
{ .name = "DAC Playback Switch", .vals.i = { 1, 1 } },
{ .name = "DAC Reversed Playback Switch", .vals.i = { 1, 1 } },
{ .name = "DAC Playback Volume", .vals.i = { 160, 160 } },
{ .name = "Mic1 Playback Switch", .vals.i = { 0, 0 } },
{ .name = "Mic1 Playback Volume", .vals.i = { 0 } },
{ .name = "Mic2 Playback Switch", .vals.i = { 0, 0 } },
{ .name = "Mic2 Playback Volume", .vals.i = { 0 } },
{ .name = "Line In Playback Switch", .vals.i = { 0, 0 } },
{ .name = "Line In Playback Volume", .vals.i = { 0 } },
// Outputs
{ .name = "Earpiece Source Playback Route", .vals.e = { "Left Mixer" } },
{ .name = "Earpiece Playback Switch", .vals.i = { !!s->ear_on } },
{ .name = "Earpiece Playback Volume", .vals.i = { s->ear_vol } },
{ .name = "Headphone Source Playback Route", .vals.e = { "Mixer", "Mixer" } },
{ .name = "Headphone Playback Switch", .vals.i = { !!s->hp_on, !!s->hp_on } },
{ .name = "Headphone Playback Volume", .vals.i = { s->hp_vol } },
// Loudspeaker
{ .name = "Line Out Source Playback Route", .vals.e = { "Mono Differential", "Mono Differential" } },
{ .name = "Line Out Playback Switch", .vals.i = { !!s->spk_on, !!s->spk_on } },
{ .name = "Line Out Playback Volume", .vals.i = { s->spk_vol } },
};
audio_restore_state(controls, ARRAY_SIZE(controls));
}
static struct audio_setup audio_setup = {
.mic_on = false,
.ear_on = false,
.spk_on = false,
.hp_on = false,
.hpmic_on = false,
.from_modem_on = true,
.to_modem_on = true,
.modem_playback_monitor = false,
.dai2_en = false,
.hp_vol = 15,
.spk_vol = 15,
.ear_vol = 31,
.mic_gain = 1,
.hpmic_gain = 1,
};
int main(int ac, char* av[])
{
int opt;
while ((opt = getopt(ac, av, "smhle2")) != -1) {
switch (opt) {
case 's':
audio_setup.spk_on = 1;
break;
case 'm':
audio_setup.mic_on = 1;
break;
case 'h':
audio_setup.hp_on = 1;
break;
case 'l':
audio_setup.hpmic_on = 1;
break;
case 'e':
audio_setup.ear_on = 1;
break;
case '2':
audio_setup.dai2_en = 1;
break;
default: /* '?' */
fprintf(stderr, "Usage: %s [-s] [-m] [-h] [-l] [-e] [-2]\n", av[0]);
exit(EXIT_FAILURE);
}
}
audio_set_controls(&audio_setup);
return 0;
}

View File

@ -0,0 +1,133 @@
<!DOCTYPE html>
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="referrer" content="no-referrer"><link rel="stylesheet" href="EG25-G%20reverse%20engineering_files/style.css"><title>EG25-G reverse engineering</title></head><body><header><div class="title"><a href="https://xnux.eu/index.html">xnux.eu</a> - <a href="https://xnux.eu/map.html">site map</a> - <a href="https://xnux.eu/news.html">news</a></div></header><main><section><h1 id="toc-eg25-g-reverse-engineering">EG25-G reverse engineering</h1><h2 id="toc-quectel-daemon">quectel_daemon</h2><ul><li>makes
<code>/sys/class/gpio/gpio1018/direction</code> an output</li><li>monitors
<code>/sys/devices/virtual/android_usb/android0/state</code> and
<code>/sys/devices/virtual/android_usb/android0/usb_sleep</code> and passes the
state to modem via&nbsp;qmi</li><li>monitors <code>/run/gpio_data</code> and updates
<code>/sys/class/gpio/gpio1018/direction</code> with
<code>high</code>/<code>low</code></li><li>opens various pcm devices
(voice_pcm_ser­vice)</li><li>handles call ringing and voice audio
configuration</li><li>touches <code>/tmp/quec_daemon_rdy</code></li><li>talks
via <code>/run/voc_svr</code> in the main loop</li></ul><h2 id="toc-quectel-monitor-daemon">quectel_mo­nitor_daemon</h2><ul><li>if
<code>/data/ModemRestartSystem</code> exists it writes <code>SYSTEM</code> to
<code>/sys/devices/4080000.qcom,mss/subsys1/restart_level</code>
or&nbsp;<code>/sys/devices/4080000.qcom,mss/subsys0/restart_level</code></li><li>if
<code>/data/ModemRestartRelated</code> exists it writes <code>RELATED</code> to
<code>/sys/devices/4080000.qcom,mss/subsys1/restart_level</code>
or&nbsp;<code>/sys/devices/4080000.qcom,mss/subsys0/restart_level</code></li><li>then
it monitors <code>/sys/devices/4080000.qcom,mss/subsys1/quec_state</code> and if
it is changed to non-0&nbsp;it restarts various daemons:<ul><li>system(„ki­llall
atfwd_daemon“);</li><li>system(„ki­llall
quectel_da­emon“);</li><li>system(„ki­llall
alsaucm_tes­t“);</li></ul></li></ul><h2 id="toc-quectel-pcm-daemon">quectel_pcm_d­aemon</h2><ul><li>waits for pcm codec
to probe</li><li>reads <code>/data/quec/conf/auxpcm.conf</code> (written by
<code>atfwd_daemon</code> via AT+QDAI command)</li><li>based on values therein
it:<ul><li>loads various kernel modules for supported
external&nbsp;co­decs<ul><li>eg.:<p>system(„echo \"nau8814-codec.2001a\“
&gt; /sys/devices/soc:s­ound/codec_na­me");</p><p>system(„echo
\"nau8814-aif1\“ &gt;
/sys/devices/soc:s­ound/rx_da­i_name");</p><p>system(„echo
\"nau8814-aif1\“ &gt;
/sys/devices/soc:s­ound/tx_da­i_name");</p><p>system(„insmod
/usr/lib/mo­dules/3.18­.44/kernel/sou­nd/soc/codec­s/snd-soc-nau8814.ko“);</p></li></ul></li><li>configures
PCM interface, like:<p>„echo %d &gt;
/sys/devices/soc:q­com,msm-sec-auxpcm/mode“</p><p>„echo %d &gt;
/sys/devices/soc:q­com,msm-sec-auxpcm/sync“</p><p>„echo %d &gt;
/sys/devices/soc:s­ound/pcm_mo­de_select“</p><p>„echo %d &gt;
/sys/devices/soc:q­com,msm-sec-auxpcm/frame“</p><p>„echo %d &gt;
/sys/devices/soc:q­com,msm-sec-auxpcm/quant“</p><p>„echo %d &gt;
/sys/devices/soc:q­com,msm-sec-auxpcm/data“</p><p>„echo %d &gt;
/sys/devices/soc:q­com,msm-sec-auxpcm/rate“</p><p>„echo %d &gt;
/sys/devices/soc:q­com,msm-sec-auxpcm/num_­slots“</p><p>„echo %d &gt;
/sys/devices/soc:q­com,msm-sec-auxpcm/slot­_mapping“</p><p>„echo %d &gt;
/sys/devices/soc:s­ound/quec_au­xpcm_rate“</p></li></ul></li></ul><h2 id="toc-quectel-psm-aware">quectel_psm_a­ware</h2><ul><li>creates fifo
<code>/run/psm_aware_cmd</code></li><li>reads this fifo and issues various
<code>psm_*</code> calls to a library</li><li>some power saving
stuff</li><li>fifo is written from <code>atfwd_daemon</code> via
<code>AT+QPSM="fifo string"</code> command</li></ul><h2 id="toc-quectel-tts-service">quectel_tts_s­ervice</h2><ul><li>binds to
127.0.0.1:17824</li><li>accepts connections and plays TTS audio from the issued
command</li></ul><h2 id="toc-sendcal">sendcal</h2><ul><li>creates
<code>/run/sendcal</code> device</li><li>does some basic processing</li></ul><h2 id="toc-subsystem-ramdump">subsystem_ram­dump</h2><ul><li>allow to dump ram to
a file in /data</li></ul><h2 id="toc-time-daemon">time_daemon</h2><ul><li>reads
RTC time from modem over qmi and updates the ARM CPU&nbsp;time</li></ul><h2 id="toc-uim-test-client">uim_test_cli­ent</h2><ul><li>sim testing console
client</li></ul><h2 id="toc-quectel-uart-ddp">quectel-uart-ddp</h2><ul><li>reads
<code>/data/quec/conf/dynamic_console</code></li><li>passes data between debug
uart port and <code>/dev/smd9</code></li></ul><h2 id="toc-quectel-thermal">quectel-thermal</h2><ul><li>monitors
<code>/sys/devices/virtual/thermal/thermal_zone%d/temp</code></li><li>updates
SAR and RF signal strength based on temperature via&nbsp;QMI</li></ul><h2 id="toc-quectel-smd-atcmd">quectel-smd-atcmd</h2><ul><li>probably supposed to
forward commands from <code>/dev/ttyGS0</code>
to&nbsp;<code>/dev/smd7</code></li><li>does nothing, just prints some crap in a
weird way to console/kmsg</li><li>Sundy still didn't learn stdio so is using
system(„echo %s &gt; /dev/kmsg“); instead of fprintf</li></ul><h2 id="toc-quectel-remotefs-service">quectel-remotefs-service</h2><ul><li>opens
<code>/dev/smd8</code></li><li>waits for commands from the modem over
<code>/dev/smd8</code> and performs basic VFS operations, like
open/close/re­ad/write/se­ek,&nbsp;etc.</li><li>implements reaction to OMA DM push
message by executing <code>/data/ipth_dme</code> binary, which implements vendor
(Verizon, AT&amp;T) specific remote FOTA/system config updates<ul><li>only if
<code>fota_ip_a</code> or <code>fota_ip_v</code> exist in
<code>/data/fota</code> directory</li></ul></li></ul><h2 id="toc-quectel-gps-handle">quectel-gps-handle</h2><ul><li>Sundy strikes again,
this time using stdio in addition to system() calls for debug
output!</li><li>writes 0&nbsp;to
<code>/data/quec/conf/gps_outport_flag</code></li><li>opens
<code>/dev/smd7</code> (modem's&nbsp;GPS data shmem device)</li><li>reads a number
from <code>/data/quec/conf/gps_outport_flag</code><ul><li>uses
<code>/dev/ttyHSL0</code> or <code>/dev/ttyGS0</code> for NMEA output based on
the&nbsp;number</li></ul></li><li>forwards data from <code>/dev/sdm7</code> to one
of the serial&nbsp;ports</li><li>monitors
<code>/sys/class/android_usb/android0/state</code> and
<code>/sys/class/android_usb/f_serial/is_connected_flag</code> and presumably
turns off GPS output if USB is not CONNECTED</li></ul><h2 id="toc-quec-wifi-bridge">quec_wifi_brid­ge</h2><ul><li>opens
<code>/data/wifi_bridge_in_pipe</code> and
<code>/data/wifi_bridge_out_pipe</code></li><li>listens on
0.0.0.0:5555</li><li>forwards data from connections to
<code>/data/wifi_bridge_in_pipe</code> as&nbsp;is</li><li>forwards data from
<code>/data/wifi_bridge_out_pipe</code> to the last accepted
connection</li></ul><h2 id="toc-ql-usbcfg">ql_usbcfg</h2><ul><li>loads USB
configuration for recovery mode</li></ul><h2 id="toc-ql-manager-server-ql-manager-cli">ql_manager_ser­ver /
ql_manager_cli</h2><ul><li>some WWAN/WIFI management server + cli
client</li><li>quectel code</li></ul><p></p><h1 id="toc-files">Files</h1><h2 id="toc-tmp-urc-sock">/tmp/.urc_sock</h2><ul><li>Unix socket that can be used to
send URCs from linux userspace</li></ul><h1 id="toc-un-der-documented-at-commands">Un(der)-documented AT commands</h1><h2 id="toc-at-qprint-1">AT+QPRINT=1</h2><ul><li>(does literally
<code>cat /proc/kmsg &gt;/dev/ttyGS0 &amp;</code>), you can get dmesg output
from <code>cat /dev/ttyUSB1</code> on the A64&nbsp;side</li></ul><h2 id="toc-at-qprint-0">AT+QPRINT=0</h2><ul><li>does literally
<code>killall cat</code></li></ul><h2 id="toc-at-qfastboot">AT+QFASTBOOT</h2><ul><li>reboots the modem in fastboot
mode</li></ul><h2 id="toc-at-qcfg-modemrstlevel-val">AT+QCFG=„m­odemrstlevel“,<code>&lt;val&gt;</code></h2><ul><li>/sys/bus/m­sm_subsys/de­vices/subsys1/res­tart_level</li></ul><p>val
== 0:</p><ul><li>echo SYSTEM &gt;
/sys/bus/m­sm_subsys/de­vices/subsys0/res­tart_level</li><li>echo 00 &gt;
/data/Modem­RestartSys­tem</li><li>rm -rf
/data/Modem­RestartRela­ted</li></ul><p>val == 1:</p><ul><li>echo RELATED &gt;
/sys/bus/m­sm_subsys/de­vices/subsys0/res­tart_level</li><li>echo 11 &gt;
/data/Modem­RestartRela­ted</li><li>rm -rf
/data/Modem­RestartSys­tem</li></ul><h2 id="toc-at-qcfg-aprstlevel-val">AT+QCFG=„a­prstlevel“,<code>&lt;val&gt;</code></h2><ul><li>echo
<code>val</code> &gt;
/sys/bus/m­sm_subsys/de­vices/subsys0/sys­tem_reset_mo­de</li></ul><h2 id="toc-at-qcfg-usbid">AT+QCFG=„us­bid“</h2><ul><li>handled by
quectel-manager (see ql_mgmt_cl­ient_open C&nbsp;api)</li></ul><h2 id="toc-at-qcfg-usbee">AT+QCFG=„us­bee“</h2><ul><li>handled by
quectel-manager (see ql_mgmt_cl­ient_open C&nbsp;api)</li></ul><h2 id="toc-at-qcfg-usbcfg">AT+QCFG=„us­bcfg“</h2><ul><li>handled by
quectel-manager (see ql_mgmt_cl­ient_open C&nbsp;api)</li></ul><h2 id="toc-at-qcfg-usbnet">AT+QCFG=„us­bnet“</h2><ul><li>handled by
quectel-manager (see ql_mgmt_cl­ient_open C&nbsp;api)</li></ul><h2 id="toc-at-qcfg-pcmclk">AT+QCFG=„p­cmclk“</h2><ul><li>reads/writes
/sys/devices/soc:q­com,msm-sec-auxpcm/ena­ble_clk</li><li>sets some params on
alsa hw:0,0&nbsp;device</li></ul><h2 id="toc-at-qcfg-tone-incoming-val">AT+QCFG=„t­one/incomin­g“,<code>&lt;val&gt;</code></h2><ul><li>reads/writes
DWORD <code>val</code> to /data/quec/con­f/ringtype­.conf</li></ul><h2 id="toc-at-qcfg-sleepind-level-val">AT+QCFG=„s­leepind/le­vel“,<code>&lt;val&gt;</code></h2><ul><li>echo
<code>val</code> &gt;
/sys/devices/soc:q­uec,quectel-power-manager/sle­ep_polarity</li><li>echo
<code>val</code> &gt; /data/quec/con­f/sleepind­.txt</li></ul><h2 id="toc-at-qcfg-wakeupin-level-val">AT+QCFG=„w­akeupin/le­vel“,<code>&lt;val&gt;</code></h2><ul><li>echo
<code>val</code> &gt; /data/quec/con­f/wakeupin­.txt</li></ul><h2 id="toc-at-qcfg-thermal-modem-thermal-limit-rates-thermal-txpwrlmt">AT+QCFG=„t­hermal/modem“,
„thermal/li­mit_rates“, „thermal/txpwr­lmt“</h2><ul><li>modifies
/data/quec_ther­mal_threshold (37B binary file)</li><li>modifies
/data/quec_ther­m_cfg<ul><li>format
enable=%d,sen­sor=%d,tem­pthreshold=%d,du­ration=%d,tri­g_cnt=%d,clr_cnt=%d</li></ul></li></ul><h2 id="toc-at-qcfg-codec-powsave">AT+QCFG=„c­odec/powsa­ve“</h2><ul><li>echo
<code>val</code> &gt;
/sys/devices/78b60­00.i2c/i2c-2/2001b/alc5616_pow­_save_cfg</li></ul><h2 id="toc-at-qcfg-qcautoconnect-val">AT+QCFG=„q­cautoconnec­t“,<code>&lt;val&gt;</code></h2><ul><li>sed
-i /&lt;AutoCon­nect&gt;[01]&lt;/&lt;­AutoConnec­t&gt;$val'&lt;/g'
/data/mobi­leap_cfg.xml</li></ul><h2 id="toc-at-qcfg-ftm-mbim">AT+QCFG=„f­tm/mbim“</h2><ul><li>opens
/data/quec/us­b/ftm_mbim and drops the fd, doesn't close&nbsp;it?</li><li>kinda
weird</li></ul><h2 id="toc-at-qcfg-multi-ip-package">AT+QCFG=„m­ulti_ip_pac­kage“</h2><ul><li>configures
/sys/devices/vir­tual/andro­id_usb/andro­id0/multi_pac­kage_enabled</li><li>and
some other related sysfs files</li></ul><h2 id="toc-at-qcfg-dbgctl">AT+QCFG=„d­bgctl“</h2><ul><li><code>echo 1 &gt; /etc/dbgctl</code></li><li>or
<code>rm /etc/dbgctl</code></li><li>of course it fails, since /etc is read-only
fs</li></ul><h2 id="toc-at-qcfg-bootup-op">AT+QCFG=„b­ootup“,<code>&lt;op&gt;</code></h2><ul><li>1
= start, 0 = stop, 2 = check if service (/etc/init.d) is running</li></ul><h2 id="toc-at-qcfg-usbmode">AT+QCFG=„us­bmode“</h2><ul><li>echo %d &gt;
/data/usb/qu­ec_usbmode_check</li><li>cat
/sys/devices/vir­tual/andro­id_usb/andro­id0/state (CONFIGURED
/&nbsp;other)</li><li>cat
/sys/devices/vir­tual/andro­id_usb/andro­id0/usb_sle­ep&nbsp;(0/1)</li></ul></section></main><footer><p>E-mail: <a href="mailto:x@xnux.eu">x@xnux.eu</a> - <a href="https://xnux.eu/map.html" accesskey="m">site map</a> - <a href="https://xnux.eu/rss.xml">RSS</a></p></footer></body></html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,105 @@
<!DOCTYPE html>
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="referrer" content="no-referrer"><link rel="stylesheet" href="Modem%20on%20PinePhone_files/style.css"><title>Modem on PinePhone</title></head><body><header><div class="title"><a href="https://xnux.eu/index.html">xnux.eu</a> - <a href="https://xnux.eu/map.html">site map</a> - <a href="https://xnux.eu/news.html">news</a></div></header><main><section><h1 id="toc-modem-on-pinephone">Modem on PinePhone</h1><div style="float:right"><a href="https://xnux.eu/contribute.html"><img src="Modem%20on%20PinePhone_files/contrib.png" style="vertical-align: middle"> Contribute</a></div><p><a href="https://www.quectel.com/product/eg25g.htm" class="external">Quectel
EG25-G</a> modem in PinePhone handles WWAN, GPS and celular services. It is
based on <code>Qualcomm MDM 9607</code> chipset, has 256&nbsp;MiB DRAM, 256&nbsp;MiB
NAND, and a single Cortex-A7 CPU clocked up to 1.3GHz.</p><p>The
modem's&nbsp;fir­mware is split into two parts:</p><ul><li>Linux kernel + userspace
runs on an ARM CPU</li><li>Modem's&nbsp;fir­mware runs on Hexagon
ADSP</li></ul><p>Most AT commands are run on a separeate DSP processor cores
(Hexagon QDSP6 V5), with some being forwarded to a Linux userspace program
called <code>atfwd_daemon</code> running on the ARM&nbsp;CPU.</p><p>Reverse
engineering the exisintg software for ARM CPU inside the modem is quite easy
using ghidra. ADB unlocker was made this&nbsp;way.</p><h2 id="toc-modem-power-driver">Modem power driver</h2><p>My kernel is a bit
special, since it contains a special <a href="https://megous.com/git/linux/commit/?h=modem-5.8&amp;id=9e26fe7200672c64256652b916319873fd602ebf" class="external">modem power manager driver</a> (released 20200803 along
with Linux&nbsp;5.8).</p><p>My driver implements several features:</p><ul><li>it
ensures modem is configured properly for audio and&nbsp;sleep</li><li>it implements
airplane mode via rfkill interface</li><li>it implements modem
suspend/resume</li><li>it hides PinePhone variant differences</li><li>it
implements URC caching on all pinephone variants regardless of AP_READY
availability</li><li>it makes the modem sleep most of the time</li><li>it
handles powerup/po­werdown errors properly</li><li>it checks for killswitch and
reports it to userspace/dmesg</li><li>it doesn't waste time during powerdown and
waits for actual modem powerdown (it doesn't just sleep for a
fixed&nbsp;time)</li><li>it handles SoC wakeup on RI</li><li>it shuts down the modem
properly during kernel powerdown/re­boot to avoid data loss inside the
modem's&nbsp;NAN­D&nbsp;flash</li><li>it reports all errors to dmesg for easy
troublesho­oting/failu­re detection</li></ul><p>Enabling and disabling the
power to the modem is as simple&nbsp;as:</p><pre class="hl"><span class="hl
slc"># request powerup</span>
<span class="hl kwb">echo</span> <span class="hl
num">1</span> <span class="hl opt">&gt; /</span>sys<span class="hl
opt">/</span>class<span class="hl opt">/</span>modem<span class="hl
kwb">-power</span><span class="hl opt">/</span>modem<span class="hl
kwb">-power</span><span class="hl opt">/</span>device<span class="hl
opt">/</span>powered
<span class="hl slc"># request powerdown</span>
<span class="hl kwb">echo</span> <span class="hl num">0</span> <span class="hl
opt">&gt; /</span>sys<span class="hl opt">/</span>class<span class="hl
opt">/</span>modem<span class="hl kwb">-power</span><span class="hl
opt">/</span>modem<span class="hl kwb">-power</span><span class="hl
opt">/</span>device<span class="hl opt">/</span>powered
<span class="hl
slc"># read power status (changes only after power state transition is complete)</span>
<span class="hl kwc">cat</span> <span class="hl opt">/</span>sys<span class="hl
opt">/</span>class<span class="hl opt">/</span>modem<span class="hl
kwb">-power</span><span class="hl opt">/</span>modem<span class="hl
kwb">-power</span><span class="hl opt">/</span>device<span class="hl
opt">/</span>powered
</pre><p>So there's&nbsp;no need to mess with gpios via
sysfs.</p><h2 id="toc-connecting-to-the-modem">Connecting to the
modem</h2><p>You can connect to the modem once it's&nbsp;powered up via:</p><pre class="hl">screen <span class="hl opt">/</span>dev<span class="hl
opt">/</span>ttyUSB2 <span class="hl num">115200</span>
</pre><p>Disconnect by
<code>CTRL+a k</code>.</p><h2 id="toc-setting-up-the-modem-for-voice-calling">Setting up the modem for voice
calling</h2><p>Once per a lifetime you have to run
<code>AT+QDAI=1,0,0,2,0,1,1,1</code> and reboot the modem. That will configure
audio on the modem side correctly and store the configuration persistently
inside the modem. This is not necessary if you use my modem driver.</p><p>To
setup audio for call use my <a href="https://xnux.eu/devices/feature/audio-pp.html">call audio setup
program</a>.</p><p>You need to run the program after the call starts twice. Once
with your desired audio setup without <code>-2</code> option and once with
<code>-2</code> option.</p><p>To answer a call type <code>ATA</code>, to make a
call <code>ATDsomenumber;</code>, to hangup <code>ATH</code>.</p><p>That's&nbsp;it.
;)</p><h2 id="toc-modem-reverse-engineering">Modem reverse
engineering</h2><p>See <a href="https://xnux.eu/devices/feature/modem-pp-reveng.html">this page for
details</a>.</p><h2 id="toc-unlock-adb-access">Unlock ADB
access</h2><p>It's&nbsp;possible to access the Linux side of the modem via adb, or
reboot the modem to fastboot mode and boot your own kernel, The modem is rooted
by default, and you can install and run your own software inside the modem.
It's&nbsp;possible to communicate between A64 and the modem's&nbsp;ARM CPU via USB
serial port (ttyGS0 on modem side and ttyUSB1 on&nbsp;A64).</p><p>It's&nbsp;also
possible to create your own URCs up to 128B in size by sending them as a
datagram message to UNIX socket <code>/tmp/.urc_sock</code>. See <a href="https://xnux.eu/devices/feature/urc.c" class="file">urc.c</a>.</p><p>To install your own program on the modem
persistently you need to remount modem's&nbsp;root filesystem read write and install
your program somewhere in <code>/usr/bin</code>. Add your startup script to
<code>/etc/init.d</code>.</p><p>To get <code>adb</code> access to the
modem:</p><ul><li>Get adb key via <code>AT+QADBKEY?</code></li><li>Enter the adb
key to the <a href="https://xnux.eu/devices/feature/qadbkey-unlock.c" class="file">unlocker
utility</a></li><li>Follow the instructions from the
<code>qadbkey-unlock</code></li><li>Install or get <code>adb</code> for your
distribution</li><li><code>adb shell</code> should get you a root shell on
the&nbsp;modem</li><li><code>adb pull</code> and <code>adb push</code> can be used
to copy files to/from the&nbsp;modem</li></ul><p>On Arch Linux ARM, adb is no longer
supported, so you need to compile it from source code. You can use <a href="https://github.com/qhuyduong/arm_adb" class="external">https://github.com/…uong/arm_adb</a> with <a href="https://xnux.eu/devices/feature/0001-Fix-build-on-modern-Arch-Linux.patch" class="file">this patch</a> to
make it work with current <code>openssl</code>.</p><h2 id="toc-modem-power-management">Modem power management</h2><p>Various PinePhone
variants have SoC GPIOs routed to the modem differently. So you need to be aware
of what PinePhone variant you have, when experimenting with
the&nbsp;modem.</p><p>Power management comes down to:</p><ul><li>letting the modem
sleep when it's&nbsp;not in use, and waking it up when it's&nbsp;needed for
something,</li><li>and letting the host sleep, and configure the modem to wake
the host up, when some important event happens (incomming call,
sms,&nbsp;…).</li></ul><p>Summay of modem's&nbsp;be­havior related to
powerup/po­werdown and power management:</p><ul><li>powerup takes about 14s,
unless the modem is too hot (&gt;5060°C), then it may take as long as 22s
due to CPU inside the modem being downclocked from 1.3Ghz
to&nbsp;400MHz</li><li>configuration of the physical UART and ttyUSB2 is shared for
some reason, so ATE0 issued on UART will turn echo off also on
ttyUSB2</li><li>modem sleeps when an election process based on the status of USB
port, DTR pin, etc. results in a positive decision</li><li>modem disables RF
based on #W_DISABLE only when configured to do so
via&nbsp;<code>AT+QCFG="airplanecontrol"</code></li><li>modem wakes up the host via
USB or RI pin based on&nbsp;<code>AT+QCFG="risignaltype"</code></li><li>modem will
cache URCs based on <code>AP_READY</code> pin's&nbsp;status only when
<code>AT+QCFG="apready"</code> is configured</li><li>powerdown takes about the
same time as powerup</li></ul></section></main><footer><p>E-mail: <a href="mailto:x@xnux.eu">x@xnux.eu</a> - <a href="https://xnux.eu/map.html" accesskey="m">site map</a> - <a href="https://xnux.eu/rss.xml">RSS</a></p></footer></body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,59 @@
# PinePhone docs
- `Quectel_EC2x&EG9x&EG2x-G&EM05_Series_AT_Commands_Manual_V2.0.pdf`, from https://wiki.pine64.org/wiki/File:Quectel_EC2x%26EG9x%26EG2x-G%26EM05_Series_AT_Commands_Manual_V2.0.pdf
- `modem.txt`, from https://megous.com/dl/tmp/modem.txt
- `Modem on PinePhone.html`, from https://xnux.eu/devices/feature/modem-pp.html
- `EG25-G reverse engineering.html`, from https://xnux.eu/devices/feature/modem-pp-reveng.html
The modem AT interface is on `/dev/EG25.AT`, which is a symlink (!) to `ttyUSB2`:
lrwxrwxrwx 1 root root 7 Nov 26 15:17 EG25.AT -> ttyUSB2
lrwxrwxrwx 1 root root 7 Nov 26 15:17 EG25.MODEM -> ttyUSB3
lrwxrwxrwx 1 root root 7 Nov 26 15:17 EG25.NMEA -> ttyUSB1
Generally useful settings:
ATE0Q0V1X4
AT+CMEE=1
- E0 = don't echo commands sent to modem
- Q0 = don't be quiet, output responses
- V1 = use verbose response codes (alternative is numeric, might be worth looking into)
- X4 = use detailed CONNECT responses, dial tone detection, and busy tone detection
- +CMEE=1 = use numeric error codes (cf +CMEE=2, verbose values)
Result codes "OK", "CONNECT", "RING", "NO CARRIER", "ERROR", "NO DIALTONE", "BUSY", "NO ANSWER"
ATS3 and ATS4 allow customised replacements of CR and LF,
respectively; might be useful for improved packetisation??
- AT+CFUN=0 --> minimum functionality
- AT+CFUN=1 --> full functionality
- AT+CFUN=1,1 --> full functionality and RESET THE MODEM
- AT+CFUN=4 --> transmit and receive RF signals DISABLED (flight mode??)
Consider UCS2 character set selection via `AT+CSCS="UCS2"`.
Error code table (see table 22, section 15.4, page 293 of the Quectel
manual):
| Error code | Error message |
|----------------|------------------------------|
| +CME ERROR: 10 | +CME ERROR: SIM not inserted |
| +CME ERROR: 13 | +CME ERROR: SIM failure |
URC = Unsolicited Response Code. You can tell it to send URCs to a
different port, to avoid interference with the regular AT
command/response parsing. See command `AT+QURCCFG`.
Interesting stuff about +QCFG configuring individual URC types here:
https://todo.sr.ht/~anteater/mms-stack-bugs/40
Most stacks seem to set URCs to go to the AT interface ("usbat"). The
modem's default seems to be "all".
Lots of great stuff here
https://gitlab.com/mobian1/devices/eg25-manager (of course!)
- AT+CPAS gets call status: 0 ready, 3 ringing, 4 call in progress or call on hold
- AT+CEER gets extended error report

View File

@ -0,0 +1,194 @@
||||||||||||||||||||||||| READ FIRST! ||||||||||||||||||||||||||||||
This file is outdated, for kernels 5.5+
For current information go to: https://xnux.eu/devices/feature/modem-pp.html
||||||||||||||||||||||||| READ FIRST! ||||||||||||||||||||||||||||||
Making calls work on PinePhone
------------------------------
Modem needs to be setup with:
AT+QDAI=1,0,0,1,0,1,1,1
AT+QDAI?
and restarted.
This sets modem to:
1 - Digital PCM
0 - I2S master
0 - Primary mode (short sync)
1 - 256kHz clock (256kHz / 16bit = 16k samples/s)
0 - 16bit linear format
1 - 16kHz sample
1 - 1 slot
1 - map to first slot (the only slot)
The SoC I2S0 interface needs to be configured to match this. To try various
configurations in real-time we can run pulseaudio and set it up so that:
1) alsamixer
- set "Line Out Source" to "Mono Differential"
- Unmute "AIF1 Slot 0 Digital DAC"
- (optional) unmute the microphone / mute loudpeaker
2) pulseaudio
# Outbound - connect audio from aif1 to i2s0
pactl load-module module-loopback \
source=alsa_input.platform-sound.stereo-fallback \
sink=alsa_output.platform-sound-modem.mono-fallback
# Inbound - connect audio from i2s0 to aif1
pactl load-module module-loopback \
source=alsa_input.platform-sound-modem.mono-fallback \
sink=alsa_output.platform-sound.stereo-fallback
To test inbound audio, we can play audio using modem's TTS (text to speech
functionality):
AT+QTTS=2,"Welcome to use the module of QUECTEL"
To test outbound, we can make a call. I call the pinephone from a dumbphone
and answer the call with:
ATA
I2S interface module has quite a lot of toggles/bits that can be configured,
and the right configuration was found to be:
I2S0: (initial)
0x01c22000 : 00000107
0x01c22004 : 00000f33
0x01c22008 : 00000030
0x01c2200c : 00000000
0x01c22010 : 00000000
0x01c22014 : 000400f5
0x01c22018 : 00390000
0x01c2201c : 00000088
0x01c22020 : 00000000
0x01c22024 : 000001c4
0x01c22028 : 00000000
0x01c2202c : 00000000
0x01c22030 : 00000000
0x01c22034 : 00001010
0x01c22038 : 00000000
0x01c2203c : 00000000
0x01c22040 : 00000000
0x01c22044 : 76543210
0x01c22048 : 00000000
0x01c2204c : 00000000
0x01c22050 : 00000000
0x01c22054 : 00001000
0x01c22058 : 76543210
0x01c2205c : 00000050
I2S0: (working)
0x01c22000 : 00000107
0x01c22004 : 00080f33
0x01c22008 : 00000030
0x01c2200c : 00000004
0x01c22010 : 00000006
0x01c22014 : 000400f5
0x01c22018 : 003e010e
0x01c2201c : 00000088
0x01c22020 : 00000000
0x01c22024 : 000001c4
0x01c22028 : 00316016
0x01c2202c : 00314b88
0x01c22030 : 00000000
0x01c22034 : 00000010
0x01c22038 : 00000000
0x01c2203c : 00000000
0x01c22040 : 00000000
0x01c22044 : 76543210
0x01c22048 : 00000000
0x01c2204c : 00000000
0x01c22050 : 00000000
0x01c22054 : 00001000
0x01c22058 : 76543210
0x01c2205c : 00000050
The only difference comapred to what kernels configures is that TX offset should be
set to 0. and RX offset to 1 (already is).
Linux kernel with necessary patches and DTS changes integrated is available at:
https://megous.com/git/linux/log/?h=pp-5.5
If you want to build my kernel, use this branch, because pp-5.5 branch is not
standalone and depends on ths-5.5 branch. orange-pi-5.5 is integration
branch for all my kernel work:
https://megous.com/git/linux/log/?h=orange-pi-5.5
To enable the modem in my kernel you need to run this script (only on DEV
phone version 1.0!!):
-------------------------------------------
#!/bin/sh
GPIO=/sys/class/gpio
PIN=/sys/class/gpio/gpio
PB3_PWRKEY=35
PL7_PWR=359
PC4_RESET=68
PH8_DISABLE=232
PH7_WAKEUP=231
echo $PL7_PWR > $GPIO/export
echo $PC4_RESET > $GPIO/export
echo $PH7_WAKEUP > $GPIO/export
echo $PH8_DISABLE > $GPIO/export
echo $PB3_PWRKEY > $GPIO/export
echo out > $PIN$PH8_DISABLE/direction
echo out > $PIN$PH7_WAKEUP/direction
echo out > $PIN$PC4_RESET/direction
echo out > $PIN$PL7_PWR/direction
echo out > $PIN$PB3_PWRKEY/direction
echo 0 > $PIN$PH8_DISABLE/value
echo 0 > $PIN$PH7_WAKEUP/value
echo 0 > $PIN$PC4_RESET/value
echo 1 > $PIN$PL7_PWR/value
sleep 0.1
echo 1 > $PIN$PB3_PWRKEY/value
sleep 0.2
echo 0 > $PIN$PB3_PWRKEY/value
-------------------------------------------
To disable the modem before poweroff/reboot:
-------------------------------------------
#!/bin/sh
GPIO=/sys/class/gpio
PIN=/sys/class/gpio/gpio
PB3_PWRKEY=35
PL7_PWR=359
PC4_RESET=68
PH8_DISABLE=232
PH7_WAKEUP=231
echo 1 > $PIN$PB3_PWRKEY/value
sleep 0.8
echo 0 > $PIN$PB3_PWRKEY/value
echo waiting for shutdown
sleep 30
echo 0 > $PIN$PL7_PWR/value
-------------------------------------------
Enjoy!
~megi

1
devices/samsung-herolte/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
backups/

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,164 @@
#!/usr/bin/env python3
import os
from fcntl import ioctl
from time import sleep
import struct
from collections import namedtuple
import cffi
import datetime
import sys
ffi = cffi.FFI()
# Per cbd, "SS310 modem", "shannon310". This is a Samsung Galaxy S7 SM-G930F.
# ["/sbin/cbd", "-d", "-tss310", "-bm", "-mm", "-P", "platform/155a0000.ufs/by-name/RADIO"]
# Aha! If we stay as root, then the security_request(2, 0, 0) fails
# with error code 11. cbd does setuid(1001) (while retaining
# capabilities!) before doing security_request(2, 0, 0), and in that
# case it succeeds with error code 0. HOWEVER it seems like you can
# ask cbd to stay as root with `-or`, in which case it gets the error
# code 11 too - which it ignores! The modem seems (?) well-configured
# afterward, so perhaps it's not required?
def mkstruct(name, fields, spec):
cls = namedtuple(name, fields)
def iter_load(bs):
return map(cls._make, struct.iter_unpack(spec, bs))
cls.iter_load = iter_load
def load(bs):
return cls._make(struct.unpack(spec, bs))
cls.load = load
def iter_save(items):
return b''.join(struct.pack(spec, *item) for item in items)
cls.iter_save = iter_save
def save(item):
return struct.pack(spec, *item)
cls.save = save
return cls
TOC = mkstruct('TOC', 'name offset loadaddr size crc entryid', '<12sIIIII')
# struct modem_firmware
FirmwareChunk = mkstruct('FirmwareChunk', 'binary size m_offset b_offset mode len', '<QIIIII')
# struct modem_sec_req
SecReq = mkstruct('SecReq', 'mode size_boot size_main', '<III4x')
def get_srinfo(fd):
buf = bytearray(struct.pack('<I1020x', 1020)) # SHMEM_SRINFO_SIZE in link_device_shmem.c
print('get_srinfo', ioctl(fd, 0x6f45, buf))
return buf
# enum modem_state from modem_prj.h
enum_modem_state = [
'STATE_OFFLINE',
'STATE_CRASH_RESET',
'STATE_CRASH_EXIT',
'STATE_BOOTING',
'STATE_ONLINE',
'STATE_NV_REBUILDING',
'STATE_LOADER_DONE',
'STATE_SIM_ATTACH',
'STATE_SIM_DETACH',
'STATE_CRASH_WATCHDOG',
]
def modem_status(fd):
return enum_modem_state[ioctl(fd, 0x6f27)]
def modem_on(fd):
print('modem_on', ioctl(fd, 0x6f19))
def modem_boot_on(fd):
print('modem_boot_on', ioctl(fd, 0x6f22))
def modem_boot_off(fd):
print('modem_boot_off', ioctl(fd, 0x6f23))
def modem_dl_start(fd):
print('modem_dl_start', ioctl(fd, 0x6f28))
def modem_reset(fd):
print('modem_reset', ioctl(fd, 0x6f21))
def security_request(fd, req):
print(req, ioctl(fd, 0x6f53, bytearray(req.save())))
def send_chunk(fd, total_size, load_offset, chunk, file_offset):
p = ffi.from_buffer(chunk)
mode = 0 ## cbd uses mode 0 for all three uploads
mf = FirmwareChunk(int(ffi.cast('long long', p)), total_size, load_offset, file_offset, mode, len(chunk))
print(mf, ioctl(fd, 0x6f40, bytearray(mf.save())))
def send_region(fd, fh, entry, base_loadaddr):
load_offset = entry.loadaddr - base_loadaddr
file_offset = entry.offset
fh.seek(file_offset)
total_size = entry.size
remaining = total_size
while remaining > 0:
chunksize = min(remaining, 62 * 1024)
chunk = fh.read(chunksize)
send_chunk(fd, total_size, load_offset, chunk, file_offset)
load_offset = load_offset + chunksize
file_offset = file_offset + chunksize
remaining = remaining - chunksize
print('poke_modem')
boot0_path = '/dev/umts_boot0'
firmware_partition = '/dev/disk/by-partlabel/RADIO'
nv_data_path = '/efs/nv_data.bin'
with open('/sys/power/wake_lock', 'wb') as f:
f.write(b'ss310')
boot0_fd = os.open(boot0_path, os.O_RDWR)
with open(firmware_partition, 'rb') as f:
toc = list(TOC.iter_load(f.read(512)))
(boot_toc_entry, main_toc_entry, nv_toc_entry) = toc[1:4]
print(toc[0])
print(boot_toc_entry)
print(main_toc_entry)
print(nv_toc_entry)
# get_srinfo(boot0_fd)
# modem_status(boot0_fd)
modem_reset(boot0_fd)
security_request(boot0_fd, SecReq(2, 0, 0))
with open(firmware_partition, 'rb') as f:
send_region(boot0_fd, f, boot_toc_entry, boot_toc_entry.loadaddr)
send_region(boot0_fd, f, main_toc_entry, boot_toc_entry.loadaddr)
with open(nv_data_path, 'rb') as f:
send_region(boot0_fd, f, nv_toc_entry, boot_toc_entry.loadaddr)
security_request(boot0_fd, SecReq(0, boot_toc_entry.size, main_toc_entry.size))
modem_on(boot0_fd)
modem_boot_on(boot0_fd)
modem_dl_start(boot0_fd)
os.write(boot0_fd, bytearray(struct.pack('I', 0x0000900d)))
print(hex(struct.unpack('I', os.read(boot0_fd, 4))[0]))
os.write(boot0_fd, bytearray(struct.pack('I', 0x00009f00)))
print(hex(struct.unpack('I', os.read(boot0_fd, 4))[0]))
modem_boot_off(boot0_fd)
os.close(boot0_fd)
with open('/sys/power/wake_unlock', 'wb') as f:
f.write(b'ss310')
sys.stdout.flush()
with open(boot0_path, 'rb') as f:
while True:
i = f.read(512)
if len(i) > 0:
print(str(datetime.datetime.now()), '({:03x})'.format(len(i)), modem_status(f.raw.fileno()), i.hex())
sys.stdout.flush()
else:
sleep(1)

View File

@ -0,0 +1,109 @@
#!/usr/bin/env python3
import os
from fcntl import ioctl
from time import sleep
import struct
from collections import namedtuple
import cffi
import select
import datetime
import sys
ffi = cffi.FFI()
def mkstruct(name, fields, spec):
cls = namedtuple(name, fields)
def iter_load(bs):
return map(cls._make, struct.iter_unpack(spec, bs))
cls.iter_load = iter_load
def load(bs):
return cls._make(struct.unpack(spec, bs))
cls.load = load
def iter_save(items):
return b''.join(struct.pack(spec, *item) for item in items)
cls.iter_save = iter_save
def save(item):
return struct.pack(spec, *item)
cls.save = save
return cls
# struct sipc_fmt_hdr, modem_prj.h
Packet = mkstruct('Packet', 'len msg_seq ack_seq main_cmd sub_cmd cmd_type', '<HBBBBB')
# enum modem_state from modem_prj.h
enum_modem_state = [
'STATE_OFFLINE',
'STATE_CRASH_RESET',
'STATE_CRASH_EXIT',
'STATE_BOOTING',
'STATE_ONLINE',
'STATE_NV_REBUILDING',
'STATE_LOADER_DONE',
'STATE_SIM_ATTACH',
'STATE_SIM_DETACH',
'STATE_CRASH_WATCHDOG',
]
def modem_status(fd):
return enum_modem_state[ioctl(fd, 0x6f27)]
class Driver(object):
def __init__(self, name, fd):
self.name = name
self.fd = fd
def read_ready(self):
i = os.read(self.fd, 65536)
self.decode(i)
print(str(datetime.datetime.now()), self.name, '({:04x})'.format(len(i)), self.statusreport())
def decode(self, bs):
raise Exception('subclassResponsibility')
def statusreport(self):
raise Exception('subclassResponsibility')
class IpcDriver(Driver):
def __init__(self, *args):
super().__init__(*args)
self.head = None
self.body = b''
self.leftover = b''
def decode(self, bs):
self.head = Packet.load(bs[:7])
bodysize = self.head.len - 7
self.body = bs[7:self.head.len]
self.leftover = bs[self.head.len:]
def statusreport(self):
return ' '.join([modem_status(self.fd), repr(self.head), self.body.hex(), repr(self.body), self.leftover.hex()])
class RfsDriver(Driver):
def __init__(self, *args):
super().__init__(*args)
self.packet = b''
def decode(self, bs):
self.packet = bs
def statusreport(self):
return self.packet.hex()
ipc0_path = '/dev/umts_ipc0'
rfs0_path = '/dev/umts_rfs0'
ipc0_fd = os.open(ipc0_path, os.O_RDWR)
rfs0_fd = os.open(rfs0_path, os.O_RDWR)
drivers = {}
drivers[ipc0_fd] = IpcDriver('ipc0', ipc0_fd)
drivers[rfs0_fd] = RfsDriver('rfs0', rfs0_fd)
while True:
(readfds, _writefds, errorfds) = select.select([ipc0_fd, rfs0_fd], [], [ipc0_fd, rfs0_fd])
if len(errorfds) != 0:
print('AIEEE', errorfds)
break
for fd in readfds:
drivers[fd].read_ready()
sys.stdout.flush()

View File

@ -0,0 +1,34 @@
#!/usr/bin/env python3
# shell quoting sucks *so hard* that I switched to python.
# PostmarketOS comes with mkbootimg-osm0sis and unpackbootimg, which
# aren't *quite* inverses of each other. This script is a
# quick-and-dirty almost-inverse of unpackbootimg.
import sys
import os
[_exe, basefilename] = sys.argv
cmdline = ['mkbootimg-osm0sis']
for p in ['base', 'board', 'cmdline', 'hashtype',
'kernel_offset', 'os_patch_level', 'os_version', 'pagesize',
'ramdisk_offset', 'second_offset', 'tags_offset']:
filename = basefilename + '-' + p
try:
with open(filename, 'rt') as f:
param = f.read().strip()
except FileNotFoundError:
param = ''
if param:
cmdline.append('--' + p)
cmdline.append(param)
cmdline = cmdline + ['--kernel', basefilename + '-zImage',
'--dt', basefilename + '-dt',
'--ramdisk', basefilename + '-ramdisk.gz',
'-o', basefilename]
os.execvp(cmdline[0], cmdline)

View File

@ -0,0 +1,2 @@
#!/bin/sh
sudo python3 qnd_cbd.py | tee cbd.log

View File

@ -0,0 +1,2 @@
#!/bin/sh
sudo python3 qnd_ril.py | tee ril.log

View File

@ -0,0 +1,11 @@
#!/usr/bin/env python3
import sys
import re
def unescape1(m):
v = int(m[1], 16)
return m[0] if v < 32 or v > 127 else chr(v)
for line in sys.stdin.readlines():
sys.stdout.write(re.sub(r'\\x([0-9a-fA-F]{2})', unescape1, line))

1
dpi.fallback Normal file
View File

@ -0,0 +1 @@
256

View File

@ -0,0 +1,34 @@
Font Awesome Free License
-------------------------
Font Awesome Free is free, open source, and GPL friendly. You can use it for
commercial projects, open source projects, or really almost whatever you want.
Full Font Awesome Free license: https://fontawesome.com/license/free.
# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
In the Font Awesome Free download, the CC BY 4.0 license applies to all icons
packaged as SVG and JS file types.
# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)
In the Font Awesome Free download, the SIL OFL license applies to all icons
packaged as web and desktop font files.
# Code: MIT License (https://opensource.org/licenses/MIT)
In the Font Awesome Free download, the MIT license applies to all non-font and
non-icon files.
# Attribution
Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
Awesome Free files already contain embedded comments with sufficient
attribution, so you shouldn't need to do anything additional when using these
files normally.
We've kept attribution comments terse, so we ask that you do not actively work
to remove them from files, especially code. They're a great way for folks to
learn about Font Awesome.
# Brand Icons
All brand icons are trademarks of their respective owners. The use of these
trademarks does not indicate endorsement of the trademark holder by Font
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
to represent the company, product, or service to which they refer.**

View File

@ -0,0 +1,140 @@
<h1><img src="https://img.fortawesome.com/349cfdf6/fa-free-logo.svg" alt="Font Awesome Free" width="50%"></h1>
> Version 5 the iconic SVG, font, and CSS framework
The internet's most popular icon toolkit has been redesigned and built from
scratch. On top of this, features like icon font ligatures, an SVG framework,
official NPM packages for popular frontend libraries like React, and access to
a new CDN.
Not familiar with Font Awesome 5? [Learn
more](https://www.kickstarter.com/projects/232193852/font-awesome-5) about our
successful Kickstarter and plan. You can also **[order Font Awesome
Pro](https://fontawesome.com/pro)** which includes tons more icons directly
from [fontawesome.com](https://fontawesome.com).
## Documentation
Learn how to get started with Font Awesome and then dive deeper into other and advanced topics:
### Using Font Awesome on the Web
* [With SVG with JavaScript](https://fontawesome.com/how-to-use/on-the-web/setup/getting-started?using=svg-with-js)
* [With web fonts with CSS](https://fontawesome.com/how-to-use/on-the-web/setup/getting-started?using=web-fonts-with-css)
* [Upgrading from version 4](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4)
* [Installing Font Awesome with a package manager](https://fontawesome.com/how-to-use/on-the-web/setup/using-package-managers)
* [Downloading + hosting Font Awesome yourself](https://fontawesome.com/how-to-use/on-the-web/setup/hosting-font-awesome-yourself)
* [Performance and security](https://fontawesome.com/how-to-use/performance-and-security)
* [Accessibility](https://fontawesome.com/how-to-use/on-the-web/other-topics/accessibility)
* [Troubleshooting](https://fontawesome.com/how-to-use/on-the-web/other-topics/troubleshooting)
#### Advanced Options & Techniques
* [Using CSS pseudo-elements](https://fontawesome.com/how-to-use/on-the-web/advanced/css-pseudo-elements)
* [SVG sprites](https://fontawesome.com/how-to-use/svg-sprites)
* [The Font Awesome API](https://fontawesome.com/how-to-use/font-awesome-api)
* [SVG symbols](https://fontawesome.com/how-to-use/on-the-web/advanced/svg-symbols)
* [SVG JavaScript Core](https://fontawesome.com/how-to-use/on-the-web/advanced/svg-javascript-core)
* [Server side rendering](https://fontawesome.com/how-to-use/server-side-rendering)
### Using Font Awesome on the Desktop
* [Getting started](https://fontawesome.com/how-to-use/on-the-desktop/setup/getting-started)
* [Upgrading from version 4](https://fontawesome.com/how-to-use/on-the-desktop/setup/upgrading-from-version-4)
* [Using ligatures](https://fontawesome.com/how-to-use/on-the-desktop/referencing-icons/using-ligatures)
* [Using glyphs](https://fontawesome.com/how-to-use/on-the-desktop/referencing-icons/using-glyphs)
* [Troubleshooting](https://fontawesome.com/how-to-use/on-the-desktop/other-topics/troubleshooting)
### Where did Font Awesome 4 (or 3) go?
Now that Font Awesome 5 has been released we are marking version 4 as
end-of-life. We don't plan on releasing any further versions of the 4.x or 3.x.
Documentation is still available but it's moved to
[https://fontawesome.com/v4.7.0](https://fontawesome.com/v4.7.0) and
[https://fontawesome.com/v3.2.1](https://fontawesome.com/v3.2.1).
The Git repository for
[v4.7.0](https://github.com/FortAwesome/Font-Awesome/releases/tag/v4.7.0) and
[v3.2.1](https://github.com/FortAwesome/Font-Awesome/releases/tag/v3.2.1) can
be found in our GitHub releases.
## Change log
We'll keep track of each release in the [CHANGELOG.md](./CHANGELOG.md)
Looking for older versions of Font Awesome? Check the [releases](https://github.com/FortAwesome/Font-Awesome/releases).
## Upgrading
From time-to-time we'll have special upgrading instructions from one version to the next.
Check out the [UPGRADING.md](./UPGRADING.md) guide when you upgrade your dependencies.
## Code of conduct
We will behave ourselves if you behave yourselves. For more details see our
[CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).
## Contributing
Please read through our [contributing guidelines](./CONTRIBUTING.md). Included
are directions for opening issues.
## Versioning
Font Awesome will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered
with the following format:
`<major>.<minor>.<patch>`
For more information on SemVer, please visit http://semver.org.
**The major version "5" is part of an umbrella release. It includes many different types of files and technologies. Therefore
we deviate from normal SemVer in the following ways:**
* Any release may update the design, look-and-feel, or branding of an existing
icon
* We will never intentionally release a `patch` version update that breaks
backward compatibility
* A `minor` release **may include backward-incompatible changes** but we will
write clear upgrading instructions in UPGRADING.md
* A `minor` or `patch` release will never remove icons
* Bug fixes will be addressed as `patch` releases unless they include backward
incompatibility then they will be `minor` releases
## License
Font Awesome Free is free, open source, and GPL friendly. You can use it for
commercial projects, open source projects, or really almost whatever you want.
- Icons — CC BY 4.0 License
- In the Font Awesome Free download, the CC BY 4.0 license applies to all icons packaged as .svg and .js files types.
- Fonts — SIL OFL 1.1 License
- In the Font Awesome Free download, the SIL OLF license applies to all icons packaged as web and desktop font files.
- Code — MIT License
- In the Font Awesome Free download, the MIT license applies to all non-font and non-icon files.
Attribution is required by MIT, SIL OLF, and CC BY licenses. Downloaded Font
Awesome Free files already contain embedded comments with sufficient
attribution, so you shouldn't need to do anything additional when using these
files normally.
We've kept attribution comments terse, so we ask that you do not actively work
to remove them from files, especially code. They're a great way for folks to
learn about Font Awesome.
## Team
* [Dave Gandy](https://github.com/davegandy)
* [Travis Chase](https://github.com/supercodepoet)
* [Rob Madole](https://github.com/robmadole)
* [Brian Talbot](https://github.com/talbs)
* [Jory Raphael](https://github.com/sensibleworld)
* [Mike Wilkerson](https://github.com/mlwilkerson)
* [Frances Botsford](https://github.com/frrrances)
* [Trevor Chase](https://github.com/trevorchase)
* [Jason Lundien](https://github.com/jasonlundien)
* [Jason Otero](https://github.com/deathnfudge)
* [Edward Emanuel](https://github.com/ej2)
* [Kelsey Jackson](https://github.com/kelseythejackson)
* [Geremia Taglialatela](https://github.com/tagliala)

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,298 @@
area-chart:
name: chart-area
arrow-circle-o-down:
name: arrow-alt-circle-down
prefix: far
arrow-circle-o-left:
name: arrow-alt-circle-left
prefix: far
arrow-circle-o-right:
name: arrow-alt-circle-right
prefix: far
arrow-circle-o-up:
name: arrow-alt-circle-up
prefix: far
arrows:
name: arrows-alt
arrows-alt:
name: expand-arrows-alt
arrows-h:
name: arrows-alt-h
arrows-v:
name: arrows-alt-v
bar-chart:
name: chart-bar
prefix: far
bitbucket-square:
name: bitbucket
prefix: fab
calendar:
name: calendar-alt
calendar-o:
name: calendar
prefix: far
caret-square-o-down:
name: caret-square-down
prefix: far
caret-square-o-left:
name: caret-square-left
prefix: far
caret-square-o-right:
name: caret-square-right
prefix: far
caret-square-o-up:
name: caret-square-up
prefix: far
cc:
name: closed-captioning
prefix: far
chain-broken:
name: unlink
circle-o-notch:
name: circle-notch
circle-thin:
name: circle
prefix: far
clipboard:
prefix: far
clone:
prefix: far
cloud-download:
name: cloud-download-alt
cloud-upload:
name: cloud-upload-alt
code-fork:
name: code-branch
comment-alt:
name: comment-dots
prefix: far
commenting:
name: comment-dots
compass:
prefix: far
compress:
name: compress-alt
copyright:
prefix: far
creative-commons:
prefix: fab
credit-card:
prefix: far
credit-card-alt:
name: credit-card
cutlery:
name: utensils
diamond:
name: gem
prefix: far
eercast:
name: sellcast
prefix: fab
eur:
name: euro-sign
exchange:
name: exchange-alt
expand:
name: expand-alt
external-link:
name: external-link-alt
external-link-square:
name: external-link-square-alt
eye:
prefix: far
eye-dropper:
name: eye-dropper
prefix: far
eye-slash:
prefix: far
eyedropper:
name: eye-dropper
facebook:
name: facebook-f
prefix: fab
facebook-official:
name: facebook
prefix: fab
file-text:
name: file-alt
files-o:
name: copy
prefix: far
floppy-o:
name: save
prefix: far
gbp:
name: pound-sign
glass:
name: glass-martini
google-plus:
name: google-plus-g
prefix: fab
google-plus-circle:
name: google-plus
prefix: fab
google-plus-official:
name: google-plus
prefix: fab
hand-o-down:
name: hand-point-down
prefix: far
hand-o-left:
name: hand-point-left
prefix: far
hand-o-right:
name: hand-point-right
prefix: far
hand-o-up:
name: hand-point-up
prefix: far
header:
name: heading
id-badge:
prefix: far
ils:
name: shekel-sign
inr:
name: rupee-sign
intersex:
name: transgender
jpy:
name: yen-sign
krw:
name: won-sign
level-down:
name: level-down-alt
level-up:
name: level-up-alt
life-ring:
prefix: far
line-chart:
name: chart-line
linkedin:
name: linkedin-in
prefix: fab
linkedin-square:
name: linkedin
prefix: fab
list-alt:
prefix: far
long-arrow-down:
name: long-arrow-alt-down
long-arrow-left:
name: long-arrow-alt-left
long-arrow-right:
name: long-arrow-alt-right
long-arrow-up:
name: long-arrow-alt-up
map-marker:
name: map-marker-alt
meanpath:
name: font-awesome
prefix: fab
mobile:
name: mobile-alt
money:
name: money-bill-alt
prefix: far
object-group:
prefix: far
object-ungroup:
prefix: far
paste:
prefix: far
pencil:
name: pencil-alt
pencil-square:
name: pen-square
pencil-square-o:
name: edit
prefix: far
picture:
name: image
pie-chart:
name: chart-pie
refresh:
name: sync
registered:
prefix: far
repeat:
name: redo
rub:
name: ruble-sign
scissors:
name: cut
shield:
name: shield-alt
sign-in:
name: sign-in-alt
sign-out:
name: sign-out-alt
sliders:
name: sliders-h
sort-alpha-asc:
name: sort-alpha-down
sort-alpha-desc:
name: sort-alpha-down-alt
sort-amount-asc:
name: sort-amount-down
sort-amount-desc:
name: sort-amount-down-alt
sort-asc:
name: sort-up
sort-desc:
name: sort-down
sort-numeric-asc:
name: sort-numeric-down
sort-numeric-desc:
name: sort-numeric-down-alt
spoon:
name: utensil-spoon
star-half-empty:
name: star-half
star-half-full:
name: star-half
support:
name: life-ring
prefix: far
tablet:
name: tablet-alt
tachometer:
name: tachometer-alt
television:
name: tv
thumb-tack:
name: thumbtack
thumbs-o-down:
name: thumbs-down
prefix: far
thumbs-o-up:
name: thumbs-up
prefix: far
ticket:
name: ticket-alt
trash:
name: trash-alt
trash-o:
name: trash-alt
prefix: far
try:
name: lira-sign
usd:
name: dollar-sign
video-camera:
name: video
vimeo:
name: vimeo-v
prefix: fab
volume-control-phone:
name: phone-volume
wheelchair-alt:
name: accessible-icon
prefix: fab
window-maximize:
prefix: far
window-restore:
prefix: far
youtube-play:
name: youtube
prefix: fab

View File

@ -0,0 +1,744 @@
accusoft:
icons:
- accusoft
label: Accusoft
url: 'https://www.accusoft.com'
administrator-technology:
icons:
- stream
label: Administrator Technology
url: 'https://administrator.de'
adversal:
icons:
- adversal
label: Adversal
url: 'https://www.adversal.com'
affiliatetheme:
icons:
- affiliatetheme
label: affiliatetheme
url: 'https://affiliatetheme.io/en'
algolia:
icons:
- algolia
label: Algolia
url: 'http://www.algolia.com'
amazon-web-services:
icons:
- aws
label: Amazon Web Services
url: 'https://aws.amazon.com'
amilia:
icons:
- amilia
label: Amilia
url: 'http://www.amilia.com'
angry-creative:
icons:
- angrycreative
label: Angry Creative
url: 'https://angrycreative.se'
app-signal:
icons:
- stroopwafel
label: AppSignal
url: 'https://appsignal.com'
apper-systems-ab:
icons:
- apper
label: Apper Systems AB
url: 'http://www.apper.com'
'asymmetrik,ltd':
icons:
- asymmetrik
label: 'Asymmetrik, Ltd.'
url: 'http://asymmetrik.com'
ausmed-education:
icons:
- user-nurse
label: Ausmed Education
url: 'https://www.ausmed.com.au'
avianex:
icons:
- avianex
label: avianex
url: 'https://www.avianex.de'
bi-mobject:
icons:
- bimobject
label: BIMobject
url: 'http://bimobject.com'
bity:
icons:
- bity
label: Bity
url: 'http://bity.com'
blackpulp-designs:
icons:
- pray
label: Blackpulp Designs
url: 'https://www.blackpulp.com'
blissbook:
icons:
- pen-fancy
label: Blissbook
url: 'https://blissbook.com'
büromöbel-experte-gmb-h &co-kg:
icons:
- buromobelexperte
label: Büromöbel-Experte GmbH & Co. KG.
url: 'https://www.bueromoebel-experte.de'
c-panel:
icons:
- cpanel
label: cPanel
url: 'http://cpanel.com'
centercode:
icons:
- centercode
label: Centercode
url: 'https://www.centercode.com'
cibltd:
icons:
- drum-steelpan
label: Comprehensive Insurance Brokers Limited
url: 'http://www.cibltd.com'
clear-blue-technologies:
icons:
- solar-panel
label: Clear Blue Technologies
url: 'http://www.clearbluetechnologies.com'
cloudflare:
icons:
- cloudflare
label: Cloudflare
url: 'https://www.cloudflare.com'
cloudscale-ch:
icons:
- cloudscale
label: cloudscale.ch
url: 'https://www.cloudscale.ch'
cloudsmith:
icons:
- cloudsmith
label: Cloudsmith
url: 'https://cloudsmith.io'
cloudversify:
icons:
- cloudversify
label: cloudversify
url: 'https://www.cloudversify.com'
cuttlefish:
icons:
- cuttlefish
label: Cuttlefish
url: 'http://wearecuttlefish.com'
cymedica:
icons:
- wave-square
label: CyMedica
url: 'https://www.cymedicaortho.com'
darren-wiebe:
icons:
- church
label: Darren Wiebe
deploy-dog:
icons:
- deploydog
label: deploy.dog
url: 'http://deploy.dog'
deskpro:
icons:
- deskpro
label: Deskpro
url: 'http://www.deskpro.com'
discourse:
icons:
- discourse
label: Discourse
url: 'https://discourse.org'
doc-hub:
icons:
- dochub
label: DocHub
url: 'https://dochub.com'
draft2-digital:
icons:
- draft2digital
label: Draft2Digital
url: 'http://draft2digital.com'
dyalog-apl:
icons:
- dyalog
label: Dyalog APL
url: 'http://www.dyalog.com'
econopublish:
icons:
- hat-cowboy-side
label: EconoPublish
url: 'https://www.econopublish.com'
firstdraft:
icons:
- firstdraft
label: firstdraft
url: 'http://www.firstdraft.com'
fleetplan:
icons:
- helicopter
label: FLEETPLAN
url: 'https://www.fleetplan.net'
getaroom:
icons:
- archway
- dumbbell
- hotel
- map-marked
- map-marked-alt
- monument
- spa
- swimmer
- swimming-pool
label: getaroom
url: 'https://www.getaroom.com'
git-kraken:
icons:
- gitkraken
label: GitKraken
url: 'https://www.gitkraken.com'
gofore:
icons:
- gofore
label: Gofore
url: 'http://gofore.com'
'gripfire,inc':
icons:
- gripfire
label: 'Gripfire, Inc.'
url: 'http://gripfire.io'
guilded:
icons:
- guilded
label: Guilded
url: 'https://www.guilded.gg'
harvard-medical-school:
icons:
- allergies
- ambulance
- band-aid
- briefcase-medical
- burn
- capsules
- diagnoses
- dna
- file-medical
- file-medical-alt
- first-aid
- heart
- heartbeat
- hospital
- hospital-alt
- hospital-symbol
- id-card-alt
- notes-medical
- pills
- plus
- prescription-bottle
- prescription-bottle-alt
- procedures
- smoking
- stethoscope
- syringe
- tablets
- thermometer
- user-md
- vial
- vials
- weight
- x-ray
label: Harvard Medical School
url: 'https://hms.harvard.edu'
hips:
icons:
- hips
label: Hips
url: 'https://hips.com'
hire-a-helper:
icons:
- archive
- box-open
- couch
- dolly
- people-carry
- route
- sign
- suitcase
- tape
- truck-loading
- truck-moving
- wine-glass
label: HireAHelper
url: 'https://www.hireahelper.com'
hive:
icons:
- hive
label: Hive Blockchain Network
url: 'https://hive.io'
hornbill:
icons:
- hornbill
label: Hornbill
url: 'https://www.hornbill.com'
hotjar:
icons:
- hotjar
label: Hotjar
url: 'https://www.hotjar.com'
hub-spot:
icons:
- hubspot
label: HubSpot
url: 'http://www.HubSpot.com'
in-site-systems:
icons:
- toolbox
label: InSite Systems
url: 'https://www.insitesystems.com'
innosoft:
icons:
- innosoft
label: Innosoft
url: 'https://innosoft.com.sa'
inspira-bvba:
icons:
- chess-knight
label: Inspira bvba
url: 'https://www.inspira.be'
instalod:
icons:
- instalod
label: InstaLOD
url: 'https://instalod.com'
joe-emison:
icons:
- blender-phone
label: Joe Emison
joget:
icons:
- joget
label: Joget
url: 'http://www.joget.org'
jon-galloway:
icons:
- crow
label: Jon Galloway
kevin-barone:
icons:
- file-contract
label: Kevin Barone
key-cdn:
icons:
- keycdn
label: KeyCDN
url: 'https://www.keycdn.com'
korvue:
icons:
- korvue
label: Korvue
url: 'https://korvue.com'
max-elman:
icons:
- frog
label: Max Elman
med-apps:
icons:
- medapps
label: MedApps
url: 'http://medapps.com.au'
medapps:
icons:
- book-medical
- clinic-medical
- comment-medical
- crutch
- disease
- hospital-user
- laptop-medical
- pager
label: MedApps
url: 'https://medapps.com.au'
megaport:
icons:
- megaport
label: Megaport
url: 'https://www.megaport.com'
mix:
icons:
- mix
label: Mix
url: 'http://mix.com'
mizuni:
icons:
- mizuni
label: Mizuni
url: 'http://www.mizuni.com'
mrt:
icons:
- medrt
label: MRT
url: 'https://medrt.co.jp'
mylogin-info:
icons:
- user-shield
label: mylogin.info
url: 'https://www.mylogin.info'
napster:
icons:
- napster
label: Napster
url: 'http://www.napster.com'
nimblr:
icons:
- nimblr
label: Nimblr
url: 'https://nimblr.ai'
nompse:
icons:
- chalkboard
- chalkboard-teacher
label: Nomp.se
url: 'https://nomp.se'
ns8:
icons:
- ns8
label: NS8
url: 'https://www.ns8.com'
nutritionix:
icons:
- nutritionix
label: Nutritionix
url: 'http://www.nutritionix.com'
octopus-deploy:
icons:
- octopus-deploy
label: Octopus Deploy
url: 'https://octopus.com'
page4-corporation:
icons:
- page4
label: page4 Corporation
url: 'https://en.page4.com'
pal-fed:
icons:
- palfed
label: PalFed
url: 'https://www.palfed.com'
patch-patrol:
icons:
- vest
- vest-patches
label: Patch Patrol
url: 'https://patchpatrol.com'
pcsg:
icons:
- horse-head
label: PCSG
url: 'https://www.pcsg.de'
perbyte:
icons:
- perbyte
label: PerByte
url: 'https://www.perbyte.com'
phabricator:
icons:
- phabricator
label: Phabricator
url: 'http://phacility.com'
promo-wizard:
icons:
- hat-wizard
label: Promo Wizard
url: 'https://promowizard.co.uk'
pulse-eight:
icons:
- volume-mute
label: Pulse-Eight
url: 'https://pulse-eight.com'
purely-interactive:
icons:
- kiwi-bird
label: Purely Interactive
url: 'https://www.purelyinteractive.ca'
pushed:
icons:
- pushed
label: Pushed
url: 'https://pushed.co'
quin-scape:
icons:
- quinscape
label: QuinScape
url: 'https://www.quinscape.de'
reacteurope:
icons:
- reacteurope
label: ReactEurope
url: 'https://www.react-europe.org'
readme-io:
icons:
- readme
label: Readme.io
url: 'http://readme.io'
red-river:
icons:
- red-river
label: red river
url: 'https://river.red'
replyd:
icons:
- replyd
label: replyd
resolving:
icons:
- resolving
label: Resolving
url: 'https://resolving.com'
rev-io:
icons:
- rev
label: Rev.io
url: 'https://rev.io'
rock-rms:
icons:
- rockrms
label: Rock RMS
url: 'http://rockrms.com'
rocket-chat:
icons:
- comment
- comment-alt
- comment-dots
- comment-slash
- comments
- frown
- meh
- phone
- phone-slash
- poo
- quote-left
- quote-right
- rocketchat
- smile
- video
- video-slash
label: Rocket.Chat
url: 'https://rocket.chat'
rodney-oliver:
icons:
- folder-minus
- folder-plus
label: Rodney Oliver
schlix:
icons:
- schlix
label: SCHLIX
url: 'http://schlix.com'
search-eng-in:
icons:
- searchengin
label: SearchEng.in
url: 'http://searcheng.in'
service-stack:
icons:
- servicestack
label: ServiceStack
url: 'https://servicestack.net'
shawn-storie:
icons:
- teeth
- teeth-open
label: Shawn Storie
shopware:
icons:
- shopware
label: Shopware
url: 'https://shopware.de'
shp:
icons:
- school
label: SHP
url: 'http://shp.com'
silicon-barn-inc:
icons:
- project-diagram
label: Silicon Barn Inc
url: 'https://siliconbarn.com'
sistrix:
icons:
- sistrix
label: SISTRIX
url: 'https://www.sistrix.de'
smup:
icons:
- shoe-prints
label: Smup
url: 'https://www.atomsoftware.com.au'
speakap:
icons:
- speakap
label: Speakap
url: 'https://speakap.com'
stay-linked:
icons:
- box
- boxes
- clipboard-check
- clipboard-list
- dolly
- dolly-flatbed
- pallet
- shipping-fast
- truck
- warehouse
label: StayLinked
url: 'https://www.staylinked.com'
sticker-mule:
icons:
- sticker-mule
label: Sticker Mule
url: 'https://stickermule.com'
studio-vinari:
icons:
- studiovinari
label: Studio Vinari
url: 'https://studiovinari.com'
supple:
icons:
- ad
- bullhorn
- bullseye
- comment-dollar
- comments-dollar
- envelope-open-text
- funnel-dollar
- mail-bulk
- poll
- poll-h
- search-dollar
- search-location
- supple
label: Supple
url: 'https://supple.com.au'
the-red-yeti:
icons:
- the-red-yeti
label: The Red Yeti
url: 'http://theredyeti.com'
the-us-sunnah-foundation:
icons:
- dollar-sign
- donate
- dove
- gift
- globe
- hand-holding-heart
- hand-holding-usd
- hand-holding-water
- hands-helping
- handshake
- heart
- leaf
- parachute-box
- piggy-bank
- ribbon
- seedling
label: The us-Sunnah Foundation
url: 'https://www.ussunnah.org'
themeco:
icons:
- themeco
label: Themeco
url: 'https://theme.co'
think-peaks:
icons:
- think-peaks
label: Think Peaks
url: 'https://thinkpeaks.com/'
typo3:
icons:
- typo3
label: Typo3
url: 'https://typo3.org'
uncharted:
icons:
- uncharted
label: Uncharted Software
url: 'https://uncharted.software'
uniregistry:
icons:
- uniregistry
label: Uniregistry
url: 'https://uniregistry.com'
us-sunnah-foundation:
icons:
- ussunnah
label: us-Sunnah Foundation
url: 'https://www.ussunnah.org'
vaadin:
icons:
- vaadin
label: Vaadin
url: 'http://vaadin.com'
via:
icons:
- car-crash
- draw-polygon
- house-damage
- layer-group
- skull-crossbones
- user-injured
label: VIA Traffic Software Solutions
url: 'https://www.via.software'
victor-costan:
icons:
- otter
label: Staphany Park and Victor Costan
vnv:
icons:
- vnv
label: VNV
url: 'https://www.vnv.ch'
watchman-monitoring:
icons:
- watchman-monitoring
label: Watchman Monitoring
url: 'https://www.watchmanmonitoring.com'
weedable:
icons:
- bong
- cannabis
- hippo
- joint
- mortar-pestle
- prescription
label: Weedable
url: 'https://www.weedable.com'
whmcs:
icons:
- whmcs
label: WHMCS
url: 'https://www.whmcs.com'
wodu:
icons:
- wodu
label: Wodu Media
url: 'https://www.wodu.com'
workrails:
icons:
- briefcase
label: WorkRails
url: 'https://www.workrails.com'
wpressr:
icons:
- wpressr
label: wpressr
url: 'https://wpressr.com'

201
fonts/from-github/LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Binary file not shown.

BIN
gsm-specs/TP-99118.pdf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

1
images/README.md Normal file
View File

@ -0,0 +1 @@
Development images go here, one per subfolder.

3
postmarketos-rndis.txt Normal file
View File

@ -0,0 +1,3 @@
sudo ip link set dev eth0 address 12:12:12:12:12:12
sudo ip address add dev eth0 172.16.42.2/24
SSH_AUTH_SOCK= ssh user@172.16.42.1

4
proxy-modem-pinephone.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
HOST=${1:-pm-rndis}
ssh ${HOST} "stty -F /dev/EG25.AT raw"
socat -v PTY,link=$HOME/src/squeak-phone/pinephone-modem,cfmakeraw EXEC:'ssh -T '"${HOST}"' socat - /dev/EG25.AT'

10
pull-image-from-phone.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh
set -eu
HOST=${1:-pm-rndis}
rsync -avu \
${HOST}:squeak.changes \
${HOST}:squeak.image \
images/current/.
rsync -avu \
${HOST}:squeak-output.log \
.

14
push-image-to-phone.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/sh
set -eu
HOST=${1:-pm-rndis}
SUDOPASS=${SUDOPASS:-user}
rsync -avu \
images/current/squeak.changes \
images/current/squeak.image \
sounds \
squeak.pr \
${HOST}:.
ssh ${HOST} "echo ${SUDOPASS} | sudo -S cp squeak.pr /etc/syndicate/services/squeak.pr"

22
rsnapshot.conf.pm-home Normal file
View File

@ -0,0 +1,22 @@
config_version 1.2
snapshot_root /home/tonyg/src/squeak-phone/pm-samsung-home-user/
no_create_root 1
cmd_cp /usr/bin/cp
cmd_rm /usr/bin/rm
cmd_rsync /usr/bin/rsync
cmd_ssh /usr/bin/ssh
cmd_logger /usr/bin/logger
logfile /tmp/rsnapshot.backups-pm-samsung-home-user.log
lockfile /tmp/rsnapshot.backups-pm-samsung-home-user.pid
retain adhoc 10000
verbose 2
one_fs 1
sync_first 1
backup user@pm:/home/user ./

12
run_squeak.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/sh
# This is needed to let mprotect(2) of /dev/shm/* with PROT_EXEC work on Pinephone
# i.e. to get Cog's JIT to run.
sudo mount -o remount,exec /dev/shm
sudo /usr/lib/squeak/squeak \
-vm-display-fbdev \
-fbdev /dev/fb0 \
-msdev /dev/null \
-kbdev /dev/null \
squeak.image 2>&1 | tee -a squeak-output.log

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
sounds/sms_morse_code.mp3 Normal file

Binary file not shown.

16
squeak.pr Normal file
View File

@ -0,0 +1,16 @@
<require-service <daemon squeak>>
<daemon squeak {
argv: "exec squeak -vm-display-fbdev -msdev /dev/null -kbdev /dev/null"
dir: "/home/user"
protocol: application/syndicate
}>
? <service-object <daemon squeak> ?cap> [
$cap {
config: $config
}
]
<depends-on <daemon squeak> <service-state <daemon fbdev-setup> complete>>
<daemon fbdev-setup <one-shot "echo 1 > /sys/class/graphics/fb0/state">>

7
ssh-pm.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/sh
set -eu
HOST=${1:-pm-rndis}
exec ssh -L 5900:localhost:5900 ${HOST}

7
vnc-phone.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/sh
# # expects TightVNC Viewer version 1.3.10
# exec xvncviewer -encodings "copyrect tight hextile zlib corre rre raw" localhost:0
# seems to work OK, with scaling even, with ssvnc!
exec ssvncviewer -encodings "copyrect tight hextile zlib corre rre raw" -scale ${SCALE:-0.4} localhost:0