A USB device enumeration method implemented in a USB device comprising a USB device controller, comprising: (a) determining a type of operating system of a USB host connected to the USB device, wherein step (a) includes: presenting the USB device to the USB host as a commonly supported USB device; performing a pseudo enumeration and collecting host OS behavior factors from messages received from the USB host, wherein the host OS behavior factors include one or more factors selected from a group consisting of: Microsoft OS Descriptor related messages, wLength of a first Get Configuration Descriptor message, wLength of a second Get Configuration Descriptor message, Interface Association Descriptor related messages, and identity of a second request after SET_ADDRESS; and determining the type of OS of the USB host based on the collected host OS behavior factors; causing the USB device controller to detach from the USB host by sending a shut down command to the USB device controller; and causing the USB device controller to again attach to the USB host, presenting itself as target USB device; and performing USB device enumeration with the USB host using a USB device enumeration process selected from a plurality of USB device enumeration processes stored in the USB device based on the determined type of OS of the USB host. (a) determining a type of operating system of a USB host connected to the USB device, wherein step (a) includes: presenting the USB device to the USB host as a commonly supported USB device; performing a pseudo enumeration and collecting host OS behavior factors from messages received from the USB host, wherein the host OS behavior factors include one or more factors selected from a group consisting of: Microsoft OS Descriptor related messages, wLength of a first Get Configuration Descriptor message, wLength of a second Get Configuration Descriptor message, Interface Association Descriptor related messages, and identity of a second request after SET_ADDRESS; and determining the type of OS of the USB host based on the collected host OS behavior factors; presenting the USB device to the USB host as a commonly supported USB device; performing a pseudo enumeration and collecting host OS behavior factors from messages received from the USB host, wherein the host OS behavior factors include one or more factors selected from a group consisting of: Microsoft OS Descriptor related messages, wLength of a first Get Configuration Descriptor message, wLength of a second Get Configuration Descriptor message, Interface Association Descriptor related messages, and identity of a second request after SET_ADDRESS; and determining the type of OS of the USB host based on the collected host OS behavior factors; causing the USB device controller to detach from the USB host by sending a shut down command to the USB device controller; and causing the USB device controller to again attach to the USB host, presenting itself as target USB device; and performing USB device enumeration with the USB host using a USB device enumeration process selected from a plurality of USB device enumeration processes stored in the USB device based on the determined type of OS of the USB host.