Linux驱动程序通过sysfs访问

时间:2011-10-12 23:26:23

标签: linux kernel driver linux-device-driver sysfs

我正在制作一个小内核模块,以提供用户空间访问ARMv7芯片的某些仅内核模式功能(特别是缓存控制)。我正在阅读Corbet,Rubini和Hartman的 Linux设备驱动程序。在其中,他们描述了如何制作完整的驱动程序+设备+总线。我根本不想创建一个总线驱动程序。事实上,我正在制作的“驱动程序”根本不需要与设备定义匹配 - 它与平台的CPU隐式匹配。任何人都可以向我解释:

  1. sysfs中我的属性应该去哪里?它应该在/sysfs/modules/mymodule下的模块条目中吗? /sys/devices/platform似乎也很有希望,/sys/devices/system/cpu也是如此。
  2. 如果存在我应该放置kobject /属性的地方,我该如何将其插入其中?我如何获得必要的kset?我见过的所有示例都创建了kset,然后从kobject链接到它 - 我还没有看到用于请求现有名为kset的API?
  3. 很抱歉,如果这显然是不可能的,或者某些地方有一些非常直接且容易发现的例子,我还没有因为某些原因而发现。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:8)

我没有使用过很多sysfs,但是我发现了一个看起来很简单的例子,它和你正在做的很相似(当然,它也在ARM下)。查看arch/arm/mach-omap1/pm.c,特别是idle_show / idle_store sysfs文件。它被注册(使用sysfs_create_file())为/sys/power/sleep_while_idle并使用全局/sys/power kobj(在include/linux/kobject.h中定义)。在那里定义了一些其他全局kobj,你可以使用,虽然我不认为任何适合你的驱动程序。

这会成为平台驱动程序吗?作为一个不适合任何公共汽车的司机,它似乎很合适。平台驱动程序在/ sys / devices / platform下获得自己的目录,并且可以在那里拥有属性。请查看drivers/hwmon/coretemp.c,其中包含temp1_crittemp1_crit_alarmtemp1_input等属性。看起来相当简单:创建属性(可能是__ATTR()?),将它们全部列在数组中,定义attribute_group,在sysfs_create_group()函数中用probe()注册它,并在sysfs_remove_group()函数中使用remove()取消注册。

如果您需要其他示例,可能还有其他平台驱动程序可以定义属性(搜索sysfs_create_group)。希望这有帮助!