Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbdev/include/usb/dev/poll.h

    rb7fd2a0 r5a6cc679  
    11/*
    22 * Copyright (c) 2011 Vojtech Horky
     3 * Copyright (c) 2017 Petr Manek
    34 * All rights reserved.
    45 *
     
    4344#include <stddef.h>
    4445#include <stdint.h>
     46#include <fibril_synch.h>
    4547
    46 /** Parameters and callbacks for automated polling. */
    47 typedef struct {
    48         /** Level of debugging messages from auto polling.
    49          * 0 - nothing
    50          * 1 - inform about errors and polling start/end
    51          * 2 - also dump every retrieved buffer
    52          */
    53         int debug;
    54         /** Maximum number of consecutive errors before polling termination. */
    55         size_t max_failures;
    56         /** Delay between poll requests in milliseconds.
    57          * Set to negative value to use value from endpoint descriptor.
    58          */
    59         int delay;
    60         /** Whether to automatically try to clear the HALT feature after
    61          * the endpoint stalls.
    62          */
    63         bool auto_clear_halt;
     48
     49/** USB automated polling. */
     50typedef struct usb_polling {
     51        /** Mandatory parameters - user is expected to configure these. */
     52
     53        /** USB device to poll. */
     54        usb_device_t *device;
     55
     56        /** Device enpoint mapping to use for polling. */
     57        usb_endpoint_mapping_t *ep_mapping;
     58
     59        /** Size of the recieved data. */
     60        size_t request_size;
     61
     62        /** Data buffer of at least `request_size`. User is responsible for its allocation. */
     63        uint8_t *buffer;
     64
    6465        /** Callback when data arrives.
    6566         *
     
    7273        bool (*on_data)(usb_device_t *dev, uint8_t *data, size_t data_size,
    7374            void *arg);
     75
     76
     77        /** Optional parameters - user can customize them, but they are defaulted to
     78         *  some reasonable values.
     79         */
     80
     81        /** Level of debugging messages from auto polling.
     82         * 0 - nothing (default)
     83         * 1 - inform about errors and polling start/end
     84         * 2 - also dump every retrieved buffer
     85         */
     86        int debug;
     87
     88        /** Maximum number of consecutive errors before polling termination (default 3). */
     89        size_t max_failures;
     90
     91        /** Delay between poll requests in milliseconds.
     92         * By default, value from endpoint descriptor used.
     93         */
     94        int delay;
     95
     96        /** Whether to automatically try to clear the HALT feature after
     97         * the endpoint stalls (true by default).
     98         */
     99        bool auto_clear_halt;
     100
     101        /** Argument to pass to callbacks (default NULL). */
     102        void *arg;
     103
    74104        /** Callback when polling is terminated.
    75105         *
     
    80110        void (*on_polling_end)(usb_device_t *dev, bool due_to_errors,
    81111            void *arg);
     112
    82113        /** Callback when error occurs.
    83114         *
     
    88119         */
    89120        bool (*on_error)(usb_device_t *dev, errno_t err_code, void *arg);
    90         /** Argument to pass to callbacks. */
    91         void *arg;
    92 } usb_device_auto_polling_t;
    93121
    94 typedef bool (*usb_polling_callback_t)(usb_device_t *, uint8_t *, size_t, void *);
    95 typedef void (*usb_polling_terminted_callback_t)(usb_device_t *, bool, void *);
    96122
    97 extern errno_t usb_device_auto_polling(usb_device_t *, usb_endpoint_t,
    98     const usb_device_auto_polling_t *, size_t);
     123        /** Internal parameters - user is not expected to set them. Messing with them
     124         *  can result in unexpected behavior if you do not know what you are doing.
     125         */
    99126
    100 extern errno_t usb_device_auto_poll(usb_device_t *, usb_endpoint_t,
    101     usb_polling_callback_t, size_t, int, usb_polling_terminted_callback_t, void *);
     127        /** Fibril used for polling. */
     128        fid_t fibril;
    102129
    103 extern errno_t usb_device_auto_polling_desc(usb_device_t *,
    104     const usb_endpoint_description_t *, const usb_device_auto_polling_t *,
    105     size_t);
     130        /** True if polling is currently in operation. */
     131        volatile bool running;
    106132
    107 extern errno_t usb_device_auto_poll_desc(usb_device_t *,
    108     const usb_endpoint_description_t *, usb_polling_callback_t, size_t, int,
    109     usb_polling_terminted_callback_t, void *);
     133        /** True if polling should terminate as soon as possible. */
     134        volatile bool joining;
     135
     136        /** Synchronization primitives for joining polling end. */
     137        fibril_mutex_t guard;
     138        fibril_condvar_t cv;
     139} usb_polling_t;
     140
     141errno_t usb_polling_init(usb_polling_t *);
     142void usb_polling_fini(usb_polling_t *);
     143
     144errno_t usb_polling_start(usb_polling_t *);
     145errno_t usb_polling_join(usb_polling_t *);
    110146
    111147#endif
Note: See TracChangeset for help on using the changeset viewer.