Ignore:
File:
1 edited

Legend:

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

    rd420b22 rc657bd7  
    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;
     210        size_t nread;
     211        int rc;
    214212       
    215213        while (true) {
    216                 if (!parent_exch)
    217                         parent_exch = async_exchange_begin(kbd->parent_sess);
    218                
    219214                const unsigned int *map = scanmap_simple;
    220215                size_t map_size = sizeof(scanmap_simple) / sizeof(unsigned int);
    221216               
    222217                uint8_t code = 0;
    223                 ssize_t size = chardev_read(parent_exch, &code, 1);
    224                 if (size != 1)
     218                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     219                if (rc != EOK)
    225220                        return EIO;
    226221               
     
    234229                        map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
    235230                       
    236                         size = chardev_read(parent_exch, &code, 1);
    237                         if (size != 1)
     231                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     232                        if (rc != EOK)
    238233                                return EIO;
    239234                       
     
    241236                       
    242237                        if (code == 0x2a) {  /* Print Screen */
    243                                 size = chardev_read(parent_exch, &code, 1);
    244                                 if (size != 1)
     238                                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     239                                if (rc != EOK)
    245240                                        return EIO;
    246241                               
     
    248243                                        continue;
    249244                               
    250                                 size = chardev_read(parent_exch, &code, 1);
    251                                 if (size != 1)
     245                                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     246                                if (rc != EOK)
    252247                                        return EIO;
    253248                               
     
    259254                       
    260255                        if (code == 0x46) {  /* Break */
    261                                 size = chardev_read(parent_exch, &code, 1);
    262                                 if (size != 1)
     256                                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     257                                if (rc != EOK)
    263258                                        return EIO;
    264259                               
     
    266261                                        continue;
    267262                               
    268                                 size = chardev_read(parent_exch, &code, 1);
    269                                 if (size != 1)
     263                                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     264                                if (rc != EOK)
    270265                                        return EIO;
    271266                               
     
    279274                /* Extended special set */
    280275                if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
    281                         size = chardev_read(parent_exch, &code, 1);
    282                         if (size != 1)
     276                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     277                        if (rc != EOK)
    283278                                return EIO;
    284279                       
     
    286281                                continue;
    287282                       
    288                         size = chardev_read(parent_exch, &code, 1);
    289                         if (size != 1)
     283                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     284                        if (rc != EOK)
    290285                                return EIO;
    291286                       
     
    293288                                continue;
    294289                       
    295                         size = chardev_read(parent_exch, &code, 1);
    296                         if (size != 1)
     290                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     291                        if (rc != EOK)
    297292                                return EIO;
    298293                       
     
    300295                                continue;
    301296                       
    302                         size = chardev_read(parent_exch, &code, 1);
    303                         if (size != 1)
     297                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     298                        if (rc != EOK)
    304299                                return EIO;
    305300                       
     
    307302                                continue;
    308303                       
    309                         size = chardev_read(parent_exch, &code, 1);
    310                         if (size != 1)
     304                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     305                        if (rc != EOK)
    311306                                return EIO;
    312307                       
     
    357352                uint8_t cmds[] = { KBD_CMD_SET_LEDS, status };
    358353               
    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);
    362                
    363                 async_answer_0(icallid, size < 0 ? size : EOK);
     354                size_t nwr;
     355                int rc = chardev_write(kbd->chardev, &cmds[0], 1, &nwr);
     356                if (rc != EOK) {
     357                        async_answer_0(icallid, rc);
     358                        break;
     359                }
     360
     361                rc = chardev_write(kbd->chardev, &cmds[1], 1, &nwr);
     362                async_answer_0(icallid, rc);
    364363                break;
    365364        }
     
    413412int xt_kbd_init(xt_kbd_t *kbd, ddf_dev_t *dev)
    414413{
    415         assert(kbd);
    416         assert(dev);
     414        async_sess_t *parent_sess;
     415        bool bound = false;
     416        int rc;
    417417       
    418418        kbd->client_sess = NULL;
    419         kbd->parent_sess = ddf_dev_parent_sess_get(dev);
    420        
    421         if (!kbd->parent_sess) {
     419       
     420        parent_sess = ddf_dev_parent_sess_get(dev);
     421        if (parent_sess == NULL) {
    422422                ddf_msg(LVL_ERROR, "Failed creating parent session.");
    423                 return EIO;
     423                rc = EIO;
     424                goto error;
     425        }
     426       
     427        rc = chardev_open(parent_sess, &kbd->chardev);
     428        if (rc != EOK) {
     429                ddf_msg(LVL_ERROR, "Failed opening character device.");
     430                goto error;
    424431        }
    425432       
    426433        kbd->kbd_fun = ddf_fun_create(dev, fun_exposed, "kbd");
    427         if (!kbd->kbd_fun) {
     434        if (kbd->kbd_fun == NULL) {
    428435                ddf_msg(LVL_ERROR, "Failed creating function 'kbd'.");
    429                 return ENOMEM;
     436                rc = ENOMEM;
     437                goto error;
    430438        }
    431439       
    432440        ddf_fun_set_ops(kbd->kbd_fun, &kbd_ops);
    433441       
    434         int ret = ddf_fun_bind(kbd->kbd_fun);
    435         if (ret != EOK) {
     442        rc = ddf_fun_bind(kbd->kbd_fun);
     443        if (rc != EOK) {
    436444                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) {
     445                goto error;
     446        }
     447       
     448        rc = ddf_fun_add_to_category(kbd->kbd_fun, "keyboard");
     449        if (rc != EOK) {
    443450                ddf_msg(LVL_ERROR, "Failed adding function 'kbd' to category "
    444451                    "'keyboard'.");
    445                 ddf_fun_unbind(kbd->kbd_fun);
    446                 ddf_fun_destroy(kbd->kbd_fun);
    447                 return ENOMEM;
     452                goto error;
    448453        }
    449454       
    450455        kbd->polling_fibril = fibril_create(polling, kbd);
    451         if (!kbd->polling_fibril) {
     456        if (kbd->polling_fibril == 0) {
    452457                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;
     458                rc = ENOMEM;
     459                goto error;
    456460        }
    457461       
    458462        fibril_add_ready(kbd->polling_fibril);
    459463        return EOK;
     464error:
     465        if (bound)
     466                ddf_fun_unbind(kbd->kbd_fun);
     467        if (kbd->kbd_fun != NULL)
     468                ddf_fun_destroy(kbd->kbd_fun);
     469        chardev_close(kbd->chardev);
     470        return rc;
    460471}
Note: See TracChangeset for help on using the changeset viewer.