首页 > 代码库 > Linux驱动学习 —— 在/sys下面创建目录示例
Linux驱动学习 —— 在/sys下面创建目录示例
有时我们需要在/sys下面创建一些目录, 下面给出了一个示例。 在加载驱动模块后, 在/sys下面会创建一个名为sysfs_demo的目录,并在其中在创建几个文件和目录。
[root@tiny4412 mnt]# ls -R /sys/sysfs_demo//sys/sysfs_demo/:node_one node_two sysfs_demo_2/sys/sysfs_demo/sysfs_demo_2:node_four node_three
这里用到的两个函数分别是: kobject_create_and_add 和 sysfs_create_group。前一个函数用于在/sys下面创建目录, 后一个函数用于创建文件。
示例驱动:
1 #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__ 2 3 #include <linux/init.h> 4 #include <linux/module.h> 5 #include <linux/kobject.h> 6 #include <linux/device.h> 7 8 static struct kobject *k_obj = NULL; 9 static struct kobject *k_obj_2 = NULL; 10 11 static char node_one_buf[20] = {0}; 12 13 static ssize_t sysfs_demo_show_node_one(struct kobject *kobj, struct kobj_attribute *attr, char * buf) 14 { 15 pr_info("enter, node: %s\n", attr->attr.name); 16 return sprintf(buf, "%s: %s\n", attr->attr.name, node_one_buf); 17 } 18 19 static ssize_t sysfs_demo_store_node_one(struct kobject *kobj, struct kobj_attribute *attr, const char * buf, size_t n) 20 { 21 pr_info("enter, node: %s\n", attr->attr.name); 22 23 sprintf(node_one_buf, "%s", buf); 24 25 return n; 26 } 27 28 static struct kobj_attribute node_one_attribute = 29 __ATTR(node_one, S_IWUSR|S_IRUGO, sysfs_demo_show_node_one, sysfs_demo_store_node_one); 30 31 static ssize_t sysfs_demo_show_node_two(struct kobject *kobj, struct kobj_attribute *attr, char * buf) 32 { 33 34 return sprintf(buf, "%s\n", attr->attr.name); 35 } 36 37 static struct kobj_attribute node_two_attribute = 38 __ATTR(node_two, S_IWUSR|S_IRUGO, sysfs_demo_show_node_two, NULL); 39 40 static struct attribute *sysfs_demo_attributes[] = { 41 &node_one_attribute.attr, 42 &node_two_attribute.attr, 43 NULL 44 }; 45 46 static const struct attribute_group sysfs_demo_attr_group = { 47 .attrs = sysfs_demo_attributes, 48 }; 49 50 static char node_three_buf[20] = {0}; 51 52 static ssize_t sysfs_demo_show_node_three(struct kobject *kobj, struct kobj_attribute *attr, char * buf) 53 { 54 pr_info("enter, node: %s\n", attr->attr.name); 55 return sprintf(buf, "%s: %s\n", attr->attr.name, node_three_buf); 56 } 57 58 static ssize_t sysfs_demo_store_node_three(struct kobject *kobj, struct kobj_attribute *attr, const char * buf, size_t n) 59 { 60 pr_info("enter, node: %s\n", attr->attr.name); 61 62 sprintf(node_three_buf, "%s", buf); 63 64 return n; 65 } 66 67 static struct kobj_attribute node_three_attribute = 68 __ATTR(node_three, S_IWUSR|S_IRUGO, sysfs_demo_show_node_three, sysfs_demo_store_node_three); 69 70 static ssize_t sysfs_demo_show_node_four(struct kobject *kobj, struct kobj_attribute *attr, char * buf) 71 { 72 73 return sprintf(buf, "%s\n", attr->attr.name); 74 } 75 76 static struct kobj_attribute node_four_attribute = 77 __ATTR(node_four, S_IWUSR|S_IRUGO, sysfs_demo_show_node_four, NULL); 78 79 static struct attribute *sysfs_demo2_attributes[] = { 80 &node_three_attribute.attr, 81 &node_four_attribute.attr, 82 NULL 83 }; 84 85 static const struct attribute_group sysfs_demo2_attr_group = { 86 .attrs = sysfs_demo2_attributes, 87 }; 88 89 static int __init sysfs_demo_init(void) 90 { 91 if ((k_obj = kobject_create_and_add("sysfs_demo", NULL)) == NULL ) { 92 pr_err("sysfs_demo sys node create error \n"); 93 goto out; 94 } 95 96 if(sysfs_create_group(k_obj, &sysfs_demo_attr_group) ) { 97 pr_err("sysfs_create_group failed\n"); 98 goto out2; 99 }100 101 if ((k_obj_2 = kobject_create_and_add("sysfs_demo_2", k_obj)) == NULL ) {102 pr_err("hwinfo sys node create error \n");103 goto out3;104 }105 106 if(sysfs_create_group(k_obj_2, &sysfs_demo2_attr_group) ) {107 pr_err("sysfs_create_group failed\n");108 goto out4;109 }110 111 pr_info("enter.\n");112 return 0;113 out4:114 kobject_put(k_obj_2);115 out3:116 sysfs_remove_group(k_obj, &sysfs_demo_attr_group);117 out2:118 kobject_put(k_obj);119 out:120 return -1;121 }122 module_init(sysfs_demo_init);123 124 static void __exit sysfs_demo_exit(void)125 {126 pr_info("enter.\n");127 128 if (k_obj) {129 sysfs_remove_group(k_obj, &sysfs_demo_attr_group);130 if (k_obj_2) {131 sysfs_remove_group(k_obj_2, &sysfs_demo2_attr_group);132 kobject_put(k_obj_2);133 }134 kobject_put(k_obj);135 }136 137 }138 module_exit(sysfs_demo_exit);139 140 MODULE_LICENSE("GPL");
Linux驱动学习 —— 在/sys下面创建目录示例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。