Frequenzanzeige: Datenzugang gelöst, Umrechnung nicht — bewusst abgebrochen
IOReport liefert je Kern die Verweilzeit in jeder Leistungsstufe, genau wie gebraucht: MCPU00 bis MCPU14, 17 Zustände, saubere Deltas zwischen zwei Messungen. Die Frequenz zu einer Stufe steht dort aber nicht. Sie muss aus den voltage-states-Tabellen im IODeviceTree kommen, und die passen nicht: der Kanal hat 16 Leistungsstufen, keine Tabelle hat 16 Einträge. Dazu sind die Einheiten uneinheitlich — voltage-states8 enthält echte Hertz (732–2472 MHz), voltage-states5 dagegen Paare wie (50103, 635), die in keiner Einheit sinnvolle Taktraten ergeben. Ab hier wäre es Reverse Engineering undokumentierter Firmware-Tabellen, deren Format sich zwischen Chip-Generationen ändert — genau die Sorte Code, die beim nächsten Mac still falsche Zahlen anzeigt statt zu scheitern. Dafür ist eine Zusatzangabe im Popover zu wenig, solange Phase 6 bis 9 offen sind. Die halbfertige Implementierung ist entfernt statt auskommentiert: nicht verdrahteter Code, der nil liefert, verrottet und täuscht später Vollständigkeit vor. Der Stand samt Fortsetzungsweg steht in docs/spikes/F-frequenz.md.
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
{
|
||||
"sourceLanguage" : "en",
|
||||
"strings" : {
|
||||
"": {},
|
||||
"" : {
|
||||
|
||||
},
|
||||
"%lld" : {
|
||||
"comment" : "A label displaying the speed of a fan. The argument is the speed of the fan, in revolutions per minute.",
|
||||
"isCommentAutoGenerated" : true
|
||||
@@ -63,6 +65,7 @@
|
||||
}
|
||||
},
|
||||
"metric.cpu.perCore" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
@@ -241,18 +244,194 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.temperature": {
|
||||
"popover.battery.calculating" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Temperatur"
|
||||
"value" : "Wird berechnet …"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Temperature"
|
||||
"value" : "Calculating…"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.charging" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Lädt mit"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Charging at"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.condition" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Zustand"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Condition"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.cycles" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Ladezyklen"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Cycles"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.draining" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Verbrauch"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Draw"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.health" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Kapazität"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Capacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.limitComing" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Das Ladelimit kommt mit dem privilegierten Helfer. Der zuständige SMC-Key ist auf diesem Modell noch nicht identifiziert — siehe docs/spikes/A-smc.md."
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The charge limit arrives with the privileged helper. The relevant SMC key is not yet identified on this model — see docs/spikes/A-smc.md."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.none" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Kein Akku gefunden"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "No battery found"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.pluggedIn" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Am Netzteil"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "On adapter"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.remaining" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "verbleibend"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "remaining"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.untilFull" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "bis voll"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "until full"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.voltage" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Spannung"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Voltage"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -273,134 +452,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.power": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Leistung"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Power"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.power.cpu": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "CPU"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "CPU"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.power.display": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Anzeige"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Display"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.power.total": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Gesamt"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Total"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.power.adapter": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Netzteil"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Adapter"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.perCore": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Je Kern"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Per core"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.processes": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Größte Verbraucher"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Top consumers"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.memory.used": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Belegt"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Used"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.memory.app" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
@@ -417,22 +468,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.memory.wired": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Reserviert"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Wired"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.memory.compressed" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
@@ -497,194 +532,162 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.condition": {
|
||||
"popover.memory.used" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Zustand"
|
||||
"value" : "Belegt"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Condition"
|
||||
"value" : "Used"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.health": {
|
||||
"popover.memory.wired" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Kapazität"
|
||||
"value" : "Reserviert"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Capacity"
|
||||
"value" : "Wired"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.cycles": {
|
||||
"popover.perCore" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Ladezyklen"
|
||||
"value" : "Je Kern"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Cycles"
|
||||
"value" : "Per core"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.remaining": {
|
||||
"popover.power" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "verbleibend"
|
||||
"value" : "Leistung"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "remaining"
|
||||
"value" : "Power"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.untilFull": {
|
||||
"popover.power.adapter" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "bis voll"
|
||||
"value" : "Netzteil"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "until full"
|
||||
"value" : "Adapter"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.pluggedIn": {
|
||||
"popover.power.cpu" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Am Netzteil"
|
||||
"value" : "CPU"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "On adapter"
|
||||
"value" : "CPU"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.calculating": {
|
||||
"popover.power.display" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Wird berechnet …"
|
||||
"value" : "Anzeige"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Calculating…"
|
||||
"value" : "Display"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.charging": {
|
||||
"popover.power.total" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Lädt mit"
|
||||
"value" : "Gesamt"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Charging at"
|
||||
"value" : "Total"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.draining": {
|
||||
"popover.processes" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Verbrauch"
|
||||
"value" : "Größte Verbraucher"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Draw"
|
||||
"value" : "Top consumers"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.voltage": {
|
||||
"popover.temperature" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Spannung"
|
||||
"value" : "Temperatur"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Voltage"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.none": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Kein Akku gefunden"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "No battery found"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"popover.battery.limitComing": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Das Ladelimit kommt mit dem privilegierten Helfer. Der zuständige SMC-Key ist auf diesem Modell noch nicht identifiziert — siehe docs/spikes/A-smc.md."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "The charge limit arrives with the privileged helper. The relevant SMC key is not yet identified on this model — see docs/spikes/A-smc.md."
|
||||
"value" : "Temperature"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,51 +1,34 @@
|
||||
{
|
||||
"sourceLanguage" : "en",
|
||||
"strings" : {
|
||||
"network.name": {
|
||||
"network.addresses" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Netzwerk"
|
||||
"value" : "Adressen"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Network"
|
||||
"value" : "Addresses"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.wifi.connected": {
|
||||
"comment": "Wenn der Netzwerkname mangels Ortungsberechtigung fehlt",
|
||||
"network.download" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "WLAN verbunden"
|
||||
"value" : "Download"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Wi-Fi connected"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.offline": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Nicht verbunden"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Not connected"
|
||||
"value" : "Download"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,6 +65,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.field.ipv6" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "IPv6"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "IPv6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.field.router" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
@@ -98,34 +97,34 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.download": {
|
||||
"network.name" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Download"
|
||||
"value" : "Netzwerk"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Download"
|
||||
"value" : "Network"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.upload": {
|
||||
"network.offline" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Upload"
|
||||
"value" : "Nicht verbunden"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Upload"
|
||||
"value" : "Not connected"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -162,103 +161,8 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.addresses": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Adressen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Addresses"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.transferred": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Übertragen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Transferred"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.total.received": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Empfangen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Received"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.total.sent": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Gesendet"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Sent"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.field.ipv6": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "IPv6"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "IPv6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.vpn.active": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Verkehr läuft durch einen Tunnel"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Traffic goes through a tunnel"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.perProcess.unavailable" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
@@ -274,6 +178,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.processes" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Je Programm"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Per app"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.public" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
@@ -306,22 +226,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.public.hint": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Dafür fragt Onyx einen fremden Dienst — standardmäßig aus, weil ein Systemmonitor nicht ungefragt nach draußen telefonieren sollte."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "This asks an external service — off by default, because a system monitor shouldn't phone home unasked."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.public.failed" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
@@ -338,18 +242,115 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.processes": {
|
||||
"network.public.hint" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Je Programm"
|
||||
"value" : "Dafür fragt Onyx einen fremden Dienst — standardmäßig aus, weil ein Systemmonitor nicht ungefragt nach draußen telefonieren sollte."
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value": "Per app"
|
||||
"value" : "This asks an external service — off by default, because a system monitor shouldn't phone home unasked."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.total.received" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Empfangen"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Received"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.total.sent" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Gesendet"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Sent"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.transferred" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Übertragen"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Transferred"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.upload" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Upload"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Upload"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.vpn.active" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Verkehr läuft durch einen Tunnel"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Traffic goes through a tunnel"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"network.wifi.connected" : {
|
||||
"comment" : "Wenn der Netzwerkname mangels Ortungsberechtigung fehlt",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "WLAN verbunden"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Wi-Fi connected"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
75
docs/spikes/F-frequenz.md
Normal file
75
docs/spikes/F-frequenz.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# Spike F — Taktfrequenzen über IOReport
|
||||
|
||||
Untersucht am 10.08.2026 auf Mac17,9 (M5 Pro). **Ergebnis: teilweise gelöst,
|
||||
bewusst abgebrochen.** Der Datenzugang steht, die Umrechnung fehlt.
|
||||
|
||||
## Was funktioniert
|
||||
|
||||
`libIOReport` ist ohne Entitlement nutzbar; alle benötigten Symbole sind
|
||||
vorhanden und über `dlsym` auflösbar:
|
||||
|
||||
```
|
||||
IOReportCopyChannelsInGroup IOReportCreateSubscription
|
||||
IOReportCreateSamples IOReportCreateSamplesDelta
|
||||
IOReportStateGetCount IOReportStateGetResidency
|
||||
IOReportStateGetNameForIndex
|
||||
```
|
||||
|
||||
Der Ablauf liefert verwertbare Daten:
|
||||
|
||||
```
|
||||
Kanäle geholt: 127 (Gruppe "CPU Stats")
|
||||
Delta-Kanäle: 127
|
||||
CPU Core Performance States/MCPU00 Zustände=17
|
||||
IDLE:17345943 V0P14:3559973 V1P13:361673 V2P12:561938 V3P11:322658 …
|
||||
```
|
||||
|
||||
Also je Kern (MCPU00 … MCPU14) die Verweilzeit in jeder Leistungsstufe seit der
|
||||
letzten Messung. Genau das, was man für einen gewichteten Mittelwert braucht.
|
||||
|
||||
## Woran es scheitert
|
||||
|
||||
Die Frequenz zu einer Stufe steht nicht im Kanal. Sie muss aus den
|
||||
`voltage-states`-Tabellen im IODeviceTree kommen — und die Zuordnung geht nicht
|
||||
auf:
|
||||
|
||||
| Tabelle | Einträge | Als Hz gelesen |
|
||||
|---|---|---|
|
||||
| `voltage-states8` | 26 | 732–2472 MHz — plausibel |
|
||||
| `voltage-states9`, `14`, `31` | 13 | 338–1620 MHz — plausibel, passt zur GPU |
|
||||
| `voltage-states5` | 20 | 0 MHz — Paare wie (50103, 635) |
|
||||
| `voltage-states22`, `23` | 15 | 0 MHz |
|
||||
|
||||
Zwei Probleme übereinander:
|
||||
|
||||
1. **Die Stufenzahl passt nicht.** Der Kanal hat 17 Zustände, davon einer
|
||||
Leerlauf, also 16 Leistungsstufen. Keine Tabelle hat 16 Einträge.
|
||||
2. **Die Einheiten sind uneinheitlich.** `voltage-states8` enthält echte Hertz.
|
||||
`voltage-states5` enthält Paare, deren erster Wert von 50103 abwärts läuft,
|
||||
während der zweite (635, 685, 710 …) nach Millivolt aussieht. Weder Hertz
|
||||
noch Kilohertz noch Megahertz ergeben daraus sinnvolle Taktraten.
|
||||
|
||||
Die Zustandsnamen (`V0P14`, `V1P13`, `V2P12` …) kodieren offenbar Spannungs-
|
||||
und P-Zustands-Index getrennt. Ein sauberer Weg führte vermutlich über diese
|
||||
Namen statt über die Position im Kanal.
|
||||
|
||||
## Warum hier abgebrochen wurde
|
||||
|
||||
Ab diesem Punkt ist es Reverse Engineering undokumentierter Firmware-Tabellen,
|
||||
deren Format sich zwischen Chip-Generationen ändert — genau die Sorte Code, die
|
||||
beim nächsten Mac still falsche Zahlen anzeigt statt zu scheitern. Der Aufwand
|
||||
steht nicht im Verhältnis zu einer Zusatzangabe im Popover, solange Phase 6 bis
|
||||
9 noch offen sind.
|
||||
|
||||
Die halbfertige Implementierung wurde entfernt statt auskommentiert: nicht
|
||||
verdrahteter Code, der `nil` zurückgibt, verrottet und täuscht später
|
||||
Vollständigkeit vor. Alles Nötige steht hier.
|
||||
|
||||
## Wenn es doch gebaut wird
|
||||
|
||||
1. Zustandsnamen zerlegen (`V<spannung>P<stufe>`) statt die Position zu benutzen.
|
||||
2. Die Tabelle über den P-Index adressieren, nicht über die Einträgezahl.
|
||||
3. Gegen `powermetrics --samplers cpu_power` gegenprüfen — das ist die einzige
|
||||
verlässliche Referenz.
|
||||
4. Bei fehlender Zuordnung **nichts** anzeigen. Eine falsche Frequenz ist
|
||||
schlechter als keine.
|
||||
Reference in New Issue
Block a user