Changeset 5c65e61 in mainline for uspace/lib/drv/generic/remote_char_dev.c
- Timestamp:
- 2013-12-31T20:55:35Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8a84484
- Parents:
- 67472b9b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_char_dev.c
r67472b9b r5c65e61 36 36 #include <errno.h> 37 37 #include <macros.h> 38 #include <device/char_dev.h>39 38 40 39 #include "ops/char_dev.h" 40 #include "char_dev_iface.h" 41 41 #include "ddf/driver.h" 42 42 43 43 #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 */ 60 static 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 */ 108 ssize_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 */ 124 ssize_t char_dev_write(async_sess_t *sess, void *buf, size_t size) 125 { 126 return char_dev_rw(sess, buf, size, false); 127 } 44 128 45 129 static void remote_char_read(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
Note:
See TracChangeset
for help on using the changeset viewer.