configfs --- 用户空间控制的内核对象配置

Linux configfs 是一个基于内存的虚拟文件系统,允许用户通过文件系统接口动态配置和管理内核对象。与 sysfs 不同,configfs 中的内核对象(如 USB 设备、网络配置)由用户通过 mkdir 创建、rmdir 销毁,生命周期完全由用户控制。

特性configfssysfs
对象控制 用户通过 mkdir/rmdir 创建/销毁 内核自动创建/销毁
配置灵活性 高(动态配置) 低(静态配置)
典型用途 动态加载模块、USB Gadget 配置 设备树展示、硬件属性调整
文件操作 支持读写属性及目录操作 主要支持属性读写

configfs 使用举例 --- usb_gadget 子系统

先加载驱动

modprobe libcomposite

执行 mount -t configfs none /sys/kernel/config 后,内核会自动在 /sys/kernel/config 下生成已注册的配置子系统(如 usb_gadget)。

在usb_gadget新建一个文件夹,比如aaa,会自动在aaa内创建一些文件和文件夹

functions文件夹对应function驱动,里面创建几个文件夹对应几个function驱动,文件夹命名规则:XXX.任何字符,其中XXX对应下面的XXX

mkdir functions/XXX.0

 

DECLARE_USB_FUNCTION_INIT(XXX, hidg_alloc_inst, hidg_alloc);

 比如 functions/hid.0

DECLARE_USB_FUNCTION_INIT(hid, hidg_alloc_inst, hidg_alloc);

如果在驱动里面有如下代码:

config_group_init_type_name(&opts->func_inst.group, "", &hid_func_type);

则创建好 functions/hid.0 后,自动生成 hid_func_type 包含的属性对应的文件

每个属性都包含读取(show)和修改(store)的函数

struct configfs_attribute {
    const char        *ca_name;
    struct module         *ca_owner;
    umode_t            ca_mode;
    ssize_t (*show)(struct config_item *, char *);
    ssize_t (*store)(struct config_item *, const char *, size_t);
};

 

static const struct config_item_type hid_func_type = {
    .ct_item_ops    = &hidg_item_ops,
    .ct_attrs    = hid_attrs,
    .ct_owner    = THIS_MODULE,
};

static struct configfs_attribute *hid_attrs[] = {
    &f_hid_opts_attr_subclass,
    &f_hid_opts_attr_protocol,
    &f_hid_opts_attr_no_out_endpoint,
    &f_hid_opts_attr_report_length,
    &f_hid_opts_attr_report_desc,
    &f_hid_opts_attr_dev,
    NULL,
};

 

posted @ 2025-07-03 14:00  流水灯  阅读(90)  评论(0)    收藏  举报