Ignore:
File:
1 edited

Legend:

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

    r069b80d rb72efe8  
    5252        int32_t value);
    5353
    54 /*---------------------------------------------------------------------------*/
    55 
    56 static int usb_pow(int a, int b)
    57 {
    58         switch (b) {
     54int usb_pow(int a, int b);
     55
     56/*---------------------------------------------------------------------------*/
     57
     58// TODO: tohle ma bejt asi jinde
     59int usb_pow(int a, int b)
     60{
     61        switch(b) {
    5962        case 0:
    6063                return 1;
     
    6467                break;
    6568        default:
    66                 return a * usb_pow(a, b - 1);
     69                return a * usb_pow(a, b-1);
    6770                break;
    6871        }
     
    7881 */
    7982size_t usb_hid_report_size(usb_hid_report_t *report, uint8_t report_id,
    80     usb_hid_report_type_t type)
     83                           usb_hid_report_type_t type)
    8184{
    8285        usb_hid_report_description_t *report_des;
    8386
    84         if (report == NULL) {
     87        if(report == NULL) {
    8588                return 0;
    8689        }
    8790
    88         report_des = usb_hid_report_find_description(report, report_id, type);
    89         if (report_des == NULL) {
     91        report_des = usb_hid_report_find_description (report, report_id, type);
     92        if(report_des == NULL){
    9093                return 0;
    91         } else {
     94        }
     95        else {
    9296                return report_des->item_length;
    9397        }
     
    102106 */
    103107size_t usb_hid_report_byte_size(usb_hid_report_t *report, uint8_t report_id,
    104     usb_hid_report_type_t type)
     108                           usb_hid_report_type_t type)
    105109{
    106110        usb_hid_report_description_t *report_des;
    107111
    108         if (report == NULL) {
     112        if(report == NULL) {
    109113                return 0;
    110114        }
    111115
    112         report_des = usb_hid_report_find_description(report, report_id, type);
    113         if (report_des == NULL) {
     116        report_des = usb_hid_report_find_description (report, report_id, type);
     117        if(report_des == NULL){
    114118                return 0;
    115         } else {
     119        }
     120        else {
    116121                return ((report_des->bit_length + 7) / 8) ;
    117122        }
     
    128133 */
    129134int usb_hid_parse_report(const usb_hid_report_t *report, const uint8_t *data,
    130     size_t size, uint8_t *report_id)
     135        size_t size, uint8_t *report_id)
    131136{
    132137        usb_hid_report_field_t *item;
     
    135140        usb_hid_report_type_t type = USB_HID_REPORT_TYPE_INPUT;
    136141       
    137         if (report == NULL) {
     142        if(report == NULL) {
    138143                return EINVAL;
    139144        }
    140145
    141         if (report->use_report_ids != 0) {
     146        if(report->use_report_ids != 0) {
    142147                *report_id = data[0];
    143         } else {
     148        }       
     149        else {
    144150                *report_id = 0;
    145151        }
    146152
     153
    147154        report_des = usb_hid_report_find_description(report, *report_id,
    148             type);
    149 
    150         if (report_des == NULL) {
     155                type);
     156
     157        if(report_des == NULL) {
    151158                return EINVAL;
    152159        }
     
    155162        list_foreach(report_des->report_items, list_item) {
    156163                item = list_get_instance(list_item, usb_hid_report_field_t,
    157                     ritems_link);
    158 
    159                 if (USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) {
     164                                ritems_link);
     165
     166                if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) {
    160167                       
    161                         if (USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) {
    162                                 /* array */
     168                        if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0){
     169
     170                                // array
    163171                                item->value =
    164172                                        usb_hid_translate_data(item, data);
    165173               
    166174                                item->usage = USB_HID_EXTENDED_USAGE(
    167                                     item->usages[item->value -
    168                                     item->physical_minimum]);
     175                                    item->usages[
     176                                    item->value - item->physical_minimum]);
    169177
    170178                                item->usage_page =
    171179                                    USB_HID_EXTENDED_USAGE_PAGE(
    172                                     item->usages[item->value -
    173                                     item->physical_minimum]);
    174 
    175                                 usb_hid_report_set_last_item(
     180                                    item->usages[
     181                                    item->value - item->physical_minimum]);
     182
     183                                usb_hid_report_set_last_item (
    176184                                    item->collection_path,
    177185                                    USB_HID_TAG_CLASS_GLOBAL,
    178186                                    item->usage_page);
    179187
    180                                 usb_hid_report_set_last_item(
     188                                usb_hid_report_set_last_item (
    181189                                    item->collection_path,
    182190                                    USB_HID_TAG_CLASS_LOCAL, item->usage);
    183                         } else {
    184                                 /* variable item */
     191                               
     192                        }
     193                        else {
     194                                // variable item
    185195                                item->value = usb_hid_translate_data(item,
    186196                                    data);                             
     
    190200       
    191201        return EOK;
     202       
    192203}
    193204
     
    206217        int part_size;
    207218       
    208         int32_t value = 0;
    209         int32_t mask = 0;
    210         const uint8_t *foo = 0;
    211 
    212         /* now only short tags are allowed */
    213         if (item->size > 32) {
     219        int32_t value=0;
     220        int32_t mask=0;
     221        const uint8_t *foo=0;
     222
     223        // now only shot tags are allowed
     224        if(item->size > 32) {
    214225                return 0;
    215226        }
    216227
    217         if ((item->physical_minimum == 0) && (item->physical_maximum == 0)) {
     228        if((item->physical_minimum == 0) && (item->physical_maximum == 0)){
    218229                item->physical_minimum = item->logical_minimum;
    219230                item->physical_maximum = item->logical_maximum;                 
     
    221232       
    222233
    223         if (item->physical_maximum == item->physical_minimum) {
     234        if(item->physical_maximum == item->physical_minimum){
    224235            resolution = 1;
    225         } else {
     236        }
     237        else {
    226238            resolution = (item->logical_maximum - item->logical_minimum) /
    227239                ((item->physical_maximum - item->physical_minimum) *
    228                 (usb_pow(10, (item->unit_exponent))));
     240                (usb_pow(10,(item->unit_exponent))));
    229241        }
    230242
    231243        offset = item->offset;
    232244        // FIXME
    233         if ((size_t) (offset / 8) != (size_t) ((offset+item->size - 1) / 8)) {
     245        if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) {
    234246               
    235247                part_size = 0;
    236248
    237                 size_t i = 0;
    238                 for (i = (size_t) (offset / 8);
    239                     i <= (size_t) (offset + item->size - 1) / 8; i++) {
    240                         if (i == (size_t) (offset / 8)) {
    241                                 /* the higher one */
     249                size_t i=0;
     250                for(i=(size_t)(offset/8); i<=(size_t)(offset+item->size-1)/8; i++){
     251                        if(i == (size_t)(offset/8)) {
     252                                // the higher one
    242253                                part_size = 8 - (offset % 8);
    243254                                foo = data + i;
    244                                 mask =  ((1 << (item->size - part_size)) - 1);
     255                                mask =  ((1 << (item->size-part_size))-1);
    245256                                value = (*foo & mask);
    246                         } else if (i == ((offset + item->size - 1) / 8)) {
    247                                 /* the lower one */
     257                        }
     258                        else if(i == ((offset+item->size-1)/8)){
     259                                // the lower one
    248260                                foo = data + i;
    249                                 mask = ((1 << (item->size - part_size)) - 1) <<
    250                                     (8 - (item->size - part_size));
     261                                mask = ((1 << (item->size - part_size)) - 1)
     262                                        << (8 - (item->size - part_size));
    251263
    252264                                value = (((*foo & mask) >> (8 -
    253                                     (item->size - part_size))) << part_size) +
    254                                     value;
    255                         } else {
    256                                 value = (*(data + 1) << (part_size + 8)) +
    257                                     value;
     265                                    (item->size - part_size))) << part_size )
     266                                    + value;
     267                        }
     268                        else {
     269                                value = (*(data + 1) << (part_size + 8)) + value;
    258270                                part_size += 8;
    259271                        }
    260272                }
    261         } else {               
    262                 foo = data + (offset / 8);
    263                 mask = ((1 << item->size) - 1) <<
    264                     (8 - ((offset % 8) + item->size));
    265                 value = (*foo & mask) >> (8 - ((offset % 8) + item->size));
    266         }
    267 
    268         if ((item->logical_minimum < 0) || (item->logical_maximum < 0)) {
     273        }
     274        else {         
     275                foo = data+(offset/8);
     276                mask =  ((1 << item->size)-1) << (8-((offset%8)+item->size));
     277                value = (*foo & mask) >> (8-((offset%8)+item->size));
     278        }
     279
     280        if((item->logical_minimum < 0) || (item->logical_maximum < 0)){
    269281                value = USB_HID_UINT32_TO_INT32(value, item->size);
    270282        }
    271283
    272         return (int) (((value - item->logical_minimum) / resolution) +
    273             item->physical_minimum);
     284        return (int)(((value - item->logical_minimum) / resolution) +
     285                item->physical_minimum);
     286       
    274287}
    275288
     
    286299 */
    287300uint8_t *usb_hid_report_output(usb_hid_report_t *report, size_t *size,
    288     uint8_t report_id)
    289 {
    290         if (report == NULL) {
     301        uint8_t report_id)
     302{
     303        if(report == NULL) {
    291304                *size = 0;
    292305                return NULL;
     
    297310        list_foreach(report->reports, report_it) {
    298311                report_des = list_get_instance(report_it,
    299                     usb_hid_report_description_t, reports_link);
     312                        usb_hid_report_description_t, reports_link);
    300313               
    301                 if ((report_des->report_id == report_id) &&
    302                     (report_des->type == USB_HID_REPORT_TYPE_OUTPUT)) {
     314                if((report_des->report_id == report_id) &&
     315                        (report_des->type == USB_HID_REPORT_TYPE_OUTPUT)){
    303316                        break;
    304317                }
    305318        }
    306319
    307         if (report_des == NULL) {
     320        if(report_des == NULL){
    308321                *size = 0;
    309322                return NULL;
    310         } else {
    311                 *size = (report_des->bit_length + (8 - 1)) / 8;
     323        }
     324        else {
     325                *size = (report_des->bit_length + (8 - 1))/8;
    312326                uint8_t *ret = malloc((*size) * sizeof(uint8_t));
    313327                memset(ret, 0, (*size) * sizeof(uint8_t));
     
    323337 */
    324338void usb_hid_report_output_free(uint8_t *output)
    325 {
    326         if (output != NULL) {
    327                 free(output);
     339
     340{
     341        if(output != NULL) {
     342                free (output);
    328343        }
    329344}
     
    339354 */
    340355int usb_hid_report_output_translate(usb_hid_report_t *report,
    341     uint8_t report_id, uint8_t *buffer, size_t size)
    342 {
    343         int32_t value = 0;
     356        uint8_t report_id, uint8_t *buffer, size_t size)
     357{
     358        int32_t value=0;
    344359        int offset;
    345360        int length;
    346361        int32_t tmp_value;
    347362       
    348         if (report == NULL) {
     363        if(report == NULL) {
    349364                return EINVAL;
    350365        }
    351366
    352         if (report->use_report_ids != 0) {
     367        if(report->use_report_ids != 0) {
    353368                buffer[0] = report_id;         
    354369        }
    355370
    356371        usb_hid_report_description_t *report_des;
    357         report_des = usb_hid_report_find_description(report, report_id,
    358             USB_HID_REPORT_TYPE_OUTPUT);
    359        
    360         if (report_des == NULL) {
     372        report_des = usb_hid_report_find_description (report, report_id,
     373                USB_HID_REPORT_TYPE_OUTPUT);
     374       
     375        if(report_des == NULL){
    361376                return EINVAL;
    362377        }
     
    369384
    370385                value = usb_hid_translate_data_reverse(report_item,
    371                     report_item->value);
     386                        report_item->value);
    372387
    373388                offset = report_des->bit_length - report_item->offset - 1;
     
    376391                usb_log_debug("\ttranslated value: %x\n", value);
    377392
    378                 if ((offset / 8) == ((offset + length - 1) / 8)) {
    379                         if (((size_t) (offset / 8) >= size) ||
    380                             ((size_t) (offset + length - 1) / 8) >= size) {
     393                if((offset/8) == ((offset+length-1)/8)) {
     394                        // je to v jednom bytu
     395                        if(((size_t)(offset/8) >= size) ||
     396                                ((size_t)(offset+length-1)/8) >= size) {
    381397                                break; // TODO ErrorCode
    382398                        }
    383                         size_t shift = 8 - offset % 8 - length;
     399                        size_t shift = 8 - offset%8 - length;
    384400                        value = value << shift;                                                 
    385                         value = value & (((1 << length) - 1) << shift);
     401                        value = value & (((1 << length)-1) << shift);
    386402                               
    387403                        uint8_t mask = 0;
    388404                        mask = 0xff - (((1 << length) - 1) << shift);
    389                         buffer[offset / 8] = (buffer[offset / 8] & mask) |
    390                             value;
    391                 } else {
     405                        buffer[offset/8] = (buffer[offset/8] & mask) | value;
     406                }
     407                else {
    392408                        int i = 0;
    393409                        uint8_t mask = 0;
    394                         for (i = (offset / 8);
    395                             i <= ((offset + length - 1) / 8); i++) {
    396                                 if (i == (offset / 8)) {
     410                        for(i = (offset/8); i <= ((offset+length-1)/8); i++) {
     411                                if(i == (offset/8)) {
    397412                                        tmp_value = value;
    398413                                        tmp_value = tmp_value &
    399                                             ((1 << (8 - (offset % 8))) - 1);
    400 
    401                                         tmp_value = tmp_value << (offset % 8);
    402        
    403                                         mask = ~(((1 << (8 - (offset % 8))) - 1)
    404                                             << (offset % 8));
     414                                                ((1 << (8-(offset%8)))-1);
     415
     416                                        tmp_value = tmp_value << (offset%8);
     417       
     418                                        mask = ~(((1 << (8-(offset%8)))-1) <<
     419                                                        (offset%8));
    405420
    406421                                        buffer[i] = (buffer[i] & mask) |
    407                                             tmp_value;
    408                                 } else if (i == ((offset + length - 1) / 8)) {
     422                                                tmp_value;
     423                                }
     424                                else if (i == ((offset + length -1)/8)) {
    409425                                       
    410426                                        value = value >> (length -
    411                                             ((offset + length) % 8));
     427                                                ((offset + length) % 8));
    412428
    413429                                        value = value & ((1 << (length -
    414                                             ((offset + length) % 8))) - 1);
     430                                                ((offset + length) % 8))) - 1);
    415431                               
    416432                                        mask = (1 << (length -
    417                                             ((offset + length) % 8))) - 1;
     433                                                ((offset + length) % 8))) - 1;
    418434
    419435                                        buffer[i] = (buffer[i] & mask) | value;
    420                                 } else {
    421                                         buffer[i] = value & (0xff << i);
     436                                }
     437                                else {
     438                                        buffer[i] = value & (0xFF << i);
    422439                                }
    423440                        }
    424441                }
    425442
    426                 /* reset value */
     443                // reset value
    427444                report_item->value = 0;
    428445        }
     
    439456 */
    440457uint32_t usb_hid_translate_data_reverse(usb_hid_report_field_t *item,
    441     int value)
    442 {
    443         int ret = 0;
     458        int value)
     459{
     460        int ret=0;
    444461        int resolution;
    445462
    446         if (USB_HID_ITEM_FLAG_CONSTANT(item->item_flags)) {
     463        if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags)) {
    447464                ret = item->logical_minimum;
    448465        }
    449466
    450         if ((item->physical_minimum == 0) && (item->physical_maximum == 0)) {
     467        if((item->physical_minimum == 0) && (item->physical_maximum == 0)){
    451468                item->physical_minimum = item->logical_minimum;
    452469                item->physical_maximum = item->logical_maximum;                 
    453470        }
    454471       
    455         /* variable item */
    456         if (item->physical_maximum == item->physical_minimum) {
     472        // variable item
     473        if(item->physical_maximum == item->physical_minimum){
    457474            resolution = 1;
    458         } else {
     475        }
     476        else {
    459477            resolution = (item->logical_maximum - item->logical_minimum) /
    460478                ((item->physical_maximum - item->physical_minimum) *
    461                 (usb_pow(10, (item->unit_exponent))));
     479                (usb_pow(10,(item->unit_exponent))));
    462480        }
    463481
    464482        ret = ((value - item->physical_minimum) * resolution) +
    465             item->logical_minimum;
    466 
    467         usb_log_debug("\tvalue(%x), resolution(%x), phymin(%x) logmin(%x), "
    468             "ret(%x)\n", value, resolution, item->physical_minimum,
    469             item->logical_minimum, ret);
    470        
    471         if ((item->logical_minimum < 0) || (item->logical_maximum < 0)) {
     483                item->logical_minimum;
     484
     485        usb_log_debug("\tvalue(%x), resolution(%x), phymin(%x) logmin(%x), \
     486                ret(%x)\n", value, resolution, item->physical_minimum,
     487                item->logical_minimum, ret);
     488       
     489        if((item->logical_minimum < 0) || (item->logical_maximum < 0)){
    472490                return USB_HID_INT32_TO_UINT32(ret, item->size);
    473491        }
    474 
    475         return (int32_t) 0 + ret;
     492        return (int32_t)0 + ret;
    476493}
    477494
     
    484501 */
    485502usb_hid_report_item_t *usb_hid_report_item_clone(
    486     const usb_hid_report_item_t *item)
     503        const usb_hid_report_item_t *item)
    487504{
    488505        usb_hid_report_item_t *new_report_item;
    489506       
    490         if (!(new_report_item = malloc(sizeof(usb_hid_report_item_t)))) {
     507        if(!(new_report_item = malloc(sizeof(usb_hid_report_item_t)))) {
    491508                return NULL;
    492509        }                                       
     
    512529 */
    513530usb_hid_report_field_t *usb_hid_report_get_sibling(usb_hid_report_t *report,
    514     usb_hid_report_field_t *field, usb_hid_report_path_t *path, int flags,
    515     usb_hid_report_type_t type)
     531        usb_hid_report_field_t *field, usb_hid_report_path_t *path, int flags,
     532        usb_hid_report_type_t type)
    516533{
    517534        usb_hid_report_description_t *report_des =
    518             usb_hid_report_find_description(report, path->report_id, type);
     535                usb_hid_report_find_description(report, path->report_id, type);
    519536
    520537        link_t *field_it;
    521538       
    522         if (report_des == NULL) {
     539        if(report_des == NULL){
    523540                return NULL;
    524541        }
    525542
    526         if (field == NULL) {
     543        if(field == NULL){
    527544                field_it = report_des->report_items.head.next;
    528         } else {
     545        }
     546        else {
    529547                field_it = field->ritems_link.next;
    530548        }
    531549
    532         while (field_it != &report_des->report_items.head) {
     550        while(field_it != &report_des->report_items.head) {
    533551                field = list_get_instance(field_it, usb_hid_report_field_t,
    534                     ritems_link);
    535 
    536                 if (USB_HID_ITEM_FLAG_CONSTANT(field->item_flags) == 0) {
    537                         usb_hid_report_path_append_item(field->collection_path,
    538                             field->usage_page, field->usage);
    539 
    540                         if (usb_hid_report_compare_usage_path(
    541                             field->collection_path, path, flags) == EOK) {
     552                        ritems_link);
     553
     554                if(USB_HID_ITEM_FLAG_CONSTANT(field->item_flags) == 0) {
     555                        usb_hid_report_path_append_item (
     556                                field->collection_path, field->usage_page,
     557                                field->usage);
     558
     559                        if(usb_hid_report_compare_usage_path(
     560                                field->collection_path, path, flags) == EOK){
     561
    542562                                usb_hid_report_remove_last_item(
    543                                     field->collection_path);
     563                                        field->collection_path);
     564
    544565                                return field;
    545566                        }
    546                         usb_hid_report_remove_last_item(field->collection_path);
     567                        usb_hid_report_remove_last_item (
     568                                field->collection_path);
    547569                }
    548570                field_it = field_it->next;
     
    564586 * @retval report_id otherwise
    565587 */
    566 uint8_t usb_hid_get_next_report_id(usb_hid_report_t *report, uint8_t report_id,
    567     usb_hid_report_type_t type)
    568 {
    569         if (report == NULL) {
     588uint8_t usb_hid_get_next_report_id(usb_hid_report_t *report,
     589        uint8_t report_id, usb_hid_report_type_t type)
     590{
     591        if(report == NULL){
    570592                return 0;
    571593        }
     
    574596        link_t *report_it;
    575597       
    576         if (report_id > 0) {
     598        if(report_id > 0) {
    577599                report_des = usb_hid_report_find_description(report, report_id,
    578                     type);
    579                 if (report_des == NULL) {
     600                        type);
     601                if(report_des == NULL) {
    580602                        return 0;
    581                 } else {
     603                }
     604                else {
    582605                        report_it = report_des->reports_link.next;
    583606                }       
    584         } else {
     607        }
     608        else {
    585609                report_it = report->reports.head.next;
    586610        }
    587611
    588         while (report_it != &report->reports.head) {
     612        while(report_it != &report->reports.head) {
    589613                report_des = list_get_instance(report_it,
    590                     usb_hid_report_description_t, reports_link);
    591 
    592                 if (report_des->type == type) {
     614                        usb_hid_report_description_t, reports_link);
     615
     616                if(report_des->type == type){
    593617                        return report_des->report_id;
    594618                }
     
    611635void usb_hid_report_reset_local_items(usb_hid_report_item_t *report_item)
    612636{
    613         if (report_item == NULL) {
     637        if(report_item == NULL) {
    614638                return;
    615639        }
     
    627651        report_item->string_minimum = 0;
    628652        report_item->string_maximum = 0;
    629 }
    630 
     653
     654        return;
     655}
    631656/**
    632657 * @}
Note: See TracChangeset for help on using the changeset viewer.