Skip to content

Commit

Permalink
Add sysfs module
Browse files Browse the repository at this point in the history
  • Loading branch information
ankcn committed Feb 14, 2020
1 parent 52a6bb5 commit 6d3b1c2
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 1 deletion.
4 changes: 3 additions & 1 deletion mydev/devfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/time.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <asm/uaccess.h>
#include "devfile.h"
Expand Down Expand Up @@ -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;
}

Expand Down
13 changes: 13 additions & 0 deletions sysfs/Makefile
Original file line number Diff line number Diff line change
@@ -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


86 changes: 86 additions & 0 deletions sysfs/sysfs.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* sysfs.c: взаимодействие между ядром и пространством пользователя
* через виртуальную файловую систему sysfs
*/

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
#include<linux/sysfs.h>
#include<linux/kobject.h>


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

0 comments on commit 6d3b1c2

Please sign in to comment.