Rev 1613 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1613 | Rev 1875 | ||
---|---|---|---|
Line 13... | Line 13... | ||
13 | struct hid_class_descriptor desc[1]; |
13 | struct hid_class_descriptor desc[1]; |
14 | } __attribute__ ((packed)); |
14 | } __attribute__ ((packed)); |
Line 15... | Line 15... | ||
15 | 15 | ||
- | 16 | void create_hid_mouse(udev_t *dev, endpoint_descr_t *en_d); |
|
Line 16... | Line 17... | ||
16 | void create_hid_mouse(udev_t *dev, endpoint_descr_t *en_d); |
17 | void create_hid_keyboard(udev_t *dev, endpoint_descr_t *en_d); |
17 | 18 | ||
18 | bool init_hid(udev_t *dev) |
19 | bool init_hid(udev_t *dev) |
19 | { |
20 | { |
Line 91... | Line 92... | ||
91 | ep->bEndpointAddress, ep->bmAttributes, |
92 | ep->bEndpointAddress, ep->bmAttributes, |
92 | ep->wMaxPacketSize, ep->bInterval); |
93 | ep->wMaxPacketSize, ep->bInterval); |
93 | dptr+= ep->bLength; |
94 | dptr+= ep->bLength; |
94 | 95 | ||
Line 95... | Line 96... | ||
95 | if( interface->bInterfaceProtocol == 2) |
96 | switch(interface->bInterfaceProtocol) |
- | 97 | { |
|
- | 98 | case 1: |
|
- | 99 | create_hid_keyboard(dev, ep); |
|
- | 100 | break; |
|
- | 101 | ||
- | 102 | case 2: |
|
96 | create_hid_mouse(dev, ep); |
103 | create_hid_mouse(dev, ep); |
- | 104 | break; |
|
- | 105 | } |
|
97 | // } |
106 | // } |
98 | return true; |
107 | return true; |
99 | }; |
108 | }; |
Line 116... | Line 125... | ||
116 | td->token ^= DATA1; |
125 | td->token ^= DATA1; |
117 | 126 | ||
Line 118... | Line 127... | ||
118 | u32_t efl = safe_cli(); |
127 | u32_t efl = safe_cli(); |
119 | list_add_tail(&rq->list, &dev->host->rq_list); |
128 | list_add_tail(&rq->list, &dev->host->rq_list); |
- | 129 | qh = dev->host->qh[rq->qnum]; |
|
- | 130 | qh->qelem = rq->td_head->dma; |
|
- | 131 | mb(); |
|
- | 132 | safe_sti(efl); |
|
- | 133 | ||
- | 134 | return true; |
|
- | 135 | }; |
|
- | 136 | ||
- | 137 | typedef union |
|
- | 138 | { |
|
- | 139 | uint16_t value; |
|
- | 140 | struct |
|
- | 141 | { |
|
- | 142 | uint8_t code; |
|
- | 143 | uint8_t ecode; |
|
- | 144 | }; |
|
- | 145 | }scancode_t; |
|
- | 146 | ||
- | 147 | static const uint16_t usb_keycode[256] = |
|
- | 148 | { |
|
- | 149 | /* 0 1 2 3 4 5 6 7 */ |
|
- | 150 | /* 8 9 A B C D E F */ |
|
- | 151 | ||
- | 152 | 0x0000, 0x0000, 0x0000, 0x0000, 0x001E, 0x0030, 0x002E, 0x0020, /* 0x00 */ |
|
- | 153 | 0x0012, 0x0021, 0x0022, 0x0023, 0x0017, 0x0024, 0x0025, 0x0026, |
|
- | 154 | ||
- | 155 | 0x0032, 0x0031, 0x0018, 0x0019, 0x0010, 0x0013, 0x001F, 0x0014, /* 0x10 */ |
|
- | 156 | 0x0016, 0x002F, 0x0011, 0x002D, 0x0015, 0x002C, 0x0002, 0x0003, |
|
- | 157 | ||
- | 158 | 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, /* 0x20 */ |
|
- | 159 | 0x001C, 0x0001, 0x000E, 0x000F, 0x0039, 0x000C, 0x000D, 0x001A, |
|
- | 160 | ||
- | 161 | 0x001B, 0x002B, 0x002B, 0x0027, 0x0028, 0x0029, 0x0033, 0x0034, /* 0x30 */ |
|
- | 162 | 0x0035, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, |
|
- | 163 | ||
- | 164 | 0x0041, 0x0042, 0x0043, 0x0044, 0x0057, 0x0058, 0xE037, 0x0046, /* 0x40 */ |
|
- | 165 | 0x0000, 0xE052, 0xE047, 0xE049, 0xE053, 0xE04F, 0xE051, 0xE04D, |
|
- | 166 | ||
- | 167 | 0xE04B, 0xE050, 0xE048, 0x0045, 0xE035, 0x0037, 0x004A, 0x004E, /* 0x50 */ |
|
- | 168 | 0xE01C, 0x004F, 0x0050, 0x0051, 0x004B, 0x004C, 0x004D, 0x0047, |
|
- | 169 | ||
- | 170 | 0x0048, 0x0049, 0x0052, 0x0053, 0x0056, 0xE05D, 0xE05E, 0x0059, /* 0x60 */ |
|
- | 171 | 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, |
|
- | 172 | ||
- | 173 | 0x006C, 0x006D, 0x006E, 0x0076, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x70 */ |
|
- | 174 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|
- | 175 | ||
- | 176 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x0000, 0x0073, /* 0x80 */ |
|
- | 177 | 0x0070, 0x007D, 0x0079, 0x007B, 0x005C, 0x0000, 0x0000, 0x0000, |
|
- | 178 | ||
- | 179 | 0x00F2, 0x00F1, 0x0078, 0x0077, 0x0076, 0x0000, 0x0000, 0x0000, /* 0x90 */ |
|
- | 180 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|
- | 181 | ||
- | 182 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xA0 */ |
|
- | 183 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|
- | 184 | ||
- | 185 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xB0 */ |
|
- | 186 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|
- | 187 | ||
- | 188 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xC0 */ |
|
- | 189 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|
- | 190 | ||
- | 191 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xD0 */ |
|
- | 192 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|
- | 193 | ||
- | 194 | 0x001D, 0x002A, 0x0038, 0xE05B, 0xE01D, 0x0036, 0xE038, 0xE05C, /* 0xE0 */ |
|
- | 195 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|
- | 196 | ||
- | 197 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xFE0 */ |
|
- | 198 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|
- | 199 | ||
- | 200 | }; |
|
- | 201 | ||
- | 202 | static uint8_t kbd_old[8]; |
|
- | 203 | ||
- | 204 | bool keyboard_handler(udev_t *dev, struct tag_request *rq) |
|
- | 205 | { |
|
- | 206 | td_t *td; |
|
- | 207 | qh_t *qh; |
|
- | 208 | ||
- | 209 | uint8_t *data; |
|
- | 210 | int i; |
|
- | 211 | ||
- | 212 | td = rq->td_head; |
|
- | 213 | ||
- | 214 | if( (td->status &0x7FF)==rq->size-1) |
|
- | 215 | { |
|
- | 216 | uint8_t action; |
|
- | 217 | scancode_t scan; |
|
- | 218 | ||
- | 219 | data = (uint8_t*)rq->data; |
|
- | 220 | ||
- | 221 | action = data[0] ^ kbd_old[0]; |
|
- | 222 | ||
- | 223 | for (i = 0; i < 8; i++) |
|
- | 224 | { |
|
- | 225 | if(action & 1) |
|
- | 226 | { |
|
- | 227 | scan.value = usb_keycode[i+224]; |
|
- | 228 | ||
- | 229 | if(data[0]>>i & 1) |
|
- | 230 | { |
|
- | 231 | if(scan.ecode) |
|
- | 232 | SetKeyboardData(scan.ecode); |
|
- | 233 | SetKeyboardData(scan.code); |
|
- | 234 | } |
|
- | 235 | else |
|
- | 236 | { |
|
- | 237 | if(scan.ecode) |
|
- | 238 | SetKeyboardData(scan.ecode); |
|
- | 239 | SetKeyboardData(scan.code|0x80); |
|
- | 240 | }; |
|
- | 241 | } |
|
- | 242 | action >>= 1; |
|
- | 243 | } |
|
- | 244 | ||
- | 245 | ||
- | 246 | for (i = 2; i < 8; i++) |
|
- | 247 | { |
|
- | 248 | if ((kbd_old[i] > 3) && (memscan(data+2, kbd_old[i], 6) == data+8)) |
|
- | 249 | { |
|
- | 250 | scan.value = usb_keycode[kbd_old[i]]; |
|
- | 251 | ||
- | 252 | if (scan.value) |
|
- | 253 | { |
|
- | 254 | if(scan.ecode) |
|
- | 255 | SetKeyboardData(scan.ecode); |
|
- | 256 | SetKeyboardData(scan.code|0x80); |
|
- | 257 | // input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0); |
|
- | 258 | } |
|
- | 259 | else |
|
- | 260 | dbgprintf("Unknown key (scancode %#x) released.\n", kbd_old[i]); |
|
- | 261 | } |
|
- | 262 | ||
- | 263 | if ((data[i] > 3) && (memscan(kbd_old+2, data[i], 6) == kbd_old+8)) |
|
- | 264 | { |
|
- | 265 | scan.value = usb_keycode[data[i]]; |
|
- | 266 | ||
- | 267 | if (scan.value) |
|
- | 268 | { |
|
- | 269 | if(scan.ecode) |
|
- | 270 | SetKeyboardData(scan.ecode); |
|
- | 271 | SetKeyboardData(scan.code); |
|
- | 272 | //input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1); |
|
- | 273 | } |
|
- | 274 | else |
|
- | 275 | dbgprintf("Unknown key (scancode %#x) released.\n", data[i]); |
|
- | 276 | } |
|
- | 277 | } |
|
- | 278 | memcpy(kbd_old, data, 8); |
|
- | 279 | }; |
|
- | 280 | ||
- | 281 | td->status = TD_CTRL_ACTIVE | TD_CTRL_IOC | dev->speed; |
|
- | 282 | td->token ^= DATA1; |
|
- | 283 | ||
- | 284 | u32_t efl = safe_cli(); |
|
- | 285 | list_add_tail(&rq->list, &dev->host->rq_list); |
|
120 | qh = dev->host->qh[6]; |
286 | qh = dev->host->qh[rq->qnum]; |
121 | qh->qelem = rq->td_head->dma; |
287 | qh->qelem = rq->td_head->dma; |
122 | mb(); |
288 | mb(); |
123 | safe_sti(efl); |
289 | safe_sti(efl); |
Line 124... | Line 290... | ||
124 | 290 | ||
Line 133... | Line 299... | ||
133 | addr_t address; |
299 | addr_t address; |
134 | addr_t size; |
300 | addr_t size; |
135 | u32_t toggle; |
301 | u32_t toggle; |
Line 136... | Line -... | ||
136 | - | ||
137 | void *packet; |
- | |
138 | - | ||
139 | td_t *td; |
302 | |
Line 140... | Line 303... | ||
140 | qh_t *qh; |
303 | qh_t *qh; |
141 | 304 | ||
Line 148... | Line 311... | ||
148 | enp.address = en_d->bEndpointAddress; |
311 | enp.address = en_d->bEndpointAddress; |
149 | enp.size = en_d->wMaxPacketSize; |
312 | enp.size = en_d->wMaxPacketSize; |
150 | enp.toggle = DATA0; |
313 | enp.toggle = DATA0; |
Line 151... | Line 314... | ||
151 | 314 | ||
Line 152... | Line -... | ||
152 | packet = kzalloc(enp.size, 0); |
- | |
153 | 315 | rq = alloc_rq_buffer(dev, &enp, DIN, enp.size); |
|
154 | rq = create_request(dev, &enp, DIN, packet, enp.size); |
316 | |
Line 155... | Line 317... | ||
155 | rq->qnum = 6; |
317 | rq->qnum = 6; |
156 | rq->handler = &mouse_handler; |
318 | rq->handler = &mouse_handler; |
157 | 319 | ||
158 | u32_t efl = safe_cli(); |
320 | u32_t efl = safe_cli(); |
159 | list_add_tail(&rq->list, &dev->host->rq_list); |
321 | list_add_tail(&rq->list, &dev->host->rq_list); |
160 | qh = dev->host->qh[6]; |
322 | qh = dev->host->qh[rq->qnum]; |
Line 161... | Line 323... | ||
161 | qh->qelem = rq->td_head->dma; |
323 | qh->qelem = rq->td_head->dma; |
162 | mb(); |
324 | mb(); |
- | 325 | safe_sti(efl); |
|
- | 326 | ||
- | 327 | dbgprintf("%s\n",__FUNCTION__); |
|
- | 328 | } |
|
- | 329 | ||
- | 330 | void create_hid_keyboard(udev_t *dev, endpoint_descr_t *en_d) |
|
- | 331 | { |
|
- | 332 | request_t *rq; |
|
- | 333 | endp_t enp; |
|
- | 334 | ||
- | 335 | addr_t address; |
|
- | 336 | addr_t size; |
|
- | 337 | u32_t toggle; |
|
- | 338 | ||
- | 339 | qh_t *qh; |
|
- | 340 | ||
- | 341 | static u16_t __attribute__((aligned(16))) |
|
- | 342 | req_set_conf[4] = {0x0900,0x0001,0x0000,0x0000}; |
|
- | 343 | ||
- | 344 | if( !ctrl_request(dev, req_set_conf, DOUT, 0, 0)) |
|
- | 345 | return; |
|
- | 346 | ||
- | 347 | enp.address = en_d->bEndpointAddress; |
|
- | 348 | enp.size = en_d->wMaxPacketSize; |
|
- | 349 | enp.toggle = DATA0; |
|
- | 350 | ||
- | 351 | rq = alloc_rq_buffer(dev, &enp, DIN, enp.size); |
|
- | 352 | ||
- | 353 | rq->qnum = 4; |
|
- | 354 | rq->handler = &keyboard_handler; |
|
- | 355 | ||
- | 356 | u32_t efl = safe_cli(); |
|
- | 357 | list_add_tail(&rq->list, &dev->host->rq_list); |
|
- | 358 | qh = dev->host->qh[rq->qnum]; |
|
- | 359 | qh->qelem = rq->td_head->dma; |
|
- | 360 | mb(); |
|
- | 361 | safe_sti(efl); |
|
- | 362 | ||
- | 363 | dbgprintf("%s\n",__FUNCTION__); |
|
- | 364 | } |
|
- | 365 | ||
- | 366 | void *memscan(void *addr, int c, size_t size) |
|
- | 367 | { |
|
- | 368 | if (!size) |
|
- | 369 | return addr; |
|
- | 370 | __asm__ __volatile__( |
|
- | 371 | "repnz; scasb \n\t" |
|
- | 372 | "jnz 1f \n\t" |
|
- | 373 | "dec %%edi \n\t" |
|
- | 374 | "1:" |
|
- | 375 | : "=D" (addr), "=c" (size) |
|
- | 376 | : "D" (addr), "1" (size), "a" (c) |