九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 4215|回复: 0
打印 上一主题 下一主题

x4412&ibox项目实战25-创建x4412-kobject驱动

[复制链接]
跳转到指定楼层
楼主
发表于 2014-9-29 18:12:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    kobject-example驱动使用kobject_create_and_add函数创建kobject,本实验采用kobject_init_and_add函数实现。
    在kernel/drivers/char/x4412目录下创建x4412-kobject.c文件,编辑源码如下:
  1. #include <linux/device.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/init.h>
  5. #include <linux/string.h>
  6. #include <linux/sysfs.h>
  7. #include <linux/stat.h>
  8. char str[] = "www.9tripod.com";
  9. /*对应于kobject的目录下的一个文件,Name成员就是文件名*/
  10. struct attribute x4412_attr = {
  11.         .name = "ibox",
  12.         .mode = S_IRWXUGO,
  13. };
  14. static struct attribute *x4412_attrs[] = {
  15.         &x4412_attr,
  16.         NULL,
  17. };
  18. /*release方法释放该kobject对象*/
  19. void x4412_kobj_release(struct kobject *kobject)
  20. {
  21.         printk("kobject: release .\n");
  22. }
  23. /*当读文件时执行的操作*/
  24. ssize_t x4412_kobj_show(struct kobject *kobject, struct attribute *attr,char *buf)
  25. {
  26.          return sprintf(buf, "%s\n", str);
  27. }
  28. /*当写文件时执行的操作*/
  29. ssize_t x4412_kobj_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count)
  30. {
  31.          sscanf(buf, "%s", str);
  32.          return count;
  33. }
  34. //kobject对象的操作
  35. struct sysfs_ops x4412_kobj_sysops =
  36. {
  37.         .show = x4412_kobj_show,
  38.         .store = x4412_kobj_store,
  39. };
  40. /*定义kobject对象的一些属性及对应的操作*/
  41. struct kobj_type ktype =
  42. {
  43.         .release = x4412_kobj_release,
  44.         .sysfs_ops=&x4412_kobj_sysops,
  45.         .default_attrs=x4412_attrs,
  46. };
  47. struct kobject kobj;//声明kobject对象
  48. static int x4412_kobj_init(void)
  49. {
  50.          int err = 0;
  51.         printk("x4412 kboject init.\n");
  52.          //初始化kobject对象kobj,并将其注册到linux系统
  53.         err = kobject_init_and_add(&kobj,&ktype,NULL,"x4412-kobject");
  54.         return err;
  55. }
  56. static void x4412_kobj_exit(void)
  57. {
  58.         printk("x4412 kobject exit.\n");
  59.         kobject_del(&kobj);
  60. }
  61. module_init(x4412_kobj_init);
  62. module_exit(x4412_kobj_exit);
  63. MODULE_AUTHOR("lqm");
  64. MODULE_LICENSE("GPL");
复制代码
    kobject_init_and_add函数将会在/sys目录下生成x4412-kobject目录。使用这个函数需要声明ktype结构体,ktype结构体的成员变量sysfs_ops指定了应用程序调用驱动的读写函数,default_attrs定义了设备文件的权限,S_IRWXUGO表示具备可读可写可执行权限。
    在kernel/drivers/char/x4412/Kconfig中添加配置文件:
  1. config X4412_KOBJECT_DRIVER
  2.          tristate "x4412 kobject driver"
  3.          default m
  4.          help
  5.          compile for x4412 kobject driver,y for kernel,m for module.
复制代码
    在kernel/drivers/char/x4412/Makefile中添加编译文件:
  1. obj-$(CONFIG_X4412_KOBJECT_DRIVER) += x4412-kobject.o
复制代码
    重新编译内核,在驱动源码目录将会产生驱动模块文件x4412-kobject.ko,将它拷贝到开发板并加载运行,观察/sys目录下是否会生成x4412-kobject目录。
  1. [root@x4412 mnt]# ls /sys/
  2. block/    class/    devices/  fs/       module/
  3. bus/      dev/      firmware/ kernel/   power/
  4. [root@x4412 mnt]# insmod x4412-kobject.ko
  5. [   47.599569] x4412 kboject init.
  6. [root@x4412 mnt]# ls /sys/
  7. block/         dev/           fs/            power/
  8. bus/           devices/       kernel/        x4412-kobject/
  9. class/         firmware/      module/
  10. [root@x4412 mnt]#
复制代码
    在x4412-kobject目录下操作文件ibox:
  1. [root@x4412 mnt]# cd /sys/x4412-kobject/
  2. [root@x4412 x4412-kobject]# ls
  3. ibox*
  4. [root@x4412 x4412-kobject]# cat ibox
  5. www.9tripod.com
  6. [root@x4412 x4412-kobject]# echo www.bbs.9tripod.com > ibox
  7. [root@x4412 x4412-kobject]# cat ibox
  8. www.bbs.9tripod.com
  9. [root@x4412 x4412-kobject]#
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-6-23 11:37 , Processed in 0.017886 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表