Hey!
Ich weis, das ist eigentlich bloß eine Spielerei... aber ich hätte echt gerne einen funktionierenden Ambient Light Sensor, nachdem dieser auf Windoof 10 auch sehr gute Dienste leistet. Mein System ist das Dell XPS 9700 mit i7-10875H und 4K-Display. Hab' mal den aktuellen EFI-folder angehangen.
Um mal kurz meinen bisherigen Ansatz zu beschreiben, zitiere ich das zu patchende Gerät aus meinen ACPI tables:
- Scope (_SB.PCI0.LPCB)
- {
- Device (ALSD)
- {
- Name (_HID, "ACPI0008" /* Ambient Light Sensor Device */) // _HID: Hardware ID
- Method (_STA, 0, NotSerialized) // _STA: Status
- {
- If ((ALSE == 0x02))
- {
- Return (0x0B)
- }
- Return (Zero)
- }
- Method (_ALI, 0, NotSerialized) // _ALI: Ambient Light Illuminance
- {
- Return (((LHIH << 0x08) | LLOW))
- }
- Name (_ALR, Package (0x05) // _ALR: Ambient Light Response
- {
- Package (0x02)
- {
- 0x46,
- Zero
- },
- Package (0x02)
- {
- 0x49,
- 0x0A
- },
- Package (0x02)
- {
- 0x55,
- 0x50
- },
- Package (0x02)
- {
- 0x64,
- 0x012C
- },
- Package (0x02)
- {
- 0x96,
- 0x03E8
- }
- })
- }
- }
Damit das Gerät in der IOReg aufscheint, musste ich natürlich ALSE auf 0x02 setzen, mittels SSDT. Gesagt getan, und schon mounted auch der LMU-Controller von Apple sowie der Eintrag in den Bildschirmeinstellungen (siehe Anhänge). Leider bewegt sich der Slider nicht, weshalb ich kurzerhand das Repo "VirtualSMC" geklont habe, um weitere Debugs einzufügen. Und zwar wollte ich wissen, was _ALI zurückgibt, nachdem diese Schnittstelle von SMCLightManager gepollt wird.
- bool SMCLightSensor::refreshSensor(bool post) {
- uint32_t lux = 0;
- auto ret = alsdDevice->evaluateInteger("_ALI", &lux);
- if (ret != kIOReturnSuccess)
- lux = 0xFFFFFFFF; // ACPI invalid
- DBGLOG("alsd", "Lux currently is: %llu", lux);
- atomic_store_explicit(¤tLux, lux, memory_order_release);
- if (post) {
- VirtualSMCAPI::postInterrupt(SmcEventALSChange);
- poller->setTimeoutMS(SensorUpdateTimeoutMS);
- }
- return ret == kIOReturnSuccess;
- }
Danach konnte ich mittels dmesg den Wert auslesen, welcher recht enttäuschend ausfällt:
- [ 791.886212]: SMCLightSensor alsd: @ (DBG) Lux currently is: 0
- [ 792.887578]: SMCLightSensor alsd: @ (DBG) Lux currently is: 0
- [ 793.888480]: SMCLightSensor alsd: @ (DBG) Lux currently is: 0
- [ 794.890898]: SMCLightSensor alsd: @ (DBG) Lux currently is: 0
- [ 795.893362]: SMCLightSensor alsd: @ (DBG) Lux currently is: 0
- [ 796.895817]: SMCLightSensor alsd: @ (DBG) Lux currently is: 0
- [ 797.896634]: SMCLightSensor alsd: @ (DBG) Lux currently is: 0
- [ 798.899057]: SMCLightSensor alsd: @ (DBG) Lux currently is: 0
Nun machte ich mich auf die Suche nach LHIH und LLOW, nachdem diese zwei Variablen den Output bestimmen.
Die Variablen befinden sich in einer OperationRegion auf dem SystemMemory, im globalen Scope. Ansonsten gibts wohl keine weiteren Zugriffe mehr darauf...
Und nun steh ich an. Die Werte werden wohl von einer ganz anderen Stelle im System über ihre bekannten Speicheradressen beschrieben (oder auch nicht, wie die 0 zeigt...). Hat jemand von Euch Ideen, wie ich weitermachen könnte?