Hallo Besucher, der Thread wurde 109k mal aufgerufen und enthält 679 Antworten

letzter Beitrag von Emwee am

Keyman64: Tastatur- und Hardwarecontroller

  • Oh, ich Depp, Lösung gefunden :-)

    Ein "lsusb" bringt zb folgendes:


    root@nuc:/dev# lsusb

    Bus 002 Device 003: ID 045b:0210 Hitachi, Ltd

    Bus 002 Device 002: ID 045b:0210 Hitachi, Ltd

    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

    Bus 001 Device 016: ID 1d50:60e9 OpenMoko, Inc. keyman64 keyboard itercepter

    Bus 001 Device 017: ID 1d50:60e9 OpenMoko, Inc. keyman64 keyboard itercepter

    Bus 001 Device 006: ID 045b:0209 Hitachi, Ltd USB-PS/2 Optical Mouse

    Bus 001 Device 004: ID 045b:0209 Hitachi, Ltd

    Bus 001 Device 003: ID 1a2c:0027 China Resource Semico Co., Ltd USB Keykoard

    Bus 001 Device 005: ID 8087:0aaa Intel Corp.

    Bus 001 Device 002: ID 046d:c03e Logitech, Inc. Premium Optical Wheel Mouse (M-BT58)

    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub


    Dh ich kann die unterschiedlichen Geräte wie folgt bei mir ansprechen:


    keyman64 -d /dev/bus/usb/001/016 oder den 2. Keyman mit:

    keyman64 -d /dev/bus/usb/001/017


    Sehr cool....

  • Ich nochmal...


    kann es sein, das ich die Restore Taste nicht ansprechen kann?

    Ich finde da irgendwie nichts, dh in der Key Liste ist die Taste nicht aufgelistet.


    Jemand eine Idee?

  • Der Keyman steuert die 8x8 Tastaturmatrix vom C64 darin ist die RESTORE Taste nicht enthalten. Also nein, er kann RESTORE nicht ansprechen.

  • Der Keyman steuert die 8x8 Tastaturmatrix vom C64 darin ist die RESTORE Taste nicht enthalten. Also nein, er kann RESTORE nicht ansprechen.

    Oh no.. wie schade...

    Ich hatte ja die Idee, das dich den Freeze Befehl (Restore + Button) auf das Keyman64 legen kann, dh zb mit einer Tastenkombination wie META + F halt das FreezeMenu aufrufen können.


    Ok, war nur eine Idee, aber schade.

  • Mh, irgendwie greift bei mir der Parameter --device nicht :-(

    Folgende Situation: System Linux, Intel Rechner an dem 3x C64 mit jeweils Keyman64 angeschlossen sind.

    Wenn ich mir nun mit "lsusb" alle USB Geräte anzeigen lasse, siehe ich meine 3 Keymans64 auch:


    Bus 001 Device 047: ID 1d50:60e9 OpenMoko, Inc. keyman64 keyboard itercepter

    Bus 001 Device 048: ID 1d50:60e9 OpenMoko, Inc. keyman64 keyboard itercepter

    Bus 001 Device 049: ID 1d50:60e9 OpenMoko, Inc. keyman64 keyboard itercepter


    Das ist ja soweit schonmal gut.

    Doch ich wollte diese nun halt unabhängig ansprechen, dafür hätte ich gedacht das es mit dem Parameter --device in Keyman64 geht.


    Die Geräte werde unter "/dev/bus/001" und dann halt 047, 048, 049 aufgelistet.

    Also war meine Idee zb:


    keyman64 --device /dev/bus/001/047 -i


    um die Info für das erste angeschlossene Keyman zu bekommen.

    Das geht soweit auch, aber halt nicht für 048 und 049. Da wird mir immer das erste Keyman angezeigt, also:


    keyman64 --device /dev/bus/001/048 -i


    geht nicht, er zeigt mir die Infos von keyman64 Nr. 1 an.


    Jemand eine Idee? Mache ich was falsch? Hat sonst noch jemand mehrere Keymans64 gleichzeitig im Betrieb?

  • Boaahhh Leute, helft mir mal bitte. Ich stehe ganz gehörig auf dem Schlauch.


    Wie kann man mit dem Keyman64 zwischen tristate und clear hin und herschalten? Normal mit tristate/high oder clear/high geht jeweils wunderbar mit invert.

    Hintergrund: Ich passe gerade die Konfig des Keymans an den FPGASID an und Thomas Freak gab mir > hier < den guten Rat, dem FPGASID zum Umschalten kein High zu verpassen.

    Code
    1. Initial:
    2. tristate port a bit 7 # Port A PIN 8 (FPGASID-TYPE) tristate
    3. Befehl:
    4. M: clear port a bit 7 # Port A PIN 8 (FPGASID-TYPE) low

    Setze ich das so wie oben gezeigt um, kann ich damit nur genau einmal umschalten und das wars. Drücke ich erneut "M" passiert nichts mehr.

    Ich bin für jeden Tipp dankbar. Die Doku habe ich auch noch mal komplett durch, aber leider kein Hinweis darauf.

    Henning Vielleicht schaust Du auch mal kurz rein? :D


    VG

    Thomas

  • Setze ich das so wie oben gezeigt um, kann ich damit nur genau einmal umschalten und das wars. Drücke ich erneut "M" passiert nichts mehr.

    So nach kurzem Studium der Keyman-Anleitung würde ich sagen, du brauchst eine andere Taste mit der Du wieder auf Tristate umschaltest. Dann weißt du auch in welchem Konfig-Zustand der FPGA-SID ist...


    Oder du fügst selbst noch eine Diode mit Kathode zum Keyman-Port in die Steuerleitung zum FPGA-SID ein.


    Oder du gibst einfach LOW und HIGH zum FPGA-SID. Da ist ja schließlich auch eine Diode drin... (Das wäre das, wovon ich abgeraten hatte...)


    Gruß

    Thomas

  • Hallo Thomas,


    das hatte ich mir fast schon so gedacht. Dann muss ich halt eine zweite Taste zum erneuten Umschalten festlegen. Wäre jetzt auch kein Weltuntergang. :D

    Mit einer wärs zwar schöner gewesen, aber "invert" kann anscheinend nur zwischen low und high wechseln. Danke für die Rückmeldung.


    VG

    Thomas

  • GMP Versuch's mal so:

    Code
    1. tristate a7 # Port A PIN 8 (FPGASID-TYPE) tristate
    2. m:0 clear a7 # jedes erste, dritte, fünfte... mal
    3. M:1 tristate a7 # jedes zweite, vierte, sechste... mal

    Die Syntax hat mich jetzt ehrlich gesagt selbst verwirrt, als ich mal wieder in die Doku geguckt habe, und die ist zudem noch falsch :whistling: Korrigiere ich morgen mal...


    Ich glaube sowas hier wäre einfacher zu verstehen:


    Code
    1. m:odd clear a7
    2. m:even tristate a7

    Oder zumindest sollte man 0 und 1 umdrehen, dann ist es nämlich einfach das niederwertigste bit der Anzahl der Betätigungen.

  • Der Keyman steuert die 8x8 Tastaturmatrix vom C64 darin ist die RESTORE Taste nicht enthalten. Also nein, er kann RESTORE nicht ansprechen.

    und pcollins


    Das stimmt, da Restore nicht teil der Matrix ist, ist sie für den Keyman auch nicht teil der Tastatur.


    Es spricht aber nichts dagegen, die Restore-Leitung zu einem der Keyman-Ports zu führen und dann wie jede andere Leitung auch über einen Befehl kurz auf Masse zu ziehen.


    Falls ich irgendwann nochmal eine neue Revision mache, würde ich die Restore-Leitung mit ansprechbar machen, ohne dass eine Portleitung dafür belegt werden muss. Habe ich leider beim Design damals nicht drüber nachgedacht, sorry.

  • Folgende Situation: System Linux, Intel Rechner an dem 3x C64 mit jeweils Keyman64 angeschlossen sind.


    Die Geräte werde unter "/dev/bus/001" und dann halt 047, 048, 049 aufgelistet.

    Also war meine Idee zb:


    keyman64 --device /dev/bus/001/047 -i


    um die Info für das erste angeschlossene Keyman zu bekommen.

    Das geht soweit auch, aber halt nicht für 048 und 049. Da wird mir immer das erste Keyman angezeigt

    Ich hätte jetzt auch gedacht, dass das gehen sollte... Gucke ich mir mal an.

  • Ich habe mir meinen Code nochmal angeschaut und habe festgestellt, dass ich den über --device angegebenen Pfad garnicht verwende, sondern nur über alle USB-Geräte iteriere und einfach das erste Gerät nehme, das ich mit der passenden Vendor- und Product-ID finde. Das erklärt zumindest das beobachtete Verhalten.


    Ich habe diese Methode wohl verwendet, weil sie generisch ist und unter allen Betriebssystemen funktioniert.


    Jetzt habe ich es hier soweit, dass unter Linux wirklich device nodes verwendet werden, also könnte man so die generischen nodes unter /dev/bus/ benutzen, um den gewünschten Keyman anzusprechen. Wirklich schön ist das aber auch noch nicht.


    Ich denke, ich werde noch die Möglichkeit einbauen, jedem Keyman über die config einen eigenen Namen geben zu können (technisch die Seriennummer des USB-Geräts).


    Dann könnte man mit einer passenden udev-Regel die Einträge unter /dev anhand der Seriennummer eindeutig und sprechend machen. Gibt man dem einen Keyman z.B. "brotkasten" und dem anderen "u64" als Seriennummern, würden sie dann so erscheinen:


    Code
    1. $ ls /dev/keyman64-*
    2. /dev/keyman64-brotkasten
    3. /dev/keyman64-u64


    Die udev-Regel dafür sähe dann so aus:


    Code
    1. SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="60e9", MODE:="0666", SYMLINK+="keyman64-$attr{serial}"
  • Danke Henning, aber ich habe das mit den zwei Tasten zum hin und her-switchen jetzt erstmal so gelassen. Gefällt mir so doch besser. Aber gut zu wissen. :)


    Nachdem ich mich jetzt wieder intensiver mit Keyman und Overlay beschäftigt habe, wurde mir wieder bewusst, wie hilfreich und nützlich diese Erweiterungen doch sind. Macht echt Spaß damit zu arbeiten.


    VG

    Thomas

  • Ich denke, ich werde noch die Möglichkeit einbauen, jedem Keyman über die config einen eigenen Namen geben zu können (technisch die Seriennummer des USB-Geräts).


    Dann könnte man mit einer passenden udev-Regel die Einträge unter /dev anhand der Seriennummer eindeutig und sprechend machen. Gibt man dem einen Keyman z.B. "brotkasten" und dem anderen "u64" als Seriennummern, würden sie dann so erscheinen:

    Das wäre echt cool...


    Ich hab mir erst einmal wie folgt beholfen:

    Jedes Keyman64 hat in dem Version-String der Firmware am Ende einen Zusatz wie "(1)" oder halt "(2)" und "(3)", dh wenn ich mit dem Parameter I die Firmware abfrage kann ich sehen welcher Keyman64 mit antwortet.
    Und meine Scripte nehmen dann den zurückgegebenen String auseinander und reagieren entsprechende drauf ob Keyman64#1, Keyman64#2 oder halt Keyman64#3.


    Nicht die beste Lösung, aber funktioniert aktuell.

  • Ok, hab ich erstmal wie beschrieben umgesetzt:


    https://github.com/hbekel/keym…377b86ebb22e85ac20cc006b1


    https://github.com/hbekel/keym…f74fd6965a8168cc62c568e06


    Die aktuell mitgelieferte udev-Regel habe ich heute morgen noch verbessert, die ist aber noch nicht auf github, das kann ich auch heute abend machen. Die verbesserte Regel erzeugt entweder /dev/keyman64, wenn keine Seriennummer konfiguriert ist, oder /dev/keyman64-<Seriennummer>, wenn eine da ist. Die aktuelle hängt einfach nur die Seriennummer an /dev/keyman64 an, also ohne dynamisch hinzugefügten Bindestrich... das ist aber eher Kosmetik. Mann kann ja auch immer spezifische Regeln selbst schreiben, wichtig ist ja, das jetzt überhaupt ein Unterscheidungsmerkmal für udev da ist.


    ABER, ich habe heute morgen nochmal nachgedacht, am besten wäre es, wenn ich einfach beide Methoden zum Auffinden des richtigen Keymans ermögliche (über device nodes oder über generisches Iterieren und zusätzliches Prüfen der Seriennummer).


    Denn dann könnte man, unabhängig vom Betriebssystem immer auch einfach nur die Seriennummer über --device bzw. KEYMAN64_DEVICE angeben:


    $ keyman64 --device brotkasten type "Hello World!" // funktioniert überall

    $ keyman64 --device u64 reset


    oder halt unter unixoiden Systemen ebenso


    $ keyman64 --device /dev/keyman64-brotkasten type "Hello World!" // funktioniert überall

    $ keyman64 --device /dev/keyman64-u64 reset


    Ich gucke mir das heute abend noch weiter an...

  • Kann man denn fertige Keyman64 wieder ordern ?

    Fertige Keyman64 konnte man (zumindest von mir) nie ordern, nur Bausätze. Ist aber wie alle meine Bausätze ohne SMD und kommt mit vorprogrammiertem Atmel.


    Aber ja, ich habe noch Bausätze, Bestellungen bitte wie auf meiner Website beschrieben per mail, danke!

  • Woran könnte es liegen wenn, sobald ich den Keyman eingebaut habe, ein paar Tasten nicht mehr funktionieren? (Muss nochmal nachschauen, aber ich meine es sind „2, 3, q und w“)

  • Dann sind höchstwahrscheinliche eine oder mehr Leitungen von der Tastatur zu den 4051 und/oder vom mt88808 zum C64 ohne Verbindung, die müsstest du mal durchklingeln. 2, 3, q und w weisen jetzt nicht auf eine bestimmte Reihe oder Spalte der Matrix und so nicht auf eine bestimmte Leitung hin.

  • Dann sind höchstwahrscheinliche eine oder mehr Leitungen von der Tastatur zu den 4051 und/oder vom mt88808 zum C64 ohne Verbindung, die müsstest du mal durchklingeln. 2, 3, q und w weisen jetzt nicht auf eine bestimmte Reihe oder Spalte der Matrix und so nicht auf eine bestimmte Leitung hin.

    Danke :) Sind das spezielle Leitungen die ich durchklingeln muß, oder einfach mal "pauschal" jede für sich durchgehen?