Changeset 15c5418 in mainline for uspace/drv/hid/xtkbd/xtkbd.c


Ignore:
Timestamp:
2017-11-18T20:06:15Z (6 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
75fcf9b
Parents:
efb9fd08
Message:

chardev_open, chardev_close.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/hid/xtkbd/xtkbd.c

    refb9fd08 r15c5418  
    11/*
    22 * Copyright (c) 2011 Jan Vesely
     3 * Copyright (c) 2017 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    206207static int polling(void *arg)
    207208{
    208         const xt_kbd_t *kbd = arg;
    209        
    210         assert(kbd);
    211         assert(kbd->parent_sess);
    212        
    213         async_exch_t *parent_exch = async_exchange_begin(kbd->parent_sess);
     209        xt_kbd_t *kbd = arg;
    214210       
    215211        while (true) {
    216                 if (!parent_exch)
    217                         parent_exch = async_exchange_begin(kbd->parent_sess);
    218                
    219212                const unsigned int *map = scanmap_simple;
    220213                size_t map_size = sizeof(scanmap_simple) / sizeof(unsigned int);
    221214               
    222215                uint8_t code = 0;
    223                 ssize_t size = chardev_read(parent_exch, &code, 1);
     216                ssize_t size = chardev_read(kbd->chardev, &code, 1);
    224217                if (size != 1)
    225218                        return EIO;
     
    234227                        map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
    235228                       
    236                         size = chardev_read(parent_exch, &code, 1);
     229                        size = chardev_read(kbd->chardev, &code, 1);
    237230                        if (size != 1)
    238231                                return EIO;
     
    241234                       
    242235                        if (code == 0x2a) {  /* Print Screen */
    243                                 size = chardev_read(parent_exch, &code, 1);
     236                                size = chardev_read(kbd->chardev, &code, 1);
    244237                                if (size != 1)
    245238                                        return EIO;
     
    248241                                        continue;
    249242                               
    250                                 size = chardev_read(parent_exch, &code, 1);
     243                                size = chardev_read(kbd->chardev, &code, 1);
    251244                                if (size != 1)
    252245                                        return EIO;
     
    259252                       
    260253                        if (code == 0x46) {  /* Break */
    261                                 size = chardev_read(parent_exch, &code, 1);
     254                                size = chardev_read(kbd->chardev, &code, 1);
    262255                                if (size != 1)
    263256                                        return EIO;
     
    266259                                        continue;
    267260                               
    268                                 size = chardev_read(parent_exch, &code, 1);
     261                                size = chardev_read(kbd->chardev, &code, 1);
    269262                                if (size != 1)
    270263                                        return EIO;
     
    279272                /* Extended special set */
    280273                if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
    281                         size = chardev_read(parent_exch, &code, 1);
     274                        size = chardev_read(kbd->chardev, &code, 1);
    282275                        if (size != 1)
    283276                                return EIO;
     
    286279                                continue;
    287280                       
    288                         size = chardev_read(parent_exch, &code, 1);
     281                        size = chardev_read(kbd->chardev, &code, 1);
    289282                        if (size != 1)
    290283                                return EIO;
     
    293286                                continue;
    294287                       
    295                         size = chardev_read(parent_exch, &code, 1);
     288                        size = chardev_read(kbd->chardev, &code, 1);
    296289                        if (size != 1)
    297290                                return EIO;
     
    300293                                continue;
    301294                       
    302                         size = chardev_read(parent_exch, &code, 1);
     295                        size = chardev_read(kbd->chardev, &code, 1);
    303296                        if (size != 1)
    304297                                return EIO;
     
    307300                                continue;
    308301                       
    309                         size = chardev_read(parent_exch, &code, 1);
     302                        size = chardev_read(kbd->chardev, &code, 1);
    310303                        if (size != 1)
    311304                                return EIO;
     
    357350                uint8_t cmds[] = { KBD_CMD_SET_LEDS, status };
    358351               
    359                 async_exch_t *exch = async_exchange_begin(kbd->parent_sess);
    360                 const ssize_t size = chardev_write(exch, cmds, sizeof(cmds));
    361                 async_exchange_end(exch);
     352                ssize_t size = chardev_write(kbd->chardev, cmds, sizeof(cmds));
    362353               
    363354                async_answer_0(icallid, size < 0 ? size : EOK);
     
    413404int xt_kbd_init(xt_kbd_t *kbd, ddf_dev_t *dev)
    414405{
    415         assert(kbd);
    416         assert(dev);
     406        async_sess_t *parent_sess;
     407        bool bound = false;
     408        int rc;
    417409       
    418410        kbd->client_sess = NULL;
    419         kbd->parent_sess = ddf_dev_parent_sess_get(dev);
    420        
    421         if (!kbd->parent_sess) {
     411       
     412        parent_sess = ddf_dev_parent_sess_get(dev);
     413        if (parent_sess == NULL) {
    422414                ddf_msg(LVL_ERROR, "Failed creating parent session.");
    423                 return EIO;
     415                rc = EIO;
     416                goto error;
     417        }
     418       
     419        rc = chardev_open(parent_sess, &kbd->chardev);
     420        if (rc != EOK) {
     421                ddf_msg(LVL_ERROR, "Failed opening character device.");
     422                goto error;
    424423        }
    425424       
    426425        kbd->kbd_fun = ddf_fun_create(dev, fun_exposed, "kbd");
    427         if (!kbd->kbd_fun) {
     426        if (kbd->kbd_fun == NULL) {
    428427                ddf_msg(LVL_ERROR, "Failed creating function 'kbd'.");
    429                 return ENOMEM;
     428                rc = ENOMEM;
     429                goto error;
    430430        }
    431431       
    432432        ddf_fun_set_ops(kbd->kbd_fun, &kbd_ops);
    433433       
    434         int ret = ddf_fun_bind(kbd->kbd_fun);
    435         if (ret != EOK) {
     434        rc = ddf_fun_bind(kbd->kbd_fun);
     435        if (rc != EOK) {
    436436                ddf_msg(LVL_ERROR, "Failed binding function 'kbd'.");
    437                 ddf_fun_destroy(kbd->kbd_fun);
    438                 return EEXIST;
    439         }
    440        
    441         ret = ddf_fun_add_to_category(kbd->kbd_fun, "keyboard");
    442         if (ret != EOK) {
     437                goto error;
     438        }
     439       
     440        rc = ddf_fun_add_to_category(kbd->kbd_fun, "keyboard");
     441        if (rc != EOK) {
    443442                ddf_msg(LVL_ERROR, "Failed adding function 'kbd' to category "
    444443                    "'keyboard'.");
    445                 ddf_fun_unbind(kbd->kbd_fun);
    446                 ddf_fun_destroy(kbd->kbd_fun);
    447                 return ENOMEM;
     444                goto error;
    448445        }
    449446       
    450447        kbd->polling_fibril = fibril_create(polling, kbd);
    451         if (!kbd->polling_fibril) {
     448        if (kbd->polling_fibril == 0) {
    452449                ddf_msg(LVL_ERROR, "Failed creating polling fibril.");
    453                 ddf_fun_unbind(kbd->kbd_fun);
    454                 ddf_fun_destroy(kbd->kbd_fun);
    455                 return ENOMEM;
     450                rc = ENOMEM;
     451                goto error;
    456452        }
    457453       
    458454        fibril_add_ready(kbd->polling_fibril);
    459455        return EOK;
     456error:
     457        if (bound)
     458                ddf_fun_unbind(kbd->kbd_fun);
     459        if (kbd->kbd_fun != NULL)
     460                ddf_fun_destroy(kbd->kbd_fun);
     461        chardev_close(kbd->chardev);
     462        return rc;
    460463}
Note: See TracChangeset for help on using the changeset viewer.