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

x4412&ibox项目实战25-测试kobject-example驱动

[复制链接]
跳转到指定楼层
楼主
发表于 2014-9-28 19:55:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在kernel/samples/kobject目录下存在一个最简单的kobject驱动事例,我们可以将它编译在模块测试。
    打开内核的menuconfig界面,在Kernel hacking菜单下,找到Sample kernel code选项并选中,进入该选项,选中Buildkobject examples选项。注意,这个选项只允许编译成模块,不允许编译进内核。
    保存配置后重新编译内核,在kernel/samples/kobject目录下将会生成目标文件kobject-example.ko。在开发板上加载模块,可以看到,在sys/kernel目录下新生成了kobject_example目录:
  1. [root@x4412 kernel]# ls
  2. debug/         ipv4/          notes          uevent_helper
  3. fscaps         mm/            slab/          uevent_seqnum
  4. [root@x4412 kernel]# insmod /mnt/kobject-example.ko
  5. [root@x4412 kernel]# ls
  6. debug/           kobject_example/ slab/
  7. fscaps           mm/              uevent_helper
  8. ipv4/            notes            uevent_seqnum
  9. [root@x4412 kernel]#
复制代码
    kobject_create_and_add()函数创建了该目录。在该目录下存在三个文件:
  1. [root@x4412 kernel]# ls kobject_example/ -la
  2. total 0
  3. drwxr-xr-x    2 root     root             0 Sep 28 11:38 ./
  4. drwxr-xr-x    7 root     root             0 Sep 28 07:20 ../
  5. -rw-rw-rw-    1 root     root          4096 Sep 28 11:41 bar
  6. -rw-rw-rw-    1 root     root          4096 Sep 28 11:41 baz
  7. -rw-rw-rw-    1 root     root          4096 Sep 28 11:41 foo
复制代码
    它是由sysfs_create_group()函数生成的。这三个文件在程序中被定义如下:
  1. static struct kobj_attribute baz_attribute =__ATTR(baz, 0666, b_show, b_store);
  2. static struct kobj_attribute bar_attribute =__ATTR(bar, 0666, b_show, b_store);
  3. static struct kobj_attribute foo_attribute =__ATTR(foo, 0666, foo_show, foo_store);
复制代码
       __ATTR()的参数中可以看出,三个文件的属性均为666,这和我们查看的正好吻合。另外,bazbar两个文件共享相同的读取和写入的函数b_showb_storefoo单独享有读取和写入函数foo_showfoo_store。可见,多个文件享有同一个读取或写入函数是完全合法的。
       linux串口终端通过catecho指令可以测试驱动是否能正常工作:
  1. [root@x4412 kernel]# cd kobject_example/
  2. [root@x4412 kobject_example]# echo 123 > bar
  3. [root@x4412 kobject_example]# echo 456 > baz
  4. [root@x4412 kobject_example]# echo 789 > foo
  5. [root@x4412 kobject_example]# cat bar
  6. 123
  7. [root@x4412 kobject_example]# cat baz
  8. 456
  9. [root@x4412 kobject_example]# cat foo
  10. 789
复制代码
       当我们卸载驱动模块后,模块卸载函数会调用kobject_put函数来减少计数,对应的设备节点将被全部释放:
  1. [root@x4412 kernel]# ls
  2. debug/           kobject_example/ slab/
  3. fscaps           mm/              uevent_helper
  4. ipv4/            notes            uevent_seqnum
  5. [root@x4412 kernel]# rmmod /mnt/kobject-example.ko
  6. [root@x4412 kernel]# ls
  7. debug/         ipv4/          notes          uevent_helper
  8. fscaps         mm/            slab/          uevent_seqnum
  9. [root@x4412 kernel]#
复制代码
       这就是最简单的sysfs设备文件系统,它彻底颠覆并淘汰了传统的devfs,成为后面linux2.6,linux2.8,linux3.0以及更高版本的设备文件系统的主流。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 16:56 , Processed in 0.017325 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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