Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision 2020927ba9a1c0ea098d234485d70c1f0d24a51e)
+++ uspace/lib/usb/src/hidparser.c	(revision 1553cbfd86b927d7ac7361cde758f8694492651d)
@@ -79,5 +79,5 @@
  * Data translation private functions
  */
-int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size);
+uint32_t usb_hid_report_tag_data_uint32(const uint8_t *data, size_t size);
 inline size_t usb_hid_count_item_offset(usb_hid_report_item_t * report_item, size_t offset);
 int usb_hid_translate_data(usb_hid_report_field_t *item, const uint8_t *data);
@@ -85,4 +85,6 @@
 int usb_pow(int a, int b);
 
+#define USB_HID_UINT32_TO_INT32(x, size)	((((x) & (1 << ((size) - 1))) != 0) ? -(~(x - 1) & ((1 << size) - 1)) : (x)) //(-(~((x) - 1)))
+#define USB_HID_INT32_TO_UINT32(x, size)	(((x) < 0 ) ? ((1 << (size)) + (x)) : (x))
 // TODO: tohle ma bejt asi jinde
 int usb_pow(int a, int b)
@@ -173,5 +175,5 @@
 		if(report_item->usages_count > 0 && ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) {
 			uint32_t usage;
-			if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
+			if(report_item->type != USB_HID_REPORT_TYPE_INPUT) {
 				if(i < report_item->usages_count){
 					usage = report_item->usages[i];
@@ -515,32 +517,33 @@
 	{
 		case USB_HID_REPORT_TAG_USAGE_PAGE:
-			report_item->usage_page = usb_hid_report_tag_data_int32(data, item_size);
+			report_item->usage_page = usb_hid_report_tag_data_uint32(data, item_size);
 			break;
 		case USB_HID_REPORT_TAG_LOGICAL_MINIMUM:
-			report_item->logical_minimum = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->logical_minimum = USB_HID_UINT32_TO_INT32(usb_hid_report_tag_data_uint32(data,item_size), item_size * 8);
 			break;
 		case USB_HID_REPORT_TAG_LOGICAL_MAXIMUM:
-			report_item->logical_maximum = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->logical_maximum = USB_HID_UINT32_TO_INT32(usb_hid_report_tag_data_uint32(data,item_size), item_size * 8);
 			break;
 		case USB_HID_REPORT_TAG_PHYSICAL_MINIMUM:
-			report_item->physical_minimum = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->physical_minimum = USB_HID_UINT32_TO_INT32(usb_hid_report_tag_data_uint32(data,item_size), item_size * 8);
 			break;			
 		case USB_HID_REPORT_TAG_PHYSICAL_MAXIMUM:
-			report_item->physical_maximum = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->physical_maximum = USB_HID_UINT32_TO_INT32(usb_hid_report_tag_data_uint32(data,item_size), item_size * 8);
+
 			break;
 		case USB_HID_REPORT_TAG_UNIT_EXPONENT:
-			report_item->unit_exponent = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->unit_exponent = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_UNIT:
-			report_item->unit = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->unit = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_REPORT_SIZE:
-			report_item->size = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->size = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_REPORT_COUNT:
-			report_item->count = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->count = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_REPORT_ID:
-			report_item->id = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->id = usb_hid_report_tag_data_uint32(data,item_size);
 			return USB_HID_RESET_OFFSET;
 			break;
@@ -557,5 +560,5 @@
 			return USB_HID_NO_ACTION;
 	}
-	
+
 	return EOK;
 }
@@ -576,5 +579,5 @@
 	{
 		case USB_HID_REPORT_TAG_USAGE:
-			report_item->usages[report_item->usages_count] = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->usages[report_item->usages_count] = usb_hid_report_tag_data_uint32(data,item_size);
 			report_item->usages_count++;
 			break;
@@ -582,9 +585,9 @@
 			if (item_size == 3) {
 				// usage extended usages
-				report_item->extended_usage_page = (usb_hid_report_tag_data_int32(data,item_size) & 0xFF00) >> 16; 
-				report_item->usage_minimum = usb_hid_report_tag_data_int32(data,item_size) & 0xFF;
+				report_item->extended_usage_page = (usb_hid_report_tag_data_uint32(data,item_size) & 0xFF00) >> 16; 
+				report_item->usage_minimum = usb_hid_report_tag_data_uint32(data,item_size) & 0xFF;
 			}
 			else {
-				report_item->usage_minimum = usb_hid_report_tag_data_int32(data,item_size);
+				report_item->usage_minimum = usb_hid_report_tag_data_uint32(data,item_size);
 			}
 			break;
@@ -592,31 +595,31 @@
 			if (item_size == 3) {
 				// usage extended usages
-				report_item->extended_usage_page = (usb_hid_report_tag_data_int32(data,item_size) & 0xFF00) >> 16; 
-				report_item->usage_maximum = usb_hid_report_tag_data_int32(data,item_size) & 0xFF;
+				report_item->extended_usage_page = (usb_hid_report_tag_data_uint32(data,item_size) & 0xFF00) >> 16; 
+				report_item->usage_maximum = usb_hid_report_tag_data_uint32(data,item_size) & 0xFF;
 			}
 			else {
-				report_item->usage_maximum = usb_hid_report_tag_data_int32(data,item_size);
+				report_item->usage_maximum = usb_hid_report_tag_data_uint32(data,item_size);
 			}
 			break;
 		case USB_HID_REPORT_TAG_DESIGNATOR_INDEX:
-			report_item->designator_index = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->designator_index = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_DESIGNATOR_MINIMUM:
-			report_item->designator_minimum = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->designator_minimum = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_DESIGNATOR_MAXIMUM:
-			report_item->designator_maximum = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->designator_maximum = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_STRING_INDEX:
-			report_item->string_index = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->string_index = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_STRING_MINIMUM:
-			report_item->string_minimum = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->string_minimum = usb_hid_report_tag_data_uint32(data,item_size);
 			break;
 		case USB_HID_REPORT_TAG_STRING_MAXIMUM:
-			report_item->string_maximum = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->string_maximum = usb_hid_report_tag_data_uint32(data,item_size);
 			break;			
 		case USB_HID_REPORT_TAG_DELIMITER:
-			//report_item->delimiter = usb_hid_report_tag_data_int32(data,item_size);
+			//report_item->delimiter = usb_hid_report_tag_data_uint32(data,item_size);
 			//TODO: 
 			//	DELIMITER STUFF
@@ -631,5 +634,5 @@
 
 /**
- * Converts raw data to int32 (thats the maximum length of short item data)
+ * Converts raw data to uint32 (thats the maximum length of short item data)
  *
  * @param Data buffer
@@ -637,8 +640,8 @@
  * @return Converted int32 number
  */
-int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size)
+uint32_t usb_hid_report_tag_data_uint32(const uint8_t *data, size_t size)
 {
 	unsigned int i;
-	int32_t result;
+	uint32_t result;
 
 	result = 0;
@@ -649,6 +652,4 @@
 	return result;
 }
-
-
 
 /**
@@ -675,8 +676,8 @@
 		usb_log_debug("\t\tOFFSET: %X\n", report_item->offset);
 		usb_log_debug("\t\tSIZE: %X\n", report_item->size);				
-		usb_log_debug("\t\tLOGMIN: %X\n", report_item->logical_minimum);
-		usb_log_debug("\t\tLOGMAX: %X\n", report_item->logical_maximum);		
-		usb_log_debug("\t\tPHYMIN: %X\n", report_item->physical_minimum);		
-		usb_log_debug("\t\tPHYMAX: %X\n", report_item->physical_maximum);				
+		usb_log_debug("\t\tLOGMIN: %d\n", report_item->logical_minimum);
+		usb_log_debug("\t\tLOGMAX: %d\n", report_item->logical_maximum);		
+		usb_log_debug("\t\tPHYMIN: %d\n", report_item->physical_minimum);		
+		usb_log_debug("\t\tPHYMAX: %d\n", report_item->physical_maximum);				
 		usb_log_debug("\t\ttUSAGEMIN: %X\n", report_item->usage_minimum);
 		usb_log_debug("\t\tUSAGEMAX: %X\n", report_item->usage_maximum);
@@ -928,9 +929,6 @@
 	}
 
-	if(!(item->logical_minimum >= 0 && item->logical_maximum >= 0)){
-		value = (int32_t)value;
-	}
-	else {
-		value = (uint32_t)value;
+	if((item->logical_minimum < 0) || (item->logical_maximum < 0)){
+		value = USB_HID_UINT32_TO_INT32(value, item->size);
 	}
 
@@ -1539,6 +1537,8 @@
 	}
 
-
-	return (uint32_t)ret;
+	if((item->logical_minimum < 0) || (item->logical_maximum < 0)){
+		return USB_HID_INT32_TO_UINT32(ret, item->size);
+	}
+	return (int32_t)ret;
 }
 
