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
コメント