Neues Keyboard Layout / wskbdmap_mfii.c

Hi,

ich habe ein neues MBPro :) (Typ A1286, Baujahr Feb 2012, mit schweizer Keyboard Layout), welches sich im OpenBSD52 GENERIC Kernel als Macbbok Pro 8.2 zu erkennen gibt. Jetzt wollte ich mal mein Keyboard anpassen. Zunächst ein bischen mit wsconsctl gespielt, damit ich auf der Konsole (ohne X !) die richtigen Umlaute und Sonderzeichen habe. Aber besonders die Tasten grösser/kleiner und Dollar/Pfund spielen nicht mit. Nur aufgerufen als "wsconsctl keyboard.map" zeigt mir die Konsole an, was gerade eingestellt ist. Das kann man dann eben nach Belieben anpassen:
Code:
wsconsctl keyboard.encoding=de  \
  keyboard.map+="keycode  30 = 1 plus " \
  keyboard.map+="keycode  31 = 2 quotedbl " \
  keyboard.map+="keycode  32 = 3 asterisk " \
  keyboard.map+="keycode  33 = 4 ccedilla " \
  keyboard.map+="keycode  34 = 5 percent " \
  keyboard.map+="keycode  35 = 6 ampersand " \
  keyboard.map+="keycode  36 = 7 slash " \
  keyboard.map+="keycode  37 = 8 parenleft " \
  keyboard.map+="keycode  38 = 9 parenright " \
  keyboard.map+="keycode  39 = 0 equal " \
  keyboard.map+="keycode  45 = apostrophe question backslash " \
  keyboard.map+="keycode  46 = dead_circumflex dead_grave " \
  keyboard.map+="keycode  48 = asciicircum exclam " \
  keyboard.map+="keycode  49 = apostrophe numbersign " \
  keyboard.map+="keycode  50 = asciicircum exclam " \
  keyboard.map+="keycode  53 = less greater bar " \
  keyboard.map+="keycode 100 = dead_circumflex dead_abovering "
Am Ende hat das ganz gut funktioniert, habe aber nicht alle Tasten "geschafft". Die richtigen Keycodes zu finden, ist der Trick dabei… Ausserdem funktioniert das im X-Term nicht, da X ja sein eigenes Keyboard Coding mitbringt.
Gut, dann gehen wir das eben richtig an...
MIOD@ hat ja auf verschiedenen Seiten schon was gepostet (u.a. zu türkischem und rumänischem Keyboard), und das habe ich als Beispiel/Grundlage genommen. Ich krieg's nicht hin, ich lande bei "sudo kbd -l" auf diesem Fehler:
Code:
encoding <0x1d00>

Unknown encoding or variant. kbd(8) needs to be rebuilt.

Diese Schritte habe ich unternommen:
Damit ich nicht dauernd neu Booten muss, weil ich mir das Keyboard zerschossen habe, habe ich das ganze unter OpenBSD 52, i386, in einer virtuellen Maschine unter VIRTUALBOX aufgesetzt. Da wird ein PC Type Keyboard emuliert, also schonmal gut, da brauchen die Besonderheiten des Apple Keyboards nicht berücksichtigt werden. Wenn das dann alles funktioniert, kann ich das dann "nativ" auf dem MBPro umsetzen. Ziel ist natürlich, die Funktionstasten richtig zu aktivieren, und ein PC Layout für Schweiz zu haben ("ch"), und eines für MBPro ("ch.apple"). MIOD@ hat ja auch schon ein "fr.apple" erstellt. Doch zunächste erstmal die Sonderzeichen und Umlaute in der virtuellen Box:

1.) wskbdmap_mfii.c
ich habe mir das wskbdmap_mfii.c File kopiert, und dann angepasst. Ich habe als Country Code mal "vn" versucht, etwas was im File halt noch nicht auftaucht… Habe mir das original File ins Home Dir als "wskbdmap_mfii_c.52" kopiert. Hier das diff:
Code:
diff -u -p wskbdmap_mfii_c.52 /usr/src/sys/dev/pckbc/wskbdmap_mfii.c  
--- wskbdmap_mfii_c.52  Sun Feb 10 17:18:25 2013
+++ /usr/src/sys/dev/pckbc/wskbdmap_mfii.c      Sun Feb 10 18:26:46 2013
@@ -1059,6 +1059,26 @@ static const keysym_t pckbd_keydesc_is_nodead[] = {
     KC(40),  KS_acute,         KS_diaeresis,   KS_asciicircum,
 };
 
+static const keysym_t pckbd_keydesc_vn[] = { 
+/*  pos      normal             shifted         altgr          shift-altgr */
+    KC(2),   KS_1,               KS_plus,        
+    KC(3),   KS_2,               KS_quotedbl,    
+    KC(4),   KS_3,               KS_asterisk,    
+    KC(5),   KS_4,               KS_cedilla,     
+    KC(6),   KS_5,               KS_percent,     KS_bracketleft, 
+    KC(7),   KS_6,               KS_ampersand,   KS_bracketright, 
+    KC(8),   KS_7,               KS_slash,       KS_bar, 
+    KC(9),   KS_8,               KS_parenleft,   KS_braceleft, 
+    KC(10),  KS_9,               KS_parenright,  KS_braceright, 
+    KC(11),  KS_0,               KS_equal,       
+    KC(12),  KS_apostrophe,      KS_question, 
+    KC(13),  KS_dead_circumflex, KS_grave, 
+    KC(16),  KS_q,               KS_Q,           KS_at, 
+    KC(31),  KS_s,               KS_S,           KS_ssharp, 
+    KC(34),  KS_g,               KS_G,           KS_at, 
+    KC(38),  KS_l,               KS_L,           KS_at, 
+}; 
+ 
 #endif /* WSKBD_NO_INTL_LAYOUTS */
 
 #define KBD_MAP(name, base, map) \
