let bus_of_usb_bus b =
  let rec aux dev =
    if is_null dev
    then []
    else { filename = usb_device_filename dev;
           bus = get_bus;
           descriptor = usb_device_descriptor dev;
           ep = Array.map (fun x -> 
                             let addr = x.bEndpointAddress in
                               if addr land 0x80 <> 0
                               then ReadEp addr
                               else WriteEp addr) ((usb_device_config dev).interf.altsetting.endpoint);
           usb_device = dev } :: (aux (usb_device_next dev)) 
  and get_bus () = { dirname = usb_bus_dirname b;
                     devices = aux (usb_bus_devices b) } 
  in get_bus ()