goldfish_events_device.c revision cccd28ca5064a7bd14282cd774ee5bb7126d5845
1/* Copyright (C) 2007-2008 The Android Open Source Project 2** 3** This software is licensed under the terms of the GNU General Public 4** License version 2, as published by the Free Software Foundation, and 5** may be copied, distributed, and modified under those terms. 6** 7** This program is distributed in the hope that it will be useful, 8** but WITHOUT ANY WARRANTY; without even the implied warranty of 9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10** GNU General Public License for more details. 11*/ 12#include "qemu_file.h" 13#include "android/hw-events.h" 14#include "android/charmap.h" 15#include "android/globals.h" /* for android_hw */ 16#include "irq.h" 17#include "user-events.h" 18#include "console.h" 19 20#define MAX_EVENTS 256*4 21 22enum { 23 REG_READ = 0x00, 24 REG_SET_PAGE = 0x00, 25 REG_LEN = 0x04, 26 REG_DATA = 0x08, 27 28 PAGE_NAME = 0x00000, 29 PAGE_EVBITS = 0x10000, 30 PAGE_ABSDATA = 0x20000 | EV_ABS, 31}; 32 33/* These corresponds to the state of the driver. 34 * Unfortunately, we have to buffer events coming 35 * from the UI, since the kernel driver is not 36 * capable of receiving them until XXXXXX 37 */ 38enum { 39 STATE_INIT = 0, /* The device is initialized */ 40 STATE_BUFFERED, /* Events have been buffered, but no IRQ raised yet */ 41 STATE_LIVE /* Events can be sent directly to the kernel */ 42}; 43 44/* NOTE: The ev_bits arrays are used to indicate to the kernel 45 * which events can be sent by the emulated hardware. 46 */ 47 48typedef struct 49{ 50 uint32_t base; 51 qemu_irq irq; 52 int pending; 53 int page; 54 55 unsigned events[MAX_EVENTS]; 56 unsigned first; 57 unsigned last; 58 unsigned state; 59 60 const char *name; 61 62 struct { 63 size_t len; 64 uint8_t *bits; 65 } ev_bits[EV_MAX + 1]; 66 67 int32_t *abs_info; 68 size_t abs_info_count; 69} events_state; 70 71/* modify this each time you change the events_device structure. you 72 * will also need to upadte events_state_load and events_state_save 73 */ 74#define EVENTS_STATE_SAVE_VERSION 2 75 76#undef QFIELD_STRUCT 77#define QFIELD_STRUCT events_state 78 79QFIELD_BEGIN(events_state_fields) 80 QFIELD_INT32(pending), 81 QFIELD_INT32(page), 82 QFIELD_BUFFER(events), 83 QFIELD_INT32(first), 84 QFIELD_INT32(last), 85 QFIELD_INT32(state), 86QFIELD_END 87 88static void events_state_save(QEMUFile* f, void* opaque) 89{ 90 events_state* s = opaque; 91 92 qemu_put_struct(f, events_state_fields, s); 93} 94 95static int events_state_load(QEMUFile* f, void* opaque, int version_id) 96{ 97 events_state* s = opaque; 98 99 if (version_id != EVENTS_STATE_SAVE_VERSION) 100 return -1; 101 102 return qemu_get_struct(f, events_state_fields, s); 103} 104 105extern const char* android_skin_keycharmap; 106 107static void enqueue_event(events_state *s, unsigned int type, unsigned int code, int value) 108{ 109 int enqueued = s->last - s->first; 110 111 if (enqueued < 0) 112 enqueued += MAX_EVENTS; 113 114 if (enqueued + 3 > MAX_EVENTS) { 115 fprintf(stderr, "##KBD: Full queue, lose event\n"); 116 return; 117 } 118 119 if(s->first == s->last) { 120 if (s->state == STATE_LIVE) 121 qemu_irq_raise(s->irq); 122 else { 123 s->state = STATE_BUFFERED; 124 } 125 } 126 127 //fprintf(stderr, "##KBD: type=%d code=%d value=%d\n", type, code, value); 128 129 s->events[s->last] = type; 130 s->last = (s->last + 1) & (MAX_EVENTS-1); 131 s->events[s->last] = code; 132 s->last = (s->last + 1) & (MAX_EVENTS-1); 133 s->events[s->last] = value; 134 s->last = (s->last + 1) & (MAX_EVENTS-1); 135} 136 137static unsigned dequeue_event(events_state *s) 138{ 139 unsigned n; 140 141 if(s->first == s->last) { 142 return 0; 143 } 144 145 n = s->events[s->first]; 146 147 s->first = (s->first + 1) & (MAX_EVENTS - 1); 148 149 if(s->first == s->last) { 150 qemu_irq_lower(s->irq); 151 } 152#ifdef TARGET_I386 153 /* 154 * Adding the logic to handle edge-triggered interrupts for x86 155 * because the exisiting goldfish events device basically provides 156 * level-trigger interrupts only. 157 * 158 * Logic: When an event (including the type/code/value) is fetched 159 * by the driver, if there is still another event in the event 160 * queue, the goldfish event device will re-assert the IRQ so that 161 * the driver can be notified to fetch the event again. 162 */ 163 else if (((s->first + 2) & (MAX_EVENTS - 1)) < s->last || 164 (s->first & (MAX_EVENTS - 1)) > s->last) { /* if there still is an event */ 165 qemu_irq_lower(s->irq); 166 qemu_irq_raise(s->irq); 167 } 168#endif 169 return n; 170} 171 172static const char* 173get_charmap_name(events_state *s) 174{ 175 if (s->name != NULL) 176 return s->name; 177 178 s->name = android_get_charmap_name(); 179 return s->name; 180} 181 182 183static int get_page_len(events_state *s) 184{ 185 int page = s->page; 186 if (page == PAGE_NAME) { 187 const char* name = get_charmap_name(s); 188 return strlen(name); 189 } if (page >= PAGE_EVBITS && page <= PAGE_EVBITS + EV_MAX) 190 return s->ev_bits[page - PAGE_EVBITS].len; 191 if (page == PAGE_ABSDATA) 192 return s->abs_info_count * sizeof(s->abs_info[0]); 193 return 0; 194} 195 196static int get_page_data(events_state *s, int offset) 197{ 198 int page_len = get_page_len(s); 199 int page = s->page; 200 if (offset > page_len) 201 return 0; 202 if (page == PAGE_NAME) { 203 const char* name = get_charmap_name(s); 204 return name[offset]; 205 } if (page >= PAGE_EVBITS && page <= PAGE_EVBITS + EV_MAX) 206 return s->ev_bits[page - PAGE_EVBITS].bits[offset]; 207 if (page == PAGE_ABSDATA) { 208 return s->abs_info[offset / sizeof(s->abs_info[0])]; 209 } 210 return 0; 211} 212 213static uint32_t events_read(void *x, target_phys_addr_t off) 214{ 215 events_state *s = (events_state *) x; 216 int offset = off; // - s->base; 217 218 /* This gross hack below is used to ensure that we 219 * only raise the IRQ when the kernel driver is 220 * properly ready! If done before this, the driver 221 * becomes confused and ignores all input events 222 * as soon as one was buffered! 223 */ 224 if (offset == REG_LEN && s->page == PAGE_ABSDATA) { 225 if (s->state == STATE_BUFFERED) 226 qemu_irq_raise(s->irq); 227 s->state = STATE_LIVE; 228 } 229 230 if (offset == REG_READ) 231 return dequeue_event(s); 232 else if (offset == REG_LEN) 233 return get_page_len(s); 234 else if (offset >= REG_DATA) 235 return get_page_data(s, offset - REG_DATA); 236 return 0; // this shouldn't happen, if the driver does the right thing 237} 238 239static void events_write(void *x, target_phys_addr_t off, uint32_t val) 240{ 241 events_state *s = (events_state *) x; 242 int offset = off; // - s->base; 243 if (offset == REG_SET_PAGE) 244 s->page = val; 245} 246 247static CPUReadMemoryFunc *events_readfn[] = { 248 events_read, 249 events_read, 250 events_read 251}; 252 253static CPUWriteMemoryFunc *events_writefn[] = { 254 events_write, 255 events_write, 256 events_write 257}; 258 259static void events_put_keycode(void *x, int keycode) 260{ 261 events_state *s = (events_state *) x; 262 263 enqueue_event(s, EV_KEY, keycode&0x1ff, (keycode&0x200) ? 1 : 0); 264} 265 266static void events_put_mouse(void *opaque, int dx, int dy, int dz, int buttons_state) 267{ 268 events_state *s = (events_state *) opaque; 269 /* in the Android emulator, we use dz == 0 for touchscreen events, 270 * and dz == 1 for trackball events. See the kbd_mouse_event calls 271 * in android/skin/trackball.c and android/skin/window.c 272 */ 273 if (dz == 0) { 274 enqueue_event(s, EV_ABS, ABS_X, dx); 275 enqueue_event(s, EV_ABS, ABS_Y, dy); 276 enqueue_event(s, EV_ABS, ABS_Z, dz); 277 enqueue_event(s, EV_KEY, BTN_TOUCH, buttons_state&1); 278 } else { 279 enqueue_event(s, EV_REL, REL_X, dx); 280 enqueue_event(s, EV_REL, REL_Y, dy); 281 } 282 enqueue_event(s, EV_SYN, 0, 0); 283} 284 285static void events_put_generic(void* opaque, int type, int code, int value) 286{ 287 events_state *s = (events_state *) opaque; 288 289 enqueue_event(s, type, code, value); 290} 291 292/* set bits [bitl..bith] in the ev_bits[type] array 293 */ 294static void 295events_set_bits(events_state *s, int type, int bitl, int bith) 296{ 297 uint8_t *bits; 298 uint8_t maskl, maskh; 299 int il, ih; 300 il = bitl / 8; 301 ih = bith / 8; 302 if (ih >= s->ev_bits[type].len) { 303 bits = qemu_mallocz(ih + 1); 304 if (bits == NULL) 305 return; 306 memcpy(bits, s->ev_bits[type].bits, s->ev_bits[type].len); 307 qemu_free(s->ev_bits[type].bits); 308 s->ev_bits[type].bits = bits; 309 s->ev_bits[type].len = ih + 1; 310 } 311 else 312 bits = s->ev_bits[type].bits; 313 maskl = 0xffU << (bitl & 7); 314 maskh = 0xffU >> (7 - (bith & 7)); 315 if (il >= ih) 316 maskh &= maskl; 317 else { 318 bits[il] |= maskl; 319 while (++il < ih) 320 bits[il] = 0xff; 321 } 322 bits[ih] |= maskh; 323} 324 325static void 326events_set_bit(events_state* s, int type, int bit) 327{ 328 events_set_bits(s, type, bit, bit); 329} 330 331static void 332events_clr_bit(events_state* s, int type, int bit) 333{ 334 int ii = bit / 8; 335 if (ii < s->ev_bits[type].len) { 336 uint8_t* bits = s->ev_bits[type].bits; 337 uint8_t mask = 0x01U << (bit & 7); 338 bits[ii] &= ~mask; 339 } 340} 341 342void events_dev_init(uint32_t base, qemu_irq irq) 343{ 344 events_state *s; 345 int iomemtype; 346 AndroidHwConfig* config = android_hw; 347 348 s = (events_state *) qemu_mallocz(sizeof(events_state)); 349 350 // charmap name will be determined on demand 351 s->name = NULL; 352 353 /* now set the events capability bits depending on hardware configuration */ 354 /* apparently, the EV_SYN array is used to indicate which other 355 * event classes to consider. 356 */ 357 358 /* configure EV_KEY array 359 * 360 * All Android devices must have the following keys: 361 * KEY_HOME, KEY_BACK, KEY_SEND (Call), KEY_END (EndCall), 362 * KEY_SOFT1 (Menu), VOLUME_UP, VOLUME_DOWN 363 * 364 * Note that previous models also had a KEY_SOFT2, 365 * and a KEY_POWER which we still support here. 366 * 367 * Newer models have a KEY_SEARCH key, which we always 368 * enable here. 369 * 370 * A Dpad will send: KEY_DOWN / UP / LEFT / RIGHT / CENTER 371 * 372 * The KEY_CAMERA button isn't very useful if there is no camera. 373 * 374 * BTN_MOUSE is sent when the trackball is pressed 375 * BTN_TOUCH is sent when the touchscreen is pressed 376 */ 377 events_set_bit (s, EV_SYN, EV_KEY ); 378 379 events_set_bit(s, EV_KEY, KEY_HOME); 380 events_set_bit(s, EV_KEY, KEY_BACK); 381 events_set_bit(s, EV_KEY, KEY_SEND); 382 events_set_bit(s, EV_KEY, KEY_END); 383 events_set_bit(s, EV_KEY, KEY_SOFT1); 384 events_set_bit(s, EV_KEY, KEY_VOLUMEUP); 385 events_set_bit(s, EV_KEY, KEY_VOLUMEDOWN); 386 events_set_bit(s, EV_KEY, KEY_SOFT2); 387 events_set_bit(s, EV_KEY, KEY_POWER); 388 events_set_bit(s, EV_KEY, KEY_SEARCH); 389 390 if (config->hw_dPad) { 391 events_set_bit(s, EV_KEY, KEY_DOWN); 392 events_set_bit(s, EV_KEY, KEY_UP); 393 events_set_bit(s, EV_KEY, KEY_LEFT); 394 events_set_bit(s, EV_KEY, KEY_RIGHT); 395 events_set_bit(s, EV_KEY, KEY_CENTER); 396 } 397 398 if (config->hw_trackBall) { 399 events_set_bit(s, EV_KEY, BTN_MOUSE); 400 } 401 if (config->hw_touchScreen) { 402 events_set_bit(s, EV_KEY, BTN_TOUCH); 403 } 404 405 if (config->hw_camera) { 406 events_set_bit(s, EV_KEY, KEY_CAMERA); 407 } 408 409 if (config->hw_keyboard) { 410 /* since we want to implement Unicode reverse-mapping 411 * allow any kind of key, even those not available on 412 * the skin. 413 * 414 * the previous code did set the [1..0x1ff] range, but 415 * we don't want to enable certain bits in the middle 416 * of the range that are registered for mouse/trackball/joystick 417 * events. 418 * 419 * see "linux_keycodes.h" for the list of events codes. 420 */ 421 events_set_bits(s, EV_KEY, 1, 0xff); 422 events_set_bits(s, EV_KEY, 0x160, 0x1ff); 423 424 /* If there is a keyboard, but no DPad, we need to clear the 425 * corresponding bits. Doing this is simpler than trying to exclude 426 * the DPad values from the ranges above. 427 */ 428 if (!config->hw_dPad) { 429 events_clr_bit(s, EV_KEY, KEY_DOWN); 430 events_clr_bit(s, EV_KEY, KEY_UP); 431 events_clr_bit(s, EV_KEY, KEY_LEFT); 432 events_clr_bit(s, EV_KEY, KEY_RIGHT); 433 events_clr_bit(s, EV_KEY, KEY_CENTER); 434 } 435 } 436 437 /* configure EV_REL array 438 * 439 * EV_REL events are sent when the trackball is moved 440 */ 441 if (config->hw_trackBall) { 442 events_set_bit (s, EV_SYN, EV_REL ); 443 events_set_bits(s, EV_REL, REL_X, REL_Y); 444 } 445 446 /* configure EV_ABS array. 447 * 448 * EV_ABS events are sent when the touchscreen is pressed 449 */ 450 if (config->hw_touchScreen) { 451 int32_t* values; 452 453 events_set_bit (s, EV_SYN, EV_ABS ); 454 events_set_bits(s, EV_ABS, ABS_X, ABS_Z); 455 /* Allocate the absinfo to report the min/max bounds for each 456 * absolute dimension. The array must contain 3 tuples 457 * of (min,max,fuzz,flat) 32-bit values. 458 * 459 * min and max are the bounds 460 * fuzz corresponds to the device's fuziness, we set it to 0 461 * flat corresponds to the flat position for JOEYDEV devices, 462 * we also set it to 0. 463 * 464 * There is no need to save/restore this array in a snapshot 465 * since the values only depend on the hardware configuration. 466 */ 467 s->abs_info_count = 3*4; 468 s->abs_info = values = malloc(sizeof(uint32_t)*s->abs_info_count); 469 470 /* ABS_X min/max/fuzz/flat */ 471 values[0] = 0; 472 values[1] = config->hw_lcd_width-1; 473 values[2] = 0; 474 values[3] = 0; 475 values += 4; 476 477 /* ABS_Y */ 478 values[0] = 0; 479 values[1] = config->hw_lcd_height-1; 480 values[2] = 0; 481 values[3] = 0; 482 values += 4; 483 484 /* ABS_Z */ 485 values[0] = 0; 486 values[1] = 1; 487 values[2] = 0; 488 values[3] = 0; 489 } 490 491 /* configure EV_SW array 492 * 493 * EW_SW events are sent to indicate that the keyboard lid 494 * was closed or opened (done when we switch layouts through 495 * KP-7 or KP-9). 496 * 497 * We only support this when hw.keyboard.lid is true. 498 */ 499 if (config->hw_keyboard && config->hw_keyboard_lid) { 500 events_set_bit(s, EV_SYN, EV_SW); 501 events_set_bit(s, EV_SW, 0); 502 } 503 504 iomemtype = cpu_register_io_memory(events_readfn, events_writefn, s); 505 506 cpu_register_physical_memory(base, 0xfff, iomemtype); 507 508 qemu_add_kbd_event_handler(events_put_keycode, s); 509 qemu_add_mouse_event_handler(events_put_mouse, s, 1, "goldfish-events"); 510 511 s->base = base; 512 s->irq = irq; 513 514 s->first = 0; 515 s->last = 0; 516 s->state = STATE_INIT; 517 518 /* This function migh fire buffered events to the device, so 519 * ensure that it is called after initialization is complete 520 */ 521 user_event_register_generic(s, events_put_generic); 522 523 register_savevm( "events_state", 0, EVENTS_STATE_SAVE_VERSION, 524 events_state_save, events_state_load, s ); 525} 526