@@ -1118,6 +1138,7 @@ const struct wscons_keydesc pckbd_keydesctab[] = {
        KBD_MAP(KB_NL | KB_NODEAD,      KB_NL,  pckbd_keydesc_nl_nodead),
        KBD_MAP(KB_IS,                  KB_US,  pckbd_keydesc_is),
        KBD_MAP(KB_IS | KB_NODEAD,      KB_IS,  pckbd_keydesc_is_nodead),
+       KBD_MAP(KB_VN,                  KB_US,  pckbd_keydesc_vn),
 #endif /* WSKBD_NO_INTL_LAYOUTS */
        {0, 0, 0, 0}
 };

2.) wsksymdef.h
analog zum Beispiel zuvor, auch hier den Country Code "vn" mit dazu:
Code:
diff -u -p wsksymdef_h.52 /usr/src/sys/dev/wscons/wsksymdef.h
--- wsksymdef_h.52      Sun Feb 10 17:18:08 2013
+++ /usr/src/sys/dev/wscons/wsksymdef.h Sun Feb 10 15:13:52 2013
@@ -734,6 +734,7 @@
 #define KB_CF                  0x1a00
 #define KB_LV                  0x1b00
 #define KB_IS                  0x1c00
+#define KB_VN                  0x1d00
 
 #define KB_NODEAD              0x000001 /* disable dead accents */
 #define KB_DECLK               0x000002 /* DEC LKnnn layout */
@@ -773,7 +774,8 @@
        { KB_SI,        "si" }, \
        { KB_CF,        "cf" }, \
        { KB_LV,        "lv" }, \
-       { KB_IS,        "is" }
+       { KB_IS,        "is" }, \
+       { KB_VN,        "vn" }
 
 #define KB_VARTAB \
        { KB_NODEAD,    "nodead" }, \

3.) ukbdmap.c
im Header von wskbdmap_mfii.c steht, dass man das ukbdmap.c neu generieren muss:
Code:
awk -f makemap.awk ../pckbc/wskbdmap_mfii.c > ukbdmap.c

4.) kernel ...
naja, dann dachte ich mir, musst Du auch den Kernel neu compilen:
[/CODE]
cd /usr/src/sys/arch/i386/conf
config GENERIC
cd ../compile/GENERIC
make clean && make
make install
[/CODE]

Den habe ich dann neu gebootet, und dann halt mal versucht, das neue Keycoding zu laden, leider ohne Erfolg.
Ein "sudo kbd -l" gibt wie gesagt diesen Fehler:
Code:
encoding <0x1d00>

Unknown encoding or variant. kbd(8) needs to be rebuilt.

Hat jemand ne Idee, was ich falsch mache / vergessen habe ?
 
Nicht, daß ich von der Materie Ahnung hätte, aber schon mal das gemacht, was die Meldung empfiehlt -- kbd(8) neu gebaut?

Anscheinend möchte er ja das "Encoding" noch irgendwo weiter definiert haben; vielleicht weil Du ein neues definiert(?) hast?
 
userland kbd ?

ja genau, ich müsste mal kbd(8) neu compilen. Aber bin mir nicht sicher, wo ich da hinlangen muss - habe gedacht, wenn ich im /usr/src/sys ... ein make clean mache, wäre alles dabei... evtl. meinst Du ja im Userland ? Weil ich nur den Kernel compiliert habe ? :confused:
Hmmm, ich gehe mal auf die Suche... Ist Neuland für mich, habe immer nur Kernels compiled, damit er als ramdisk kernel geladen werden kann. Wo hatte ich nur das OpenBSD Buch ;)... Bin für jeden Tipp dankbar
 
Das impliziert schon, dass du erst mal deine Kernelkonfiguration für kbd anpassen solltest. Einfach so nur neu bauen ergibt keinen Sinn.
 
userland kbd - gelöst.

Kernelkonfiguration für kbd anpassen - verstehe nicht, was Du da meinst.
Ich habe das Userland neu gebaut, und yes ! - es funzt.
Wo vorher auf der 1234 mit shift die Zeichen !@# waren, ist jetzt +"* - und so weiter ... wunderbar.
Was noch ein netter Hinweis wäre: ich muss ja nicht das ganze Userland neu bauen (ok, 20min sind nicht mehr allzu lange), müsste ja nur kbd(8) neu bauen ...
Jetzt werde ich mal alle Zeichen verifizieren, habe gesehen dass da mit der Tilde und der Cedille was noch nicht stimmt. Noch ein bischen weiter spielen ... Dann werde ich das auf dem MBPro (ohne virtuelle Maschine) noch probieren (und auf -stable heben, da muss ich eh das ganze userland neu bauen).
:)
 
Oh, irgendwie dachte ich du hättest deine Änderungen in irgendwelchen Konfigurationsdateien gemacht.

Dass du die ganze Zeit im Kernel-Code rumgedoktort hast habe ich irgendwie übersehen.
 
Zurück
Oben