cfg文件所在路径
https://gitee.com/openharmony/device_board_hihope/blob/master/rk3568/cfg/init.rk3568.usb.cfg
https://gitee.com/openharmony/drivers_peripheral/blob/master/usb/cfg/init.usb.configfs.cfg
- 首先将configfs文件系统挂载到系统上
mount configfs none /config
一、创建设备
- 创建设备对应的目录:
mkdir /config/usb_gadget/g1 0770 shell shell
- 每个设备有它自己的product id和vendor id
write /config/usb_gadget/g1/idVendor 0x2207
write /config/usb_gadget/g1/idProduct 0x0018
- 每个设备 也必须有他的 序列号、厂商、产品字符串,创建一个string目录用来存放这些信息。
mkdir /config/usb_gadget/g1/strings/0x409 0770
copy /sys/block/mmcblk0/device/cid /config/usb_gadget/g1/strings/0x409/serialnumber
write /config/usb_gadget/g1/strings/0x409/manufacturer Rockchip
write /config/usb_gadget/g1/strings/0x409/product \"HDC Device\"
二、创建配置
- 每个设备由许多配置组成,这些配置对应的目录也需要被创建
mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell
- 每个配置也需要有自己的字符串,所以对于每种语言需要创建一个对应的string目录
mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell
- 然后这个配置的字符串就可以被写进去了
write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration hdc
- 这个配置的其它一些属性也可以被设置进去
write /config/usb_gadget/g1/configs/b.1/MaxPower 500
三、创建功能
- 设备将会提供一些功能,对于每一个功能其对应的目录也必须被创建
mkdir /config/usb_gadget/g1/functions/ffs.hdc
四、将功能和对应的配置关联起来
- 现在创建了很多设备,每个设备有一些配置和一些功能。那么接下来就需要我们标识出来哪些功能在哪个配置里面是有效。一个功能可以被包含在多个配置当中。上述动作通过符号链接来完成。
symlink /config/usb_gadget/g1/functions/ffs.hdc /config/usb_gadget/g1/configs/b.1/f1
挂载functionfs文件系统
- functionfs可以把它当做一个具有独特行为的复合function。主要作用是在挂载的functionfs文件系统目录下生成ep0目录,用来写入描述符和字符串完成协商。
mount functionfs hdc /dev/usb-ffs/hdc uid=2000,gid=2000
五、使能该设备
- 为了使能这个设备我们必须要将它绑定到某个udc上面去
write /config/usb_gadget/g1/UDC ${sys.usb.controller}
UDC名称应该是目录/sys/class/udc/*
下面的某一个。
六、去使能该设备
write /config/usb_gadget/g1/UDC none
七、清除
- 从配置里面移除功能
rm /config/usb_gadget/g1/configs/b.1/f1
- 移除配置里面的字符串目录(没找到)
rmdir configs/<config name>.<number>/strings/<lang>
- 移除配置(没找到)
rmdir configs/<config name>.<number>
- 移除功能(没找到)
rmdir functions/<name>.<instance name>
- 移除设备字符串目录(没找到)
rmdir strings/<lang>
- 最后移除设备
rmdir <gadget name>
实现设计
- 一个gadget有它的config组,这个组有一些属性(idVendor, idProduct etc)和默认的子组(configs, functions, strings)。
- 写这些属性,将会导致这些属性存储在对应的位置。在configs, functions, strings子组里面,用户可以创建他们的子组,代表相应的配置,功能和字符串。
- 用户可以创建一些配置和功能,并使用符号链接将他们关联起来。在设备的UDC属性被写之后,这些信息将会被使用。这个写意味着将该设备和对应的UDC关联起来了。
drivers/usb/gadget/configfs.c
里面的代码将会便利所有的配置,在每个配置里面将会便利所有的功能,并绑定他们。
参考资料
Linux USB gadget configured through configfs
How FunctionFS works