Changeset 574f276 in mainline


Ignore:
Timestamp:
2011-05-27T17:37:21Z (13 years ago)
Author:
Matej Klonfar <maklf@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4967c1e
Parents:
0c904a3
Message:

parsing of customer controls bug fixed

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

Legend:

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

    r0c904a3 r574f276  
    187187
    188188                field = malloc(sizeof(usb_hid_report_field_t));
     189                if(field == NULL) {
     190                        return ENOMEM;
     191                }
     192
    189193                memset(field, 0, sizeof(usb_hid_report_field_t));
    190194                list_initialize(&field->link);
     
    241245
    242246                field->size = report_item->size;
    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) {
     247       
     248                if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
     249                        field->offset = report_item->offset +
     250                            ((report_item->count - (i + 1)) *
     251                            report_item->size);
     252                }
     253                else {
     254                        field->offset = report_item->offset + (i * report_item->size);
     255                }
     256
     257                if(report->use_report_ids != 0) {
    252258                        field->offset += 8;
    253259                        report->use_report_ids = 1;
  • uspace/lib/usbhid/src/hidparser.c

    r0c904a3 r574f276  
    258258                                foo = data + i;
    259259                                mask =  ((1 << (item->size-part_size))-1);
    260                                 value = (*foo & mask) << part_size;
     260                                value = (*foo & mask);
    261261                        }
    262262                        else if(i == ((offset+item->size-1)/8)){
    263263                                // the lower one
    264264                                foo = data + i;
    265                                 mask =  ((1 << part_size)-1) << (8-part_size);
    266                                 value += ((*foo & mask) >> (8-part_size));
     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;
    267271                        }
    268272                        else {
    269                                 value = value << 8;
    270                                 value += *(data + 1);
     273                                value = (*(data + 1) << (part_size + 8)) + value;
    271274                                part_size += 8;
    272275                        }
     
    386389                report_item = list_get_instance(item, usb_hid_report_field_t, link);
    387390
    388                 if(USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) {
    389                                        
    390                         // array
    391                         value = usb_hid_translate_data_reverse(report_item,
    392                                 report_item->value);
    393 
    394                         offset = report_item->offset;
    395                         length = report_item->size;
    396                 }
    397                 else {
    398                         // variable item
    399                         value  = usb_hid_translate_data_reverse(report_item,
    400                                 report_item->value);
    401 
    402                         offset = report_item->offset;
    403                         length = report_item->size;
    404                 }
    405 
     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               
    406397                usb_log_debug("\ttranslated value: %x\n", value);
    407398
Note: See TracChangeset for help on using the changeset viewer.