Ignore:
Timestamp:
2014-08-29T20:32:20Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
af0a2c7
Parents:
312e5ff
Message:

Factor out chardev IPC from pl050, i8042, xtkbd and ps2mouse.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/include/io/chardev_srv.h

    r312e5ff r75751db6  
    11/*
    2  * Copyright (c) 2011 Jan Vesely
     2 * Copyright (c) 2014 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 #include <errno.h>
    30 #include <mem.h>
    31 #include <ipc/dev_iface.h>
    32 #include <ddf/log.h>
     29/** @addtogroup libc
     30 * @{
     31 */
     32/** @file
     33 */
    3334
    34 #include "chardev.h"
     35#ifndef LIBC_IO_CHARDEV_SRV_H_
     36#define LIBC_IO_CHARDEV_SRV_H_
    3537
    36 // TODO make this shared
    37 enum {
    38         IPC_CHAR_READ = DEV_FIRST_CUSTOM_METHOD,
    39         IPC_CHAR_WRITE,
     38#include <adt/list.h>
     39#include <async.h>
     40#include <fibril_synch.h>
     41#include <stdbool.h>
     42#include <sys/types.h>
     43
     44typedef struct chardev_ops chardev_ops_t;
     45
     46/** Service setup (per sevice) */
     47typedef struct {
     48        chardev_ops_t *ops;
     49        void *sarg;
     50} chardev_srvs_t;
     51
     52/** Server structure (per client session) */
     53typedef struct {
     54        chardev_srvs_t *srvs;
     55        void *carg;
     56} chardev_srv_t;
     57
     58struct chardev_ops {
     59        int (*open)(chardev_srvs_t *, chardev_srv_t *);
     60        int (*close)(chardev_srv_t *);
     61        int (*read)(chardev_srv_t *, void *, size_t);
     62        int (*write)(chardev_srv_t *, const void *, size_t);
    4063};
    4164
    42 ssize_t chardev_read(async_exch_t *exch, void *data, size_t size)
    43 {
    44         if (!exch)
    45                 return EBADMEM;
    46         if (size > 4 * sizeof(sysarg_t))
    47                 return ELIMIT;
     65extern void chardev_srvs_init(chardev_srvs_t *);
    4866
    49         sysarg_t message[4] = { 0 };
    50         const ssize_t ret = async_req_1_4(exch, IPC_CHAR_READ, size,
    51             &message[0], &message[1], &message[2], &message[3]);
    52         if (ret > 0 && (size_t)ret <= size)
    53                 memcpy(data, message, size);
    54         return ret;
    55 }
     67extern int chardev_conn(ipc_callid_t, ipc_call_t *, chardev_srvs_t *);
    5668
    57 ssize_t chardev_write(async_exch_t *exch, const void *data, size_t size)
    58 {
    59         if (!exch)
    60                 return EBADMEM;
    61         if (size > 3 * sizeof(sysarg_t))
    62                 return ELIMIT;
     69#endif
    6370
    64         sysarg_t message[3] = { 0 };
    65         memcpy(message, data, size);
    66         return async_req_4_0(exch, IPC_CHAR_WRITE, size,
    67             message[0], message[1], message[2]);
    68 }
     71/** @}
     72 */
Note: See TracChangeset for help on using the changeset viewer.