Как я могу получить уровень заряда батареи внутри модуля ядра Linux? - PullRequest
14 голосов
/ 01 февраля 2011

Я пытаюсь получить уровень заряда батареи внутри модуля ядра Linux (модуль вставляется через modprobe).В идеале я хотел бы использовать вызов API ядра для получения информации об аккумуляторе.Я искал в Интернете решения, а также исследовал источник ядра Linux и программу «acpi» Майкла Мескеса для идей.

Вот некоторые из тех приемов, которые, я думаю, я могу использовать:

  1. Чтение и анализ /proc/acpi/battery/BAT0/state и /proc/acpi/battery/BAT0/info
  2. Чтение из /sys/class/power_supply/BAT0/charge_now и charge_full без анализа.
  3. Я мог бы попытаться использовать вызовыиз исходников ядра Linux / acpi / battery.c, если бы я мог понять, как выставить интерфейс.Мне, вероятно, понадобятся методы acpi_battery_get_status и acpi_battery_get_info
  4. Я также заметил, что внутри drivers / acpi / sbs.c есть метод acpi_battery_read, а прямо над ним есть комментарий «Интерфейс драйвера»,Это может быть другой способ, если кто-то знает, как это использовать.

Я предполагаю, что, вероятно, плохая идея читать файлы в модуле ядра, но я не совсем уверен, как эти файлы отображаютсяк вызовам функций ядра, так что все может быть в порядке.

Итак, вы, ребята, можете дать мне несколько советов / рекомендаций?

Редактировать: я включил свое решение в ответ ниже.

Ответы [ 3 ]

11 голосов
/ 05 марта 2011

Я нашел решение, которое работает для меня. Прежде всего, убедитесь, что #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);
}
0 голосов
/ 06 февраля 2011

У меня та же самая дилемма! : - \ Если вы делаете это специфически для аппаратного обеспечения, вы можете увидеть, можете ли вы на вашем конкретном ноутбуке обнаружить интеллектуальную батарею по каналу SMBus или нет. Если вы можете, то вы можете просто делать вызовы i2c / SMBus из своего LKM. Большинство новых систем (за исключением некоторых ноутбуков Fujitsu) используют вместо этого встроенный контроллер, который в конечном итоге настраивает батарею (я полагаю, через SMBus) .... Попробуйте установить «lm-sensor» и посмотреть, обнаружит ли он ваш умный аккумулятор. Если это так, вы сможете разговаривать напрямую с аккумулятором (обычно по адресу i2c 0xb).

Если это не аппаратная вещь, которую вы делаете, игнорируйте то, что я сказал:)

0 голосов
/ 01 февраля 2011

Глядя на battery.c, sbs.c, я думаю, что вы можете напрямую вызывать API интерфейса (acpi_battery_read, acpi_battery_get_state) в вашем LKM.
Вы уже пробовали это?

...