In the current usbdev code, each class driver and composite driver
has its own enumeration process, resulting in a high degree of code
duplication and making maintenance difficult.
Maybe we can abstract out the common processes, similar to the composite
device framework in Linux. Different functions only need to provide
descriptor information, and the common processes will be handled by
the composite framework.