lkmpg/examples/hello-sysfs.c

62 lines
1.4 KiB
C
Raw Normal View History

2021-07-22 06:35:24 +08:00
/*
* hello-sysfs.c sysfs example
2021-07-22 06:35:24 +08:00
*/
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/module.h>
2021-07-22 06:35:24 +08:00
#include <linux/string.h>
#include <linux/sysfs.h>
2021-07-22 06:35:24 +08:00
static struct kobject *mymodule;
/* the variable you want to be able to change */
static int myvariable = 0;
static ssize_t myvariable_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
2021-07-22 06:35:24 +08:00
{
return sprintf(buf, "%d\n", myvariable);
}
static ssize_t myvariable_store(struct kobject *kobj,
struct kobj_attribute *attr, char *buf,
size_t count)
2021-07-22 06:35:24 +08:00
{
sscanf(buf, "%du", &myvariable);
return count;
}
static struct kobj_attribute myvariable_attribute =
__ATTR(myvariable, 0660, myvariable_show, (void *)myvariable_store);
2021-07-22 06:35:24 +08:00
static int __init mymodule_init(void)
2021-07-22 06:35:24 +08:00
{
int error = 0;
pr_info("mymodule: initialised\n");
mymodule = kobject_create_and_add("mymodule", kernel_kobj);
2021-07-22 06:35:24 +08:00
if (!mymodule)
return -ENOMEM;
error = sysfs_create_file(mymodule, &myvariable_attribute.attr);
if (error) {
pr_info("failed to create the myvariable file "
"in /sys/kernel/mymodule\n");
2021-07-22 06:35:24 +08:00
}
return error;
}
static void __exit mymodule_exit(void)
2021-07-22 06:35:24 +08:00
{
pr_info("mymodule: Exit success\n");
kobject_put(mymodule);
}
module_init(mymodule_init);
module_exit(mymodule_exit);
MODULE_LICENSE("GPL");