首先要知道普通usb是主从模式的, 一切通信都是由主机控制的,从机没有控制权,也有主从转换的情况。
主机通过引脚触发的中断来知道usb设备的插入,然后发起握手,所以gadget作为从机需要有一个引脚来触发主机的引脚的中断,pullup引脚。
主机对从机的握手是通过与从机的ep0的控制节点通信来实现的,来来回回有几次握手,握手会改变从机的一些配置。
握手的时候需要知道从机的配置信息,这些信息都由print.c文件来提供,print.c还提供对应用层的接口。
at91_udc.c提供gadget 和 eps的抽象 ,在中断处理函数维持状态机,以及最最底层的操作。
udc_core.c 来链接各种对象的关联,使得各个对象相互之间能找到。
composite.c 只是一个适配层,提供共性,特性需要具体的驱动提供。订阅者模式。
各个容器通过链表,指针什么的关联在一起,相互之间能找到。
初始化
udc_bind_to_driver -》composite_bind --》 printer_bind
-》usb_gadget_udc_start-》at91_start-》at91_pullup
探测握手
handle_setup->composite_setup-》usb_function.setup->printer_func_setup
-》usb_function.set_alt-》printer_func_set_alt