Oddly (for how detailed it is in other places) this skips the actual wire protocol side of enumeration -- reset device, read descriptors, assign address, etc.
Enumeration is an interesting process -- newly reset devices accept transfers to address zero, until the host assigns a non-zero addres. Then the next device (if their are additional devices detected on a hub, or if the just-enumerated device is a hub with devices below it) can be enumerated (initially responding at 0 after reset), walking the entire tree of hubs and devices (and revisiting it as necessary when hubs report connections and disconnections).
Enumeration is an interesting process -- newly reset devices accept transfers to address zero, until the host assigns a non-zero addres. Then the next device (if their are additional devices detected on a hub, or if the just-enumerated device is a hub with devices below it) can be enumerated (initially responding at 0 after reset), walking the entire tree of hubs and devices (and revisiting it as necessary when hubs report connections and disconnections).