通过sysfs访问Linux驱动程序

问题描述:

我正在制作一个小型内核模块,以提供用户空间访问ARMv7芯片(特别是缓存控制)的某些内核模式特性。我正在阅读Corbet,Rubini和Hartman的Linux设备驱动程序。其中他们描述了如何制作完整的驱动程序+设备+总线。我根本不想创造一个公共汽车司机。事实上,我所做的'驱动程序'并不需要完全匹配设备定义 - 它隐含地与平台的CPU相匹配。任何人都可以向我解释:通过sysfs访问Linux驱动程序

  1. 哪里在sysfs应该我的属性去?是否应该在/sysfs/modules/mymodule的模块条目中? /sys/devices/platform似乎也很有希望,/sys/devices/system/cpu也是如此。
  2. 如果现有的地方应该放置我的kobject /属性,我该如何将它插入它?我如何获得必要的kset?我见过的所有示例创建了一个kset,然后从kobject链接到它 - 我还没有看到用于请求现有名为kset的API?

很抱歉,如果这仅仅是不可能明显,或如果有一些非常简单和容易的地方发现的例子,我还没有发现由于某种原因。任何人都可以对此有所了解吗?

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

这是一个平台驱动程序吗?作为不适合任何巴士的司机,这似乎是一个不错的选择。平台驱动程序在/ sys/devices/platform下获得自己的目录,并且可以在那里有属性。看看drivers/hwmon/coretemp.c,它有temp1_crit,temp1_crit_alarm,temp1_input等属性。它看起来相当简单:创建属性(可能与__ATTR()?),将它们全部列在数组中,定义attribute_group,在probe()函数中用sysfs_create_group()注册它,并在remove()函数中用sysfs_remove_group()取消注册。

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

+0

我会看看coretemp.c驱动程序。谢谢! –

+0

更新 - coretemp模块是完美的模板。我有一些sysfs属性工作得很好。再次感谢。 –