Changeset 132ab5d1 in mainline for uspace/drv/hid


Ignore:
Timestamp:
2018-01-30T03:20:45Z (8 years ago)
Author:
Jenda <jenda.jzqk73@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5a6cc679
Parents:
8bfb163 (diff), 6a5d05b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge commit '6a5d05bd2551e64111bea4f9332dd7448c26ce84' into forwardport

Separate return value from error code in gen_irq_code*().

Location:
uspace/drv/hid
Files:
8 added
7 edited
4 moved

Legend:

Unmodified
Added
Removed
  • uspace/drv/hid/adb-kbd/adb-kbd.h

    r8bfb163 r132ab5d1  
    11/*
    2  * Copyright (c) 2010 Lenka Trochtova
     2 * Copyright (c) 2017 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup libc
    30  * @{
    31  */
    3229/** @file
    3330 */
    3431
    35 #ifndef LIBDRV_CHAR_DEV_IFACE_H_
    36 #define LIBDRV_CHAR_DEV_IFACE_H_
     32#ifndef ADB_KBD_H
     33#define ADB_KBD_H
    3734
    3835#include <async.h>
     36#include <ddf/driver.h>
    3937
    40 typedef enum {
    41         CHAR_DEV_READ = 0,
    42         CHAR_DEV_WRITE
    43 } char_dev_method_t;
     38/** ADB keyboard */
     39typedef struct {
     40        ddf_dev_t *dev;
     41        async_sess_t *parent_sess;
     42        ddf_fun_t *fun;
     43        async_sess_t *client_sess;
     44} adb_kbd_t;
    4445
    45 extern ssize_t char_dev_read(async_sess_t *, void *, size_t);
    46 extern ssize_t char_dev_write(async_sess_t *, void *, size_t);
     46extern int adb_kbd_add(adb_kbd_t *);
     47extern int adb_kbd_remove(adb_kbd_t *);
     48extern int adb_kbd_gone(adb_kbd_t *);
    4749
    4850#endif
  • uspace/drv/hid/adb-kbd/ctl.c

    r8bfb163 r132ab5d1  
    2727 */
    2828
    29 /** @addtogroup kbd_ctl
    30  * @ingroup input
    31  * @{
    32  */
    3329/**
    3430 * @file
    35  * @brief Apple ADB keyboard controller driver.
    36  */
    37 
     31 * @brief Apple ADB keyboard controller
     32 */
     33
     34#include <errno.h>
    3835#include <io/console.h>
    3936#include <io/keycode.h>
    40 #include "../kbd.h"
    41 #include "../kbd_ctl.h"
    42 #include "../kbd_port.h"
    43 
    44 static void apple_ctl_parse(sysarg_t);
    45 static int apple_ctl_init(kbd_dev_t *);
    46 static void apple_ctl_set_ind(kbd_dev_t *, unsigned int);
    47 
    48 kbd_ctl_ops_t apple_ctl = {
    49         .parse = apple_ctl_parse,
    50         .init = apple_ctl_init,
    51         .set_ind = apple_ctl_set_ind
    52 };
     37
     38#include "ctl.h"
    5339
    5440#define KBD_KEY_RELEASE  0x80
     
    185171};
    186172
    187 static kbd_dev_t *kbd_dev;
    188 
    189 static int apple_ctl_init(kbd_dev_t *kdev)
     173/** Translate ADB keyboard scancode into keyboard event.
     174 *
     175 * @param scancode Scancode
     176 * @param rtype Place to store type of keyboard event (press or release)
     177 * @param rkey Place to store key code
     178 *
     179 * @return EOK on success, ENOENT if no translation exists
     180 */
     181int adb_kbd_key_translate(sysarg_t scancode, kbd_event_type_t *rtype,
     182    unsigned int *rkey)
    190183{
    191         kbd_dev = kdev;
    192         return 0;
    193 }
    194 
    195 static void apple_ctl_parse(sysarg_t scancode)
    196 {
    197         kbd_event_type_t type;
    198        
     184        kbd_event_type_t etype;
     185        unsigned int key;
     186
    199187        if (scancode & KBD_KEY_RELEASE) {
    200188                scancode &= ~KBD_KEY_RELEASE;
    201                 type = KEY_RELEASE;
    202         } else
    203                 type = KEY_PRESS;
    204        
     189                etype = KEY_RELEASE;
     190        } else {
     191                etype = KEY_PRESS;
     192        }
     193
    205194        if (scancode >= sizeof(scanmap) / sizeof(unsigned int))
    206                 return;
    207        
    208         unsigned int key = scanmap[scancode];
    209         if (key != 0)
    210                 kbd_push_event(kbd_dev, type, key);
     195                return ENOENT;
     196
     197        key = scanmap[scancode];
     198        if (key == 0)
     199                return ENOENT;
     200
     201        *rtype = etype;
     202        *rkey = key;
     203        return EOK;
    211204}
    212205
    213 static void apple_ctl_set_ind(kbd_dev_t *kdev, unsigned mods)
    214 {
    215         (void) mods;
    216 }
    217 
    218206/** @}
    219207 */
  • uspace/drv/hid/adb-kbd/ctl.h

    r8bfb163 r132ab5d1  
    11/*
    2  * Copyright (c) 2008 Jiri Svoboda
     2 * Copyright (c) 2017 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup console
    30  * @{
    31  */
    3229/**
    3330 * @file
     31 * @brief Apple ADB keyboard controller
    3432 */
    3533
    36 #ifndef OUTPUT_PORT_SKI_H_
    37 #define OUTPUT_PORT_SKI_H_
     34#ifndef CTL_H
     35#define CTL_H
    3836
    39 extern int ski_init(void);
     37extern int adb_kbd_key_translate(sysarg_t, kbd_event_type_t *, unsigned int *);
    4038
    4139#endif
  • uspace/drv/hid/adb-mouse/adb-mouse.h

    r8bfb163 r132ab5d1  
    11/*
    2  * Copyright (c) 2008 Jiri Svoboda
     2 * Copyright (c) 2017 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup trace
    30  * @{
    31  */
    32 /** @file
     29/** @file ADB mouse driver
    3330 */
    3431
    35 #ifndef ERRORS_H_
    36 #define ERRORS_H_
     32#ifndef ADB_MOUSE_H
     33#define ADB_MOUSE_H
    3734
     35#include <async.h>
     36#include <ddf/driver.h>
     37#include <stdbool.h>
     38
     39/** ADB mouse */
    3840typedef struct {
    39         const char *name;  /**< Error value name (Exx) */
    40         const char *desc;  /**< Error description */
    41 } err_desc_t;
     41        ddf_dev_t *dev;
     42        async_sess_t *parent_sess;
     43        ddf_fun_t *fun;
     44        async_sess_t *client_sess;
     45        bool b1_pressed;
     46        bool b2_pressed;
     47} adb_mouse_t;
    4248
    43 extern const err_desc_t err_desc[];
     49extern int adb_mouse_add(adb_mouse_t *);
     50extern int adb_mouse_remove(adb_mouse_t *);
     51extern int adb_mouse_gone(adb_mouse_t *);
    4452
    4553#endif
  • uspace/drv/hid/atkbd/atkbd.c

    r8bfb163 r132ab5d1  
    11/*
     2 * Copyright (c) 2017 Jiri Svoboda
    23 * Copyright (c) 2011 Jan Vesely
    34 * Copyright (c) 2009 Vineeth Pillai
     
    201202static int polling(void *arg)
    202203{
    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);
     204        at_kbd_t *kbd = arg;
     205        size_t nwr;
     206        int rc;
    209207       
    210208        while (true) {
    211                 if (!parent_exch)
    212                         parent_exch = async_exchange_begin(kbd->parent_sess);
    213 
    214209                uint8_t code = 0;
    215                 ssize_t size = chardev_read(parent_exch, &code, 1);
    216                 if (size != 1)
     210                rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     211                if (rc != EOK)
    217212                        return EIO;
    218213               
     
    224219                        map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
    225220                       
    226                         size = chardev_read(parent_exch, &code, 1);
    227                         if (size != 1)
     221                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     222                        if (rc != EOK)
    228223                                return EIO;
    229224                } else if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
    230                         size = chardev_read(parent_exch, &code, 1);
    231                         if (size != 1)
     225                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     226                        if (rc != EOK)
    232227                                return EIO;
    233228                        if (code != 0x14)
    234229                                continue;
    235230
    236                         size = chardev_read(parent_exch, &code, 1);
    237                         if (size != 1)
     231                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     232                        if (rc != EOK)
    238233                                return EIO;
    239234                        if (code != 0x77)
    240235                                continue;
    241236
    242                         size = chardev_read(parent_exch, &code, 1);
    243                         if (size != 1)
     237                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     238                        if (rc != EOK)
    244239                                return EIO;
    245240                        if (code != 0xe1)
    246241                                continue;
    247242
    248                         size = chardev_read(parent_exch, &code, 1);
    249                         if (size != 1)
     243                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     244                        if (rc != EOK)
    250245                                return EIO;
    251246                        if (code != 0xf0)
    252247                                continue;
    253248
    254                         size = chardev_read(parent_exch, &code, 1);
    255                         if (size != 1)
     249                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     250                        if (rc != EOK)
    256251                                return EIO;
    257252                        if (code != 0x14)
    258253                                continue;
    259254
    260                         size = chardev_read(parent_exch, &code, 1);
    261                         if (size != 1)
     255                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     256                        if (rc != EOK)
    262257                                return EIO;
    263258                        if (code != 0xf0)
    264259                                continue;
    265260
    266                         size = chardev_read(parent_exch, &code, 1);
    267                         if (size != 1)
     261                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     262                        if (rc != EOK)
    268263                                return EIO;
    269264                        if (code == 0x77)
     
    279274                if (code == KBD_SCANCODE_KEY_RELEASE) {
    280275                        type = KEY_RELEASE;
    281                         size = chardev_read(parent_exch, &code, 1);
    282                         if (size != 1)
     276                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     277                        if (rc != EOK)
    283278                                return EIO;
    284279                } else {
     
    362357int at_kbd_init(at_kbd_t *kbd, ddf_dev_t *dev)
    363358{
     359        async_sess_t *parent_sess;
     360        int rc;
     361       
    364362        assert(kbd);
    365363        assert(dev);
    366364       
    367365        kbd->client_sess = NULL;
    368         kbd->parent_sess = ddf_dev_parent_sess_get(dev);
    369        
    370         if (!kbd->parent_sess) {
     366        parent_sess = ddf_dev_parent_sess_get(dev);
     367        if (parent_sess == NULL) {
    371368                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.");
    372376                return EIO;
    373377        }
     
    407411        fibril_add_ready(kbd->polling_fibril);
    408412        return EOK;
     413error:
     414        chardev_close(kbd->chardev);
     415        kbd->chardev = NULL;
     416        return rc;
    409417}
  • uspace/drv/hid/atkbd/atkbd.h

    r8bfb163 r132ab5d1  
    11/*
    22 * Copyright (c) 2011 Jan Vesely
     3 * Copyright (c) 2017 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    3435 */
    3536
    36 #ifndef _AT_KBD_H_
    37 #define _AT_KBD_H_
     37#ifndef AT_KBD_H_
     38#define AT_KBD_H_
    3839
    3940#include <ddf/driver.h>
    4041#include <fibril.h>
     42#include <io/chardev.h>
    4143
    4244/** PC/AT keyboard driver structure. */
    4345typedef struct {
    44         ddf_fun_t *kbd_fun;        /**< Keyboard function. */
    45         async_sess_t *parent_sess; /**< Connection to device providing data. */
    46         async_sess_t *client_sess; /**< Callback connection to client. */
    47         fid_t polling_fibril;      /**< Fibril retrieving an parsing data. */
     46        /** Keyboard function */
     47        ddf_fun_t *kbd_fun;
     48        /** Device providing keyboard connection */
     49        chardev_t *chardev;
     50        /** Callback connection to client */
     51        async_sess_t *client_sess;
     52        /** Fibril retrieving and parsing data */
     53        fid_t polling_fibril;
    4854} at_kbd_t;
    4955
  • uspace/drv/hid/ps2mouse/main.c

    r8bfb163 r132ab5d1  
    3030 */
    3131/** @file
    32  * @brief ps/2 mouse driver
     32 * @brief PS/2 mouse driver
    3333 */
    3434
  • uspace/drv/hid/ps2mouse/ps2mouse.c

    r8bfb163 r132ab5d1  
    11/*
    22 * Copyright (c) 2011 Jan Vesely
     3 * Copyright (c) 2017 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    3031 */
    3132/** @file
    32  * @brief ps2 mouse driver.
     33 * @brief PS/2 mouse driver.
    3334 */
    3435
    3536#include <stdbool.h>
    3637#include <errno.h>
     38#include <str_error.h>
    3739#include <ddf/log.h>
    3840#include <io/keycode.h>
     
    7072#define PS2_BUTTON_MASK(button) (1 << button)
    7173
    72 #define MOUSE_READ_BYTE_TEST(sess, value_) \
     74#define MOUSE_READ_BYTE_TEST(mouse, value_) \
    7375do { \
    7476        uint8_t value = (value_); \
    7577        uint8_t data = 0; \
    76         const ssize_t size = chardev_read(sess, &data, 1); \
    77         if (size != 1) { \
    78                 ddf_msg(LVL_ERROR, "Failed reading byte: %zd)", size);\
    79                 return size < 0 ? size : EIO; \
     78        size_t nread; \
     79        const int rc = chardev_read((mouse)->chardev, &data, 1, &nread); \
     80        if (rc != EOK) { \
     81                ddf_msg(LVL_ERROR, "Failed reading byte: %s", str_error_name(rc));\
     82                return rc; \
    8083        } \
    8184        if (data != value) { \
     
    8689} while (0)
    8790
    88 #define MOUSE_WRITE_BYTE(sess, value_) \
     91#define MOUSE_WRITE_BYTE(mouse, value_) \
    8992do { \
    9093        uint8_t value = (value_); \
    9194        uint8_t data = (value); \
    92         const ssize_t size = chardev_write(sess, &data, 1); \
    93         if (size < 0 ) { \
    94                 ddf_msg(LVL_ERROR, "Failed writing byte: %hhx", value); \
    95                 return size; \
     95        size_t nwr; \
     96        const int rc = chardev_write((mouse)->chardev, &data, 1, &nwr); \
     97        if (rc != EOK) { \
     98                ddf_msg(LVL_ERROR, "Failed writing byte: %s", str_error_name(rc)); \
     99                return rc; \
    96100        } \
    97101} while (0)
     
    99103static int polling_ps2(void *);
    100104static int polling_intellimouse(void *);
    101 static int probe_intellimouse(async_exch_t *, bool);
     105static int probe_intellimouse(ps2_mouse_t *, bool);
    102106static void default_connection_handler(ddf_fun_t *, ipc_callid_t, ipc_call_t *);
    103107
     
    108112
    109113/** Initialize mouse driver structure.
     114 *
     115 * Connects to parent, creates keyboard function, starts polling fibril.
     116 *
    110117 * @param kbd Mouse driver structure to initialize.
    111118 * @param dev DDF device structure.
    112119 *
    113  * Connects to parent, creates keyboard function, starts polling fibril.
     120 * @return EOK on success or non-zero error code
    114121 */
    115122int ps2_mouse_init(ps2_mouse_t *mouse, ddf_dev_t *dev)
    116123{
     124        async_sess_t *parent_sess;
     125        bool bound = false;
     126        int rc;
     127
    117128        mouse->client_sess = NULL;
    118         mouse->parent_sess = ddf_dev_parent_sess_get(dev);
    119         if (!mouse->parent_sess)
    120                 return ENOMEM;
     129
     130        parent_sess = ddf_dev_parent_sess_get(dev);
     131        if (parent_sess == NULL) {
     132                ddf_msg(LVL_ERROR, "Failed getting parent session.");
     133                rc = ENOMEM;
     134                goto error;
     135        }
     136
     137        rc = chardev_open(parent_sess, &mouse->chardev);
     138        if (rc != EOK) {
     139                ddf_msg(LVL_ERROR, "Failed opening character device.");
     140                goto error;
     141        }
    121142
    122143        mouse->mouse_fun = ddf_fun_create(dev, fun_exposed, "mouse");
    123         if (!mouse->mouse_fun) {
    124                 return ENOMEM;
    125         }
     144        if (mouse->mouse_fun == NULL) {
     145                ddf_msg(LVL_ERROR, "Error creating mouse function.");
     146                rc = ENOMEM;
     147                goto error;
     148        }
     149
    126150        ddf_fun_set_ops(mouse->mouse_fun, &mouse_ops);
    127151
    128         int ret = ddf_fun_bind(mouse->mouse_fun);
    129         if (ret != EOK) {
    130                 ddf_fun_destroy(mouse->mouse_fun);
    131                 return ENOMEM;
    132         }
    133 
    134         ret = ddf_fun_add_to_category(mouse->mouse_fun, "mouse");
    135         if (ret != EOK) {
    136                 ddf_fun_unbind(mouse->mouse_fun);
    137                 ddf_fun_destroy(mouse->mouse_fun);
    138                 return ENOMEM;
    139         }
     152        rc = ddf_fun_bind(mouse->mouse_fun);
     153        if (rc != EOK) {
     154                ddf_msg(LVL_ERROR, "Failed binding mouse function.");
     155                goto error;
     156        }
     157
     158        bound = true;
     159
     160        rc = ddf_fun_add_to_category(mouse->mouse_fun, "mouse");
     161        if (rc != EOK) {
     162                ddf_msg(LVL_ERROR, "Failed adding mouse function to category.");
     163                goto error;
     164        }
     165
    140166        /* Probe IntelliMouse extensions. */
    141167        int (*polling_f)(void*) = polling_ps2;
    142         async_exch_t *exch = async_exchange_begin(mouse->parent_sess);
    143         if (probe_intellimouse(exch, false) == EOK) {
     168        if (probe_intellimouse(mouse, false) == EOK) {
    144169                ddf_msg(LVL_NOTE, "Enabled IntelliMouse extensions");
    145170                polling_f = polling_intellimouse;
    146                 if (probe_intellimouse(exch, true) == EOK)
     171                if (probe_intellimouse(mouse, true) == EOK)
    147172                        ddf_msg(LVL_NOTE, "Enabled 4th and 5th button.");
    148173        }
     174
    149175        /* Enable mouse data reporting. */
    150176        uint8_t report = PS2_MOUSE_ENABLE_DATA_REPORT;
    151         ssize_t size = chardev_write(exch, &report, 1);
    152         if (size != 1) {
     177        size_t nwr;
     178        rc = chardev_write(mouse->chardev, &report, 1, &nwr);
     179        if (rc != EOK) {
    153180                ddf_msg(LVL_ERROR, "Failed to enable data reporting.");
    154                 async_exchange_end(exch);
    155                 ddf_fun_unbind(mouse->mouse_fun);
    156                 ddf_fun_destroy(mouse->mouse_fun);
    157                 return EIO;
    158         }
    159 
    160         size = chardev_read(exch, &report, 1);
    161         async_exchange_end(exch);
    162         if (size != 1 || report != PS2_MOUSE_ACK) {
     181                rc = EIO;
     182                goto error;
     183        }
     184
     185        size_t nread;
     186        rc = chardev_read(mouse->chardev, &report, 1, &nread);
     187        if (rc != EOK || report != PS2_MOUSE_ACK) {
    163188                ddf_msg(LVL_ERROR, "Failed to confirm data reporting: %hhx.",
    164189                    report);
     190                rc = EIO;
     191                goto error;
     192        }
     193
     194        mouse->polling_fibril = fibril_create(polling_f, mouse);
     195        if (mouse->polling_fibril == 0) {
     196                rc = ENOMEM;
     197                goto error;
     198        }
     199
     200        fibril_add_ready(mouse->polling_fibril);
     201        return EOK;
     202error:
     203        if (bound)
    165204                ddf_fun_unbind(mouse->mouse_fun);
     205        if (mouse->mouse_fun != NULL) {
    166206                ddf_fun_destroy(mouse->mouse_fun);
    167                 return EIO;
    168         }
    169 
    170         mouse->polling_fibril = fibril_create(polling_f, mouse);
    171         if (!mouse->polling_fibril) {
    172                 ddf_fun_unbind(mouse->mouse_fun);
    173                 ddf_fun_destroy(mouse->mouse_fun);
    174                 return ENOMEM;
    175         }
    176         fibril_add_ready(mouse->polling_fibril);
     207                mouse->mouse_fun = NULL;
     208        }
     209
     210        chardev_close(mouse->chardev);
     211        mouse->chardev = NULL;
     212        return rc;
     213}
     214
     215/** Read fixed-size mouse packet.
     216 *
     217 * Continue reading until entire packet is received.
     218 *
     219 * @param mouse Mouse device
     220 * @param pbuf Buffer for storing packet
     221 * @param psize Packet size
     222 *
     223 * @return EOK on success or non-zero error code
     224 */
     225static int ps2_mouse_read_packet(ps2_mouse_t *mouse, void *pbuf, size_t psize)
     226{
     227        int rc;
     228        size_t pos;
     229        size_t nread;
     230
     231        pos = 0;
     232        while (pos < psize) {
     233                rc = chardev_read(mouse->chardev, pbuf + pos, psize - pos,
     234                    &nread);
     235                if (rc != EOK) {
     236                        ddf_msg(LVL_WARN, "Error reading packet.");
     237                        return rc;
     238                }
     239
     240                pos += nread;
     241        }
     242
    177243        return EOK;
    178244}
     
    184250int polling_ps2(void *arg)
    185251{
    186         assert(arg);
    187         const ps2_mouse_t *mouse = arg;
    188 
    189         assert(mouse->parent_sess);
     252        ps2_mouse_t *mouse = (ps2_mouse_t *) arg;
     253        int rc;
     254
    190255        bool buttons[PS2_BUTTON_COUNT] = {};
    191         async_exch_t *parent_exch = async_exchange_begin(mouse->parent_sess);
    192256        while (1) {
    193 
    194257                uint8_t packet[PS2_BUFSIZE] = {};
    195                 const ssize_t size =
    196                     chardev_read(parent_exch, packet, PS2_BUFSIZE);
    197 
    198                 if (size != PS2_BUFSIZE) {
    199                         ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", size);
     258                rc = ps2_mouse_read_packet(mouse, packet, PS2_BUFSIZE);
     259                if (rc != EOK)
    200260                        continue;
    201                 }
     261
    202262                ddf_msg(LVL_DEBUG2, "Got packet: %hhx:%hhx:%hhx.",
    203263                    packet[0], packet[1], packet[2]);
     
    232292                async_exchange_end(exch);
    233293        }
    234         async_exchange_end(parent_exch);
     294
     295        return 0;
    235296}
    236297
     
    241302static int polling_intellimouse(void *arg)
    242303{
    243         assert(arg);
    244         const ps2_mouse_t *mouse = arg;
    245 
    246         assert(mouse->parent_sess);
     304        ps2_mouse_t *mouse = (ps2_mouse_t *) arg;
     305        int rc;
     306
    247307        bool buttons[INTELLIMOUSE_BUTTON_COUNT] = {};
    248         async_exch_t *parent_exch = NULL;
    249308        while (1) {
    250                 if (!parent_exch)
    251                         parent_exch = async_exchange_begin(mouse->parent_sess);
    252 
    253309                uint8_t packet[INTELLIMOUSE_BUFSIZE] = {};
    254                 const ssize_t size = chardev_read(
    255                     parent_exch, packet, INTELLIMOUSE_BUFSIZE);
    256 
    257                 if (size != INTELLIMOUSE_BUFSIZE) {
    258                         ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", size);
     310                rc = ps2_mouse_read_packet(mouse, packet, INTELLIMOUSE_BUFSIZE);
     311                if (rc != EOK)
    259312                        continue;
    260                 }
     313
    261314                ddf_msg(LVL_DEBUG2, "Got packet: %hhx:%hhx:%hhx:%hhx.",
    262315                    packet[0], packet[1], packet[2], packet[3]);
     
    310363                async_exchange_end(exch);
    311364        }
    312         async_exchange_end(parent_exch);
     365
     366        return 0;
    313367}
    314368
     
    319373 * See http://www.computer-engineering.org/ps2mouse/ for details.
    320374 */
    321 static int probe_intellimouse(async_exch_t *exch, bool buttons)
    322 {
    323         assert(exch);
    324 
    325         MOUSE_WRITE_BYTE(exch, PS2_MOUSE_SET_SAMPLE_RATE);
    326         MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK);
    327         MOUSE_WRITE_BYTE(exch, 200);
    328         MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK);
    329 
    330         MOUSE_WRITE_BYTE(exch, PS2_MOUSE_SET_SAMPLE_RATE);
    331         MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK);
    332         MOUSE_WRITE_BYTE(exch, buttons ? 200 : 100);
    333         MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK);
    334 
    335         MOUSE_WRITE_BYTE(exch, PS2_MOUSE_SET_SAMPLE_RATE);
    336         MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK);
    337         MOUSE_WRITE_BYTE(exch, 80);
    338         MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK);
    339 
    340         MOUSE_WRITE_BYTE(exch, PS2_MOUSE_GET_DEVICE_ID);
    341         MOUSE_READ_BYTE_TEST(exch, PS2_MOUSE_ACK);
    342         MOUSE_READ_BYTE_TEST(exch, buttons ? 4 : 3);
     375static int probe_intellimouse(ps2_mouse_t *mouse, bool buttons)
     376{
     377        MOUSE_WRITE_BYTE(mouse, PS2_MOUSE_SET_SAMPLE_RATE);
     378        MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK);
     379        MOUSE_WRITE_BYTE(mouse, 200);
     380        MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK);
     381
     382        MOUSE_WRITE_BYTE(mouse, PS2_MOUSE_SET_SAMPLE_RATE);
     383        MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK);
     384        MOUSE_WRITE_BYTE(mouse, buttons ? 200 : 100);
     385        MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK);
     386
     387        MOUSE_WRITE_BYTE(mouse, PS2_MOUSE_SET_SAMPLE_RATE);
     388        MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK);
     389        MOUSE_WRITE_BYTE(mouse, 80);
     390        MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK);
     391
     392        MOUSE_WRITE_BYTE(mouse, PS2_MOUSE_GET_DEVICE_ID);
     393        MOUSE_READ_BYTE_TEST(mouse, PS2_MOUSE_ACK);
     394        MOUSE_READ_BYTE_TEST(mouse, buttons ? 4 : 3);
    343395
    344396        return EOK;
  • uspace/drv/hid/ps2mouse/ps2mouse.h

    r8bfb163 r132ab5d1  
    11/*
    22 * Copyright (c) 2011 Jan Vesely
     3 * Copyright (c) 2017 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    3031 */
    3132/** @file
    32  * @brief ps/2 mouse driver.
     33 * @brief PS/2 mouse driver.
    3334 */
    3435
    35 #ifndef _PS2MOUSE_H_
    36 #define _PS2MOUSE_H_
     36#ifndef PS2MOUSE_H_
     37#define PS2MOUSE_H_
    3738
    3839#include <ddf/driver.h>
    3940#include <fibril.h>
     41#include <io/chardev.h>
    4042
    4143/** PS/2 mouse driver structure. */
    4244typedef struct {
    43         ddf_fun_t *mouse_fun;      /**< Mouse function. */
    44         async_sess_t *parent_sess; /**< Connection to device providing data. */
    45         async_sess_t *client_sess;  /**< Callback connection to client. */
    46         fid_t polling_fibril;      /**< Fibril retrieving an parsing data. */
     45        /** Mouse function. */
     46        ddf_fun_t *mouse_fun;
     47        /** Device providing mouse connection */
     48        chardev_t *chardev;
     49        /** Callback connection to client. */
     50        async_sess_t *client_sess;
     51        /** Fibril retrieving an parsing data. */
     52        fid_t polling_fibril;
    4753} ps2_mouse_t;
    4854
    49 int ps2_mouse_init(ps2_mouse_t *, ddf_dev_t *);
     55extern int ps2_mouse_init(ps2_mouse_t *, ddf_dev_t *);
    5056
    5157#endif
     58
    5259/**
    5360 * @}
  • uspace/drv/hid/xtkbd/xtkbd.c

    r8bfb163 r132ab5d1  
    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}
  • uspace/drv/hid/xtkbd/xtkbd.h

    r8bfb163 r132ab5d1  
    11/*
    22 * Copyright (c) 2011 Jan Vesely
     3 * Copyright (c) 2017 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    3435 */
    3536
    36 #ifndef _XT_KBD_H_
    37 #define _XT_KBD_H_
     37#ifndef XT_KBD_H_
     38#define XT_KBD_H_
    3839
     40#include <async.h>
    3941#include <ddf/driver.h>
    4042#include <fibril.h>
     43#include <io/chardev.h>
    4144
    42 /** PC/XT keyboard driver structure. */
     45/** PC/XT keyboard driver structure */
    4346typedef struct {
    44         ddf_fun_t *kbd_fun;        /**< Keyboard function. */
    45         async_sess_t *parent_sess; /**< Connection to device providing data. */
    46         async_sess_t *client_sess; /**< Callback connection to client. */
    47         fid_t polling_fibril;      /**< Fibril retrieving an parsing data. */
     47        /** Keyboard function */
     48        ddf_fun_t *kbd_fun;
     49        /** Device providing keyboard connection */
     50        chardev_t *chardev;
     51        /** Callback connection to client */
     52        async_sess_t *client_sess;
     53        /** Fibril retrieving an parsing data */
     54        fid_t polling_fibril;
    4855} xt_kbd_t;
    4956
Note: See TracChangeset for help on using the changeset viewer.