Ignore:
File:
1 edited

Legend:

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

    rc657bd7 rd420b22  
    11/*
    22 * Copyright (c) 2011 Jan Vesely
    3  * Copyright (c) 2017 Jiri Svoboda
    43 * All rights reserved.
    54 *
     
    207206static int polling(void *arg)
    208207{
    209         xt_kbd_t *kbd = arg;
    210         size_t nread;
    211         int rc;
     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);
    212214       
    213215        while (true) {
     216                if (!parent_exch)
     217                        parent_exch = async_exchange_begin(kbd->parent_sess);
     218               
    214219                const unsigned int *map = scanmap_simple;
    215220                size_t map_size = sizeof(scanmap_simple) / sizeof(unsigned int);
    216221               
    217222                uint8_t code = 0;
    218                 rc = chardev_read(kbd->chardev, &code, 1, &nread);
    219                 if (rc != EOK)
     223                ssize_t size = chardev_read(parent_exch, &code, 1);
     224                if (size != 1)
    220225                        return EIO;
    221226               
     
    229234                        map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
    230235                       
    231                         rc = chardev_read(kbd->chardev, &code, 1, &nread);
    232                         if (rc != EOK)
     236                        size = chardev_read(parent_exch, &code, 1);
     237                        if (size != 1)
    233238                                return EIO;
    234239                       
     
    236241                       
    237242                        if (code == 0x2a) {  /* Print Screen */
    238                                 rc = chardev_read(kbd->chardev, &code, 1, &nread);
    239                                 if (rc != EOK)
     243                                size = chardev_read(parent_exch, &code, 1);
     244                                if (size != 1)
    240245                                        return EIO;
    241246                               
     
    243248                                        continue;
    244249                               
    245                                 rc = chardev_read(kbd->chardev, &code, 1, &nread);
    246                                 if (rc != EOK)
     250                                size = chardev_read(parent_exch, &code, 1);
     251                                if (size != 1)
    247252                                        return EIO;
    248253                               
     
    254259                       
    255260                        if (code == 0x46) {  /* Break */
    256                                 rc = chardev_read(kbd->chardev, &code, 1, &nread);
    257                                 if (rc != EOK)
     261                                size = chardev_read(parent_exch, &code, 1);
     262                                if (size != 1)
    258263                                        return EIO;
    259264                               
     
    261266                                        continue;
    262267                               
    263                                 rc = chardev_read(kbd->chardev, &code, 1, &nread);
    264                                 if (rc != EOK)
     268                                size = chardev_read(parent_exch, &code, 1);
     269                                if (size != 1)
    265270                                        return EIO;
    266271                               
     
    274279                /* Extended special set */
    275280                if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
    276                         rc = chardev_read(kbd->chardev, &code, 1, &nread);
    277                         if (rc != EOK)
     281                        size = chardev_read(parent_exch, &code, 1);
     282                        if (size != 1)
    278283                                return EIO;
    279284                       
     
    281286                                continue;
    282287                       
    283                         rc = chardev_read(kbd->chardev, &code, 1, &nread);
    284                         if (rc != EOK)
     288                        size = chardev_read(parent_exch, &code, 1);
     289                        if (size != 1)
    285290                                return EIO;
    286291                       
     
    288293                                continue;
    289294                       
    290                         rc = chardev_read(kbd->chardev, &code, 1, &nread);
    291                         if (rc != EOK)
     295                        size = chardev_read(parent_exch, &code, 1);
     296                        if (size != 1)
    292297                                return EIO;
    293298                       
     
    295300                                continue;
    296301                       
    297                         rc = chardev_read(kbd->chardev, &code, 1, &nread);
    298                         if (rc != EOK)
     302                        size = chardev_read(parent_exch, &code, 1);
     303                        if (size != 1)
    299304                                return EIO;
    300305                       
     
    302307                                continue;
    303308                       
    304                         rc = chardev_read(kbd->chardev, &code, 1, &nread);
    305                         if (rc != EOK)
     309                        size = chardev_read(parent_exch, &code, 1);
     310                        if (size != 1)
    306311                                return EIO;
    307312                       
     
    352357                uint8_t cmds[] = { KBD_CMD_SET_LEDS, status };
    353358               
    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);
     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);
    363364                break;
    364365        }
     
    412413int xt_kbd_init(xt_kbd_t *kbd, ddf_dev_t *dev)
    413414{
    414         async_sess_t *parent_sess;
    415         bool bound = false;
    416         int rc;
     415        assert(kbd);
     416        assert(dev);
    417417       
    418418        kbd->client_sess = NULL;
    419        
    420         parent_sess = ddf_dev_parent_sess_get(dev);
    421         if (parent_sess == NULL) {
     419        kbd->parent_sess = ddf_dev_parent_sess_get(dev);
     420       
     421        if (!kbd->parent_sess) {
    422422                ddf_msg(LVL_ERROR, "Failed creating parent session.");
    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;
     423                return EIO;
    431424        }
    432425       
    433426        kbd->kbd_fun = ddf_fun_create(dev, fun_exposed, "kbd");
    434         if (kbd->kbd_fun == NULL) {
     427        if (!kbd->kbd_fun) {
    435428                ddf_msg(LVL_ERROR, "Failed creating function 'kbd'.");
    436                 rc = ENOMEM;
    437                 goto error;
     429                return ENOMEM;
    438430        }
    439431       
    440432        ddf_fun_set_ops(kbd->kbd_fun, &kbd_ops);
    441433       
    442         rc = ddf_fun_bind(kbd->kbd_fun);
    443         if (rc != EOK) {
     434        int ret = ddf_fun_bind(kbd->kbd_fun);
     435        if (ret != EOK) {
    444436                ddf_msg(LVL_ERROR, "Failed binding function 'kbd'.");
    445                 goto error;
    446         }
    447        
    448         rc = ddf_fun_add_to_category(kbd->kbd_fun, "keyboard");
    449         if (rc != EOK) {
     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) {
    450443                ddf_msg(LVL_ERROR, "Failed adding function 'kbd' to category "
    451444                    "'keyboard'.");
    452                 goto error;
     445                ddf_fun_unbind(kbd->kbd_fun);
     446                ddf_fun_destroy(kbd->kbd_fun);
     447                return ENOMEM;
    453448        }
    454449       
    455450        kbd->polling_fibril = fibril_create(polling, kbd);
    456         if (kbd->polling_fibril == 0) {
     451        if (!kbd->polling_fibril) {
    457452                ddf_msg(LVL_ERROR, "Failed creating polling fibril.");
    458                 rc = ENOMEM;
    459                 goto error;
     453                ddf_fun_unbind(kbd->kbd_fun);
     454                ddf_fun_destroy(kbd->kbd_fun);
     455                return ENOMEM;
    460456        }
    461457       
    462458        fibril_add_ready(kbd->polling_fibril);
    463459        return EOK;
    464 error:
    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;
    471460}
Note: See TracChangeset for help on using the changeset viewer.