Changeset 476f62c in mainline for uspace/lib/drv/generic/remote_char_dev.c
- Timestamp:
- 2014-01-17T17:26:48Z (11 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_char_dev.c
r61b5b73d r476f62c 35 35 #include <async.h> 36 36 #include <errno.h> 37 #include <macros.h> 37 38 38 39 #include "ops/char_dev.h" 40 #include "char_dev_iface.h" 39 41 #include "ddf/driver.h" 40 42 41 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 } 42 128 43 129 static void remote_char_read(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); … … 45 131 46 132 /** Remote character interface operations. */ 47 static remote_iface_func_ptr_t remote_char_dev_iface_ops[] = {48 &remote_char_read,49 &remote_char_write133 static 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 50 136 }; 51 137 … … 55 141 * character interface. 56 142 */ 57 remote_iface_t remote_char_dev_iface = { 58 .method_count = sizeof(remote_char_dev_iface_ops) / 59 sizeof(remote_iface_func_ptr_t), 143 const remote_iface_t remote_char_dev_iface = { 144 .method_count = ARRAY_SIZE(remote_char_dev_iface_ops), 60 145 .methods = remote_char_dev_iface_ops 61 146 };
Note:
See TracChangeset
for help on using the changeset viewer.