我正在制作一个小内核模块,以提供用户空间访问ARMv7芯片的某些仅内核模式功能(特别是缓存控制)。我正在阅读Corbet,Rubini和Hartman的 Linux设备驱动程序。在其中,他们描述了如何制作完整的驱动程序+设备+总线。我根本不想创建一个总线驱动程序。事实上,我正在制作的“驱动程序”根本不需要与设备定义匹配 - 它与平台的CPU隐式匹配。任何人都可以向我解释:
/sysfs/modules/mymodule
下的模块条目中吗? /sys/devices/platform
似乎也很有希望,/sys/devices/system/cpu
也是如此。kobject
/属性的地方,我该如何将其插入其中?我如何获得必要的kset
?我见过的所有示例都创建了kset
,然后从kobject
链接到它 - 我还没有看到用于请求现有名为kset
的API?很抱歉,如果这显然是不可能的,或者某些地方有一些非常直接且容易发现的例子,我还没有因为某些原因而发现。任何人都可以对此有所了解吗?
答案 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_crit
,temp1_crit_alarm
,temp1_input
等属性。看起来相当简单:创建属性(可能是__ATTR()
?),将它们全部列在数组中,定义attribute_group
,在sysfs_create_group()
函数中用probe()
注册它,并在sysfs_remove_group()
函数中使用remove()
取消注册。
如果您需要其他示例,可能还有其他平台驱动程序可以定义属性(搜索sysfs_create_group
)。希望这有帮助!