一、configfs 简介
configfs 是一个基于内存(ram-based)的文件系统。
二、configfs 和 sysfs 相比
sysfs 是以文件系统的方式呈现内核对象。
configfs 是以文件系统为手段管理内核对象或 config_items。
sysfs 所要呈现的对象在内核中创建(例如,在发现一个新设备时),并使用 sysfs 进行注册。注册后,对象的属性出现在 sysfs 下面,用户空间可以使用 readdir/ 读取属性内容,允许的情况下也可以使用 write 修改属性内容。关键点是:对象的创建和销毁都在内核里完成,其生命周期由内核控制,sysfs 仅仅是呈现这些的方式。
configfs 的 config_item 创建通过用户空间的 mkdir 操作实现,销毁使用 rmdir。mkdir 执行后,属性项也随之出现,后续使用 read/write 修改它们。和 sysfs 相同的是,configfs 同样可以使用 readdir 查询各个属性项,还可以使用 symlink 把一些属性组和起来;不同的是,configfs 的生命周期完全由用户空间控制。属性项背后的内核模块必须响应相应的操作。
sysfs 和 configfs 能够而且也应该在同一个系统上同时存在;并不存在谁替代谁的问题。
三、configfs 示例
3.1 功能简介
- 设备有一个USB接口,该USB支持adb功能和UVC功能,但同时只能使能一个
- 默认是adb功能
- adb功能和UVC功能通过 configfs 进行配置
3.2 配置实例
设备上电:
# ls /sys/kernel/config/ usb_gadget <-- configfs 已经挂载 # ls /sys/kernel/config/usb_gadget/ adb_demo <-- 当前功能:adb # /etc/init.d/S90adb stop <-- 通知adb功能 [ 40.611471] configfs-gadget gadget: unbind function 'Function FS Gadget'/84990c24 # ls /sys/kernel/config/ # # mount -t configfs none /sys/kernel/config <-- 挂载 configfs # ls /sys/kernel/config/ usb_gadget # ls /sys/kernel/config/usb_gadget/ # # # mkdir /sys/kernel/config/usb_gadget/uvc_demo <-- 使能UVC功能 # ls /sys/kernel/config/usb_gadget/ uvc_demo <-- 启用成功 # ls /sys/kernel/config/usb_gadget/uvc_demo/ <-- 内核生成的UVC配置文件 UDC bMaxPacketSize0 functions strings bDeviceClass bcdDevice idProduct bDeviceProtocol bcdUSB idVendor bDeviceSubClass configs os_desc
后续即通过读写这些配置文件,对UVC进行配置。