I'm learning how to use sysfs
in my Linux modules, but I'm having the hardest time finding current documentation on these topics. The Linux Device Drivers 3rd Edition
book I've been using seems to be rather dated in this area unfortunately (e.g. the class_device
appears to be completely gone in current Linux versions).
I'm simply trying to get an attribute to appear, under the respective sysfs
class for my module, that will allow me to read the value of a module variable from kernel space.
In my code, I have a class created that allows udev to create a device node at /dev/foo
for my module:
alloc_chrdev_region(&foo_dev, 0, 1, "bar");
struct class *bar = class_create(THIS_MODULE, "bar");
device_create(bar, NULL, foo_dev, NULL, "foo");
struct cdev foo_dev_file;
cdev_init(&foo_dev_file, &fops); /* fops defined earlier */
cdev_add(&foo_dev_file, foo_dev, 1);
When I insert the module I get a sysfs class directory created and populated with some default attributes at /sys/class/bar/foo/
. How can I create attributes that show up under this new directory?
I have the concepts down pretty well I believe -- create attribute structure, define sysfs_ops
functions, etc -- my problem is that I don't know which particular kernel structure to use (class_attribute
?), nor how to make these attributes appear under the right sysfs
Would anyone point me to a tutorial or article detailing the process for current Linux kernels?