Commit initial
This commit is contained in:
		
							
								
								
									
										0
									
								
								jbuild-workspace
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								jbuild-workspace
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										21
									
								
								lib/generator/g.ml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								lib/generator/g.ml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					open Ctypes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module U = T.Types(My_types)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module P(F:Cstubs.FOREIGN) = struct
 | 
				
			||||||
 | 
					  open F
 | 
				
			||||||
 | 
					  let error_name =                  foreign "libusb_error_name"                  (U.error @-> returning string)
 | 
				
			||||||
 | 
					  let error_description =           foreign "libusb_strerror"                    (U.error @-> returning string)
 | 
				
			||||||
 | 
					  let init =                        foreign "libusb_init"                        (ptr void @-> returning U.error)
 | 
				
			||||||
 | 
					  let exit =                        foreign "libusb_exit"                        (ptr void @-> returning void)
 | 
				
			||||||
 | 
					  let get_version =                 foreign "libusb_get_version"                 (void @-> returning (ptr U.version))
 | 
				
			||||||
 | 
					  let get_device_list =             foreign "libusb_get_device_list"             (ptr void @-> ptr (ptr (ptr U.device)) @-> returning U.error)
 | 
				
			||||||
 | 
					  let free_device_list =            foreign "libusb_free_device_list"            (ptr (ptr U.device) @-> int @-> returning void)
 | 
				
			||||||
 | 
					  let unref_device =                foreign "libusb_unref_device"                (ptr U.device @-> returning void)
 | 
				
			||||||
 | 
					  let open_device =                 foreign "libusb_open"                        (ptr U.device @-> ptr (ptr U.device_handle) @-> returning U.error)
 | 
				
			||||||
 | 
					  let close_device =                foreign "libusb_close"                       (ptr U.device_handle @-> returning void)
 | 
				
			||||||
 | 
					  let get_device_descriptor =       foreign "libusb_get_device_descriptor"       (ptr U.device @-> ptr U.device_descriptor @-> returning U.error)
 | 
				
			||||||
 | 
					  let get_string_descriptor_ascii = foreign "libusb_get_string_descriptor_ascii" (ptr U.device_handle @-> uint8_t @-> ptr char @-> int @-> returning U.error)
 | 
				
			||||||
 | 
					  let control_transfer =            foreign "libusb_control_transfer"            (ptr U.device_handle @-> uint8_t @-> uint8_t @-> uint16_t @-> uint16_t @-> ptr char @-> uint16_t @-> uint @-> returning U.error)
 | 
				
			||||||
 | 
					  let bulk_transfer =               foreign "libusb_bulk_transfer"               (ptr U.device_handle @-> uint8_t @-> ptr char @-> int @-> ptr int @-> uint @-> returning U.error)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										16
									
								
								lib/generator/generator.ml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								lib/generator/generator.ml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					open G
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let () =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (***  C part ***)
 | 
				
			||||||
 | 
					  let oc = open_out "cstub_libusb.c" in
 | 
				
			||||||
 | 
					  let cstub = Format.formatter_of_out_channel oc in
 | 
				
			||||||
 | 
					  Format.fprintf cstub "#include <libusb.h>\n";
 | 
				
			||||||
 | 
					  Cstubs.write_c cstub "libusb" (module P);
 | 
				
			||||||
 | 
					  close_out oc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (***  ML part ***)
 | 
				
			||||||
 | 
					  let oc = open_out "bindings.ml" in
 | 
				
			||||||
 | 
					  let bindings = Format.formatter_of_out_channel oc in
 | 
				
			||||||
 | 
					  Cstubs.write_ml bindings "libusb" (module P);
 | 
				
			||||||
 | 
					  close_out oc
 | 
				
			||||||
							
								
								
									
										6
									
								
								lib/generator/jbuild
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								lib/generator/jbuild
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					(executable(
 | 
				
			||||||
 | 
					           (name generator)
 | 
				
			||||||
 | 
					           (libraries (ctypes.stubs))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(copy_files stubs/{t,my_types}.ml)
 | 
				
			||||||
@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					let () =
 | 
				
			||||||
 | 
					  Format.fprintf Format.std_formatter "#include <libusb.h>@.";
 | 
				
			||||||
 | 
					  Cstubs.Types.write_c Format.std_formatter (module T.Types)
 | 
				
			||||||
							
								
								
									
										9
									
								
								lib/generator/stubs/c_types_generator/jbuild
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								lib/generator/stubs/c_types_generator/jbuild
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					(executable(
 | 
				
			||||||
 | 
					           (name c_types_generator)
 | 
				
			||||||
 | 
					           (libraries (ctypes.stubs))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(rule(
 | 
				
			||||||
 | 
					     (targets (t.ml))
 | 
				
			||||||
 | 
					     (action (copy ../t.ml t.ml))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					Printf.printf "-I%s%!"
 | 
				
			||||||
 | 
					  (
 | 
				
			||||||
 | 
					    Findlib.init ();
 | 
				
			||||||
 | 
					    Findlib.package_directory "ctypes"
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
							
								
								
									
										4
									
								
								lib/generator/stubs/ctypes_cflags_generator/jbuild
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								lib/generator/stubs/ctypes_cflags_generator/jbuild
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					(executable(
 | 
				
			||||||
 | 
					           (name ctypes_cflags_generator)
 | 
				
			||||||
 | 
					           (libraries (findlib))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
							
								
								
									
										36
									
								
								lib/generator/stubs/jbuild
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								lib/generator/stubs/jbuild
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					(rule(
 | 
				
			||||||
 | 
					     (targets (my_types.ml))
 | 
				
			||||||
 | 
					     (deps (my_types_generator.exe))
 | 
				
			||||||
 | 
					     (action (with-stdout-to ${@} (run ${<})))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(rule(
 | 
				
			||||||
 | 
					     (targets (my_types_generator.exe))
 | 
				
			||||||
 | 
					     (deps (my_types_generator.c))
 | 
				
			||||||
 | 
					     (action (run ${CC}
 | 
				
			||||||
 | 
					               -o ${@}
 | 
				
			||||||
 | 
					               ${read:libusb_cflags}
 | 
				
			||||||
 | 
					               ${read:ctypes_cflags}
 | 
				
			||||||
 | 
					               -I${ocaml-config:standard_library}
 | 
				
			||||||
 | 
					               ${<}))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(rule(
 | 
				
			||||||
 | 
					     (targets (my_types_generator.c))
 | 
				
			||||||
 | 
					     (action
 | 
				
			||||||
 | 
					      (with-stdout-to ${@}
 | 
				
			||||||
 | 
					       (run c_types_generator/c_types_generator.exe)
 | 
				
			||||||
 | 
					     ))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(rule(
 | 
				
			||||||
 | 
					     (targets (ctypes_cflags))
 | 
				
			||||||
 | 
					     (action (with-stdout-to ${@}
 | 
				
			||||||
 | 
					              (run ctypes_cflags_generator/ctypes_cflags_generator.exe)))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(rule(
 | 
				
			||||||
 | 
					     (targets (libusb_cflags))
 | 
				
			||||||
 | 
					     (action (with-stdout-to ${@}
 | 
				
			||||||
 | 
					              (run libusb_cflags_generator/libusb_cflags_generator.exe)))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
							
								
								
									
										4
									
								
								lib/generator/stubs/libusb_cflags_generator/jbuild
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								lib/generator/stubs/libusb_cflags_generator/jbuild
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					(executable(
 | 
				
			||||||
 | 
					           (name libusb_cflags_generator)
 | 
				
			||||||
 | 
					           (libraries (configurator))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					let (>>|) a f = match a with None -> None | Some a -> f a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let libusb_c_flags =
 | 
				
			||||||
 | 
					  let open Configurator in
 | 
				
			||||||
 | 
					  create "c"
 | 
				
			||||||
 | 
					  |> Pkg_config.get
 | 
				
			||||||
 | 
					  >>| Pkg_config.query ~package:"libusb-1.0"
 | 
				
			||||||
 | 
					  >>| (fun Pkg_config.{cflags} ->
 | 
				
			||||||
 | 
					      Some (String.concat " " cflags))
 | 
				
			||||||
 | 
					  |> (function
 | 
				
			||||||
 | 
					      | None -> "libusb flag not found"
 | 
				
			||||||
 | 
					      | Some f -> f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let () = Printf.printf "%s%!" libusb_c_flags
 | 
				
			||||||
							
								
								
									
										117
									
								
								lib/generator/stubs/t.ml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								lib/generator/stubs/t.ml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					open Ctypes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type error =
 | 
				
			||||||
 | 
					  | Number of int             (** A positive number *)
 | 
				
			||||||
 | 
						| Success                   (** Success (no error) *)
 | 
				
			||||||
 | 
					  | Error_io                  (** Input/output error *)
 | 
				
			||||||
 | 
					  | Error_invalid_param       (** Invalid parameter *)
 | 
				
			||||||
 | 
					  | Error_access              (** Access denied (insufficient permissions) *)
 | 
				
			||||||
 | 
					  | Error_no_device           (** No such device (it may have been disconnected) *)
 | 
				
			||||||
 | 
					  | Error_not_found           (** Entity not found *)
 | 
				
			||||||
 | 
					  | Error_busy                (** Resource busy *)
 | 
				
			||||||
 | 
					  | Error_timeout             (** Operation timed out *)
 | 
				
			||||||
 | 
					  | Error_overflow            (** Overflow *)
 | 
				
			||||||
 | 
					  | Error_pipe                (** Pipe error *)
 | 
				
			||||||
 | 
					  | Error_interrupted         (** System call interrupted (perhaps due to signal) *)
 | 
				
			||||||
 | 
					  | Error_no_mem              (** Insufficient memory *)
 | 
				
			||||||
 | 
					  | Error_not_supported       (** Operation not supported or unimplemented on this platform *)
 | 
				
			||||||
 | 
					  | Error_other               (** Other error *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type version = {
 | 
				
			||||||
 | 
					  major: int;                   (** Library major version *)
 | 
				
			||||||
 | 
					  minor: int;                   (** Library major version *)
 | 
				
			||||||
 | 
					  micro: int;                   (** Library micro version *)
 | 
				
			||||||
 | 
					  nano: int;                    (** Library nano version *)
 | 
				
			||||||
 | 
					  rc: string;                   (** Library release candidate suffix string, e.g. "-rc4" *)
 | 
				
			||||||
 | 
					  describe: string;             (** For ABI compatibility only *)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type device_descriptor = {
 | 
				
			||||||
 | 
					  id_vendor: int;	      (** Vendor ID. *)
 | 
				
			||||||
 | 
					  id_product: int;   	  (** Product ID.*)
 | 
				
			||||||
 | 
					  i_manufacturer: int;	(** Index of string descriptor describing manufacturer. *)
 | 
				
			||||||
 | 
					  i_product: int;	      (** Index of string descriptor describing product. *)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module Types(T:Cstubs.Types.TYPE) = struct
 | 
				
			||||||
 | 
					  let success              = T.constant "LIBUSB_SUCCESS"             T.int64_t
 | 
				
			||||||
 | 
					  let error_io             = T.constant "LIBUSB_ERROR_IO"            T.int64_t
 | 
				
			||||||
 | 
					  let error_invalid_param  = T.constant "LIBUSB_ERROR_INVALID_PARAM" T.int64_t
 | 
				
			||||||
 | 
					  let error_access         = T.constant "LIBUSB_ERROR_ACCESS"        T.int64_t
 | 
				
			||||||
 | 
					  let error_no_device      = T.constant "LIBUSB_ERROR_NO_DEVICE"     T.int64_t
 | 
				
			||||||
 | 
					  let error_not_found      = T.constant "LIBUSB_ERROR_NOT_FOUND"     T.int64_t
 | 
				
			||||||
 | 
					  let error_busy           = T.constant "LIBUSB_ERROR_BUSY"          T.int64_t
 | 
				
			||||||
 | 
					  let error_timeout        = T.constant "LIBUSB_ERROR_TIMEOUT"       T.int64_t
 | 
				
			||||||
 | 
					  let error_overflow       = T.constant "LIBUSB_ERROR_OVERFLOW"      T.int64_t
 | 
				
			||||||
 | 
					  let error_pipe           = T.constant "LIBUSB_ERROR_PIPE"          T.int64_t
 | 
				
			||||||
 | 
					  let error_interrupted    = T.constant "LIBUSB_ERROR_INTERRUPTED"   T.int64_t
 | 
				
			||||||
 | 
					  let error_no_mem         = T.constant "LIBUSB_ERROR_NO_MEM"        T.int64_t
 | 
				
			||||||
 | 
					  let error_not_supported  = T.constant "LIBUSB_ERROR_NOT_SUPPORTED" T.int64_t
 | 
				
			||||||
 | 
					  let error_other          = T.constant "LIBUSB_ERROR_OTHER"         T.int64_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let error = T.enum "libusb_error" [
 | 
				
			||||||
 | 
					      Success,               success;
 | 
				
			||||||
 | 
					      Error_io,              error_io;
 | 
				
			||||||
 | 
					      Error_invalid_param,   error_invalid_param ;
 | 
				
			||||||
 | 
					      Error_access,          error_access ;
 | 
				
			||||||
 | 
						    Error_no_device,       error_no_device ;
 | 
				
			||||||
 | 
						    Error_not_found,       error_not_found;
 | 
				
			||||||
 | 
					 	    Error_busy,   	       error_busy ;
 | 
				
			||||||
 | 
					      Error_timeout,         error_timeout;
 | 
				
			||||||
 | 
					      Error_overflow,        error_overflow;
 | 
				
			||||||
 | 
						    Error_pipe,  	         error_pipe ;
 | 
				
			||||||
 | 
					      Error_interrupted,     error_interrupted;
 | 
				
			||||||
 | 
						    Error_no_mem,          error_no_mem ;
 | 
				
			||||||
 | 
					      Error_not_supported,   error_not_supported;
 | 
				
			||||||
 | 
					      Error_other,           error_other ;
 | 
				
			||||||
 | 
					    ] ~unexpected:(fun x -> Number (Int64.to_int x))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let request_type_standard  = T.constant "LIBUSB_REQUEST_TYPE_STANDARD" T.int64_t
 | 
				
			||||||
 | 
					  let request_type_class     = T.constant "LIBUSB_REQUEST_TYPE_CLASS"    T.int64_t
 | 
				
			||||||
 | 
					  let request_type_vendor    = T.constant "LIBUSB_REQUEST_TYPE_VENDOR"   T.int64_t
 | 
				
			||||||
 | 
					  let request_type_reserved  = T.constant "LIBUSB_REQUEST_TYPE_RESERVED" T.int64_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let endpoint_direction_in  = T.constant "LIBUSB_ENDPOINT_IN"  T.int64_t
 | 
				
			||||||
 | 
					  let endpoint_direction_out = T.constant "LIBUSB_ENDPOINT_OUT" T.int64_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let libusb_recipient_device    = T.constant "LIBUSB_RECIPIENT_DEVICE"    T.int64_t
 | 
				
			||||||
 | 
					  let libusb_recipient_interface = T.constant "LIBUSB_RECIPIENT_INTERFACE" T.int64_t
 | 
				
			||||||
 | 
					  let libusb_recipient_endpoint  = T.constant "LIBUSB_RECIPIENT_ENDPOINT"  T.int64_t
 | 
				
			||||||
 | 
					  let libusb_recipient_other     = T.constant "LIBUSB_RECIPIENT_OTHER"     T.int64_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  type version
 | 
				
			||||||
 | 
					  let version : version structure typ = structure "libusb_version"
 | 
				
			||||||
 | 
					  let (|:) n t = field version n t
 | 
				
			||||||
 | 
					  let version_major = "major" |: uint16_t
 | 
				
			||||||
 | 
					  let version_minor = "minor" |: uint16_t
 | 
				
			||||||
 | 
					  let version_micro = "micro" |: uint16_t
 | 
				
			||||||
 | 
					  let version_nano = "nano" |: uint16_t
 | 
				
			||||||
 | 
					  let version_rc = "rc" |: string
 | 
				
			||||||
 | 
					  let version_describe = "describe" |: string
 | 
				
			||||||
 | 
					  let () = seal version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  type device
 | 
				
			||||||
 | 
					  let device : device structure typ = structure "libusb_device"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  type device_handle
 | 
				
			||||||
 | 
					  let device_handle : device_handle structure typ = structure "libusb_device_handle"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  type device_descriptor
 | 
				
			||||||
 | 
					  let device_descriptor : device_descriptor structure typ = structure "libusb_device_descriptor"
 | 
				
			||||||
 | 
					  let (|:) n t = field device_descriptor n t
 | 
				
			||||||
 | 
					  let device_descriptor_blength =            "bLength"            |: uint8_t  (* Size of this descriptor (in bytes) *)
 | 
				
			||||||
 | 
					  let device_descriptor_bdescriptortype =    "bDescriptorType"    |: uint8_t  (* Descriptor type. *)
 | 
				
			||||||
 | 
					  let device_descriptor_bcdusb =             "bcdUSB"             |: uint16_t (* USB specification release number in binary-coded decimal. *)
 | 
				
			||||||
 | 
					  let device_descriptor_bdeviceclass =       "bDeviceClass"       |: uint8_t  (* USB-IF class code for the device. *)
 | 
				
			||||||
 | 
					  let device_descriptor_bdevicesubclass =    "bDeviceSubClass"    |: uint8_t  (* USB-IF subclass code for the device, qualified by the bDeviceClass value. *)
 | 
				
			||||||
 | 
					  let device_descriptor_bdeviceprotocol =    "bDeviceProtocol"    |: uint8_t  (* USB-IF protocol code for the device, qualified by the bDeviceClass and bDeviceSubClass values. *)
 | 
				
			||||||
 | 
					  let device_descriptor_bmaxpacketsize0 =    "bMaxPacketSize0"    |: uint8_t  (* Maximum packet size for endpoint 0. *)
 | 
				
			||||||
 | 
					  let device_descriptor_idvendor =           "idVendor"           |: uint16_t (* USB-IF vendor ID. *)
 | 
				
			||||||
 | 
					  let device_descriptor_idproduct =          "idProduct"          |: uint16_t (* USB-IF product ID.*)
 | 
				
			||||||
 | 
					  let device_descriptor_bcddevice =          "bcdDevice"          |: uint16_t (* Device release number in binary-coded decimal. *)
 | 
				
			||||||
 | 
					  let device_descriptor_imanufacturer =      "iManufacturer"      |: uint8_t  (* Index of string descriptor describing manufacturer. *)
 | 
				
			||||||
 | 
					  let device_descriptor_iproduct =           "iProduct"           |: uint8_t  (* Index of string descriptor describing product. *)
 | 
				
			||||||
 | 
					  let device_descriptor_iserialnumber =      "iSerialNumber"      |: uint8_t  (* Index of string descriptor containing device serial number. *)
 | 
				
			||||||
 | 
					  let device_descriptor_bnumconfigurations = "bNumConfigurations" |: uint8_t 	(* Number of possible configurations.  *)
 | 
				
			||||||
 | 
					  let () = seal device_descriptor
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										30
									
								
								lib/jbuild
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								lib/jbuild
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					(library(
 | 
				
			||||||
 | 
					        (name libusb)
 | 
				
			||||||
 | 
					        (public_name libusb)
 | 
				
			||||||
 | 
					        (libraries (ctypes))
 | 
				
			||||||
 | 
					        (c_names (cstub_libusb))
 | 
				
			||||||
 | 
					        (c_flags (:include libusb_cflags_and_no_discarded_qualifiers))
 | 
				
			||||||
 | 
					        (c_library_flags (-lusb-1.0))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(rule(
 | 
				
			||||||
 | 
					     (targets (libusb_cflags_and_no_discarded_qualifiers))
 | 
				
			||||||
 | 
					     (deps (generator/stubs/libusb_cflags))
 | 
				
			||||||
 | 
					     (action (with-stdout-to ${@}
 | 
				
			||||||
 | 
					              (progn
 | 
				
			||||||
 | 
					               (echo "(")
 | 
				
			||||||
 | 
					               (cat ${<})
 | 
				
			||||||
 | 
					               (echo "  -Wno-discarded-qualifiers")
 | 
				
			||||||
 | 
					               (echo ")")
 | 
				
			||||||
 | 
					              )
 | 
				
			||||||
 | 
					     ))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(copy_files generator/g.ml)
 | 
				
			||||||
 | 
					(copy_files generator/stubs/{t,my_types}.ml)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(rule(
 | 
				
			||||||
 | 
					     (targets (cstub_libusb.c bindings.ml))
 | 
				
			||||||
 | 
					     (deps (generator/generator.exe))
 | 
				
			||||||
 | 
					     (action (run ${<}))
 | 
				
			||||||
 | 
					))
 | 
				
			||||||
							
								
								
									
										135
									
								
								lib/libusb.ml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								lib/libusb.ml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,135 @@
 | 
				
			|||||||
 | 
					open Ctypes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include T
 | 
				
			||||||
 | 
					module L = G.P(Bindings)
 | 
				
			||||||
 | 
					module GT = G.U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let request_type_standard = GT.request_type_standard |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					let request_type_class    = GT.request_type_class    |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					let request_type_vendor   = GT.request_type_vendor   |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					let request_type_reserved = GT.request_type_reserved |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let endpoint_direction_in  = GT.endpoint_direction_in  |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					let endpoint_direction_out = GT.endpoint_direction_out |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let recipient_device    = GT.libusb_recipient_device    |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					let recipient_interface = GT.libusb_recipient_interface |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					let recipient_endpoint  = GT.libusb_recipient_endpoint  |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					let recipient_other     = GT.libusb_recipient_other     |> Signed.Int64.to_int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let string_of_error = function
 | 
				
			||||||
 | 
					  | Success -> "Success"
 | 
				
			||||||
 | 
					  | Number n -> Printf.sprintf "Positive number: %d" n
 | 
				
			||||||
 | 
					  | e -> L.error_name e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let description_of_error = function
 | 
				
			||||||
 | 
					  | Success -> "Success"
 | 
				
			||||||
 | 
					  | Number n -> Printf.sprintf "Positive number: %d" n
 | 
				
			||||||
 | 
					  | e -> L.error_description e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let init_libusb () =
 | 
				
			||||||
 | 
					  match L.init null with
 | 
				
			||||||
 | 
					  | Success -> Ok ()
 | 
				
			||||||
 | 
					  | Number _ -> assert false
 | 
				
			||||||
 | 
					  | e -> Error e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let exit_libusb () = L.exit null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let get_version () =
 | 
				
			||||||
 | 
					  let sv = !@ (L.get_version ()) in
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    major = getf sv GT.version_major |> Unsigned.UInt16.to_int;
 | 
				
			||||||
 | 
					    minor = getf sv GT.version_minor |> Unsigned.UInt16.to_int;
 | 
				
			||||||
 | 
					    micro = getf sv GT.version_micro |> Unsigned.UInt16.to_int;
 | 
				
			||||||
 | 
					    nano = getf sv GT.version_nano |> Unsigned.UInt16.to_int;
 | 
				
			||||||
 | 
					    rc = getf sv GT.version_rc;
 | 
				
			||||||
 | 
					    describe = getf sv GT.version_describe;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type device = GT.device structure ptr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let get_device_list () =
 | 
				
			||||||
 | 
					  let dl =
 | 
				
			||||||
 | 
					    from_voidp GT.device null
 | 
				
			||||||
 | 
					    |> allocate (ptr GT.device)
 | 
				
			||||||
 | 
					    |> allocate (ptr (ptr GT.device)) in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  match L.get_device_list null dl with
 | 
				
			||||||
 | 
					  | Success ->
 | 
				
			||||||
 | 
					    L.free_device_list !@dl 0;
 | 
				
			||||||
 | 
					    Ok []
 | 
				
			||||||
 | 
					  | Number nb_devices ->
 | 
				
			||||||
 | 
					    let l = CArray.from_ptr !@dl nb_devices
 | 
				
			||||||
 | 
					            |> CArray.to_list in
 | 
				
			||||||
 | 
					    L.free_device_list !@dl 0;
 | 
				
			||||||
 | 
					    Ok l
 | 
				
			||||||
 | 
					  | err -> Error err
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let unref_device d = L.unref_device d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type device_handle = GT.device_handle structure ptr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let open_device ?(unref=true) d =
 | 
				
			||||||
 | 
					  let h = from_voidp GT.device_handle null
 | 
				
			||||||
 | 
					          |> allocate (ptr GT.device_handle) in
 | 
				
			||||||
 | 
					  match L.open_device d h with
 | 
				
			||||||
 | 
					  | Success ->
 | 
				
			||||||
 | 
					    if unref then unref_device d;
 | 
				
			||||||
 | 
					    Ok !@h
 | 
				
			||||||
 | 
					  | Number _ -> assert false
 | 
				
			||||||
 | 
					  | e -> Error e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let close_device h = L.close_device h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let get_device_descriptor d =
 | 
				
			||||||
 | 
					  let desc = make GT.device_descriptor in
 | 
				
			||||||
 | 
					  match L.get_device_descriptor d (addr desc) with
 | 
				
			||||||
 | 
					  | Success ->
 | 
				
			||||||
 | 
					    Ok {
 | 
				
			||||||
 | 
					      id_vendor = getf desc GT.device_descriptor_idvendor |> Unsigned.UInt16.to_int;
 | 
				
			||||||
 | 
					      id_product = getf desc GT.device_descriptor_idproduct |> Unsigned.UInt16.to_int;
 | 
				
			||||||
 | 
					      i_manufacturer = getf desc GT.device_descriptor_imanufacturer |> Unsigned.UInt8.to_int;
 | 
				
			||||||
 | 
					      i_product = getf desc GT.device_descriptor_iproduct |> Unsigned.UInt8.to_int;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  | Number _ -> assert false
 | 
				
			||||||
 | 
					  | e -> Error e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let get_string_descriptor d i =
 | 
				
			||||||
 | 
					  if
 | 
				
			||||||
 | 
					    i <= 0
 | 
				
			||||||
 | 
					  then
 | 
				
			||||||
 | 
					    Error Error_not_found
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    let sz = Unsigned.UInt8.(to_int max_int) in
 | 
				
			||||||
 | 
					    let strptr = allocate_n char ~count:sz in
 | 
				
			||||||
 | 
					    match L.get_string_descriptor_ascii d (Unsigned.UInt8.of_int i) strptr sz with
 | 
				
			||||||
 | 
					    | Success -> assert false
 | 
				
			||||||
 | 
					    | Number n -> Ok (string_from_ptr strptr ~length:n |> String.trim)
 | 
				
			||||||
 | 
					    | e -> Error e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let is_vendor v d =
 | 
				
			||||||
 | 
					  match get_device_descriptor d with
 | 
				
			||||||
 | 
					  | Ok dd -> dd.id_vendor = v
 | 
				
			||||||
 | 
					  | _ -> false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let is_product p d =
 | 
				
			||||||
 | 
					match get_device_descriptor d with
 | 
				
			||||||
 | 
					  | Ok dd -> dd.id_product = p
 | 
				
			||||||
 | 
					  | _ -> false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let filter_devices f dl =
 | 
				
			||||||
 | 
					  let keep, unref = List.partition f dl in
 | 
				
			||||||
 | 
					  List.iter unref_device unref;
 | 
				
			||||||
 | 
					  keep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let control_transfer ~device_handle ~request_type ~request ~value ~index ~buffer ~timeout =
 | 
				
			||||||
 | 
					  let sz = Bigarray.Array1.dim buffer in
 | 
				
			||||||
 | 
					  L.control_transfer
 | 
				
			||||||
 | 
					    device_handle
 | 
				
			||||||
 | 
					    (Unsigned.UInt8.of_int request_type)
 | 
				
			||||||
 | 
					    (Unsigned.UInt8.of_int request)
 | 
				
			||||||
 | 
					    (Unsigned.UInt16.of_int value)
 | 
				
			||||||
 | 
					    (Unsigned.UInt16.of_int index)
 | 
				
			||||||
 | 
					    (bigarray_start array1 buffer)
 | 
				
			||||||
 | 
					    (Unsigned.UInt16.of_int sz)
 | 
				
			||||||
 | 
					    (Unsigned.UInt.of_int timeout)
 | 
				
			||||||
							
								
								
									
										89
									
								
								lib/libusb.mli
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								lib/libusb.mli
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					open Ctypes
 | 
				
			||||||
 | 
					include module type of T
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(** {1 Errors} *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val string_of_error: error -> string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val description_of_error: error -> string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(** {1 Flags} *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val request_type_standard: int
 | 
				
			||||||
 | 
					val request_type_class:    int
 | 
				
			||||||
 | 
					val request_type_vendor:   int
 | 
				
			||||||
 | 
					val request_type_reserved: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val endpoint_direction_in:  int
 | 
				
			||||||
 | 
					val endpoint_direction_out: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val recipient_device:    int
 | 
				
			||||||
 | 
					val recipient_interface: int
 | 
				
			||||||
 | 
					val recipient_endpoint:  int
 | 
				
			||||||
 | 
					val recipient_other:     int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(** {1 Initialisation}  *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val init_libusb: unit -> (unit, error) result
 | 
				
			||||||
 | 
					(** This function must be called before calling any other libusb function. *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val exit_libusb: unit -> unit
 | 
				
			||||||
 | 
					(** Should be called after closing all open devices and before your application terminates. *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val get_version: unit -> version
 | 
				
			||||||
 | 
					(** @return the version of the running libusb library *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(** {1 Devices enumeration} *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type device
 | 
				
			||||||
 | 
					(** A C pointer to a device *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val get_device_list: unit -> (device list, error) result
 | 
				
			||||||
 | 
					(** @return a list of C pointers to libusb devices.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Each device returned in the list has it's reference counter set to 1. Do not
 | 
				
			||||||
 | 
					    forget to {!Libusb.unref_device} each of them after use. *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val unref_device: device -> unit
 | 
				
			||||||
 | 
					(** Decrement the reference count of a device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If the decrement operation causes the reference count to reach zero, the
 | 
				
			||||||
 | 
					    device shall be destroyed. *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val is_vendor: int -> device -> bool
 | 
				
			||||||
 | 
					(** [is_vendor vend d] checks if device [d] vendor id is [vend]  *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val is_product: int -> device -> bool
 | 
				
			||||||
 | 
					(** [is_product prod d] checks if device [d] product id is [prod]  *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val filter_devices: (device -> bool) -> device list -> device list
 | 
				
			||||||
 | 
					(** [filter_devices f dl] filters [dl] devices list using [f].
 | 
				
			||||||
 | 
					    The devices of [dl] which are not part of the returned list are
 | 
				
			||||||
 | 
					    unreferenced with {!Libusb.unref_device}. *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(** {1 Device opening} *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type device_handle
 | 
				
			||||||
 | 
					(** A opaque type to manipulate opened devices *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val open_device: ?unref:bool -> device -> (device_handle, error) result
 | 
				
			||||||
 | 
					(** Opens the device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The C libusb library device opening increments the device reference count.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If the operation is successfull, and if [unref] is true (which is it's
 | 
				
			||||||
 | 
					   default value) {!Libusb.open_device} decrements the device reference counter
 | 
				
			||||||
 | 
					   of the device: this allows the device to be destroyed automatically when
 | 
				
			||||||
 | 
					   {!Libusb.close_device} will be called. *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val close_device: device_handle -> unit
 | 
				
			||||||
 | 
					(** Closes the device. This operation decrements the reference counter. *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val get_device_descriptor: device -> (device_descriptor, error) result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val get_string_descriptor: device_handle -> int -> (string, error) result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(** {1 Transfers} *)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val control_transfer: device_handle:device_handle -> request_type:int -> request:int -> value:int -> index:int -> buffer:(char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t -> timeout:int -> error
 | 
				
			||||||
							
								
								
									
										17
									
								
								libusb.opam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								libusb.opam
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					opam-version: "1.2"
 | 
				
			||||||
 | 
					name: "extremes"
 | 
				
			||||||
 | 
					version: "2017-11-20-1"
 | 
				
			||||||
 | 
					maintainer: "Matthieu Dubuget <matthieu.dubuget@metalscan.fr>"
 | 
				
			||||||
 | 
					authors: "Matthieu Dubuget <matthieu.dubuget@metalscan.fr>"
 | 
				
			||||||
 | 
					homepage: "none"
 | 
				
			||||||
 | 
					bug-reports: "Matthieu Dubuget <matthieu.dubuget@gmail.com>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					build: [
 | 
				
			||||||
 | 
					  [ "jbuilder" "build" "-p" name "-j" jobs ]
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					license: "Not yet decided"
 | 
				
			||||||
 | 
					bug-reports: "dontuse@metalscan.fr"
 | 
				
			||||||
 | 
					depends: [
 | 
				
			||||||
 | 
					  "jbuilder" {build & >= "1.0+beta13"}
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
		Reference in New Issue
	
	Block a user