Changeset a81a1d09 in mainline for uspace/drv/usbhid/generic/hiddev.c


Ignore:
Timestamp:
2011-05-11T16:49:28Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
19387b61
Parents:
e1dbcbc (diff), 9212f8a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge development/ changes

File:
1 edited

Legend:

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

    re1dbcbc ra81a1d09  
    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>
    3944
    4045#include "hiddev.h"
     
    5560/*----------------------------------------------------------------------------*/
    5661
     62static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun);
     63
     64static 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
     67static int usb_generic_hid_client_connected(ddf_fun_t *fun);
     68
     69/*----------------------------------------------------------------------------*/
     70
     71static 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
     76static 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
     83static 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
     96static 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
     128static int usb_generic_hid_client_connected(ddf_fun_t *fun)
     129{
     130        usb_hid_report_received();
     131        return EOK;
     132}
     133
     134/*----------------------------------------------------------------------------*/
     135
     136static 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
     164int 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
    57175bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev,
    58176    uint8_t *buffer, size_t buffer_size)
Note: See TracChangeset for help on using the changeset viewer.