Changes in uspace/drv/usbkbd/main.c [101ef25c:0e126be7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbkbd/main.c
r101ef25c r0e126be7 28 28 #include <usb/usbdrv.h> 29 29 #include <driver.h> 30 #include <ipc/driver.h>31 30 #include <errno.h> 32 #include <fibril.h>33 #include <usb/classes/hid.h>34 31 35 32 #define BUFFER_SIZE 32 36 #define NAME "usbkbd"37 33 38 static const usb_endpoint_t CONTROL_EP = 0; 39 40 static usb_hid_dev_kbd_t *usbkbd_init_device(device_t *dev) 41 { 42 usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)malloc( 43 sizeof(usb_hid_dev_kbd_t)); 44 45 if (kbd_dev == NULL) { 46 fprintf(stderr, NAME ": No memory!\n"); 47 return NULL; 48 } 49 50 kbd_dev->device = dev; 51 52 // get phone to my HC and save it as my parent's phone 53 // TODO: maybe not a good idea if DDF will use parent_phone 54 kbd_dev->device->parent_phone = usb_drv_hc_connect(dev, 0); 55 56 kbd_dev->address = usb_drv_get_my_address(dev->parent_phone, 57 dev); 58 59 // doesn't matter now that we have no address 60 // if (kbd_dev->address < 0) { 61 // fprintf(stderr, NAME ": No device address!\n"); 62 // free(kbd_dev); 63 // return NULL; 64 // } 65 66 // default endpoint 67 kbd_dev->default_ep = CONTROL_EP; 68 69 // TODO: get descriptors 70 71 // TODO: parse descriptors and save endpoints 72 73 return kbd_dev; 74 } 75 76 static void usbkbd_process_interrupt_in(usb_hid_dev_kbd_t *kbd_dev, 77 char *buffer, size_t actual_size) 78 { 79 /* 80 * here, the parser will be called, probably with some callbacks 81 * now only take last 6 bytes and process, i.e. send to kbd 82 */ 83 } 84 85 static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev) 34 /* Call this periodically to check keyboard status changes. */ 35 static void poll_keyboard(device_t *dev) 86 36 { 87 37 int rc; … … 89 39 char buffer[BUFFER_SIZE]; 90 40 size_t actual_size; 91 //usb_endpoint_t poll_endpoint = 1;41 usb_endpoint_t poll_endpoint = 1; 92 42 93 //usb_address_t my_address = usb_drv_get_my_address(dev->parent_phone,94 //dev);95 //if (my_address < 0) {96 //return;97 //}43 usb_address_t my_address = usb_drv_get_my_address(dev->parent_phone, 44 dev); 45 if (my_address < 0) { 46 return; 47 } 98 48 99 49 usb_target_t poll_target = { 100 .address = kbd_dev->address,101 .endpoint = kbd_dev->default_ep50 .address = my_address, 51 .endpoint = poll_endpoint 102 52 }; 103 53 104 while (true) { 105 rc = usb_drv_async_interrupt_in(kbd_dev->device->parent_phone, 106 poll_target, buffer, BUFFER_SIZE, &actual_size, &handle); 107 108 if (rc != EOK) { 109 continue; 110 } 111 112 rc = usb_drv_async_wait_for(handle); 113 if (rc != EOK) { 114 continue; 115 } 116 117 /* 118 * If the keyboard answered with NAK, it returned no data. 119 * This implies that no change happened since last query. 120 */ 121 if (actual_size == 0) { 122 continue; 123 } 124 125 /* 126 * TODO: Process pressed keys. 127 */ 128 usbkbd_process_interrupt_in(kbd_dev, buffer, actual_size); 54 rc = usb_drv_async_interrupt_in(dev->parent_phone, poll_target, 55 buffer, BUFFER_SIZE, &actual_size, &handle); 56 if (rc != EOK) { 57 return; 129 58 } 130 59 131 // not reached 132 assert(0); 60 rc = usb_drv_async_wait_for(handle); 61 if (rc != EOK) { 62 return; 63 } 64 65 /* 66 * If the keyboard answered with NAK, it returned no data. 67 * This implies that no change happened since last query. 68 */ 69 if (actual_size == 0) { 70 return; 71 } 72 73 /* 74 * Process pressed keys. 75 */ 133 76 } 134 77 135 static int usbkbd_fibril_device(void *arg) 136 { 137 printf("!!! USB device fibril\n"); 138 139 if (arg == NULL) { 140 printf("No device!\n"); 141 return -1; 142 } 143 144 device_t *dev = (device_t *)arg; 145 146 // initialize device (get and process descriptors, get address, etc.) 147 usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev); 148 149 usbkbd_poll_keyboard(kbd_dev); 150 151 return EOK; 152 } 153 154 static int usbkbd_add_device(device_t *dev) 78 static int add_kbd_device(device_t *dev) 155 79 { 156 80 /* For now, fail immediately. */ 157 //return ENOTSUP;81 return ENOTSUP; 158 82 159 83 /* 160 84 * When everything is okay, connect to "our" HC. 161 *162 * Not supported yet, skip..163 85 */ 164 //int phone = usb_drv_hc_connect(dev, 0);165 //if (phone < 0) {166 ///*167 //* Connecting to HC failed, roll-back and announce168 //* failure.169 //*/170 //return phone;171 //}86 int phone = usb_drv_hc_connect(dev, 0); 87 if (phone < 0) { 88 /* 89 * Connecting to HC failed, roll-back and announce 90 * failure. 91 */ 92 return phone; 93 } 172 94 173 //dev->parent_phone = phone;95 dev->parent_phone = phone; 174 96 175 97 /* 176 * Create new fibril for handling this keyboard98 * Just for fun ;-). 177 99 */ 178 fid_t fid = fibril_create(usbkbd_fibril_device, dev); 179 if (fid == 0) { 180 printf("%s: failed to start fibril for HID device\n", NAME); 181 return ENOMEM; 182 } 183 fibril_add_ready(fid); 100 poll_keyboard(dev); 184 101 185 102 /* … … 190 107 191 108 static driver_ops_t kbd_driver_ops = { 192 .add_device = usbkbd_add_device,109 .add_device = add_kbd_device, 193 110 }; 194 111 195 112 static driver_t kbd_driver = { 196 .name = NAME,113 .name = "usbkbd", 197 114 .driver_ops = &kbd_driver_ops 198 115 };
Note:
See TracChangeset
for help on using the changeset viewer.