initial commit; version 0.1.0

This commit is contained in:
2026-08-21 20:33:58 +02:00
commit 4795a7ccfd
9 changed files with 170 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
KVER ?= $(shell uname -r)
obj-m := fake-battery.o
all:
$(MAKE) -C /lib/modules/$(KVER)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(KVER)/build M=$(PWD) clean
+6
View File
@@ -0,0 +1,6 @@
fake-battery-dkms (0.1.0-1) stable; urgency=low
* Initial release
-- Vincent Schweiger <vincent.schweiger@icloud.com> Fri, 21 Aug 2026 19:39:00
+0200
+14
View File
@@ -0,0 +1,14 @@
Source: fake-battery-dkms
Maintainer: Vincent Schweiger <vincent.schweiger@icloud.com>
Section: kernel
Priority: optional
Build-Depends: debhelper-compat (= 13),
dh-sequence-dkms,
Standards-Version: 4.7.0
Rules-Requires-Root: no
Package: fake-battery-dkms
Architecture: all
Depends: ${misc:Depends}
Description: Fake Battery
Creates a fake battery module
Vendored
+1
View File
@@ -0,0 +1 @@
dkms.conf
Vendored Executable
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
for dir in fake-battery.c Makefile; do
echo ${dir} /usr/src/${PACKAGE_NAME}-${PACKAGE_VERSION}
done
Vendored Executable
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/make -f
PACKAGE_NAME=$(shell grep PACKAGE_NAME= dkms.conf | cut -d= -f2 | cut -d\" -f2)
PACKAGE_VERSION=$(shell grep PACKAGE_VERSION= dkms.conf | cut -d= -f2 | cut -d\" -f2)
export PACKAGE_NAME PACKAGE_VERSION
%:
dh $@ --with dkms
# Nothing to configure, build or auto-install (this all happens after
# installation using dkms)
override_dh_auto_configure:
override_dh_auto_build:
override_dh_auto_install:
+1
View File
@@ -0,0 +1 @@
3.0 (quilt)
+9
View File
@@ -0,0 +1,9 @@
PACKAGE_VERSION="0.1.0"
PACKAGE_NAME="fake-battery"
CLEAN=true
BUILT_MODULE_NAME[0]="fake-battery"
BUILT_MODULE_LOCATION[0]=""
DEST_MODULE_LOCATION[0]="/extra"
MAKE[0]="make KVER=$kernelver -C ${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build"
AUTOINSTALL="yes"
+112
View File
@@ -0,0 +1,112 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/power_supply.h>
#include <linux/init.h>
static struct power_supply *fake_battery;
static struct power_supply_desc battery_desc;
static enum power_supply_property fake_battery_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CAPACITY,
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_CURRENT_NOW,
POWER_SUPPLY_PROP_TEMP,
};
static int fake_battery_get_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
switch (psp) {
case POWER_SUPPLY_PROP_STATUS:
val->intval = POWER_SUPPLY_STATUS_FULL;
break;
case POWER_SUPPLY_PROP_HEALTH:
val->intval = POWER_SUPPLY_HEALTH_GOOD;
break;
case POWER_SUPPLY_PROP_PRESENT:
val->intval = 1;
break;
case POWER_SUPPLY_PROP_TECHNOLOGY:
val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO;
break;
case POWER_SUPPLY_PROP_CAPACITY:
val->intval = 100;
break;
case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
val->intval = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
break;
case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
val->intval = 5000000; /* 5000 mAh */
break;
case POWER_SUPPLY_PROP_CHARGE_FULL:
val->intval = 5000000; /* 5000 mAh */
break;
case POWER_SUPPLY_PROP_CHARGE_NOW:
val->intval = 5000000; /* 5000 mAh (fully charged) */
break;
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
val->intval = 4200000; /* 4.2V */
break;
case POWER_SUPPLY_PROP_CURRENT_NOW:
val->intval = 0; /* Not charging */
break;
case POWER_SUPPLY_PROP_TEMP:
val->intval = 250; /* 25°C in 0.1°C units */
break;
default:
return -EINVAL;
}
return 0;
}
static int __init fake_battery_init(void)
{
int ret;
pr_info("fake_battery: Loading fake battery module\n");
// Initialize the power supply descriptor
battery_desc.name = "fake-battery";
battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;
battery_desc.properties = fake_battery_props;
battery_desc.num_properties = ARRAY_SIZE(fake_battery_props);
battery_desc.get_property = fake_battery_get_property;
// Register the power supply
fake_battery = power_supply_register(NULL, &battery_desc, NULL);
if (IS_ERR(fake_battery)) {
ret = PTR_ERR(fake_battery);
pr_err("fake_battery: Failed to register power supply: %d\n", ret);
return ret;
}
pr_info("fake_battery: Fake battery registered successfully\n");
pr_info("fake_battery: Battery status: 100%% charged\n");
return 0;
}
static void __exit fake_battery_exit(void)
{
pr_info("fake_battery: Unloading fake battery module\n");
if (fake_battery)
power_supply_unregister(fake_battery);
}
module_init(fake_battery_init);
module_exit(fake_battery_exit);
MODULE_AUTHOR("Vincent Schweiger");
MODULE_DESCRIPTION("Fake battery module that reports a fully charged battery");
MODULE_VERSION("0.1.0");
MODULE_LICENSE("GPL");