Changes in uspace/lib/usbhost/include/usb/host/hcd.h [4e732f1a:56fd7cf] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/include/usb/host/hcd.h
r4e732f1a r56fd7cf 37 37 #define LIBUSBHOST_HOST_HCD_H 38 38 39 #include <usb/host/endpoint.h>40 #include <usb/host/usb_bus.h>41 #include <usb/host/usb_transfer_batch.h>42 #include <usb/usb.h>43 44 39 #include <assert.h> 45 40 #include <usbhc_iface.h> 46 #include <sys/types.h> 41 42 #include <usb/host/usb_device_manager.h> 43 #include <usb/host/usb_endpoint_manager.h> 44 #include <usb/host/usb_transfer_batch.h> 47 45 48 46 typedef struct hcd hcd_t; 49 47 50 typedef int (*schedule_hook_t)(hcd_t *, usb_transfer_batch_t *);51 typedef int (*ep_add_hook_t)(hcd_t *, endpoint_t *);52 typedef void (*ep_remove_hook_t)(hcd_t *, endpoint_t *);53 typedef void (*interrupt_hook_t)(hcd_t *, uint32_t);54 typedef int (*status_hook_t)(hcd_t *, uint32_t *);55 56 typedef struct {57 /** Device specific driver data. */58 void *data;59 /** Transfer scheduling, implement in device driver. */60 schedule_hook_t schedule;61 /** Hook called upon registering new endpoint. */62 ep_add_hook_t ep_add_hook;63 /** Hook called upon removing of an endpoint. */64 ep_remove_hook_t ep_remove_hook;65 /** Hook to be called on device interrupt, passes ARG1 */66 interrupt_hook_t irq_hook;67 /** Periodic polling hook */68 status_hook_t status_hook;69 } hc_driver_t;70 71 48 /** Generic host controller driver structure. */ 72 49 struct hcd { 50 /** Device manager storing handles and addresses. */ 51 usb_device_manager_t dev_manager; 73 52 /** Endpoint manager. */ 74 usb_ bus_t bus;53 usb_endpoint_manager_t ep_manager; 75 54 76 /** Driver implementation */ 77 hc_driver_t driver; 78 79 /** Interrupt replacement fibril */ 80 fid_t polling_fibril; 55 /** Device specific driver data. */ 56 void *private_data; 57 /** Transfer scheduling, implement in device driver. */ 58 int (*schedule)(hcd_t *, usb_transfer_batch_t *); 59 /** Hook called upon registering new endpoint. */ 60 int (*ep_add_hook)(hcd_t *, endpoint_t *); 61 /** Hook called upon removing of an endpoint. */ 62 void (*ep_remove_hook)(hcd_t *, endpoint_t *); 81 63 }; 82 64 83 void hcd_init(hcd_t *hcd, usb_speed_t max_speed, size_t bandwidth, 84 bw_count_func_t bw_count); 85 86 static inline void hcd_set_implementation(hcd_t *hcd, void *data, 87 schedule_hook_t schedule, ep_add_hook_t add_hook, ep_remove_hook_t rem_hook, 88 interrupt_hook_t irq_hook, status_hook_t status_hook) 65 /** Initialize hcd_t structure. 66 * Initializes device and endpoint managers. Sets data and hook pointer to NULL. 67 * @param hcd hcd_t structure to initialize, non-null. 68 * @param bandwidth Available bandwidth, passed to endpoint manager. 69 * @param bw_count Bandwidth compute function, passed to endpoint manager. 70 */ 71 static inline void hcd_init(hcd_t *hcd, usb_speed_t max_speed, size_t bandwidth, 72 size_t (*bw_count)(usb_speed_t, usb_transfer_type_t, size_t, size_t)) 89 73 { 90 74 assert(hcd); 91 hcd->driver.data = data;92 hcd->driver.schedule = schedule;93 hcd-> driver.ep_add_hook = add_hook;94 hcd-> driver.ep_remove_hook = rem_hook;95 hcd-> driver.irq_hook = irq_hook;96 hcd-> driver.status_hook = status_hook;75 usb_device_manager_init(&hcd->dev_manager, max_speed); 76 usb_endpoint_manager_init(&hcd->ep_manager, bandwidth, bw_count); 77 hcd->private_data = NULL; 78 hcd->schedule = NULL; 79 hcd->ep_add_hook = NULL; 80 hcd->ep_remove_hook = NULL; 97 81 } 98 82 99 usb_address_t hcd_request_address(hcd_t *hcd, usb_speed_t speed); 100 101 int hcd_release_address(hcd_t *hcd, usb_address_t address); 102 103 int hcd_reserve_default_address(hcd_t *hcd, usb_speed_t speed); 104 105 static inline int hcd_release_default_address(hcd_t *hcd)83 /** Check registered endpoints and reset toggle bit if necessary. 84 * @param hcd hcd_t structure, non-null. 85 * @param target Control communication target. 86 * @param setup_data Setup packet of the control communication. 87 */ 88 static inline void reset_ep_if_need(hcd_t *hcd, usb_target_t target, 89 const char setup_data[8]) 106 90 { 107 return hcd_release_address(hcd, USB_ADDRESS_DEFAULT); 91 assert(hcd); 92 usb_endpoint_manager_reset_eps_if_need( 93 &hcd->ep_manager, target, (const uint8_t *)setup_data); 108 94 } 109 95 110 int hcd_add_ep(hcd_t *hcd, usb_target_t target, usb_direction_t dir, 111 usb_transfer_type_t type, size_t max_packet_size, unsigned packets, 112 size_t size, usb_address_t tt_address, unsigned tt_port); 96 /** Data retrieve wrapper. 97 * @param fun ddf function, non-null. 98 * @return pointer cast to hcd_t*. 99 */ 100 static inline hcd_t *fun_to_hcd(ddf_fun_t *fun) 101 { 102 return ddf_fun_data_get(fun); 103 } 113 104 114 int hcd_remove_ep(hcd_t *hcd, usb_target_t target, usb_direction_t dir); 115 116 int hcd_send_batch(hcd_t *hcd, usb_target_t target, usb_direction_t direction, 117 void *data, size_t size, uint64_t setup_data, 118 usbhc_iface_transfer_in_callback_t in, 119 usbhc_iface_transfer_out_callback_t out, void *arg, const char* name); 120 121 ssize_t hcd_send_batch_sync(hcd_t *hcd, usb_target_t target, 122 usb_direction_t dir, void *data, size_t size, uint64_t setup_data, 123 const char* name); 105 extern usbhc_iface_t hcd_iface; 124 106 125 107 #endif 108 126 109 /** 127 110 * @}
Note:
See TracChangeset
for help on using the changeset viewer.