Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/include/usb/host/hcd.h

    r4e732f1a r56fd7cf  
    3737#define LIBUSBHOST_HOST_HCD_H
    3838
    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 
    4439#include <assert.h>
    4540#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>
    4745
    4846typedef struct hcd hcd_t;
    4947
    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 
    7148/** Generic host controller driver structure. */
    7249struct hcd {
     50        /** Device manager storing handles and addresses. */
     51        usb_device_manager_t dev_manager;
    7352        /** Endpoint manager. */
    74         usb_bus_t bus;
     53        usb_endpoint_manager_t ep_manager;
    7554
    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 *);
    8163};
    8264
    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 */
     71static 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))
    8973{
    9074        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;
    9781}
    9882
    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 */
     88static inline void reset_ep_if_need(hcd_t *hcd, usb_target_t target,
     89    const char setup_data[8])
    10690{
    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);
    10894}
    10995
    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 */
     100static inline hcd_t *fun_to_hcd(ddf_fun_t *fun)
     101{
     102        return ddf_fun_data_get(fun);
     103}
    113104
    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);
     105extern usbhc_iface_t hcd_iface;
    124106
    125107#endif
     108
    126109/**
    127110 * @}
Note: See TracChangeset for help on using the changeset viewer.