Gadget arch and API
https://blog.youkuaiyun.com/wenlifu71022/article/details/4668512
USB 驱动及设备生命线
https://blog.youkuaiyun.com/zhqh100/category_3045907.html
1.查看注册了多少个UDC
ls /sys/class/udc/
2.configfs
https://blog.youkuaiyun.com/u014135607/article/details/79949571
https://blog.youkuaiyun.com/litao31415/article/details/97613438
3.lsusb查看USB设备信息
https://ipcmen.com/lsusb
4.USB PC网络通信
https://blog.youkuaiyun.com/forfuture_/article/details/79266375
5.USB gadget, hdrc
https://www.jianshu.com/p/2c1d38086a8b
https://www.jianshu.com/p/d341022167b4
6.gadget驱动分层
https://blog.youkuaiyun.com/litao31415/article/details/99689399
Function
usb_function
usb_function_instance
基于nanopi neo源代码分析musb_core, udc_core, composite, gadget等模块关系
legacy webcam.c module_usb_composite_driver (entry)->
get gadget_driver from composite_driver_template
search udc for udc_list
udc_bind_to_driver->
gadget driver bind
udc start
usb_composite_driver->
bind (be invoked in composite_bind)->
usb_get_function_instance(“uvc”);
usb_add_config to usb_composite_dev
usb_gadget_driver
gadget composite.c usb_gadget_driver (value copied to usb_composite_driver)
bind->
create usb_composite_dev
udc core.c usb_gadget_probe_driver,
udc_bind_to_driver(so where is udc generated)
(usb_add_gadget_udc is provided by udc_core)
musb_core.c struct platform_driver musb_driver
musb_probe->
musb_init_controller->
create musb instance
musb_platform_init->
invoke “musb_platform_ops->init” in sunxi.c (glue layer)
init workqueue (for what purpose?),
Setup by port mode
host
gadget
musb_gadget_setup->
usb_add_gadget_udc
dual role
musb_init_debugfs
sysfs_create_group
glue layer sunxi.c struct platform_driver sunxi_musb_driver
sunxi_musb_probe->
usb_phy_generic_register
sunxi_musb_ops
platform_device_register_full (hdrc)
1.how gadget bind to udc
legacy ->
usb_composite_driver with empty usb_gadget_driver
“module_usb_composite_driver”, this macro for registering usb_composite_driver by “composite usb_composite_probe” in composite
composite ->
real usb_gadget_driver
usb_composite_probe invoke “usb_gadget_probe_driver” in udc core
udc core ->
usb_udc
usb_gadget_probe_driver->udc_bind_to_driver-> usb_gadget_driver bind(in composite.c):
***create usb_composite_dev
usb_composite_driver->bind (legacy)
usb_gadget_udc_start
2.where udc generate
musb_core ->
platform_driver -> musb_probe -> musb_init_controller-> invoke musb_gadget_setup (in musb_gadget)
struct musb
struct usb_gadget g; //attributes be assigned in musb_gadget
usb_gadget_ops
struct usb_gadget_driver *gadget_driver; //be assigned in g.usb_gadget_ops->udc_start
musb_gadget->
musb_gadget_setup -> invoke usb_add_gadget_udc (in usb_core, gadget instance is also in udc)
udc core ->
usb_add_gadget_udc: create usb_udc
3.struct usb_function
struct usb_configuration
struct usb_composite_dev *cdev (be assigned in usb_add_config , invoke usb_add_config_only)
4.zero.c workflow
module_usb_composite_driver->
usb_composite_probe->
assign “gadget_driver” in “usb_composite_driver” with “composite_driver_template”
usb_gadget_probe_driver->
get udc(struct usb_udc) from udc_list
udc_bind_to_driver-> composite_bind(gadget driver bind)
->create “usb_composite_dev”
->bind (usb_composite_driver)
usb_gadget_udc_start (usb_gadget_ops->udc_start)
5.udc register workflow
struct platform_driver musb_driver->musb_probe->musb_init_controller->musb_gadget_setup->
usb_gadget_ops assignment
usb_add_gadget_udc