Ignore:
Timestamp:
2014-01-17T17:26:48Z (10 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5828554, cf982ff
Parents:
61b5b73d (diff), 66be0288 (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 libdrv cleanup.

  • move 'client side' device iface to libdrv (from libc)
  • hide remote_* libdrv headers
  • add a bunch of const qualifiers and change static data to const
  • cleanup: index initialized arrays, array size macro, removes duplicit enums, …

TODO:

move hw_res, pio_window and co to libdrv. (too entangled with libc to move right now)
move clock_dev iface to libdrv. (also tied to libc, we need a time provider solution)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/drv/generic/remote_char_dev.c

    r61b5b73d r476f62c  
    3535#include <async.h>
    3636#include <errno.h>
     37#include <macros.h>
    3738
    3839#include "ops/char_dev.h"
     40#include "char_dev_iface.h"
    3941#include "ddf/driver.h"
    4042
    4143#define MAX_CHAR_RW_COUNT 256
     44
     45/** Read to or write from device.
     46 *
     47 * Helper function to read to or write from a device
     48 * using its character interface.
     49 *
     50 * @param sess Session to the device.
     51 * @param buf  Buffer for the data read from or written to the device.
     52 * @param size Maximum size of data (in bytes) to be read or written.
     53 * @param read Read from the device if true, write to it otherwise.
     54 *
     55 * @return Non-negative number of bytes actually read from or
     56 *         written to the device on success, negative error number
     57 *         otherwise.
     58 *
     59 */
     60static ssize_t char_dev_rw(async_sess_t *sess, void *buf, size_t size, bool read)
     61{
     62        ipc_call_t answer;
     63        aid_t req;
     64        int ret;
     65       
     66        async_exch_t *exch = async_exchange_begin(sess);
     67       
     68        if (read) {
     69                req = async_send_1(exch, DEV_IFACE_ID(CHAR_DEV_IFACE),
     70                    CHAR_DEV_READ, &answer);
     71                ret = async_data_read_start(exch, buf, size);
     72        } else {
     73                req = async_send_1(exch, DEV_IFACE_ID(CHAR_DEV_IFACE),
     74                    CHAR_DEV_WRITE, &answer);
     75                ret = async_data_write_start(exch, buf, size);
     76        }
     77       
     78        async_exchange_end(exch);
     79       
     80        sysarg_t rc;
     81        if (ret != EOK) {
     82                async_wait_for(req, &rc);
     83                if (rc == EOK)
     84                        return (ssize_t) ret;
     85               
     86                return (ssize_t) rc;
     87        }
     88       
     89        async_wait_for(req, &rc);
     90       
     91        ret = (int) rc;
     92        if (ret != EOK)
     93                return (ssize_t) ret;
     94       
     95        return (ssize_t) IPC_GET_ARG1(answer);
     96}
     97
     98/** Read from character device.
     99 *
     100 * @param sess Session to the device.
     101 * @param buf  Output buffer for the data read from the device.
     102 * @param size Maximum size (in bytes) of the data to be read.
     103 *
     104 * @return Non-negative number of bytes actually read from the
     105 *         device on success, negative error number otherwise.
     106 *
     107 */
     108ssize_t char_dev_read(async_sess_t *sess, void *buf, size_t size)
     109{
     110        return char_dev_rw(sess, buf, size, true);
     111}
     112
     113/** Write to character device.
     114 *
     115 * @param sess Session to the device.
     116 * @param buf  Input buffer containg the data to be written to the
     117 *             device.
     118 * @param size Maximum size (in bytes) of the data to be written.
     119 *
     120 * @return Non-negative number of bytes actually written to the
     121 *         device on success, negative error number otherwise.
     122 *
     123 */
     124ssize_t char_dev_write(async_sess_t *sess, void *buf, size_t size)
     125{
     126        return char_dev_rw(sess, buf, size, false);
     127}
    42128
    43129static void remote_char_read(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
     
    45131
    46132/** Remote character interface operations. */
    47 static remote_iface_func_ptr_t remote_char_dev_iface_ops[] = {
    48         &remote_char_read,
    49         &remote_char_write
     133static const remote_iface_func_ptr_t remote_char_dev_iface_ops[] = {
     134        [CHAR_DEV_READ] = remote_char_read,
     135        [CHAR_DEV_WRITE] = remote_char_write
    50136};
    51137
     
    55141 * character interface.
    56142 */
    57 remote_iface_t remote_char_dev_iface = {
    58         .method_count = sizeof(remote_char_dev_iface_ops) /
    59             sizeof(remote_iface_func_ptr_t),
     143const remote_iface_t remote_char_dev_iface = {
     144        .method_count = ARRAY_SIZE(remote_char_dev_iface_ops),
    60145        .methods = remote_char_dev_iface_ops
    61146};
Note: See TracChangeset for help on using the changeset viewer.