Nokia N900 >> Easy Debian

移植qemu 2.4.0.1


步驟如下:

+++ new/qemu-2.4.0.1/ui/gtk.c
--- old/qemu-2.4.0.1/ui/gtk.c
+ static GtkDisplayState *gN900GtkDisplayState=NULL;
void N900ReleaseGrab(void)
{
   // uncheck grab menu item
+ if(gN900GtkDisplayState){
+  gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gN900GtkDisplayState->grab_item), FALSE);
+ }
}

static bool gd_is_grab_active(GtkDisplayState *s)
{
+ gN900GtkDisplayState = s;
  return gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(s->grab_item));
}

+++ new/qemu-2.4.0.1/ui/input.c
--- old/qemu-2.4.0.1/ui/input.c
void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down)
{
  // 支援上、下、左、右鍵
+ if(num == 200) num = 0x48; // Up
+ else if(num == 208) num = 0x50; // Down
+ else if(num == 203) num = 0x4b; // Left
+ else if(num == 205) num = 0x4d; // Right
}

+++ new/qemu-2.4.0.1/hw/input/ps2.c
--- old/qemu-2.4.0.1/hw/input/ps2.c
+ void N900ReleaseGrab(void);

static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, InputEvent *evt)
{
  PS2KbdState *s = (PS2KbdState*)dev;
  int scancodes[3], i, count;
+ int code=0;
+ static int ctrl=0, alt=0, shift=0;

  qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
  count = qemu_input_key_value_to_scancode(
  evt->key->key, evt->key->down, scancodes);

  // remap scancode for n900 keyboard
+ for(i=0; i<count; i++){
+  code = scancodes[i];
+  //printf("steward, 0x%X\n", code);
+  if(code == 0x1d) ctrl = 1;
+  if(code == 0x9d) ctrl = 0;
+  if(code == 0x2a) shift = 1;
+  if(code == 0xaa) shift = 0;
+  if((code == 0xe0) && (scancodes[i - 1] == 0x38)) alt = 1;
+  if((code == 0xe0) && (scancodes[i - 1] == 0xb8)) alt = 0;

   // Ctrl+Shift -> poweroff
+  if(ctrl && shift){
+   printf("steward, enforce to exit\n");
+   exit(1);
+  }

+  if(code == 0xe0){
+   i+= 2;
+   continue;
+  }

+  if(alt){
+   switch(code){
+   case 0x10: // q -> 1
+    ps2_put_keycode(s, 0x02);
+    break;
+   case 0x11: // w -> 2
+    ps2_put_keycode(s, 0x03);
+    break;
+   case 0x12: // e -> 3 ^
+    if(shift){
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x07);
+     ps2_put_keycode(s, 0xaa);
+    }
+    else{
+     ps2_put_keycode(s, 0x04);
+    }
+    break;
+   case 0x13: // r -> 4 `
+    if(shift){
+     ps2_put_keycode(s, 0xaa);
+     ps2_put_keycode(s, 0x29);
+    }
+    else{
+     ps2_put_keycode(s, 0x05);
+    }
+    break;
+   case 0x14: // t -> 5
+    ps2_put_keycode(s, 0x06);
+    break;
+   case 0x15: // y -> 6 [
+    if(shift){
+      ps2_put_keycode(s, 0xaa);
+      ps2_put_keycode(s, 0x1a);
+    }
+    else{
+     ps2_put_keycode(s, 0x07);
+    }
+    break;
+   case 0x16: // u -> 7 ]
+    if(shift){
+     ps2_put_keycode(s, 0xaa);
+     ps2_put_keycode(s, 0x1b);
+    }
+    else{
+     ps2_put_keycode(s, 0x08);
+    }
+    break;
+   case 0x17: // i -> 8
+    ps2_put_keycode(s, 0x09);
+    break;
+   case 0x18: // o -> 9
+    ps2_put_keycode(s, 0x0a);
+    break;
+   case 0x19: // p -> 0
+    ps2_put_keycode(s, 0x0b);
+    break;
+   case 0x33: // , -> =
+    ps2_put_keycode(s, 0x0d);
+    break;
+   case 0x1e: // a -> *
+    ps2_put_keycode(s, 0x2a);
+    ps2_put_keycode(s, 0x09);
+    ps2_put_keycode(s, 0xaa);
+    break;
+   case 0x1f: // s -> +
+    ps2_put_keycode(s, 0x2a);
+    ps2_put_keycode(s, 0x0d);
+    ps2_put_keycode(s, 0xaa);
+    break;
+   case 0x20: // d -> #
+    ps2_put_keycode(s, 0x2a);
+    ps2_put_keycode(s, 0x04);
+    ps2_put_keycode(s, 0xaa);
+    break;
+   case 0x21: // f -> + ~
+    if(shift){
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x29);
+     ps2_put_keycode(s, 0xaa);
+    }
+    else{
+     ps2_put_keycode(s, 0x0c);
+    }
+    break;
+   case 0x22: // g -> _
+    if(ctrl){ // Ctrl+Alt+G
+     N900ReleaseGrab();
+    }
+    else{
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x0c);
+     ps2_put_keycode(s, 0xaa);
+    }
+    break;
+   case 0x23: // h -> ( <
+    if(shift){
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x33);
+     ps2_put_keycode(s, 0xaa);
+    }
+    else{
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x0a);
+     ps2_put_keycode(s, 0xaa);
+    }
+    break;
+   case 0x24: // j -> ) >
+    if(shift){
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x34);
+     ps2_put_keycode(s, 0xaa);
+    }
+    else{
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x0b);
+     ps2_put_keycode(s, 0xaa);
+    }
+    break;
+   case 0x25: // k -> &
+    if(shift){
+    }
+    else{
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x08);
+     ps2_put_keycode(s, 0xaa);
+    }
+    break;
+   case 0x26: // l -> ! |
+    if(shift){
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x2b);
+     ps2_put_keycode(s, 0xaa);
+    }
+    else{
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x02);
+     ps2_put_keycode(s, 0xaa);
+    }
+    break;
+   case 0x34: // . -> ?
+    ps2_put_keycode(s, 0x2a);
+    ps2_put_keycode(s, 0x35);
+    ps2_put_keycode(s, 0xaa);
+    break;
+   case 0x2d: // x -> $
+    ps2_put_keycode(s, 0x2a);
+    ps2_put_keycode(s, 0x05);
+    ps2_put_keycode(s, 0xaa);
+    break;
+   case 0x2f: // v -> / %
+    if(shift){
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x06);
+     ps2_put_keycode(s, 0xaa);
+    }
+    else{
+     ps2_put_keycode(s, 0x35);
+    }
+    break;
+   case 0x30: /* b -> \ */
+    ps2_put_keycode(s, 0x2b);
+    break;
+   case 0x31: // n -> " {
+    if(shift){
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x1a);
+     ps2_put_keycode(s, 0xaa);
+    }
+    else{
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x28);
+     ps2_put_keycode(s, 0xaa);
+    }
+    break;
+   case 0x32: // m -> ' }
+    if(shift){
+     ps2_put_keycode(s, 0x2a);
+     ps2_put_keycode(s, 0x1b);
+     ps2_put_keycode(s, 0xaa);
+    }
+    else{
+     ps2_put_keycode(s, 0x28);
+    }
+    break;
+   case 0x39: // space -> @
+    ps2_put_keycode(s, 0x2a);
+    ps2_put_keycode(s, 0x03);
+    ps2_put_keycode(s, 0xaa);
+    break;
+   case 0x0e: // backspace -> tab
+    ps2_put_keycode(s, 0x0f);
+    break;
+   case 0x48: // up -> page up
+    ps2_put_keycode(s, 0x49);
+    break;
+   case 0x50: // down -> page down
+    ps2_put_keycode(s, 0x51);
+    break;
+   case 0x4b: // left -> home
+    ps2_put_keycode(s, 0x47);
+    break;
+   case 0x4d: // right -> end
+    ps2_put_keycode(s, 0x4f);
+    break;
+   default:
+    break;
+   }
+  }
+  else{
+   if(shift){
+    switch(code){
+    case 0x0e: // backspace -> escape
+     ps2_put_keycode(s, 0x01);
+     break;
+    case 0x33: // , -> ;
+     ps2_put_keycode(s, 0xaa);
+     ps2_put_keycode(s, 0x27);
+     break;
+    case 0x34: // . -> :
+     ps2_put_keycode(s, 0x27);
+     break;
+    default:
+     ps2_put_keycode(s, code);
+     break;
+    }
+   }
+   else{
+    ps2_put_keycode(s, code);
+   }
+  }
+ }
}

特殊按鍵

特殊鍵功能
Ctrl + ShiftPoweroff
Ctrl + Alt + gRelease Grab

一般按鍵

KeyShift + KeyAlt + KeyAlt + Shift + Key
qQ1q
wW2w
eE3^
rR4`
tT5t
yY6[
uU7]
iI8i
oO9o
pP0p
,;=,
backspaceescapetabbackspace
aA*a
sS+s
dD#d
fF-~
gG_g
hH(<
jJ)>
kK&k
lL!|
.:?.
zZzz
xX$x
cCcc
vV/%
bB\b
hN"{
mM'}
spacespace@space


返回上一頁