Changes in / [d70765d:b3f655f] in mainline
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
rd70765d rb3f655f 554 554 % Polling UHCI & OHCI (no interrupts) 555 555 ! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_USBHC_NO_INTERRUPTS (y/n) 556 557 % Run devman in kconsole (not recommended)558 ! CONFIG_DEVMAN_EARLY_LAUNCH (n/y)559 -
uspace/app/init/init.c
rd70765d rb3f655f 288 288 289 289 spawn("/srv/clip"); 290 291 #ifdef CONFIG_DEVMAN_EARLY_LAUNCH292 spawn("/srv/devman");293 #endif294 290 295 291 /* … … 317 313 getterm("term/vc5", "/app/bdsh", false); 318 314 getterm("term/vc6", "/app/klog", false); 319 320 #ifndef CONFIG_DEVMAN_EARLY_LAUNCH321 315 getterm("term/vc7", "/srv/devman", false); 322 #endif 323 316 324 317 return 0; 325 318 } -
uspace/app/klog/klog.c
rd70765d rb3f655f 44 44 #include <io/klog.h> 45 45 #include <sysinfo.h> 46 #include <fibril_synch.h>47 46 48 47 #define NAME "klog" … … 55 54 static FILE *log; 56 55 57 /* Serialize the output a bit. This will not avoid messed-up log completely58 but chances for are pretty high (experimentally confirmed). */59 static FIBRIL_MUTEX_INITIALIZE(log_mutex);60 61 56 static void interrupt_received(ipc_callid_t callid, ipc_call_t *call) 62 57 { 63 fibril_mutex_lock(&log_mutex);64 65 58 size_t klog_start = (size_t) IPC_GET_ARG1(*call); 66 59 size_t klog_len = (size_t) IPC_GET_ARG2(*call); … … 81 74 fsync(fileno(log)); 82 75 } 83 84 fibril_mutex_unlock(&log_mutex);85 76 } 86 77 -
uspace/drv/usbmid/explore.c
rd70765d rb3f655f 40 40 #include <usb/request.h> 41 41 #include <usb/dp.h> 42 #include <usb/ddfiface.h>43 42 #include "usbmid.h" 44 45 /** Operations of the device itself. */46 static ddf_dev_ops_t mid_device_ops = {47 .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl48 };49 43 50 44 /** Find starting indexes of all interface descriptors in a configuration. … … 111 105 * @return Whether to accept this device from devman. 112 106 */ 113 bool usbmid_explore_device(usb _device_t *dev)107 bool usbmid_explore_device(usbmid_device_t *dev) 114 108 { 115 int rc; 116 117 int dev_class = dev->descriptors.device.device_class; 118 if (dev_class != USB_CLASS_USE_INTERFACE) { 109 usb_standard_device_descriptor_t device_descriptor; 110 int rc = usb_request_get_device_descriptor(&dev->ctrl_pipe, 111 &device_descriptor); 112 if (rc != EOK) { 113 usb_log_error("Getting device descriptor failed: %s.\n", 114 str_error(rc)); 115 return false; 116 } 117 118 if (device_descriptor.device_class != USB_CLASS_USE_INTERFACE) { 119 119 usb_log_warning( 120 120 "Device class: %d (%s), but expected class 0.\n", 121 dev_class, usb_str_class(dev_class)); 121 device_descriptor.device_class, 122 usb_str_class(device_descriptor.device_class)); 122 123 usb_log_error("Not multi interface device, refusing.\n"); 123 124 return false; 124 125 } 125 126 126 /* Short cuts to save on typing ;-). */ 127 uint8_t *config_descriptor_raw = dev->descriptors.configuration; 128 size_t config_descriptor_size = dev->descriptors.configuration_size; 129 usb_standard_configuration_descriptor_t *config_descriptor = 130 (usb_standard_configuration_descriptor_t *) config_descriptor_raw; 127 size_t config_descriptor_size; 128 uint8_t *config_descriptor_raw = NULL; 129 rc = usb_request_get_full_configuration_descriptor_alloc( 130 &dev->ctrl_pipe, 0, 131 (void **) &config_descriptor_raw, &config_descriptor_size); 132 if (rc != EOK) { 133 usb_log_error("Failed getting full config descriptor: %s.\n", 134 str_error(rc)); 135 return false; 136 } 137 138 usb_standard_configuration_descriptor_t *config_descriptor 139 = (usb_standard_configuration_descriptor_t *) config_descriptor_raw; 131 140 132 141 size_t *interface_descriptors … … 145 154 if (interface_descriptors_count == (size_t) -1) { 146 155 usb_log_error("Problem parsing configuration descriptor.\n"); 156 free(config_descriptor_raw); 147 157 free(interface_descriptors); 148 158 return false; … … 155 165 usb_log_error("Failed to set device configuration: %s.\n", 156 166 str_error(rc)); 167 free(config_descriptor_raw); 157 168 free(interface_descriptors); 158 169 return false; … … 161 172 162 173 /* Create control function */ 163 ddf_fun_t *ctl_fun = ddf_fun_create(dev->d df_dev, fun_exposed, "ctl");174 ddf_fun_t *ctl_fun = ddf_fun_create(dev->dev, fun_exposed, "ctl"); 164 175 if (ctl_fun == NULL) { 165 176 usb_log_error("Failed to create control function.\n"); 166 free(interface_descriptors); 167 return false; 168 } 169 170 ctl_fun->ops = &mid_device_ops; 171 177 free(config_descriptor_raw); 178 free(interface_descriptors); 179 return false; 180 } 172 181 rc = ddf_fun_bind(ctl_fun); 173 182 if (rc != EOK) { 174 183 usb_log_error("Failed to bind control function: %s.\n", 175 184 str_error(rc)); 185 free(config_descriptor_raw); 176 186 free(interface_descriptors); 177 187 return false; … … 189 199 (int) interface->interface_number, 190 200 usb_str_class(interface->interface_class)); 191 rc = usbmid_spawn_interface_child(dev, &dev ->descriptors.device,201 rc = usbmid_spawn_interface_child(dev, &device_descriptor, 192 202 interface); 193 203 if (rc != EOK) { … … 197 207 } 198 208 209 free(config_descriptor_raw); 210 199 211 return true; 200 212 } -
uspace/drv/usbmid/main.c
rd70765d rb3f655f 49 49 * @return Error code. 50 50 */ 51 static int usbmid_add_device( usb_device_t *dev)51 static int usbmid_add_device(ddf_dev_t *gen_dev) 52 52 { 53 usb_log_info("Taking care of new MID `%s'.\n", dev->ddf_dev->name); 53 usbmid_device_t *dev = usbmid_device_create(gen_dev); 54 if (dev == NULL) { 55 return ENOMEM; 56 } 57 58 usb_log_info("Taking care of new MID: addr %d (HC %zu)\n", 59 dev->wire.address, dev->wire.hc_handle); 54 60 55 61 int rc; … … 59 65 usb_log_error("Failed to start session on control pipe: %s.\n", 60 66 str_error(rc)); 61 return rc;67 goto error_leave; 62 68 } 63 69 … … 71 77 72 78 if (!accept) { 73 return ENOTSUP; 79 rc = ENOTSUP; 80 goto error_leave; 74 81 } 75 82 83 gen_dev->driver_data = dev; 84 76 85 return EOK; 86 87 88 error_leave: 89 free(dev); 90 return rc; 77 91 } 78 92 79 93 /** USB MID driver ops. */ 80 static usb_driver_ops_t mid_driver_ops = {94 static driver_ops_t mid_driver_ops = { 81 95 .add_device = usbmid_add_device, 82 96 }; 83 97 84 98 /** USB MID driver. */ 85 static usb_driver_t mid_driver = {99 static driver_t mid_driver = { 86 100 .name = NAME, 87 .ops = &mid_driver_ops, 88 .endpoints = NULL 101 .driver_ops = &mid_driver_ops 89 102 }; 90 103 … … 94 107 95 108 usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME); 96 97 return usb_driver_main(&mid_driver); 109 return ddf_driver_main(&mid_driver); 98 110 } 99 111 -
uspace/drv/usbmid/usbmid.c
rd70765d rb3f655f 79 79 }; 80 80 81 /** Operations of the device itself. */ 82 static ddf_dev_ops_t mid_device_ops = { 83 .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl 84 }; 85 86 /** Create new USB multi interface device. 87 * 88 * @param dev Backing generic DDF device. 89 * @return New USB MID device. 90 * @retval NULL Error occured. 91 */ 92 usbmid_device_t *usbmid_device_create(ddf_dev_t *dev) 93 { 94 usbmid_device_t *mid = malloc(sizeof(usbmid_device_t)); 95 if (mid == NULL) { 96 usb_log_error("Out of memory (wanted %zu bytes).\n", 97 sizeof(usbmid_device_t)); 98 return NULL; 99 } 100 101 int rc; 102 rc = usb_device_connection_initialize_from_device(&mid->wire, dev); 103 if (rc != EOK) { 104 usb_log_error("Failed to initialize `USB wire': %s.\n", 105 str_error(rc)); 106 free(mid); 107 return NULL; 108 } 109 110 rc = usb_pipe_initialize_default_control(&mid->ctrl_pipe, 111 &mid->wire); 112 if (rc != EOK) { 113 usb_log_error("Failed to initialize control pipe: %s.\n", 114 str_error(rc)); 115 free(mid); 116 return NULL; 117 } 118 rc = usb_pipe_probe_default_control(&mid->ctrl_pipe); 119 if (rc != EOK) { 120 usb_log_error("Probing default control pipe failed: %s.\n", 121 str_error(rc)); 122 free(mid); 123 return NULL; 124 } 125 126 mid->dev = dev; 127 (void) &mid_device_ops; 128 129 return mid; 130 } 131 81 132 /** Create new interface for USB MID device. 82 133 * … … 109 160 * @return Error code. 110 161 */ 111 int usbmid_spawn_interface_child(usb _device_t *parent,162 int usbmid_spawn_interface_child(usbmid_device_t *parent, 112 163 const usb_standard_device_descriptor_t *device_descriptor, 113 164 const usb_standard_interface_descriptor_t *interface_descriptor) … … 131 182 132 183 /* Create the device. */ 133 child = ddf_fun_create(parent->d df_dev, fun_inner, child_name);184 child = ddf_fun_create(parent->dev, fun_inner, child_name); 134 185 if (child == NULL) { 135 186 rc = ENOMEM; -
uspace/drv/usbmid/usbmid.h
rd70765d rb3f655f 41 41 #include <usb/pipes.h> 42 42 #include <usb/debug.h> 43 #include <usb/devdrv.h>44 43 45 44 #define NAME "usbmid" 45 46 /** USB MID device container. */ 47 typedef struct { 48 /** Device container. */ 49 ddf_dev_t *dev; 50 51 /** Representation of USB wire. */ 52 usb_device_connection_t wire; 53 /** Default control pipe. */ 54 usb_pipe_t ctrl_pipe; 55 } usbmid_device_t; 56 46 57 47 58 /** Container for single interface in a MID device. */ … … 54 65 } usbmid_interface_t; 55 66 67 usbmid_device_t *usbmid_device_create(ddf_dev_t *); 56 68 usbmid_interface_t *usbmid_interface_create(ddf_fun_t *, int); 57 bool usbmid_explore_device(usb _device_t *);58 int usbmid_spawn_interface_child(usb _device_t *,69 bool usbmid_explore_device(usbmid_device_t *); 70 int usbmid_spawn_interface_child(usbmid_device_t *, 59 71 const usb_standard_device_descriptor_t *, 60 72 const usb_standard_interface_descriptor_t *);
Note:
See TracChangeset
for help on using the changeset viewer.