Changeset 79ae36dd in mainline for uspace/lib/usbhid/src/hidiface.c
- Timestamp:
- 2011-06-08T19:01:55Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0eff68e
- Parents:
- 764d71e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhid/src/hidiface.c
r764d71e r79ae36dd 43 43 /** Ask for event array length. 44 44 * 45 * @param dev_phone Opened phone to DDF device providing USB HID interface. 45 * @param dev_sess Session to DDF device providing USB HID interface. 46 * 46 47 * @return Number of usages returned or negative error code. 47 */ 48 int usbhid_dev_get_event_length(int dev_phone, size_t *size) 49 { 50 if (dev_phone < 0) { 51 return EINVAL; 52 } 53 48 * 49 */ 50 int usbhid_dev_get_event_length(async_sess_t *dev_sess, size_t *size) 51 { 52 if (!dev_sess) 53 return EINVAL; 54 55 async_exch_t *exch = async_exchange_begin(dev_sess); 56 54 57 sysarg_t len; 55 int rc = async_req_1_1( dev_phone, DEV_IFACE_ID(USBHID_DEV_IFACE),58 int rc = async_req_1_1(exch, DEV_IFACE_ID(USBHID_DEV_IFACE), 56 59 IPC_M_USBHID_GET_EVENT_LENGTH, &len); 60 61 async_exchange_end(exch); 62 57 63 if (rc == EOK) { 58 if (size != NULL) {64 if (size != NULL) 59 65 *size = (size_t) len; 60 }61 66 } 62 67 … … 66 71 /** Request for next event from HID device. 67 72 * 68 * @param[in] dev_phone Opened phoneto DDF device providing USB HID interface.73 * @param[in] dev_sess Session to DDF device providing USB HID interface. 69 74 * @param[out] usage_pages Where to store usage pages. 70 * @param[out] usages Where to store usages (actual data).71 * @param[in] usage_count Length of @p usage_pages and @p usages buffer72 * 75 * @param[out] usages Where to store usages (actual data). 76 * @param[in] usage_count Length of @p usage_pages and @p usages buffer 77 * (in items, not bytes). 73 78 * @param[out] actual_usage_count Number of usages actually returned by the 74 * device driver. 75 * @param[in] flags Flags (see USBHID_IFACE_FLAG_*). 79 * device driver. 80 * @param[in] flags Flags (see USBHID_IFACE_FLAG_*). 81 * 76 82 * @return Error code. 77 */ 78 int usbhid_dev_get_event(int dev_phone, uint8_t *buf, 83 * 84 */ 85 int usbhid_dev_get_event(async_sess_t *dev_sess, uint8_t *buf, 79 86 size_t size, size_t *actual_size, int *event_nr, unsigned int flags) 80 87 { 81 if (dev_phone < 0) { 82 return EINVAL; 83 } 84 if ((buf == NULL)) { 85 return ENOMEM; 86 } 87 if (size == 0) { 88 return EINVAL; 89 } 90 91 // if (size == 0) { 92 // return EOK; 93 // } 94 88 if (!dev_sess) 89 return EINVAL; 90 91 if ((buf == NULL)) 92 return ENOMEM; 93 94 if (size == 0) 95 return EINVAL; 96 95 97 size_t buffer_size = size; 96 98 uint8_t *buffer = malloc(buffer_size); 97 if (buffer == NULL) { 98 return ENOMEM; 99 } 100 99 if (buffer == NULL) 100 return ENOMEM; 101 102 async_exch_t *exch = async_exchange_begin(dev_sess); 103 101 104 ipc_call_t opening_request_call; 102 aid_t opening_request = async_send_2( dev_phone,105 aid_t opening_request = async_send_2(exch, 103 106 DEV_IFACE_ID(USBHID_DEV_IFACE), IPC_M_USBHID_GET_EVENT, 104 107 flags, &opening_request_call); 108 105 109 if (opening_request == 0) { 110 async_exchange_end(exch); 106 111 free(buffer); 107 112 return ENOMEM; 108 113 } 109 114 110 115 ipc_call_t data_request_call; 111 aid_t data_request = async_data_read( dev_phone, buffer, buffer_size,116 aid_t data_request = async_data_read(exch, buffer, buffer_size, 112 117 &data_request_call); 118 119 async_exchange_end(exch); 120 113 121 if (data_request == 0) { 114 122 async_wait_for(opening_request, NULL); … … 116 124 return ENOMEM; 117 125 } 118 126 119 127 sysarg_t data_request_rc; 120 128 sysarg_t opening_request_rc; 121 129 async_wait_for(data_request, &data_request_rc); 122 130 async_wait_for(opening_request, &opening_request_rc); 123 131 124 132 if (data_request_rc != EOK) { 125 133 /* Prefer return code of the opening request. */ 126 if (opening_request_rc != EOK) {134 if (opening_request_rc != EOK) 127 135 return (int) opening_request_rc; 128 } else {136 else 129 137 return (int) data_request_rc; 130 } 131 } 132 133 if (opening_request_rc != EOK) { 138 } 139 140 if (opening_request_rc != EOK) 134 141 return (int) opening_request_rc; 135 } 136 142 137 143 size_t act_size = IPC_GET_ARG2(data_request_call); 138 144 139 145 /* Copy the individual items. */ 140 146 memcpy(buf, buffer, act_size); 141 // memcpy(usages, buffer + items, items * sizeof(int32_t)); 142 143 if (actual_size != NULL) { 147 148 if (actual_size != NULL) 144 149 *actual_size = act_size; 145 } 146 147 if (event_nr != NULL) { 150 151 if (event_nr != NULL) 148 152 *event_nr = IPC_GET_ARG1(opening_request_call); 149 } 150 153 151 154 return EOK; 152 155 } 153 156 154 155 int usbhid_dev_get_report_descriptor_length(int dev_phone, size_t *size) 156 { 157 if (dev_phone < 0) { 158 return EINVAL; 159 } 160 157 int usbhid_dev_get_report_descriptor_length(async_sess_t *dev_sess, 158 size_t *size) 159 { 160 if (!dev_sess) 161 return EINVAL; 162 163 async_exch_t *exch = async_exchange_begin(dev_sess); 164 161 165 sysarg_t arg_size; 162 int rc = async_req_1_1( dev_phone, DEV_IFACE_ID(USBHID_DEV_IFACE),166 int rc = async_req_1_1(exch, DEV_IFACE_ID(USBHID_DEV_IFACE), 163 167 IPC_M_USBHID_GET_REPORT_DESCRIPTOR_LENGTH, &arg_size); 168 169 async_exchange_end(exch); 170 164 171 if (rc == EOK) { 165 if (size != NULL) {172 if (size != NULL) 166 173 *size = (size_t) arg_size; 167 168 }174 } 175 169 176 return rc; 170 177 } 171 178 172 int usbhid_dev_get_report_descriptor(int dev_phone, uint8_t *buf, size_t size, 173 size_t *actual_size) 174 { 175 if (dev_phone < 0) { 176 return EINVAL; 177 } 178 if ((buf == NULL)) { 179 return ENOMEM; 180 } 181 if (size == 0) { 182 return EINVAL; 183 } 184 185 aid_t opening_request = async_send_1(dev_phone, 179 int usbhid_dev_get_report_descriptor(async_sess_t *dev_sess, uint8_t *buf, 180 size_t size, size_t *actual_size) 181 { 182 if (!dev_sess) 183 return EINVAL; 184 185 if ((buf == NULL)) 186 return ENOMEM; 187 188 if (size == 0) 189 return EINVAL; 190 191 async_exch_t *exch = async_exchange_begin(dev_sess); 192 193 aid_t opening_request = async_send_1(exch, 186 194 DEV_IFACE_ID(USBHID_DEV_IFACE), IPC_M_USBHID_GET_REPORT_DESCRIPTOR, 187 195 NULL); 188 196 if (opening_request == 0) { 189 return ENOMEM; 190 } 191 197 async_exchange_end(exch); 198 return ENOMEM; 199 } 200 192 201 ipc_call_t data_request_call; 193 aid_t data_request = async_data_read( dev_phone, buf, size,202 aid_t data_request = async_data_read(exch, buf, size, 194 203 &data_request_call); 204 205 async_exchange_end(exch); 206 195 207 if (data_request == 0) { 196 208 async_wait_for(opening_request, NULL); 197 209 return ENOMEM; 198 210 } 199 211 200 212 sysarg_t data_request_rc; 201 213 sysarg_t opening_request_rc; 202 214 async_wait_for(data_request, &data_request_rc); 203 215 async_wait_for(opening_request, &opening_request_rc); 204 216 205 217 if (data_request_rc != EOK) { 206 218 /* Prefer return code of the opening request. */ 207 if (opening_request_rc != EOK) {219 if (opening_request_rc != EOK) 208 220 return (int) opening_request_rc; 209 } else {221 else 210 222 return (int) data_request_rc; 211 } 212 } 213 214 if (opening_request_rc != EOK) { 223 } 224 225 if (opening_request_rc != EOK) 215 226 return (int) opening_request_rc; 216 } 217 227 218 228 size_t act_size = IPC_GET_ARG2(data_request_call); 219 220 if (actual_size != NULL) {229 230 if (actual_size != NULL) 221 231 *actual_size = act_size; 222 } 223 232 224 233 return EOK; 225 234 }
Note:
See TracChangeset
for help on using the changeset viewer.