From 6d3b1c216f28162019e0ee1f539192f7ee2204ed Mon Sep 17 00:00:00 2001 From: Andrey Tarasov Date: Fri, 14 Feb 2020 15:06:30 +0700 Subject: [PATCH] Add sysfs module --- mydev/devfile.c | 4 ++- sysfs/Makefile | 13 ++++++++ sysfs/sysfs.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 sysfs/Makefile create mode 100644 sysfs/sysfs.c diff --git a/mydev/devfile.c b/mydev/devfile.c index 29bad25..55651b1 100644 --- a/mydev/devfile.c +++ b/mydev/devfile.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include "devfile.h" @@ -42,6 +41,9 @@ static int __init setup_device(void) } printk(KERN_INFO "Device registered with major number %d\n", major_num); + printk(KERN_INFO "Create a dev file with:\n"); + printk(KERN_INFO "mknod /dev/%s c %d 0\n", DEVICE_NAME, major_num); + return 0; } diff --git a/sysfs/Makefile b/sysfs/Makefile new file mode 100644 index 0000000..e6518e1 --- /dev/null +++ b/sysfs/Makefile @@ -0,0 +1,13 @@ +PWD := $(shell pwd) +obj-m += sysfs.o +KDIR := /home/and/sources/linux-5.3.13 +ccflags-y := -std=gnu99 -Wno-declaration-after-statement + + +all: + make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C ${KDIR} M=$(PWD) modules + +clean: + make -C ${KDIR} M=$(PWD) clean + + diff --git a/sysfs/sysfs.c b/sysfs/sysfs.c new file mode 100644 index 0000000..03dc00c --- /dev/null +++ b/sysfs/sysfs.c @@ -0,0 +1,86 @@ +/* + * sysfs.c: взаимодействие между ядром и пространством пользователя + * через виртуальную файловую систему sysfs + */ + +#include +#include +#include +#include +#include +#include + + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Andrey Tarasov"); +MODULE_DESCRIPTION("Test module for sysfs"); + +// Размер буфера +#define BUF_SIZE 1024 + +// Имя директории в sysfs +#define KOBJ_DIR_NAME "test" + +// Имя атрибута/файла в sysfs +#define KOBJ_FILE_NAME message + + +// Буфер для ввода/вывода данных через sysfs +static char kbuffer[BUF_SIZE] = "Hello from sysfs!\n"; + +static struct kobject *kobjp; + +/* + * sysfs_read - вывод данных из буфера в userspace через sysfs + */ +static ssize_t sysfs_read(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + printk(KERN_INFO "Reading sysfs\n"); + return sprintf(buf, "%s", kbuffer); +} + +/* + * sysfs_write - ввод данных в буфер из userspace через sysfs + */ +static ssize_t sysfs_write(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t count) +{ + printk(KERN_INFO "Writing to sysfs\n"); + strncpy(kbuffer, buf, count); + kbuffer[count] = 0; + return count; +} + + +static struct kobj_attribute sysfs_attr = __ATTR(KOBJ_FILE_NAME, 0660, sysfs_read, sysfs_write); + +/* + * setup_module - инициализация модуля + */ +static int __init setup_module(void) +{ + kobjp = kobject_create_and_add(KOBJ_DIR_NAME, kernel_kobj); + if (! kobjp) + return -ENOMEM; + + if (sysfs_create_file(kobjp, &sysfs_attr.attr)) { + printk(KERN_INFO "Can't create sysfs file\n"); + kobject_put(kobjp); + } else + printk(KERN_INFO "Created sysfs entry /sys/kernel/%s/%s\n", KOBJ_DIR_NAME, __stringify(KOBJ_FILE_NAME)); + + return 0; +} + +/* + * shutdown_module - закрытие модуля + */ +static void __exit shutdown_module(void) +{ + kobject_put(kobjp); + printk(KERN_INFO "Sysfs object deleted\n"); +} + + +module_init(setup_module); +module_exit(shutdown_module); +