Changes in uspace/drv/bus/usb/usbhid/main.c [9d58539:a8c4e871] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhid/main.c
r9d58539 ra8c4e871 46 46 #include "usbhid.h" 47 47 48 /*----------------------------------------------------------------------------*/ 49 48 50 #define NAME "usbhid" 49 51 50 52 /** 51 * Callback for passing a new device to the driver. 52 * 53 * @note Currently, only boot-protocol keyboards are supported by this driver. 54 * 55 * @param dev Structure representing the new device. 56 * @return Error code. 57 */ 58 static int usb_hid_device_add(usb_device_t *dev) 59 { 60 usb_log_debug("%s\n", __FUNCTION__); 61 62 if (dev == NULL) { 63 usb_log_error("Wrong parameter given for add_device().\n"); 64 return EINVAL; 65 } 66 67 if (dev->interface_no < 0) { 68 usb_log_error("Failed to add HID device: endpoints not found." 69 "\n"); 70 return ENOTSUP; 71 } 53 * Function for adding a new device of type USB/HID/keyboard. 54 * 55 * This functions initializes required structures from the device's descriptors 56 * and starts new fibril for polling the keyboard for events and another one for 57 * handling auto-repeat of keys. 58 * 59 * During initialization, the keyboard is switched into boot protocol, the idle 60 * rate is set to 0 (infinity), resulting in the keyboard only reporting event 61 * when a key is pressed or released. Finally, the LED lights are turned on 62 * according to the default setup of lock keys. 63 * 64 * @note By default, the keyboards is initialized with Num Lock turned on and 65 * other locks turned off. 66 * @note Currently supports only boot-protocol keyboards. 67 * 68 * @param dev Device to add. 69 * 70 * @retval EOK if successful. 71 * @retval ENOMEM if there 72 * @return Other error code inherited from one of functions usb_kbd_init(), 73 * ddf_fun_bind() and ddf_fun_add_to_class(). 74 */ 75 static int usb_hid_try_add_device(usb_device_t *dev) 76 { 77 assert(dev != NULL); 78 79 /* Initialize device (get and process descriptors, get address, etc.) */ 80 usb_log_debug("Initializing USB/HID device...\n"); 81 72 82 usb_hid_dev_t *hid_dev = 73 83 usb_device_data_alloc(dev, sizeof(usb_hid_dev_t)); 74 84 if (hid_dev == NULL) { 75 usb_log_error("Failed to create USB/HID device structure.\n"); 85 usb_log_error("Error while creating USB/HID device " 86 "structure.\n"); 76 87 return ENOMEM; 77 88 } 78 89 79 90 int rc = usb_hid_init(hid_dev, dev); 91 80 92 if (rc != EOK) { 81 93 usb_log_error("Failed to initialize USB/HID device.\n"); … … 86 98 usb_log_debug("USB/HID device structure initialized.\n"); 87 99 100 /* 101 * 1) subdriver vytvori vlastnu ddf_fun, vlastne ddf_dev_ops, ktore da 102 * do nej. 103 * 2) do tych ops do .interfaces[DEV_IFACE_USBHID (asi)] priradi 104 * vyplnenu strukturu usbhid_iface_t. 105 * 3) klientska aplikacia - musi si rucne vytvorit telefon 106 * (devman_device_connect() - cesta k zariadeniu (/hw/pci0/...) az 107 * k tej fcii. 108 * pouzit usb/classes/hid/iface.h - prvy int je telefon 109 */ 110 88 111 /* Start automated polling function. 89 112 * This will create a separate fibril that will query the device 90 * for the data continuously. */ 113 * for the data continuously 114 */ 91 115 rc = usb_device_auto_poll(dev, 92 116 /* Index of the polling pipe. */ … … 95 119 usb_hid_polling_callback, 96 120 /* How much data to request. */ 97 dev->pipes[hid_dev->poll_pipe_index].pipe .max_packet_size,121 dev->pipes[hid_dev->poll_pipe_index].pipe->max_packet_size, 98 122 /* Callback when the polling ends. */ 99 123 usb_hid_polling_ended_callback, … … 109 133 hid_dev->running = true; 110 134 135 /* 136 * Hurrah, device is initialized. 137 */ 138 return EOK; 139 } 140 141 /*----------------------------------------------------------------------------*/ 142 /** 143 * Callback for passing a new device to the driver. 144 * 145 * @note Currently, only boot-protocol keyboards are supported by this driver. 146 * 147 * @param dev Structure representing the new device. 148 * 149 * @retval EOK if successful. 150 * @retval EREFUSED if the device is not supported. 151 */ 152 static int usb_hid_device_add(usb_device_t *dev) 153 { 154 usb_log_debug("usb_hid_device_add()\n"); 155 156 if (dev == NULL) { 157 usb_log_warning("Wrong parameter given for add_device().\n"); 158 return EINVAL; 159 } 160 161 if (dev->interface_no < 0) { 162 usb_log_warning("Device is not a supported HID device.\n"); 163 usb_log_error("Failed to add HID device: endpoints not found." 164 "\n"); 165 return ENOTSUP; 166 } 167 168 int rc = usb_hid_try_add_device(dev); 169 170 if (rc != EOK) { 171 usb_log_warning("Device is not a supported HID device.\n"); 172 usb_log_error("Failed to add HID device: %s.\n", 173 str_error(rc)); 174 return rc; 175 } 176 111 177 usb_log_info("HID device `%s' ready to use.\n", dev->ddf_dev->name); 112 178 113 179 return EOK; 114 180 } 115 /*----------------------------------------------------------------------------*/ 116 /** 117 * Callback for a device about to be removed from the driver. 181 182 /*----------------------------------------------------------------------------*/ 183 184 /** 185 * Callback for removing a device from the driver. 118 186 * 119 187 * @param dev Structure representing the device. 120 * @return Error code. 121 */ 122 static int usb_hid_device_rem(usb_device_t *dev) 123 { 124 // TODO: Stop device polling 125 // TODO: Call deinit (stops autorepeat too) 126 return ENOTSUP; 127 } 128 /*----------------------------------------------------------------------------*/ 129 /** 130 * Callback for removing a device from the driver. 131 * 132 * @param dev Structure representing the device. 133 * @return Error code. 188 * 189 * @retval EOK if successful. 190 * @retval EREFUSED if the device is not supported. 134 191 */ 135 192 static int usb_hid_device_gone(usb_device_t *dev) 136 193 { 137 assert(dev);138 assert(dev->driver_data);139 194 usb_hid_dev_t *hid_dev = dev->driver_data; 140 unsigned tries = 100; 141 /* Wait for fail. */ 142 while (hid_dev->running && tries--) { 195 unsigned tries = 10; 196 while (hid_dev->running) { 143 197 async_usleep(100000); 144 } 145 if (hid_dev->running) { 146 usb_log_error("Can't remove hid, still running.\n"); 147 return EBUSY; 148 } 149 198 if (!tries--) { 199 usb_log_error("Can't remove hub, still running.\n"); 200 return EINPROGRESS; 201 } 202 } 203 204 assert(!hid_dev->running); 150 205 usb_hid_deinit(hid_dev); 151 206 usb_log_debug2("%s destruction complete.\n", dev->ddf_dev->name); 152 207 return EOK; 153 208 } 154 /*----------------------------------------------------------------------------*/ 209 155 210 /** USB generic driver callbacks */ 156 static constusb_driver_ops_t usb_hid_driver_ops = {211 static usb_driver_ops_t usb_hid_driver_ops = { 157 212 .device_add = usb_hid_device_add, 158 .device_rem = usb_hid_device_rem,159 213 .device_gone = usb_hid_device_gone, 160 214 }; 161 /*----------------------------------------------------------------------------*/ 215 216 162 217 /** The driver itself. */ 163 static constusb_driver_t usb_hid_driver = {218 static usb_driver_t usb_hid_driver = { 164 219 .name = NAME, 165 220 .ops = &usb_hid_driver_ops, 166 221 .endpoints = usb_hid_endpoints 167 222 }; 168 /*----------------------------------------------------------------------------*/ 223 224 /*----------------------------------------------------------------------------*/ 225 169 226 int main(int argc, char *argv[]) 170 227 { … … 175 232 return usb_driver_main(&usb_hid_driver); 176 233 } 234 177 235 /** 178 236 * @}
Note:
See TracChangeset
for help on using the changeset viewer.