Changes in / [d600874:98e15b1] in mainline


Ignore:
Location:
uspace/lib/usbhid/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhid/src/hiddescriptor.c

    rd600874 r98e15b1  
    187187
    188188                field = malloc(sizeof(usb_hid_report_field_t));
    189                 if(field == NULL) {
    190                         return ENOMEM;
    191                 }
    192 
    193189                memset(field, 0, sizeof(usb_hid_report_field_t));
    194190                list_initialize(&field->link);
     
    220216                        }
    221217                        else {
    222                                 usage = report_item->usages[
     218                                usage = report_item->usages[
    223219                                        report_item->usages_count- 1];
    224220                        }
     
    245241
    246242                field->size = report_item->size;
    247 
    248                 if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
    249                         int offset = report_item->offset + report_item->size * i;
    250                         int field_offset = (offset/8)*8 + (offset/8 + 1) * 8 -
    251                                 offset - report_item->size;
    252                         if(field_offset < 0) {
    253                                 field->offset = 0;
    254                         }
    255                         else {
    256                                 field->offset = field_offset;
    257                         }
    258                 }
    259                 else {
    260                         field->offset = report_item->offset + (i * report_item->size);
    261                 }
    262 
    263 
    264                 if(report->use_report_ids != 0) {
     243               
     244                size_t offset_byte = (report_item->offset + (i *
     245                        report_item->size)) / 8;
     246
     247                size_t offset_bit = 8 - ((report_item->offset + (i *
     248                        report_item->size)) % 8) - report_item->size;
     249
     250                field->offset = 8 * offset_byte + offset_bit;
     251                if(report_item->id != 0) {
    265252                        field->offset += 8;
    266253                        report->use_report_ids = 1;
    267254                }
    268 
    269255                field->item_flags = report_item->item_flags;
    270256
  • uspace/lib/usbhid/src/hidparser.c

    rd600874 r98e15b1  
    153153
    154154
    155         report_des = usb_hid_report_find_description(report, *report_id,
    156                 type);
    157 
     155        report_des = usb_hid_report_find_description(report, *report_id, type);
    158156        if(report_des == NULL) {
    159157                return EINVAL;
     
    169167                if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) {
    170168                       
    171                         if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0){
     169                        if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) {
    172170
    173171                                // array
     
    176174               
    177175                                item->usage = USB_HID_EXTENDED_USAGE(
    178                                     item->usages[
    179                                     item->value - item->physical_minimum]);
    180 
    181                                 item->usage_page =
    182                                     USB_HID_EXTENDED_USAGE_PAGE(
    183                                     item->usages[
    184                                     item->value - item->physical_minimum]);
    185 
    186                                 usb_hid_report_set_last_item (
    187                                     item->collection_path,
    188                                     USB_HID_TAG_CLASS_GLOBAL,
    189                                     item->usage_page);
    190 
    191                                 usb_hid_report_set_last_item (
    192                                     item->collection_path,
     176                                    item->usages[item->value - item->physical_minimum]);
     177
     178                                item->usage_page = USB_HID_EXTENDED_USAGE_PAGE(
     179                                    item->usages[item->value - item->physical_minimum]);
     180
     181                                usb_hid_report_set_last_item (item->collection_path,
     182                                    USB_HID_TAG_CLASS_GLOBAL, item->usage_page);
     183
     184                                usb_hid_report_set_last_item (item->collection_path,
    193185                                    USB_HID_TAG_CLASS_LOCAL, item->usage);
    194186                               
     
    196188                        else {
    197189                                // variable item
    198                                 item->value = usb_hid_translate_data(item,
    199                                     data);                             
    200                         }                       
     190                                item->value = usb_hid_translate_data(item, data);                               
     191                        }                               
    201192                }
    202193                list_item = list_item->next;
     
    222213       
    223214        int32_t value=0;
    224         int32_t mask=0;
    225         const uint8_t *foo=0;
     215        int32_t mask;
     216        const uint8_t *foo;
    226217
    227218        // now only shot tags are allowed
     
    249240        if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) {
    250241               
    251                 part_size = 0;
     242                part_size = ((offset+item->size)%8);
    252243
    253244                size_t i=0;
     
    255246                        if(i == (size_t)(offset/8)) {
    256247                                // the higher one
    257                                 part_size = 8 - (offset % 8);
    258248                                foo = data + i;
    259249                                mask =  ((1 << (item->size-part_size))-1);
    260                                 value = (*foo & mask);
     250                                value = (*foo & mask) << part_size;
    261251                        }
    262252                        else if(i == ((offset+item->size-1)/8)){
    263253                                // the lower one
    264254                                foo = data + i;
    265                                 mask = ((1 << (item->size - part_size)) - 1)
    266                                         << (8 - (item->size - part_size));
    267 
    268                                 value = (((*foo & mask) >> (8 -
    269                                     (item->size - part_size))) << part_size )
    270                                     + value;
     255                                mask =  ((1 << part_size)-1) << (8-part_size);
     256                                value += ((*foo & mask) >> (8-part_size));
    271257                        }
    272258                        else {
    273                                 value = (*(data + 1) << (part_size + 8)) + value;
    274                                 part_size += 8;
     259                                value = value << 8;
     260                                value += *(data + 1);
    275261                        }
    276262                }
     
    389375                report_item = list_get_instance(item, usb_hid_report_field_t, link);
    390376
    391                 value = usb_hid_translate_data_reverse(report_item,
    392                         report_item->value);
    393 
    394                 offset = report_des->bit_length - report_item->offset - 1;
    395                 length = report_item->size;
    396                
     377                if(USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) {
     378                                       
     379                        // array
     380                        value = usb_hid_translate_data_reverse(report_item,
     381                                report_item->value);
     382
     383                        offset = report_item->offset;
     384                        length = report_item->size;
     385                }
     386                else {
     387                        // variable item
     388                        value  = usb_hid_translate_data_reverse(report_item,
     389                                report_item->value);
     390
     391                        offset = report_item->offset;
     392                        length = report_item->size;
     393                }
     394
    397395                usb_log_debug("\ttranslated value: %x\n", value);
    398396
     
    619617                        return report_des->report_id;
    620618                }
    621 
    622                 report_it = report_it->next;
    623619        }
    624620
Note: See TracChangeset for help on using the changeset viewer.