Changes in / [e28d228:54b141a] in mainline
- Location:
- uspace
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhub/utils.c
re28d228 r54b141a 186 186 */ 187 187 188 /*189 * WARNING: sample code, will not work out of the box.190 * And does not contain code for checking for errors.191 */192 #if 0193 /*194 * Before opening the port, we must acquire the default195 * address.196 */197 usb_drv_reserve_default_address(hc);198 199 usb_address_t new_device_address = usb_drv_request_address(hc);200 201 // TODO: open the port202 203 // TODO: send request for setting address to new_device_address204 205 /*206 * Once new address is set, we can release the default207 * address.208 */209 usb_drv_release_default_address(hc);210 211 /*212 * Obtain descriptors and create match ids for devman.213 */214 215 // TODO: get device descriptors216 217 // TODO: create match ids218 219 // TODO: add child device220 221 // child_device_register sets the device handle222 // TODO: store it here223 devman_handle_t new_device_handle = 0;224 225 /*226 * Inform the HC that the new device has devman handle227 * assigned.228 */229 usb_drv_bind_address(hc, new_device_address, new_device_handle);230 231 /*232 * That's all.233 */234 #endif235 236 188 237 189 /* -
uspace/drv/vhc/addrmgm.c
re28d228 r54b141a 49 49 typedef struct { 50 50 usb_address_t address; 51 devman_handle_t devman_handle;52 51 bool available; 53 52 } address_info_t; … … 70 69 dev_address[i].address = i + 1; 71 70 dev_address[i].available = true; 72 dev_address[i].devman_handle = 0;73 71 } 74 72 … … 122 120 } 123 121 124 int bind_address(device_t *dev, usb_address_t address, devman_handle_t handle)125 {126 if (address == DEFAULT_ADDRESS) {127 return EPERM;128 }129 130 int rc = EPERM;131 132 fibril_mutex_lock(&address_guard);133 usb_address_t i;134 for (i = 0; i < ADDRESS_COUNT; i++) {135 if (dev_address[i].address == address) {136 if (dev_address[i].available) {137 rc = ENOENT;138 break;139 }140 141 dev_address[i].devman_handle = handle;142 rc = EOK;143 break;144 }145 }146 fibril_mutex_unlock(&address_guard);147 148 return rc;149 }150 151 int tell_address(device_t *dev, devman_handle_t handle, usb_address_t *address)152 {153 int rc = ENOENT;154 155 fibril_mutex_lock(&address_guard);156 usb_address_t i;157 for (i = 0; i < ADDRESS_COUNT; i++) {158 if (dev_address[i].devman_handle == handle) {159 *address = dev_address[i].address;160 rc = EOK;161 break;162 }163 }164 fibril_mutex_unlock(&address_guard);165 166 return rc;167 }168 169 122 int release_address(device_t *dev, usb_address_t address) 170 123 { … … 185 138 186 139 dev_address[i].available = true; 187 dev_address[i].devman_handle = 0;188 140 rc = EOK; 189 141 break; -
uspace/drv/vhc/conn.h
re28d228 r54b141a 52 52 int request_address(device_t *, usb_address_t *); 53 53 int release_address(device_t *, usb_address_t); 54 int bind_address(device_t *, usb_address_t, devman_handle_t);55 54 56 int tell_address(device_t *, devman_handle_t, usb_address_t *);57 55 58 56 void default_connection_handler(device_t *, ipc_callid_t, ipc_call_t *); -
uspace/drv/vhc/connhost.c
re28d228 r54b141a 148 148 149 149 150 static int get_address(device_t *dev, devman_handle_t handle, 151 usb_address_t *address) 152 { 153 return ENOTSUP; 154 } 155 150 156 static int interrupt_out(device_t *dev, usb_target_t target, 151 157 void *data, size_t size, … … 220 226 221 227 usbhc_iface_t vhc_iface = { 222 .tell_address = tell_address,228 .tell_address = get_address, 223 229 224 230 .reserve_default_address = reserve_default_address, 225 231 .release_default_address = release_default_address, 226 232 .request_address = request_address, 227 .bind_address = bind_address,228 233 .release_address = release_address, 229 234 -
uspace/lib/drv/generic/remote_usbhc.c
re28d228 r54b141a 55 55 static void remote_usbhc_release_default_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 56 56 static void remote_usbhc_request_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 57 static void remote_usbhc_bind_address(device_t *, void *, ipc_callid_t, ipc_call_t *);58 57 static void remote_usbhc_release_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 59 58 //static void remote_usbhc(device_t *, void *, ipc_callid_t, ipc_call_t *); … … 69 68 70 69 remote_usbhc_request_address, 71 remote_usbhc_bind_address,72 70 remote_usbhc_release_address, 73 71 … … 199 197 ipc_answer_1(callid, EOK, (ipcarg_t) address); 200 198 } 201 }202 203 void remote_usbhc_bind_address(device_t *device, void *iface,204 ipc_callid_t callid, ipc_call_t *call)205 {206 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;207 208 if (!usb_iface->bind_address) {209 ipc_answer_0(callid, ENOTSUP);210 return;211 }212 213 usb_address_t address = (usb_address_t) IPC_GET_ARG1(*call);214 devman_handle_t handle = (devman_handle_t) IPC_GET_ARG2(*call);215 216 int rc = usb_iface->bind_address(device, address, handle);217 218 ipc_answer_0(callid, rc);219 199 } 220 200 -
uspace/lib/drv/include/usbhc_iface.h
re28d228 r54b141a 137 137 IPC_M_USBHC_REQUEST_ADDRESS, 138 138 139 /** Bind USB address with devman handle.140 * Parameters:141 * - USB address142 * - devman handle143 * Answer:144 * - EOK - address binded145 * - ENOENT - address is not in use146 */147 IPC_M_USBHC_BIND_ADDRESS,148 149 139 /** Release address in use. 150 140 * Arguments: … … 233 223 int (*release_default_address)(device_t *); 234 224 int (*request_address)(device_t *, usb_address_t *); 235 int (*bind_address)(device_t *, usb_address_t, devman_handle_t);236 225 int (*release_address)(device_t *, usb_address_t); 237 226 -
uspace/lib/usb/include/usb/usbdrv.h
re28d228 r54b141a 44 44 int usb_drv_release_default_address(int); 45 45 usb_address_t usb_drv_request_address(int); 46 int usb_drv_bind_address(int, usb_address_t, devman_handle_t);47 46 int usb_drv_release_address(int, usb_address_t); 48 47 -
uspace/lib/usb/src/usbdrv.c
re28d228 r54b141a 136 136 } 137 137 138 /** Inform HC about binding address with devman handle.139 *140 * @param phone Open phone to host controller driver.141 * @param address Address to be binded.142 * @param handle Devman handle of the device.143 * @return Error code.144 */145 int usb_drv_bind_address(int phone, usb_address_t address,146 devman_handle_t handle)147 {148 int rc = async_req_2_0(phone, IPC_M_USBHC_BIND_ADDRESS,149 address, handle);150 151 return rc;152 }153 154 138 /** Inform HC about address release. 155 139 *
Note:
See TracChangeset
for help on using the changeset viewer.