一、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進行配置。