linux-kernel - 如何在 Linux 内核模块中获取电池电量?

标签 linux-kernel kernel-module acpi

我正在尝试获取 Linux 内核模块中的电池电量(该模块是通过 modprobe 插入的)。理想情况下,我想使用内核 API 调用来获取电池信息。我在网上搜索了解决方案,并且我还探索了 Linux 内核源代码和 Michael Meskes 的程序“acpi”的源代码以获取想法。

这些是我认为可以使用的一些技术:

  • 读取和解析 /proc/acpi/battery/BAT0/state/proc/acpi/battery/BAT0/info
  • 阅读 /sys/class/power_supply/BAT0/charge_nowcharge_full不涉及解析。
  • 如果我能弄清楚如何公开接口(interface),我可以尝试使用来自 Linux 内核源驱动程序/acpi/battery.c 的调用。我可能需要方法 acpi_battery_get_statusacpi_battery_get_info
  • 我还注意到在 drivers/acpi/sbs.c 里面有一个方法 acpi_battery_read在它的正上方有一条评论说“驱动程序界面”。如果有人知道如何使用它,这可能是另一种方式。

  • 我认为在内核模块中读取文件可能是个坏主意,但我不确定这些文件如何映射到内核函数调用,所以可能没问题。

    那么,你们能给我一些建议/建议吗?

    编辑:我在下面的答案中包含了我的解决方案。

    最佳答案

    我找到了适合我的解决方案。首先确保#include

    假设您知道电池的名称,此代码给出了如何获取当前电池容量的示例。

    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);
    }
    

    关于linux-kernel - 如何在 Linux 内核模块中获取电池电量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858657/

    相关文章:

    c - 为什么使用 calloc 将分配的内存初始化为零?

    linux - Linux中有没有类似NanoBSD的东西

    c - Ubuntu 15.10(内核 4.2): Hello world kernel module makefile error

    linux - 在 USB 的 Linux 内核空间驱动程序中运行供应商命令

    c - 原子调度

    c - 我的代码在读取和写入设备文件时出了什么问题

    qemu - OpenBSD 的 virsh 关闭 (libvirt/kvm)

    c# - 控制风扇速度

    linux - Linux 内核在哪里(在内存中)存储 'special' 总线地址?