Changeset 1b22bd4 in mainline
- Timestamp:
- 2010-11-20T14:48:18Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 32eceb4f
- Parents:
- 4b4c797
- Location:
- uspace/lib/drv
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_usb.c
r4b4c797 r1b22bd4 40 40 #include "driver.h" 41 41 42 #define USB_MAX_PAYLOAD_SIZE 1020 43 42 44 static void remote_usb_get_buffer(device_t *, void *, ipc_callid_t, ipc_call_t *); 43 45 static void remote_usb_interrupt_out(device_t *, void *, ipc_callid_t, ipc_call_t *); … … 60 62 }; 61 63 64 typedef struct { 65 ipc_callid_t caller; 66 void *buffer; 67 size_t size; 68 } async_transaction_t; 62 69 63 70 … … 65 72 ipc_callid_t callid, ipc_call_t *call) 66 73 { 67 ipc_answer_0(callid, ENOTSUP); 74 ipcarg_t buffer_hash = IPC_GET_ARG1(*call); 75 async_transaction_t * trans = (async_transaction_t *)buffer_hash; 76 if (trans == NULL) { 77 ipc_answer_0(callid, ENOENT); 78 return; 79 } 80 if (trans->buffer == NULL) { 81 ipc_answer_0(callid, EINVAL); 82 free(trans); 83 return; 84 } 85 86 ipc_callid_t cid; 87 size_t accepted_size; 88 if (!async_data_read_receive(&cid, &accepted_size)) { 89 ipc_answer_0(callid, EINVAL); 90 return; 91 } 92 93 if (accepted_size > trans->size) { 94 accepted_size = trans->size; 95 } 96 async_data_read_finalize(callid, trans->buffer, accepted_size); 97 98 ipc_answer_1(callid, EOK, accepted_size); 99 100 free(trans->buffer); 101 free(trans); 102 } 103 104 105 static void callback_out(device_t *device, 106 usb_transaction_outcome_t outcome, void *arg) 107 { 108 async_transaction_t *trans = (async_transaction_t *)arg; 109 110 // FIXME - answer according to outcome 111 ipc_answer_0(trans->caller, EOK); 112 113 free(trans); 114 } 115 116 static void callback_in(device_t *device, 117 usb_transaction_outcome_t outcome, size_t actual_size, void *arg) 118 { 119 async_transaction_t *trans = (async_transaction_t *)arg; 120 121 // FIXME - answer according to outcome 122 ipc_answer_1(trans->caller, EOK, (ipcarg_t)trans); 123 124 trans->size = actual_size; 68 125 } 69 126 … … 71 128 ipc_callid_t callid, ipc_call_t *call) 72 129 { 73 ipc_answer_0(callid, ENOTSUP); 130 usb_iface_t *usb_iface = (usb_iface_t *) iface; 131 132 size_t expected_len = IPC_GET_ARG3(*call); 133 usb_target_t target = { 134 .address = IPC_GET_ARG1(*call), 135 .endpoint = IPC_GET_ARG2(*call) 136 }; 137 138 size_t len = 0; 139 void *buffer = NULL; 140 if (expected_len > 0) { 141 int rc = async_data_write_accept(&buffer, false, 142 1, USB_MAX_PAYLOAD_SIZE, 143 0, &len); 144 145 if (rc != EOK) { 146 ipc_answer_0(callid, rc); 147 return; 148 } 149 } 150 151 if (!usb_iface->interrupt_out) { 152 ipc_answer_0(callid, ENOTSUP); 153 return; 154 } 155 156 async_transaction_t *trans = malloc(sizeof(async_transaction_t)); 157 trans->caller = callid; 158 trans->buffer = NULL; 159 trans->size = 0; 160 161 int rc = usb_iface->interrupt_out(device, target, buffer, len, 162 callback_out, trans); 163 164 if (rc != EOK) { 165 ipc_answer_0(callid, rc); 166 free(trans); 167 } 74 168 } 75 169 … … 77 171 ipc_callid_t callid, ipc_call_t *call) 78 172 { 79 ipc_answer_0(callid, ENOTSUP); 80 } 173 usb_iface_t *usb_iface = (usb_iface_t *) iface; 174 175 size_t len = IPC_GET_ARG3(*call); 176 usb_target_t target = { 177 .address = IPC_GET_ARG1(*call), 178 .endpoint = IPC_GET_ARG2(*call) 179 }; 180 181 if (!usb_iface->interrupt_in) { 182 ipc_answer_0(callid, ENOTSUP); 183 return; 184 } 185 186 async_transaction_t *trans = malloc(sizeof(async_transaction_t)); 187 trans->caller = callid; 188 trans->buffer = malloc(len); 189 trans->size = len; 190 191 int rc = usb_iface->interrupt_in(device, target, trans->buffer, len, 192 callback_in, trans); 193 194 if (rc != EOK) { 195 ipc_answer_0(callid, rc); 196 free(trans->buffer); 197 free(trans); 198 } 199 } 200 81 201 82 202 /** -
uspace/lib/drv/include/usb_iface.h
r4b4c797 r1b22bd4 93 93 typedef enum { 94 94 /** Asks for data buffer. 95 * See explanation at usb_method_t. 95 * See explanation at usb_iface_funcs_t. 96 * This function does not have counter part in functional interface 97 * as it is handled by the remote part itself. 96 98 */ 97 99 IPC_M_USB_GET_BUFFER, … … 99 101 100 102 /** Send interrupt data to device. 101 * See explanation at usb_ method_t (OUT transaction).103 * See explanation at usb_iface_funcs_t (OUT transaction). 102 104 */ 103 105 IPC_M_USB_INTERRUPT_OUT, 104 106 105 107 /** Get interrupt data from device. 106 * See explanation at usb_ method_t (IN transaction).108 * See explanation at usb_iface_funcs_t (IN transaction). 107 109 */ 108 110 IPC_M_USB_INTERRUPT_IN, … … 110 112 111 113 /** Start WRITE control transfer. 112 * See explanation at usb_ method_t (OUT transaction).114 * See explanation at usb_iface_funcs_t (OUT transaction). 113 115 */ 114 116 IPC_M_USB_CONTROL_WRITE_SETUP, 115 117 116 118 /** Send control-transfer data to device. 117 * See explanation at usb_ method_t (OUT transaction).119 * See explanation at usb_iface_funcs_t (OUT transaction). 118 120 */ 119 121 IPC_M_USB_CONTROL_WRITE_DATA, 120 122 121 123 /** Terminate WRITE control transfer. 122 * See explanation at usb_ method_t (NO-DATA transaction).124 * See explanation at usb_iface_funcs_t (NO-DATA transaction). 123 125 */ 124 126 IPC_M_USB_CONTROL_WRITE_STATUS, … … 127 129 128 130 /** Start READ control transfer. 129 * See explanation at usb_ method_t (OUT transaction).131 * See explanation at usb_iface_funcs_t (OUT transaction). 130 132 */ 131 133 IPC_M_USB_CONTROL_READ_SETUP, 132 134 133 135 /** Get control-transfer data from device. 134 * See explanation at usb_ method_t (IN transaction).136 * See explanation at usb_iface_funcs_t (IN transaction). 135 137 */ 136 138 IPC_M_USB_CONTROL_READ_DATA, 137 139 138 140 /** Terminate READ control transfer. 139 * See explanation at usb_ method_t (NO-DATA transaction).141 * See explanation at usb_iface_funcs_t (NO-DATA transaction). 140 142 */ 141 143 IPC_M_USB_CONTROL_READ_STATUS, … … 155 157 /** USB devices communication interface. */ 156 158 typedef struct { 157 int (*interrupt_out)(device_t *, usb_ endpoint_t,159 int (*interrupt_out)(device_t *, usb_target_t, 158 160 void *, size_t, 159 161 usb_iface_transfer_out_callback_t, void *); 160 int (*interrupt_in)(device_t *, usb_ endpoint_t,162 int (*interrupt_in)(device_t *, usb_target_t, 161 163 void *, size_t, 162 164 usb_iface_transfer_in_callback_t, void *);
Note:
See TracChangeset
for help on using the changeset viewer.