Changes in / [d600874:98e15b1] in mainline
- Location:
- uspace/lib/usbhid/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhid/src/hiddescriptor.c
rd600874 r98e15b1 187 187 188 188 field = malloc(sizeof(usb_hid_report_field_t)); 189 if(field == NULL) {190 return ENOMEM;191 }192 193 189 memset(field, 0, sizeof(usb_hid_report_field_t)); 194 190 list_initialize(&field->link); … … 220 216 } 221 217 else { 222 usage = 218 usage = report_item->usages[ 223 219 report_item->usages_count- 1]; 224 220 } … … 245 241 246 242 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) { 265 252 field->offset += 8; 266 253 report->use_report_ids = 1; 267 254 } 268 269 255 field->item_flags = report_item->item_flags; 270 256 -
uspace/lib/usbhid/src/hidparser.c
rd600874 r98e15b1 153 153 154 154 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); 158 156 if(report_des == NULL) { 159 157 return EINVAL; … … 169 167 if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) { 170 168 171 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) {169 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) { 172 170 173 171 // array … … 176 174 177 175 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, 193 185 USB_HID_TAG_CLASS_LOCAL, item->usage); 194 186 … … 196 188 else { 197 189 // variable item 198 item->value = usb_hid_translate_data(item, 199 data); 200 } 190 item->value = usb_hid_translate_data(item, data); 191 } 201 192 } 202 193 list_item = list_item->next; … … 222 213 223 214 int32_t value=0; 224 int32_t mask =0;225 const uint8_t *foo =0;215 int32_t mask; 216 const uint8_t *foo; 226 217 227 218 // now only shot tags are allowed … … 249 240 if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) { 250 241 251 part_size = 0;242 part_size = ((offset+item->size)%8); 252 243 253 244 size_t i=0; … … 255 246 if(i == (size_t)(offset/8)) { 256 247 // the higher one 257 part_size = 8 - (offset % 8);258 248 foo = data + i; 259 249 mask = ((1 << (item->size-part_size))-1); 260 value = (*foo & mask) ;250 value = (*foo & mask) << part_size; 261 251 } 262 252 else if(i == ((offset+item->size-1)/8)){ 263 253 // the lower one 264 254 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)); 271 257 } 272 258 else { 273 value = (*(data + 1) << (part_size + 8)) + value;274 part_size += 8;259 value = value << 8; 260 value += *(data + 1); 275 261 } 276 262 } … … 389 375 report_item = list_get_instance(item, usb_hid_report_field_t, link); 390 376 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 397 395 usb_log_debug("\ttranslated value: %x\n", value); 398 396 … … 619 617 return report_des->report_id; 620 618 } 621 622 report_it = report_it->next;623 619 } 624 620
Note:
See TracChangeset
for help on using the changeset viewer.