sysfs

sysfsとは

 ドライバに関連する情報を上位層とやり取りする為のファイルをRAM上で提供する仕組みです。制御も可能ですが、情報のやり取りを主目的として使われるインターフェースです。上位層とのインターフェースとしては、1行から作成可能であり最も簡単に作成できます。

使い方

 ltr578_i2c_probeから呼ばれるltr578_create_attrに記載がある、driver_create_fileがsysfs内にファイルを作成しています。この作成されたファイルの読み書きを上位層が行うことで、ドライバのパラメータの読み書きが可能です。

kernel/mediatek/4.4/drivers/misc/mediatek/sensors-1.0/alsps/ltr578/ltr578.c

err = driver_create_file(driver, ltr578_attr_list[idx]);

driver_create_fileの引数に渡しているltr578_attr_listには、sysfs上に作成するファイルに関する情報が格納されています。
これらはDRIVER_ATTRによって定義されます。

DRIVER_ATTR(name, mode, show_func, store_func)

name: sysfs上のファイル名
mode: S_IRUGO(読み取り可能)やS_IWUSR(書き込み可能)などのファイル権限
show_func: ファイルが読み込みされた時に呼ばれるコールバック関数
store_func: ファイルに書き込みされた時に呼ばれるコールバック関数

 より簡単にsysfs上のファイルを作る方法としてmodule_paramが存在します。1行から作成可能な方法がこちらになります。

kernel/mediatek/4.4/include/linux/moduleparam.h

/**
 * module_param - typesafe helper for a module/cmdline parameter
 * @value: the variable to alter, and exposed parameter name.
 * @type: the type of the parameter
 * @perm: visibility in sysfs.
 *
 * @value becomes the module parameter, or (prefixed by KBUILD_MODNAME and a
 * ".") the kernel commandline parameter.  Note that - is changed to _, so
 * the user can use "foo-bar=1" even for variable "foo_bar".
 *
 * @perm is 0 if the the variable is not to appear in sysfs, or 0444
 * for world-readable, 0644 for root-writable, etc.  Note that if it
 * is writable, you may need to use kernel_param_lock() around
 * accesses (esp. charp, which can be kfreed when it changes).
 *
 * The @type is simply pasted to refer to a param_ops_##type and a
 * param_check_##type: for convenience many standard types are provided but
 * you can create your own by defining those variables.
 *
 * Standard types are:
 *	byte, short, ushort, int, uint, long, ulong
 *	charp: a character pointer
 *	bool: a bool, values 0/1, y/n, Y/N.
 *	invbool: the above, only sense-reversed (N = true).
 */
#define module_param(name, type, perm)				\
	module_param_named(name, name, type, perm)

name: sysfs上のファイル名
type: データ型
perm: S_IRUGO(読み取り可能)やS_IWUSR(書き込み可能)などのファイル権限

 module_paramの派生で、書き込み時と読み込み時にコールバックを登録できる方法としてmodule_param_callも存在します。

#define module_param_call(name, set, get, arg, perm)

name: sysfs上のファイル名
set: ファイルに書き込みされた時に呼ばれるコールバック関数
get: ファイルが読み込みされた時に呼ばれるコールバック関数
arg: 関数へ渡される追加の引数 (省略可)
perm: S_IRUGO(読み取り可能)やS_IWUSR(書き込み可能)などのファイル権限

最後に

 sysfsのファイルは/sys配下に作成されます。近接照度センサドライバのdriver_create_file(driver, ltr578_attr_list[idx])で作られたファイルは、以下に作成されています。残念ながら開発者でないので、読み込みはできません。

maverick:/ $ ls /sys/bus/platform/drivers/als_ps
ls: /sys/bus/platform/drivers/als_ps/ps: Permission denied
ls: /sys/bus/platform/drivers/als_ps/reg: Permission denied
ls: /sys/bus/platform/drivers/als_ps/bind: Permission denied
ls: /sys/bus/platform/drivers/als_ps/recv: Permission denied
ls: /sys/bus/platform/drivers/als_ps/send: Permission denied
ls: /sys/bus/platform/drivers/als_ps/alslv: Permission denied
ls: /sys/bus/platform/drivers/als_ps/trace: Permission denied
ls: /sys/bus/platform/drivers/als_ps/alsval: Permission denied
ls: /sys/bus/platform/drivers/als_ps/config: Permission denied
ls: /sys/bus/platform/drivers/als_ps/enable: Permission denied
ls: /sys/bus/platform/drivers/als_ps/status: Permission denied
ls: /sys/bus/platform/drivers/als_ps/uevent: Permission denied
ls: /sys/bus/platform/drivers/als_ps/unbind: Permission denied
ls: /sys/bus/platform/drivers/als_ps/alscali: Permission denied
ls: /sys/bus/platform/drivers/als_ps/alstest: Permission denied

コメント

タイトルとURLをコピーしました