Ignore:
File:
1 edited

Legend:

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

    r5d50c419 rd420b22  
    11/*
    2  * Copyright (c) 2017 Jiri Svoboda
    32 * Copyright (c) 2011 Jan Vesely
    43 * Copyright (c) 2009 Vineeth Pillai
     
    202201static int polling(void *arg)
    203202{
    204         at_kbd_t *kbd = arg;
    205         size_t nwr;
    206         int rc;
     203        const at_kbd_t *kbd = arg;
     204       
     205        assert(kbd);
     206        assert(kbd->parent_sess);
     207       
     208        async_exch_t *parent_exch = async_exchange_begin(kbd->parent_sess);
    207209       
    208210        while (true) {
     211                if (!parent_exch)
     212                        parent_exch = async_exchange_begin(kbd->parent_sess);
     213
    209214                uint8_t code = 0;
    210                 rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    211                 if (rc != EOK)
     215                ssize_t size = chardev_read(parent_exch, &code, 1);
     216                if (size != 1)
    212217                        return EIO;
    213218               
     
    219224                        map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
    220225                       
    221                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    222                         if (rc != EOK)
     226                        size = chardev_read(parent_exch, &code, 1);
     227                        if (size != 1)
    223228                                return EIO;
    224229                } else if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
    225                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    226                         if (rc != EOK)
     230                        size = chardev_read(parent_exch, &code, 1);
     231                        if (size != 1)
    227232                                return EIO;
    228233                        if (code != 0x14)
    229234                                continue;
    230235
    231                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    232                         if (rc != EOK)
     236                        size = chardev_read(parent_exch, &code, 1);
     237                        if (size != 1)
    233238                                return EIO;
    234239                        if (code != 0x77)
    235240                                continue;
    236241
    237                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    238                         if (rc != EOK)
     242                        size = chardev_read(parent_exch, &code, 1);
     243                        if (size != 1)
    239244                                return EIO;
    240245                        if (code != 0xe1)
    241246                                continue;
    242247
    243                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    244                         if (rc != EOK)
     248                        size = chardev_read(parent_exch, &code, 1);
     249                        if (size != 1)
    245250                                return EIO;
    246251                        if (code != 0xf0)
    247252                                continue;
    248253
    249                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    250                         if (rc != EOK)
     254                        size = chardev_read(parent_exch, &code, 1);
     255                        if (size != 1)
    251256                                return EIO;
    252257                        if (code != 0x14)
    253258                                continue;
    254259
    255                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    256                         if (rc != EOK)
     260                        size = chardev_read(parent_exch, &code, 1);
     261                        if (size != 1)
    257262                                return EIO;
    258263                        if (code != 0xf0)
    259264                                continue;
    260265
    261                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    262                         if (rc != EOK)
     266                        size = chardev_read(parent_exch, &code, 1);
     267                        if (size != 1)
    263268                                return EIO;
    264269                        if (code == 0x77)
     
    274279                if (code == KBD_SCANCODE_KEY_RELEASE) {
    275280                        type = KEY_RELEASE;
    276                         rc = chardev_read(kbd->chardev, &code, 1, &nwr);
    277                         if (rc != EOK)
     281                        size = chardev_read(parent_exch, &code, 1);
     282                        if (size != 1)
    278283                                return EIO;
    279284                } else {
     
    357362int at_kbd_init(at_kbd_t *kbd, ddf_dev_t *dev)
    358363{
    359         async_sess_t *parent_sess;
    360         int rc;
    361        
    362364        assert(kbd);
    363365        assert(dev);
    364366       
    365367        kbd->client_sess = NULL;
    366         parent_sess = ddf_dev_parent_sess_get(dev);
    367         if (parent_sess == NULL) {
     368        kbd->parent_sess = ddf_dev_parent_sess_get(dev);
     369       
     370        if (!kbd->parent_sess) {
    368371                ddf_msg(LVL_ERROR, "Failed creating parent session.");
    369                 rc = EIO;
    370                 goto error;
    371         }
    372        
    373         rc = chardev_open(parent_sess, &kbd->chardev);
    374         if (rc != EOK) {
    375                 ddf_msg(LVL_ERROR, "Failed opening character device.");
    376372                return EIO;
    377373        }
     
    411407        fibril_add_ready(kbd->polling_fibril);
    412408        return EOK;
    413 error:
    414         chardev_close(kbd->chardev);
    415         kbd->chardev = NULL;
    416         return rc;
    417409}
Note: See TracChangeset for help on using the changeset viewer.