Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/input/port/chardev.c

    r7a6065c r7aa94304  
    3535 */
    3636
     37#include <ipc/char.h>
    3738#include <async.h>
     39#include <loc.h>
    3840#include <errno.h>
    39 #include <fibril.h>
    40 #include <io/chardev.h>
    41 #include <loc.h>
    4241#include <stdio.h>
    4342#include "../input.h"
     
    4544#include "../kbd.h"
    4645
    47 static int kbd_port_fibril(void *);
     46static void kbd_port_events(ipc_callid_t iid, ipc_call_t *icall, void *arg);
    4847
    4948static int chardev_port_init(kbd_dev_t *);
    50 static void chardev_port_write(uint8_t);
     49static void chardev_port_write(uint8_t data);
    5150
    5251kbd_port_ops_t chardev_port = {
     
    5756static kbd_dev_t *kbd_dev;
    5857static async_sess_t *dev_sess;
    59 static chardev_t *chardev;
    6058
    6159/** List of devices to try connecting to. */
     
    7270{
    7371        service_id_t service_id;
     72        async_exch_t *exch;
    7473        unsigned int i;
    75         fid_t fid;
    7674        int rc;
    7775       
     
    9896        }
    9997       
    100         rc = chardev_open(dev_sess, &chardev);
    101         if (rc != EOK) {
    102                 printf("%s: Failed opening character device\n", NAME);
     98        exch = async_exchange_begin(dev_sess);
     99        if (exch == NULL) {
     100                printf("%s: Failed starting exchange with device\n", NAME);
    103101                async_hangup(dev_sess);
    104102                return ENOMEM;
    105103        }
    106104       
    107         fid = fibril_create(kbd_port_fibril, NULL);
    108         if (fid == 0) {
    109                 printf("%s: Failed creating fibril\n", NAME);
    110                 chardev_close(chardev);
     105        port_id_t port;
     106        rc = async_create_callback_port(exch, INTERFACE_CHAR_CB, 0, 0,
     107            kbd_port_events, NULL, &port);
     108       
     109        async_exchange_end(exch);
     110       
     111        if (rc != 0) {
     112                printf("%s: Failed to create callback from device\n", NAME);
    111113                async_hangup(dev_sess);
    112                 return ENOMEM;
     114                return -1;
    113115        }
    114 
    115         fibril_add_ready(fid);
    116116       
    117117        printf("%s: Found input device '%s'\n", NAME, in_devs[i]);
     
    121121static void chardev_port_write(uint8_t data)
    122122{
    123         int rc;
    124         size_t nwr;
     123        async_exch_t *exch = async_exchange_begin(dev_sess);
     124        if (exch == NULL) {
     125                printf("%s: Failed starting exchange with device\n", NAME);
     126                return;
     127        }
    125128
    126         rc = chardev_write(chardev, &data, sizeof(data), &nwr);
    127         if (rc != EOK || nwr != sizeof(data)) {
    128                 printf("%s: Failed writing to character device\n", NAME);
    129                 return;
     129        async_msg_1(exch, CHAR_WRITE_BYTE, data);
     130        async_exchange_end(exch);
     131}
     132
     133static void kbd_port_events(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     134{
     135        /* Ignore parameters, the connection is already opened */
     136        while (true) {
     137
     138                ipc_call_t call;
     139                ipc_callid_t callid = async_get_call(&call);
     140               
     141                if (!IPC_GET_IMETHOD(call)) {
     142                        /* TODO: Handle hangup */
     143                        return;
     144                }
     145
     146                int retval = EOK;
     147
     148                switch (IPC_GET_IMETHOD(call)) {
     149                case CHAR_NOTIF_BYTE:
     150                        kbd_push_data(kbd_dev, IPC_GET_ARG1(call));
     151                        break;
     152                default:
     153                        retval = ENOENT;
     154                }
     155                async_answer_0(callid, retval);
    130156        }
    131157}
    132158
    133 static int kbd_port_fibril(void *arg)
    134 {
    135         int rc;
    136         size_t nread;
    137         uint8_t b;
    138 
    139         while (true) {
    140                 rc = chardev_read(chardev, &b, sizeof(b), &nread);
    141                 if (rc != EOK || nread != sizeof(b)) {
    142                         printf("%s: Error reading data", NAME);
    143                         continue;
    144                 }
    145 
    146                 kbd_push_data(kbd_dev, b);
    147         }
    148 
    149         return 0;
    150 }
    151159
    152160/**
Note: See TracChangeset for help on using the changeset viewer.