4 typedef struct _DEV_CONNECT_DATA
7 struct _USB_DRIVER
*pdriver
;
8 struct _USB_DEV_MANAGER
*dev_mgr
;
9 PUSB_INTERFACE_DESC if_desc
;
11 } DEV_CONNECT_DATA
, *PDEV_CONNECT_DATA
;
13 typedef BOOLEAN ( *PDEV_CONNECT_EX
)( PDEV_CONNECT_DATA init_param
, DEV_HANDLE dev_handle
);
14 typedef BOOLEAN ( *PDEV_CONNECT
)( struct _USB_DEV_MANAGER
*dev_mgr
, DEV_HANDLE dev_handle
);
15 typedef BOOLEAN ( *PDRVR_INIT
)( struct _USB_DEV_MANAGER
*dev_mgr
, struct _USB_DRIVER
*pdriver
);
17 typedef struct _PNP_DISPATCH
20 PDEV_CONNECT_EX dev_connect
;
21 PDEV_CONNECT dev_reserved
; //currently we do not use this entry
22 PDEV_CONNECT dev_stop
;
23 PDEV_CONNECT dev_disconnect
;
25 }PNP_DISPATCH
, *PPNP_DISPATCH
;
27 #define USB_DRIVER_FLAG_IF_CAPABLE 0x80000000
28 #define USB_DRIVER_FLAG_DEV_CAPABLE 0x40000000
30 typedef struct _USB_DRIVER_DESCRIPTION
34 WORD vendor_id
; // USB Vendor ID
35 WORD product_id
; // USB Product ID.
36 WORD release_num
; // Release Number of Device
39 BYTE config_val
; // Configuration Value
40 BYTE if_num
; // Interface Number
41 BYTE if_class
; // Interface Class
42 BYTE if_sub_class
; // Interface SubClass
43 BYTE if_protocol
; // Interface Protocol
46 const char *driver_name
; // Driver name for Name Registry
47 BYTE dev_class
; // Device Class (from SampleStorageDeviceID.h)
48 BYTE dev_sub_class
; // Device Subclass
49 BYTE dev_protocol
; // Protocol Info.
51 } USB_DRIVER_DESCRIPTION
,*PUSB_DRIVER_DESCRIPTION
;
53 #define RH_DRIVER_IDX 0
54 #define HUB_DRIVER_IDX 1
55 #define UMSS_DRIVER_IDX 2
56 #define COMP_DRIVER_IDX 3
57 #define GEN_DRIVER_IDX 4
58 #define GEN_IF_DRIVER_IDX 5
59 #define MOUSE_DRIVER_IDX 6
60 #define KEYBOARD_DRIVER_IDX 7
61 #define DEVMGR_MAX_DRIVERS 8
63 typedef struct _USB_DRIVER
65 USB_DRIVER_DESCRIPTION driver_desc
;
66 PNP_DISPATCH disp_tbl
;
71 PDRVR_INIT driver_init
;
72 PDRVR_INIT driver_destroy
;
74 } USB_DRIVER
, *PUSB_DRIVER
;
76 extern USB_DRIVER g_driver_list
[ DEVMGR_MAX_DRIVERS
];
79 #define dev_mgr_from_hcd( hCD ) ( ( hCD )->hcd_get_dev_mgr( hCD ) )
80 #define dev_mgr_from_dev( pdEV ) ( dev_mgr_from_hcd( pdEV->hcd ) )
82 typedef struct _USB_DEV_MANAGER
84 //BYTE dev_addr_map[ MAX_DEVS / 8 ]; //one bit per dev
85 struct _HCD
*hcd_array
[ MAX_HCDS
];
86 unsigned char hcd_count
;
88 KSPIN_LOCK dev_list_lock
;
91 //PDEVICE_EXTENSION pdev_ext;
97 KSPIN_LOCK event_list_lock
;
99 USB_EVENT_POOL event_pool
;
101 KEVENT drivers_inited
;
102 KTIMER dev_mgr_timer
;
103 KDPC dev_mgr_timer_dpc
;
104 KSPIN_LOCK timer_svc_list_lock
;
105 LIST_HEAD timer_svc_list
;
106 TIMER_SVC_POOL timer_svc_pool
;
110 PUSB_DRIVER driver_list
;
112 LIST_HEAD hub_list
; //for reference only
115 LONG conn_count
; //will also be used to assign device id
116 PDRIVER_OBJECT usb_driver_obj
; //this driver object
117 LONG open_count
; //increment when IRP_MJ_CREATE arrives
118 //and decrement when IRP_MJ_CLOSE arrives
120 } USB_DEV_MANAGER
, *PUSB_DEV_MANAGER
;
124 PUSB_DEV_MANAGER dev_mgr
,
130 PUSB_DEV dev
, //always null. we do not use this param
137 PUSB_DEV_MANAGER dev_mgr
146 dev_mgr_timer_dpc_callback(
148 PVOID DeferredContext
,
149 PVOID SystemArgument1
,
150 PVOID SystemArgument2
154 dev_mgr_request_timer_svc(
155 PUSB_DEV_MANAGER dev_mgr
,
159 TIMER_SVC_HANDLER handler
164 PUSB_DEV_MANAGER dev_mgr
,
170 PUSB_DEV_MANAGER dev_mgr
,
176 dev_mgr_alloc_device(
177 PUSB_DEV_MANAGER dev_mgr
,
183 PUSB_DEV_MANAGER dev_mgr
,
188 dev_mgr_disconnect_dev(
194 PUSB_DEV_MANAGER dev_mgr
198 dev_mgr_build_usb_config(
206 dev_mgr_register_hcd(
207 PUSB_DEV_MANAGER dev_mgr
,
212 dev_mgr_deregister_hcd(
213 PUSB_DEV_MANAGER dev_mgr
,
219 IN PUSB_DEV_MANAGER dev_mgr
,
224 dev_mgr_register_irp(
225 PUSB_DEV_MANAGER dev_mgr
,
232 PUSB_DEV_MANAGER dev_mgr
,
237 dev_mgr_score_driver_for_if(
238 PUSB_DEV_MANAGER dev_mgr
,
240 PUSB_INTERFACE_DESC pif_desc
245 PUSB_DEV_MANAGER dev_mgr
,
246 DEV_HANDLE dev_handle
,
248 PUSB_DEV pdev
//if pdev != NULL, we use pdev instead if_handle
252 dev_mgr_set_if_driver(
253 PUSB_DEV_MANAGER dev_mgr
,
254 DEV_HANDLE if_handle
,
256 PUSB_DEV pdev
//if pdev != NULL, we use pdev instead if_handle
261 PUSB_DEV_MANAGER dev_mgr
266 PUSB_DEV_MANAGER dev_mgr
269 BOOLEAN
dev_mgr_start_config_dev(PUSB_DEV pdev
);
270 BOOLEAN
dev_mgr_event_init(PUSB_DEV dev
, //always null. we do not use this param
274 VOID
dev_mgr_get_desc_completion(PURB purb
, PVOID context
);
275 VOID
dev_mgr_event_select_driver(PUSB_DEV pdev
, ULONG event
, ULONG context
, ULONG param
);
276 LONG
dev_mgr_score_driver_for_dev(PUSB_DEV_MANAGER dev_mgr
, PUSB_DRIVER pdriver
, PUSB_DEVICE_DESC pdev_desc
);
277 NTSTATUS
dev_mgr_destroy_usb_config(PUSB_CONFIGURATION pcfg
);
278 BOOLEAN
dev_mgr_start_select_driver(PUSB_DEV pdev
);
279 VOID
dev_mgr_cancel_irp(PDEVICE_OBJECT pdev_obj
, PIRP pirp
);