Implémentation d’un pilote de caractères Linux dans l’espace utilisateur

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:

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!

Vous ne pouvez pas.

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:

  • Vous pouvez utiliser XSendEvent ou le protocole XTEST pour synthétiser des événements locaux.
  • Vous pouvez créer un serveur de réseau (ou un serveur utilisant un socket de domaine unix multicast pour dissortingbuer efficacement des données) permettant aux clients de se connecter.
  • Si ce n’est vraiment que 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:

http://pingus.seul.org/~grumbel/xboxdrv/

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