kobject-example驱动使用kobject_create_and_add函数创建kobject,本实验采用kobject_init_and_add函数实现。 在kernel/drivers/char/x4412目录下创建x4412-kobject.c文件,编辑源码如下: - #include <linux/device.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/string.h>
- #include <linux/sysfs.h>
- #include <linux/stat.h>
- char str[] = "www.9tripod.com";
- /*对应于kobject的目录下的一个文件,Name成员就是文件名*/
- struct attribute x4412_attr = {
- .name = "ibox",
- .mode = S_IRWXUGO,
- };
- static struct attribute *x4412_attrs[] = {
- &x4412_attr,
- NULL,
- };
- /*release方法释放该kobject对象*/
- void x4412_kobj_release(struct kobject *kobject)
- {
- printk("kobject: release .\n");
- }
- /*当读文件时执行的操作*/
- ssize_t x4412_kobj_show(struct kobject *kobject, struct attribute *attr,char *buf)
- {
- return sprintf(buf, "%s\n", str);
- }
- /*当写文件时执行的操作*/
- ssize_t x4412_kobj_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count)
- {
- sscanf(buf, "%s", str);
- return count;
- }
- //kobject对象的操作
- struct sysfs_ops x4412_kobj_sysops =
- {
- .show = x4412_kobj_show,
- .store = x4412_kobj_store,
- };
- /*定义kobject对象的一些属性及对应的操作*/
- struct kobj_type ktype =
- {
- .release = x4412_kobj_release,
- .sysfs_ops=&x4412_kobj_sysops,
- .default_attrs=x4412_attrs,
- };
- struct kobject kobj;//声明kobject对象
- static int x4412_kobj_init(void)
- {
- int err = 0;
- printk("x4412 kboject init.\n");
- //初始化kobject对象kobj,并将其注册到linux系统
- err = kobject_init_and_add(&kobj,&ktype,NULL,"x4412-kobject");
- return err;
- }
- static void x4412_kobj_exit(void)
- {
- printk("x4412 kobject exit.\n");
- kobject_del(&kobj);
- }
- module_init(x4412_kobj_init);
- module_exit(x4412_kobj_exit);
- MODULE_AUTHOR("lqm");
- MODULE_LICENSE("GPL");
复制代码 kobject_init_and_add函数将会在/sys目录下生成x4412-kobject目录。使用这个函数需要声明ktype结构体,ktype结构体的成员变量sysfs_ops指定了应用程序调用驱动的读写函数,default_attrs定义了设备文件的权限,S_IRWXUGO表示具备可读可写可执行权限。 在kernel/drivers/char/x4412/Kconfig中添加配置文件: - config X4412_KOBJECT_DRIVER
- tristate "x4412 kobject driver"
- default m
- help
- compile for x4412 kobject driver,y for kernel,m for module.
复制代码 在kernel/drivers/char/x4412/Makefile中添加编译文件: - obj-$(CONFIG_X4412_KOBJECT_DRIVER) += x4412-kobject.o
复制代码 重新编译内核,在驱动源码目录将会产生驱动模块文件x4412-kobject.ko,将它拷贝到开发板并加载运行,观察/sys目录下是否会生成x4412-kobject目录。 - [root@x4412 mnt]# ls /sys/
- block/ class/ devices/ fs/ module/
- bus/ dev/ firmware/ kernel/ power/
- [root@x4412 mnt]# insmod x4412-kobject.ko
- [ 47.599569] x4412 kboject init.
- [root@x4412 mnt]# ls /sys/
- block/ dev/ fs/ power/
- bus/ devices/ kernel/ x4412-kobject/
- class/ firmware/ module/
- [root@x4412 mnt]#
复制代码 在x4412-kobject目录下操作文件ibox: - [root@x4412 mnt]# cd /sys/x4412-kobject/
- [root@x4412 x4412-kobject]# ls
- ibox*
- [root@x4412 x4412-kobject]# cat ibox
- www.9tripod.com
- [root@x4412 x4412-kobject]# echo www.bbs.9tripod.com > ibox
- [root@x4412 x4412-kobject]# cat ibox
- www.bbs.9tripod.com
- [root@x4412 x4412-kobject]#
复制代码 |