Changeset 867e6735 in mainline for uspace/lib
- Timestamp:
- 2011-02-18T19:55:39Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 228f251
- Parents:
- 72363a1 (diff), b6c7da6 (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. - Location:
- uspace/lib
- Files:
-
- 8 edited
-
c/generic/str_error.c (modified) (1 diff)
-
c/include/errno.h (modified) (1 diff)
-
drv/generic/remote_usbhc.c (modified) (7 diffs)
-
drv/include/usbhc_iface.h (modified) (4 diffs)
-
usb/include/usb/hub.h (modified) (2 diffs)
-
usb/include/usb/usb.h (modified) (1 diff)
-
usb/src/hub.c (modified) (5 diffs)
-
usbvirt/Makefile (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/str_error.c
r72363a1 r867e6735 73 73 case EBADCHECKSUM: 74 74 return "Bad checksum"; 75 case ESTALL: 76 return "Operation stalled"; 75 77 case EAGAIN: 76 78 return "Resource temporarily unavailable"; -
uspace/lib/c/include/errno.h
r72363a1 r867e6735 59 59 #define EBADCHECKSUM (-300) 60 60 61 /** USB: stalled operation. */ 62 #define ESTALL (-301) 63 61 64 /** An API function is called while another blocking function is in progress. */ 62 65 #define EINPROGRESS (-10036) -
uspace/lib/drv/generic/remote_usbhc.c
r72363a1 r867e6735 40 40 41 41 #define USB_MAX_PAYLOAD_SIZE 1020 42 #define HACK_MAX_PACKET_SIZE 8 43 #define HACK_MAX_PACKET_SIZE_INTERRUPT_IN 4 42 44 43 45 static void remote_usbhc_get_address(device_t *, void *, ipc_callid_t, ipc_call_t *); … … 163 165 return; 164 166 } 165 166 int rc = usb_iface->reserve_default_address(device); 167 168 usb_speed_t speed = DEV_IPC_GET_ARG1(*call); 169 170 int rc = usb_iface->reserve_default_address(device, speed); 167 171 168 172 async_answer_0(callid, rc); … … 193 197 return; 194 198 } 199 200 usb_speed_t speed = DEV_IPC_GET_ARG1(*call); 195 201 196 202 usb_address_t address; 197 int rc = usb_iface->request_address(device, &address);203 int rc = usb_iface->request_address(device, speed, &address); 198 204 if (rc != EOK) { 199 205 async_answer_0(callid, rc); … … 322 328 trans->size = len; 323 329 324 int rc = transfer_func(device, target, buffer, len, 330 int rc = transfer_func(device, target, HACK_MAX_PACKET_SIZE, 331 buffer, len, 325 332 callback_out, trans); 326 333 … … 368 375 trans->size = len; 369 376 370 int rc = transfer_func(device, target, trans->buffer, len, 377 int rc = transfer_func(device, target, HACK_MAX_PACKET_SIZE_INTERRUPT_IN, 378 trans->buffer, len, 371 379 callback_in, trans); 372 380 … … 576 584 trans->size = data_buffer_len; 577 585 578 rc = usb_iface->control_write(device, target, 586 rc = usb_iface->control_write(device, target, HACK_MAX_PACKET_SIZE, 579 587 setup_packet, setup_packet_len, 580 588 data_buffer, data_buffer_len, … … 640 648 } 641 649 642 rc = usb_iface->control_read(device, target, 650 rc = usb_iface->control_read(device, target, HACK_MAX_PACKET_SIZE, 643 651 setup_packet, setup_packet_len, 644 652 trans->buffer, trans->size, -
uspace/lib/drv/include/usbhc_iface.h
r72363a1 r867e6735 40 40 #include "driver.h" 41 41 #include <usb/usb.h> 42 #include <bool.h> 42 43 43 44 … … 215 216 216 217 /** Out transfer processing function prototype. */ 217 typedef int (*usbhc_iface_transfer_out_t)(device_t *, usb_target_t, 218 typedef int (*usbhc_iface_transfer_out_t)(device_t *, usb_target_t, size_t, 218 219 void *, size_t, 219 220 usbhc_iface_transfer_out_callback_t, void *); 220 221 221 /** Setup transfer processing function prototype. */222 /** Setup transfer processing function prototype. @deprecated */ 222 223 typedef usbhc_iface_transfer_out_t usbhc_iface_transfer_setup_t; 223 224 224 225 /** In transfer processing function prototype. */ 225 typedef int (*usbhc_iface_transfer_in_t)(device_t *, usb_target_t, 226 typedef int (*usbhc_iface_transfer_in_t)(device_t *, usb_target_t, size_t, 226 227 void *, size_t, 227 228 usbhc_iface_transfer_in_callback_t, void *); … … 231 232 int (*tell_address)(device_t *, devman_handle_t, usb_address_t *); 232 233 233 int (*reserve_default_address)(device_t * );234 int (*reserve_default_address)(device_t *, usb_speed_t); 234 235 int (*release_default_address)(device_t *); 235 int (*request_address)(device_t *, usb_ address_t *);236 int (*request_address)(device_t *, usb_speed_t, usb_address_t *); 236 237 int (*bind_address)(device_t *, usb_address_t, devman_handle_t); 237 238 int (*release_address)(device_t *, usb_address_t); … … 251 252 252 253 int (*control_write)(device_t *, usb_target_t, 254 size_t, 253 255 void *, size_t, void *, size_t, 254 256 usbhc_iface_transfer_out_callback_t, void *); 255 257 256 258 int (*control_read)(device_t *, usb_target_t, 259 size_t, 257 260 void *, size_t, void *, size_t, 258 261 usbhc_iface_transfer_in_callback_t, void *); -
uspace/lib/usb/include/usb/hub.h
r72363a1 r867e6735 39 39 #include <usb/usbdevice.h> 40 40 41 int usb_hc_new_device_wrapper(device_t *, usb_hc_connection_t *, usb_speed_t, 42 int (*)(int, void *), int, void *, usb_address_t *, devman_handle_t *); 43 41 44 /** Info about device attached to host controller. 42 45 * … … 52 55 } usb_hc_attached_device_t; 53 56 54 int usb_hc_reserve_default_address(usb_hc_connection_t * );57 int usb_hc_reserve_default_address(usb_hc_connection_t *, usb_speed_t); 55 58 int usb_hc_release_default_address(usb_hc_connection_t *); 56 59 57 usb_address_t usb_hc_request_address(usb_hc_connection_t * );60 usb_address_t usb_hc_request_address(usb_hc_connection_t *, usb_speed_t); 58 61 int usb_hc_register_device(usb_hc_connection_t *, 59 62 const usb_hc_attached_device_t *); -
uspace/lib/usb/include/usb/usb.h
r72363a1 r867e6735 68 68 USB_DIRECTION_BOTH 69 69 } usb_direction_t; 70 71 /** USB speeds. */ 72 typedef enum { 73 /** USB 1.1 low speed (1.5Mbits/s). */ 74 USB_SPEED_LOW, 75 /** USB 1.1 full speed (12Mbits/s). */ 76 USB_SPEED_FULL, 77 /** USB 2.0 high speed (480Mbits/s). */ 78 USB_SPEED_HIGH 79 } usb_speed_t; 70 80 71 81 /** USB request type target. */ -
uspace/lib/usb/src/hub.c
r72363a1 r867e6735 34 34 */ 35 35 #include <usb/hub.h> 36 #include <usb/pipes.h> 37 #include <usb/request.h> 38 #include <usb/recognise.h> 36 39 #include <usbhc_iface.h> 37 40 #include <errno.h> … … 55 58 * @return Error code. 56 59 */ 57 int usb_hc_reserve_default_address(usb_hc_connection_t *connection) 60 int usb_hc_reserve_default_address(usb_hc_connection_t *connection, 61 usb_speed_t speed) 62 { 63 CHECK_CONNECTION(connection); 64 65 return async_req_2_0(connection->hc_phone, 66 DEV_IFACE_ID(USBHC_DEV_IFACE), 67 IPC_M_USBHC_RESERVE_DEFAULT_ADDRESS, speed); 68 } 69 70 /** Tell host controller to release default address. 71 * 72 * @param connection Opened connection to host controller. 73 * @return Error code. 74 */ 75 int usb_hc_release_default_address(usb_hc_connection_t *connection) 58 76 { 59 77 CHECK_CONNECTION(connection); … … 61 79 return async_req_1_0(connection->hc_phone, 62 80 DEV_IFACE_ID(USBHC_DEV_IFACE), 63 IPC_M_USBHC_RESERVE_DEFAULT_ADDRESS);64 }65 66 /** Tell host controller to release default address.67 *68 * @param connection Opened connection to host controller.69 * @return Error code.70 */71 int usb_hc_release_default_address(usb_hc_connection_t *connection)72 {73 CHECK_CONNECTION(connection);74 75 return async_req_1_0(connection->hc_phone,76 DEV_IFACE_ID(USBHC_DEV_IFACE),77 81 IPC_M_USBHC_RELEASE_DEFAULT_ADDRESS); 78 82 } … … 83 87 * @return Assigned USB address or negative error code. 84 88 */ 85 usb_address_t usb_hc_request_address(usb_hc_connection_t *connection) 89 usb_address_t usb_hc_request_address(usb_hc_connection_t *connection, 90 usb_speed_t speed) 86 91 { 87 92 CHECK_CONNECTION(connection); 88 93 89 94 sysarg_t address; 90 int rc = async_req_1_1(connection->hc_phone, 91 DEV_IFACE_ID(USBHC_DEV_IFACE), 92 IPC_M_USBHC_REQUEST_ADDRESS, &address); 95 int rc = async_req_2_1(connection->hc_phone, 96 DEV_IFACE_ID(USBHC_DEV_IFACE), 97 IPC_M_USBHC_REQUEST_ADDRESS, speed, 98 &address); 93 99 if (rc != EOK) { 94 100 return (usb_address_t) rc; … … 135 141 136 142 143 /** Wrapper for registering attached device to the hub. 144 * 145 * The @p enable_port function is expected to enable singalling on given 146 * port. 147 * The two arguments to it can have arbitrary meaning 148 * (the @p port_no is only a suggestion) 149 * and are not touched at all by this function 150 * (they are passed as is to the @p enable_port function). 151 * 152 * If the @p enable_port fails (i.e. does not return EOK), the device 153 * addition is cancelled. 154 * The return value is then returned (it is good idea to use different 155 * error codes than those listed as return codes by this function itself). 156 * 157 * @param parent Parent device (i.e. the hub device). 158 * @param connection Opened connection to host controller. 159 * @param dev_speed New device speed. 160 * @param enable_port Function for enabling signalling through the port the 161 * device is attached to. 162 * @param port_no Port number (passed through to @p enable_port). 163 * @param arg Any data argument to @p enable_port. 164 * @param[out] assigned_address USB address of the device. 165 * @param[out] assigned_handle Devman handle of the new device. 166 * @return Error code. 167 * @retval ENOENT Connection to HC not opened. 168 * @retval EADDRNOTAVAIL Failed retrieving free address from host controller. 169 * @retval EBUSY Failed reserving default USB address. 170 * @retval ENOTCONN Problem connecting to the host controller via USB pipe. 171 * @retval ESTALL Problem communication with device (either SET_ADDRESS 172 * request or requests for descriptors when creating match ids). 173 */ 174 int usb_hc_new_device_wrapper(device_t *parent, usb_hc_connection_t *connection, 175 usb_speed_t dev_speed, 176 int (*enable_port)(int port_no, void *arg), int port_no, void *arg, 177 usb_address_t *assigned_address, devman_handle_t *assigned_handle) 178 { 179 CHECK_CONNECTION(connection); 180 181 /* 182 * Request new address. 183 */ 184 usb_address_t dev_addr = usb_hc_request_address(connection, dev_speed); 185 if (dev_addr < 0) { 186 return EADDRNOTAVAIL; 187 } 188 189 int rc; 190 191 /* 192 * Reserve the default address. 193 */ 194 rc = usb_hc_reserve_default_address(connection, dev_speed); 195 if (rc != EOK) { 196 rc = EBUSY; 197 goto leave_release_free_address; 198 } 199 200 /* 201 * Enable the port (i.e. allow signalling through this port). 202 */ 203 rc = enable_port(port_no, arg); 204 if (rc != EOK) { 205 goto leave_release_default_address; 206 } 207 208 /* 209 * Change the address from default to the free one. 210 * We need to create a new control pipe for that. 211 */ 212 usb_device_connection_t dev_conn; 213 rc = usb_device_connection_initialize_on_default_address(&dev_conn, 214 connection); 215 if (rc != EOK) { 216 rc = ENOTCONN; 217 goto leave_release_default_address; 218 } 219 220 usb_endpoint_pipe_t ctrl_pipe; 221 rc = usb_endpoint_pipe_initialize_default_control(&ctrl_pipe, 222 &dev_conn); 223 if (rc != EOK) { 224 rc = ENOTCONN; 225 goto leave_release_default_address; 226 } 227 228 rc = usb_endpoint_pipe_start_session(&ctrl_pipe); 229 if (rc != EOK) { 230 rc = ENOTCONN; 231 goto leave_release_default_address; 232 } 233 234 rc = usb_request_set_address(&ctrl_pipe, dev_addr); 235 if (rc != EOK) { 236 rc = ESTALL; 237 goto leave_stop_session; 238 } 239 240 usb_endpoint_pipe_end_session(&ctrl_pipe); 241 242 /* 243 * Once the address is changed, we can return the default address. 244 */ 245 usb_hc_release_default_address(connection); 246 247 /* 248 * It is time to register the device with devman. 249 */ 250 /* FIXME: create device_register that will get opened ctrl pipe. */ 251 devman_handle_t child_handle; 252 rc = usb_device_register_child_in_devman(dev_addr, dev_conn.hc_handle, 253 parent, &child_handle); 254 if (rc != EOK) { 255 rc = ESTALL; 256 goto leave_release_free_address; 257 } 258 259 /* 260 * And now inform the host controller about the handle. 261 */ 262 usb_hc_attached_device_t new_device = { 263 .address = dev_addr, 264 .handle = child_handle 265 }; 266 rc = usb_hc_register_device(connection, &new_device); 267 if (rc != EOK) { 268 rc = EDESTADDRREQ; 269 goto leave_release_free_address; 270 } 271 272 /* 273 * And we are done. 274 */ 275 if (assigned_address != NULL) { 276 *assigned_address = dev_addr; 277 } 278 if (assigned_handle != NULL) { 279 *assigned_handle = child_handle; 280 } 281 282 return EOK; 283 284 285 286 /* 287 * Error handling (like nested exceptions) starts here. 288 * Completely ignoring errors here. 289 */ 290 291 leave_stop_session: 292 usb_endpoint_pipe_end_session(&ctrl_pipe); 293 294 leave_release_default_address: 295 usb_hc_release_default_address(connection); 296 297 leave_release_free_address: 298 usb_hc_unregister_device(connection, dev_addr); 299 300 return rc; 301 } 302 303 137 304 /** 138 305 * @} -
uspace/lib/usbvirt/Makefile
r72363a1 r867e6735 30 30 LIBRARY = libusbvirt 31 31 32 LIBS = $(LIBUSB_PREFIX)/libusb.a33 32 EXTRA_CFLAGS = -I$(LIBUSB_PREFIX)/include -Iinclude 34 33
Note:
See TracChangeset
for help on using the changeset viewer.
