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 DEVMGR_MAX_DRIVERS 7//8
54 #define RH_DRIVER_IDX 0
55 #define HUB_DRIVER_IDX 1
56 #define UMSS_DRIVER_IDX 2
57 #define COMP_DRIVER_IDX 3
58 #define GEN_DRIVER_IDX 4
59 #define GEN_IF_DRIVER_IDX 5
60 #define MOUSE_DRIVER_IDX 6
61 #define KEYBOARD_DRIVER_IDX 7//temp disabled
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 KTIMER dev_mgr_timer
;
102 KDPC dev_mgr_timer_dpc
;
103 KSPIN_LOCK timer_svc_list_lock
;
104 LIST_HEAD timer_svc_list
;
105 TIMER_SVC_POOL timer_svc_pool
;
109 PUSB_DRIVER driver_list
;
111 LIST_HEAD hub_list
; //for reference only
114 LONG conn_count
; //will also be used to assign device id
115 PDRIVER_OBJECT usb_driver_obj
; //this driver object
116 LONG open_count
; //increment when IRP_MJ_CREATE arrives
117 //and decrement when IRP_MJ_CLOSE arrives
119 } USB_DEV_MANAGER
, *PUSB_DEV_MANAGER
;
123 PUSB_DEV_MANAGER dev_mgr
,
129 PUSB_DEV dev
, //always null. we do not use this param
136 PUSB_DEV_MANAGER dev_mgr
145 dev_mgr_timer_dpc_callback(
147 PVOID DeferredContext
,
148 PVOID SystemArgument1
,
149 PVOID SystemArgument2
153 dev_mgr_request_timer_svc(
154 PUSB_DEV_MANAGER dev_mgr
,
158 TIMER_SVC_HANDLER handler
163 PUSB_DEV_MANAGER dev_mgr
,
169 PUSB_DEV_MANAGER dev_mgr
,
175 dev_mgr_alloc_device(
176 PUSB_DEV_MANAGER dev_mgr
,
182 PUSB_DEV_MANAGER dev_mgr
,
187 dev_mgr_disconnect_dev(
193 PUSB_DEV_MANAGER dev_mgr
197 dev_mgr_build_usb_config(
205 dev_mgr_register_hcd(
206 PUSB_DEV_MANAGER dev_mgr
,
212 IN PUSB_DEV_MANAGER dev_mgr
,
217 dev_mgr_register_irp(
218 PUSB_DEV_MANAGER dev_mgr
,
225 PUSB_DEV_MANAGER dev_mgr
,
230 dev_mgr_score_driver_for_if(
231 PUSB_DEV_MANAGER dev_mgr
,
233 PUSB_INTERFACE_DESC pif_desc
238 PUSB_DEV_MANAGER dev_mgr
,
239 DEV_HANDLE dev_handle
,
241 PUSB_DEV pdev
//if pdev != NULL, we use pdev instead if_handle
245 dev_mgr_set_if_driver(
246 PUSB_DEV_MANAGER dev_mgr
,
247 DEV_HANDLE if_handle
,
249 PUSB_DEV pdev
//if pdev != NULL, we use pdev instead if_handle
254 PUSB_DEV_MANAGER dev_mgr
259 PUSB_DEV_MANAGER dev_mgr
262 BOOLEAN
dev_mgr_start_config_dev(PUSB_DEV pdev
);
263 BOOLEAN
dev_mgr_event_init(PUSB_DEV dev
, //always null. we do not use this param
267 VOID
dev_mgr_get_desc_completion(PURB purb
, PVOID context
);
268 VOID
dev_mgr_event_select_driver(PUSB_DEV pdev
, ULONG event
, ULONG context
, ULONG param
);
269 LONG
dev_mgr_score_driver_for_dev(PUSB_DEV_MANAGER dev_mgr
, PUSB_DRIVER pdriver
, PUSB_DEVICE_DESC pdev_desc
);
270 NTSTATUS
dev_mgr_destroy_usb_config(PUSB_CONFIGURATION pcfg
);
271 BOOLEAN
dev_mgr_start_select_driver(PUSB_DEV pdev
);
272 VOID
dev_mgr_cancel_irp(PDEVICE_OBJECT pdev_obj
, PIRP pirp
);