Frage

Ich versuche, den Batteriepegel in einem Linux -Kernel -Modul zu erhalten (das Modul wird über Modprobe eingefügt). Ich würde idealerweise gerne einen Kernel -API -Anruf verwenden, um die Batterieinformationen zu erhalten. Ich habe im Web nach Lösungen gesucht und auch Linux -Kernelquelle und die Quelle des Programms "ACPI" von Michael Meskes nach Ideen untersucht.

Dies sind einige der Techniken, die ich verwenden kann:

  1. Lesen und analysieren /proc/acpi/battery/BAT0/state und /proc/acpi/battery/BAT0/info
  2. Lesen von /sys/class/power_supply/BAT0/charge_now und charge_full ohne Analyse.
  3. Ich könnte versuchen, die Aufrufe von Linux -Kernel -Quell -Treibern/acpi/batterie.c zu verwenden, wenn ich herausfinden könnte, wie die Schnittstelle freigelegt werden kann. Ich würde wahrscheinlich die Methoden brauchen acpi_battery_get_status und acpi_battery_get_info
  4. Mir ist auch aufgefallen, dass es in Treibern/acpi/sbs.c eine Methode gibt acpi_battery_read Und genau darüber gibt es einen Kommentar mit der Aufschrift "Treiberschnittstelle". Dies könnte ein anderer Weg sein, wenn jemand weiß, wie er das benutzt.

Ich gehe davon aus, dass es wahrscheinlich eine schlechte Idee ist, Dateien in einem Kernel -Modul zu lesen, aber ich bin mir nicht genau sicher, wie diese Dateien an Kernel -Funktionsaufrufe abbilden, also ist es möglicherweise in Ordnung.

Könnt ihr mir einige Vorschläge/Empfehlungen geben?

Bearbeiten: Ich habe meine Lösung in eine Antwort unten aufgenommen.

War es hilfreich?

Lösung

Ich habe eine Lösung gefunden, die für mich funktioniert. Stellen Sie zunächst sicher, dass #include <linux/power_supply.h>

Angenommen, Sie kennen den Namen des Akkus, gibt dieser Code ein Beispiel dafür, wie Sie die aktuelle Akkukapazität erhalten.

char name[]= "BAT0";
int result = 0;
struct power_supply *psy = power_supply_get_by_name(name);
union power_supply_propval chargenow, chargefull;
result = psy->get_property(psy,POWER_SUPPLY_PROP_CHARGE_NOW,&chargenow);
if(!result) {
    printk(KERN_INFO "The charge level is %d\n",chargenow.intval);
}
result = psy->get_property(psy,POWER_SUPPLY_PROP_CHARGE_FULL,&chargefull);
if(!result) {
    printk(KERN_INFO "The charge level is %d\n",chargefull.intval);
}

Andere Tipps

Wenn Sie sich die Batterie.C, SBS.C ansehen, können Sie direkt die Schnittstellen -API (ACPI_Battery_Read, ACPI_Battery_Get_State) in Ihrem LKM aufrufen.
Hast du das bisher versucht?

Ich habe das gleiche Dilemma! :- Wenn dies eine hardwarespezifische Sache ist, die Sie tun, können Sie auf Ihrem speziellen Laptop den Smart-Akku auf dem Smbus-Link erkennen oder nicht. Wenn Sie können, können Sie nur I2C/Smbus -Anrufe aus Ihrem LKM ausführen. Die meisten neuen Systeme (mit Ausnahme einiger Fujitsu-Laptops) sprechen stattdessen mit einem eingebetteten Controller, der den Akku (über SMBUS) konfiguriert hat. In diesem Fall sollten Sie in der Lage sein, direkt mit dem Akku zu sprechen (normalerweise bei I2C -Adresse 0xB).

Wenn dies keine hardwarespezifische Sache ist, die Sie tun, dann ignorieren Sie, was ich gesagt habe :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top