Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbhid/generic/hiddev.c

    rdd3eda2 r60c0573  
    3737#include <usb/debug.h>
    3838#include <usb/classes/classes.h>
    39 #include <errno.h>
    40 #include <str_error.h>
    41 #include <bool.h>
    42 
    43 #include <usbhid_iface.h>
    4439
    4540#include "hiddev.h"
     
    6055/*----------------------------------------------------------------------------*/
    6156
    62 static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun);
    63 
    64 static int usb_generic_hid_get_event(ddf_fun_t *fun, int32_t *buffer,
    65     size_t size, size_t *act_size, unsigned int flags);
    66 
    67 static int usb_generic_hid_client_connected(ddf_fun_t *fun);
    68 
    69 /*----------------------------------------------------------------------------*/
    70 
    71 static usbhid_iface_t usb_generic_iface = {
    72         .get_event = usb_generic_hid_get_event,
    73         .get_event_length = usb_generic_hid_get_event_length
    74 };
    75 
    76 static ddf_dev_ops_t usb_generic_hid_ops = {
    77         .interfaces[USBHID_DEV_IFACE] = &usb_generic_iface,
    78         .open = usb_generic_hid_client_connected
    79 };
    80 
    81 /*----------------------------------------------------------------------------*/
    82 
    83 static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun)
    84 {
    85         if (fun == NULL || fun->driver_data) {
    86                 return 0;
    87         }
    88 
    89         usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
    90        
    91         return hid_dev->input_report_size;
    92 }
    93 
    94 /*----------------------------------------------------------------------------*/
    95 
    96 static int usb_generic_hid_get_event(ddf_fun_t *fun, int32_t *buffer,
    97     size_t size, size_t *act_size, unsigned int flags)
    98 {
    99         if (fun == NULL || fun->driver_data) {
    100                 return EINVAL;
    101         }
    102 
    103         usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
    104        
    105         if (hid_dev->input_report_size > size) {
    106                 return EINVAL;  // TODO: other error code
    107         }
    108        
    109         /*! @todo This should probably be atomic. */
    110         if (usb_hid_report_ready()) {
    111                 memcpy(buffer, hid_dev->input_report,
    112                     hid_dev->input_report_size);
    113                 *act_size = hid_dev->input_report_size;
    114                 usb_hid_report_received();
    115         }
    116        
    117         // clear the buffer so that it will not be received twice
    118         //memset(hid_dev->input_report, 0, hid_dev->input_report_size);
    119        
    120         // note that we already received this report
    121 //      report_received = true;
    122        
    123         return EOK;
    124 }
    125 
    126 /*----------------------------------------------------------------------------*/
    127 
    128 static int usb_generic_hid_client_connected(ddf_fun_t *fun)
    129 {
    130         usb_hid_report_received();
    131         return EOK;
    132 }
    133 
    134 /*----------------------------------------------------------------------------*/
    135 
    136 static int usb_generic_hid_create_function(usb_hid_dev_t *hid_dev)
    137 {       
    138         /* Create the function exposed under /dev/devices. */
    139         /** @todo Generate numbers for the devices? */
    140         usb_log_debug("Creating DDF function %s...\n", HID_GENERIC_FUN_NAME);
    141         ddf_fun_t *fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed,
    142             HID_GENERIC_FUN_NAME);
    143         if (fun == NULL) {
    144                 usb_log_error("Could not create DDF function node.\n");
    145                 return ENOMEM;
    146         }
    147 
    148         int rc = ddf_fun_bind(fun);
    149         if (rc != EOK) {
    150                 usb_log_error("Could not bind DDF function: %s.\n",
    151                     str_error(rc));
    152                 ddf_fun_destroy(fun);
    153                 return rc;
    154         }
    155        
    156         fun->ops = &usb_generic_hid_ops;
    157         fun->driver_data = hid_dev;
    158        
    159         return EOK;
    160 }
    161 
    162 /*----------------------------------------------------------------------------*/
    163 
    164 int usb_generic_hid_init(usb_hid_dev_t *hid_dev)
    165 {
    166         if (hid_dev == NULL) {
    167                 return EINVAL;
    168         }
    169        
    170         return usb_generic_hid_create_function(hid_dev);
    171 }
    172 
    173 /*----------------------------------------------------------------------------*/
    174 
    17557bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev,
    17658    uint8_t *buffer, size_t buffer_size)
Note: See TracChangeset for help on using the changeset viewer.