Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/drv/generic/remote_usbhid.c

    r9dddb3d r27b85d9  
    3636#include <errno.h>
    3737#include <assert.h>
    38 #include <stdio.h>
    3938
    4039#include "usbhid_iface.h"
     
    4342static void remote_usbhid_get_event_length(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
    4443static void remote_usbhid_get_event(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
    45 static void remote_usbhid_get_report_descriptor_length(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
    46 static void remote_usbhid_get_report_descriptor(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
    4744// static void remote_usbhid_(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
    4845
     
    5047static remote_iface_func_ptr_t remote_usbhid_iface_ops [] = {
    5148        remote_usbhid_get_event_length,
    52         remote_usbhid_get_event,
    53         remote_usbhid_get_report_descriptor_length,
    54         remote_usbhid_get_report_descriptor
     49        remote_usbhid_get_event
    5550};
    5651
     
    6358};
    6459
    65 //usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;
     60usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;
    6661
    6762
     
    6964    ipc_callid_t callid, ipc_call_t *call)
    7065{
    71         printf("remote_usbhid_get_event_length()\n");
    72        
    7366        usbhid_iface_t *hid_iface = (usbhid_iface_t *) iface;
    7467
    7568        if (!hid_iface->get_event_length) {
    76                 printf("Get event length not set!\n");
    7769                async_answer_0(callid, ENOTSUP);
    7870                return;
    7971        }
    8072
    81         size_t len = hid_iface->get_event_length(fun);
    82 //      if (len == 0) {
    83 //              len = EEMPTY;
    84 //      }
    85         async_answer_1(callid, EOK, len);
    86        
    87 //      if (len < 0) {
    88 //              async_answer_0(callid, len);
    89 //      } else {
    90 //              async_answer_1(callid, EOK, len);
    91 //      }
     73        int len = hid_iface->get_event_length(fun);
     74        if (len == 0) {
     75                len = EEMPTY;
     76        }
     77        if (len < 0) {
     78                async_answer_0(callid, len);
     79        } else {
     80                async_answer_1(callid, EOK, len);
     81        }
    9282}
    9383
     
    110100                return;
    111101        }
    112 //      /* Check that length is even number. Truncate otherwise. */
    113 //      if ((len % 2) == 1) {
    114 //              len--;
    115 //      }
     102        /* Check that length is even number. Truncate otherwise. */
     103        if ((len % 2) == 1) {
     104                len--;
     105        }
    116106        if (len == 0) {
    117107                async_answer_0(data_callid, EINVAL);
    118108                async_answer_0(callid, EINVAL);
    119                 return;
    120109        }
    121110
    122111        int rc;
    123112
    124         uint8_t *data = malloc(len);
    125         if (data == NULL) {
     113        size_t items = len / 2;
     114        uint16_t *usage_pages_and_usages = malloc(sizeof(uint16_t) * len);
     115        if (usage_pages_and_usages == NULL) {
    126116                async_answer_0(data_callid, ENOMEM);
    127117                async_answer_0(callid, ENOMEM);
    128                 return;
    129118        }
    130119
    131         size_t act_length;
    132         rc = hid_iface->get_event(fun, data, len, &act_length, flags);
     120        size_t act_items;
     121        int rc = hid_iface->get_event(fun, usage_pages_and_usages,
     122            usage_pages_and_usages + items, items, &act_items, flags);
    133123        if (rc != EOK) {
    134                 free(data);
     124                free(usage_pages_and_usages);
    135125                async_answer_0(data_callid, rc);
    136126                async_answer_0(callid, rc);
    137                 return;
    138127        }
    139         if (act_length >= len) {
     128        if (act_items >= items) {
    140129                /* This shall not happen. */
    141130                // FIXME: how about an assert here?
    142                 act_length = len;
     131                act_items = items;
    143132        }
    144133
    145         async_data_read_finalize(data_callid, data, act_length);
     134        async_data_read_finalize(data_callid, usage_pages_and_usages,
     135            act_items * 2 * sizeof(uint16_t));
    146136
    147         free(data);
     137        free(usage_pages_and_usages);
    148138
    149139        async_answer_0(callid, EOK);
    150140}
    151141
    152 void remote_usbhid_get_report_descriptor_length(ddf_fun_t *fun, void *iface,
    153     ipc_callid_t callid, ipc_call_t *call)
    154 {
    155         usbhid_iface_t *hid_iface = (usbhid_iface_t *) iface;
    156 
    157         if (!hid_iface->get_report_descriptor_length) {
    158                 async_answer_0(callid, ENOTSUP);
    159                 return;
    160         }
    161 
    162         size_t len = hid_iface->get_report_descriptor_length(fun);
    163         async_answer_1(callid, EOK, (sysarg_t) len);
    164 }
    165 
    166 void remote_usbhid_get_report_descriptor(ddf_fun_t *fun, void *iface,
    167     ipc_callid_t callid, ipc_call_t *call)
    168 {
    169         usbhid_iface_t *hid_iface = (usbhid_iface_t *) iface;
    170 
    171         if (!hid_iface->get_report_descriptor) {
    172                 async_answer_0(callid, ENOTSUP);
    173                 return;
    174         }
    175 
    176         size_t len;
    177         ipc_callid_t data_callid;
    178         if (!async_data_read_receive(&data_callid, &len)) {
    179                 async_answer_0(callid, EINVAL);
    180                 return;
    181         }
    182 
    183         if (len == 0) {
    184                 async_answer_0(data_callid, EINVAL);
    185                 async_answer_0(callid, EINVAL);
    186                 return;
    187         }
    188 
    189         uint8_t *descriptor = malloc(len);
    190         if (descriptor == NULL) {
    191                 async_answer_0(data_callid, ENOMEM);
    192                 async_answer_0(callid, ENOMEM);
    193                 return;
    194         }
    195 
    196         size_t act_len = 0;
    197         int rc = hid_iface->get_report_descriptor(fun, descriptor, len,
    198             &act_len);
    199         if (act_len > len) {
    200                 rc = ELIMIT;
    201         }
    202         if (rc != EOK) {
    203                 free(descriptor);
    204                 async_answer_0(data_callid, rc);
    205                 async_answer_0(callid, rc);
    206                 return;
    207         }
    208 
    209         async_data_read_finalize(data_callid, descriptor, act_len);
    210         async_answer_0(callid, EOK);
    211 
    212         free(descriptor);
    213 }
    214 
    215 
    216 
    217142/**
    218143 * @}
Note: See TracChangeset for help on using the changeset viewer.