Доступ к драйверу Linux через sysfs - PullRequest
7 голосов
/ 13 октября 2011

Я делаю небольшой модуль ядра, чтобы обеспечить доступ из пользовательского пространства к некоторым функциям только в режиме ядра микросхемы ARMv7 (в частности, управление кэшем).Я читаю Драйверы устройств Linux от Корбета, Рубини и Хартмана.В ней описывается, как сделать полноценный драйвер + устройство + шина.Я не хочу создавать водителя автобуса вообще.На самом деле «драйвер», который я создаю, на самом деле не должен совпадать с определением устройства - он неявно сопоставляется с процессором платформы.Может кто-нибудь объяснить мне:

  1. Куда в sysfs должны идти мои атрибуты?Должно ли это быть в моей записи модуля под /sysfs/modules/mymodule?/sys/devices/platform тоже выглядит многообещающе, как и /sys/devices/system/cpu.
  2. Если есть место, куда я должен поместить свои атрибуты kobject /, как мне его подключить?Как мне получить необходимые kset?Все примеры, которые я видел, создают kset, а затем ссылку на него из kobject - я не видел API для запроса существующего имени kset?

Извините, еслиэто просто невероятно очевидно, или если есть где-то действительно простой и легко обнаруживаемый пример, который я по какой-то причине не обнаружил.Кто-нибудь может пролить свет на это?

1 Ответ

8 голосов
/ 13 октября 2011

Я не слишком много работал с 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), если вам нужны другие примеры. Надеюсь, это поможет!

...