J’essaie de créer un joystick / un gamepad personnalisé pour un système Linux intégré. Je recherche une bibliothèque ou une API système qui me permettra de créer un nœud dans / dev / input à partir du code de l’espace utilisateur.
Je voudrais cela parce que:
Le matériel personnalisé peut communiquer avec le système à l’aide des pilotes SPI ou I2C existants (c’est ma conception matérielle pour que je puisse faire tout ce qui est le plus technique)
Les modules du kernel ne peuvent pas utiliser d’autres pilotes, mais uniquement des symboles exportés d’autres modules
Je comprends que la seule façon de faire un module du kernel est d’utiliser du code du kernel et de le comstackr en tant que module du kernel. Je n’essaie pas de réaliser un module kernel avec du code utilisateur.
Je recherche une API qui me permette de créer un fichier, et lorsque ce fichier est lu ou écrit, les fonctions sont appelées. C’est le concept général d’un pilote de personnage. Je n’ai pas besoin des privilèges ou des ressortingctions fournis ou imposés par le kernel.
Il doit exister un moyen d’émuler les E / S de fichiers qui n’impliquent pas l’écriture d’un nouveau module de kernel.
Merci!
Un “périphérique de caractères” fait référence à une interface orientée caractères dans le kernel.
Vous pouvez faire ce que LIUB suggère et créer une interface de type fusible qui ramène l’API de type kernel dans l’espace utilisateur, et vous devrez faire quelque chose comme cela si vous avez absolument besoin de périphériques de type HID produits dans /dev/input
.
Cependant, si vous n’avez pas besoin de périphériques HID et que cela ne concerne que votre matériel et que vous “n’avez pas besoin d’un access au kernel” car vous pouvez réellement communiquer avec le matériel de bas niveau, vous pouvez envisager d’autres options:
read()
vous voulez que les clients fassent, vous pouvez utiliser un fifo . Lorsque votre programme write()
paquets write()
divisibles de manière égale dans un PIPE_BUF
(512 octets), vous pouvez être PIPE_BUF
qu’ils ne peuvent pas être entrelacés accidentellement dans un autre paquet. Vous pouvez utiliser le sous-système d’entrée de l’espace utilisateur pour faire ce que vous voulez, voir:
http://thiemonge.org/getting-startedwith-uinput
et pour un exemple d’utilisation:
Ancienne question, mais je pensais que j’appendais une friandise pour que les gens qui regardent cela n’obtiennent pas de mauvaises idées. Depuis environ 3 ou 4 ans, il y a eu ce petit framework, qui a été ajouté pour étendre le bord du système de fichiers FUSE qui fournit une solution en bac à sable pour faire exactement ce que le demandeur demande.
Il s’appelle CUSE, ce qui permet aux pilotes de caractères d’être instanciés par des personnes faisant partie du groupe FUSE sur un système sur lequel FUSE et CUSE ont été activés dans le kernel. Tout ce qu’il faut, c’est une application appropriée (votre démon d’adaptation OSS sur votre dissortingbution n’est qu’une application de ce type, FWIW …)
Les réponses de “vous ne pouvez pas” et autres à l’époque n’étaient pas du tout utiles, n’ont pas réellement considéré le problème, et étaient … heh … plutôt mal dans l’ ensemble … même alors.
CUSE n’a pas eu autant d’absorption que FUSE, il y a donc moins d’aide à y faire sous la forme de liaisons faciles à utiliser, mais elles sont toujours là. Ce qui m’a amené à ce sujet, c’est que je cherchais une “meilleure” réponse s’il y en avait une à ce sujet. Répondez qu’il se trouve que “oui, si vous pouvez faire Python …” (pycuse) – et si vous ne pouvez pas faire Python là-bas, vous êtes seul. Eh bien … je n’ai jamais été quelqu’un pour accepter ce genre de choses … alors je vais apprendre de pycuse et faire un C ++ / Go / etc. Je suis obligé de les trouver et j’en ai besoin d’un nouveau pour la langue avec laquelle je travaille au moment où j’en ai besoin.
En ce qui concerne le rest … heh … la prochaine fois, vos canards seront plus nombreux. Vous ne l’avez certainement pas sur celui-ci.
essayez de créer votre propre périphérique, puis écrivez une application d’espace utilisateur qui communique avec le pilote (je recommande d’utiliser netlink dans ce cas, car il peut être utilisé comme porte dérobée lorsque d’autres pilotes n’exportent pas de symboles, mais ils ouvrent le fonctionnalité à l’espace utilisateur, dans ce cas, l’espace utilisateur avec l’aide de netlink peut fonctionner comme une passerelle).
Dans votre périphérique de personnalisation, vous pouvez laisser l’utilisateur vous indiquer le chemin d’access du périphérique que vous souhaitez créer. c.-à-d. que le périphérique char crée un périphérique de caractères initial avec un nom fixe, alors l’application utilisateur peut utiliser netlink (ou ioctl) pour indiquer à ce périphérique de création de créer un autre périphérique avec un nom personnalisé.
J’espère que cela t’aides
Vous décrivez exactement la machine virtuelle viewos
http://wiki.virtualsquare.org/wiki/index.php/Main_Page
http://wiki.virtualsquare.org/wiki/index.php/UMview#Modules
cette machine virtuelle peut détourner tous les appels dirigés vers votre kernel vers votre module d’espace utilisateur (on pense que linux sera un peu moins monolithique)
vous démarrez une instance umview avec la commande $umview xterm
donc chaque programme qui s’exécute à l’intérieur du nouveau xterm engendré est tracé
maintenant vous pouvez simplement faire (dans une instance d’umview) un
$um_add_service umdev $mount -t umdevJoystick none
vous pouvez donc écrire un module capable d’intercepter chaque lecture / écriture / … dans votre fichier /dev/virtualJoystick
et faire ce que vous voulez
(la syntaxe du module est très simple)
static int joystick_read(char type, dev_t device, struct dev_info *di){ /*my operation...probably a XTestEvent() or something like that*/ } static int joystick_write(char type, dev_t device, struct dev_info *di){ /*my operation...probably a XTestEvent() or something like that*/ } /*...*/ struct umdev_operations umdev_ops={ /*hijacking table*/ .read=joystick_read, .write=joystick_write, };
(le umdev_testmodules
dans la source umview est très utile pour un petit tutoriel!)
Avec certaines limitations, vous pouvez faire réfléchir les applications que vous pouvez, avec LD_PRELOAD et une bibliothèque, en remplaçant les appels communs à l’appareil.
voir ici pour plus de détails