Ignore:
File:
1 edited

Legend:

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

    r56fd7cf r4e732f1a  
    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
    3944#include <assert.h>
    4045#include <usbhc_iface.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>
     46#include <sys/types.h>
    4547
    4648typedef struct hcd hcd_t;
    4749
     50typedef int (*schedule_hook_t)(hcd_t *, usb_transfer_batch_t *);
     51typedef int (*ep_add_hook_t)(hcd_t *, endpoint_t *);
     52typedef void (*ep_remove_hook_t)(hcd_t *, endpoint_t *);
     53typedef void (*interrupt_hook_t)(hcd_t *, uint32_t);
     54typedef int (*status_hook_t)(hcd_t *, uint32_t *);
     55
     56typedef 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
    4871/** Generic host controller driver structure. */
    4972struct hcd {
    50         /** Device manager storing handles and addresses. */
    51         usb_device_manager_t dev_manager;
    5273        /** Endpoint manager. */
    53         usb_endpoint_manager_t ep_manager;
     74        usb_bus_t bus;
    5475
    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 *);
     76        /** Driver implementation */
     77        hc_driver_t driver;
     78
     79        /** Interrupt replacement fibril */
     80        fid_t polling_fibril;
    6381};
    6482
    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))
     83void hcd_init(hcd_t *hcd, usb_speed_t max_speed, size_t bandwidth,
     84    bw_count_func_t bw_count);
     85
     86static 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)
    7389{
    7490        assert(hcd);
    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;
     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;
    8197}
    8298
    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])
     99usb_address_t hcd_request_address(hcd_t *hcd, usb_speed_t speed);
     100
     101int hcd_release_address(hcd_t *hcd, usb_address_t address);
     102
     103int hcd_reserve_default_address(hcd_t *hcd, usb_speed_t speed);
     104
     105static inline int hcd_release_default_address(hcd_t *hcd)
    90106{
    91         assert(hcd);
    92         usb_endpoint_manager_reset_eps_if_need(
    93             &hcd->ep_manager, target, (const uint8_t *)setup_data);
     107        return hcd_release_address(hcd, USB_ADDRESS_DEFAULT);
    94108}
    95109
    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 }
     110int 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);
    104113
    105 extern usbhc_iface_t hcd_iface;
     114int hcd_remove_ep(hcd_t *hcd, usb_target_t target, usb_direction_t dir);
     115
     116int 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
     121ssize_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);
    106124
    107125#endif
    108 
    109126/**
    110127 * @}
Note: See TracChangeset for help on using the changeset viewer.