I2C_SLAVE ioctl but
Je suis à l'écriture de code pour la mise en œuvre d'un simple i2c
de lecture/écriture de la fonction en utilisant le linux en général i2c
pilote linux/i2c-dev.h
Je suis confus au sujet de l' ioctl
: I2C_SLAVE
La documentation du noyau états comme suit :
Vous pouvez le faire plaine i2c transactions en utilisant read(2) et write(2) les appels.
Vous n'avez pas besoin de passer l'adresse de l'octet; au lieu de cela, réglez-le à travers
ioctl I2C_SLAVE avant de vous essayez d'accéder à l'appareil
Cependant, je suis en utilisant le ioctl I2C_RDWR
où j'ai de nouveau mis l'adresse de l'esclave à l'aide de i2c_msg.addr
.
La documentation du noyau mentionne également les éléments suivants :
Certains appels ioctl() sont pour les tâches administratives et sont gérés par
i2c-dev directement. Les exemples incluent I2C_SLAVE
Est donc qu'il doit utiliser le ioctl I2C_SLAVE
? Si oui, dois-je créer juste une fois ou à chaque fois que j'effectue une lecture et d'écriture?
Si j'avais un i2c
appareil je pourrais viens de tester le code sur l'appareil et ne l'aurait pas dérangé vous les gars, mais malheureusement je n'en ai pas le droit maintenant.
Merci pour l'aide.
OriginalL'auteur zacurry | 2012-04-02
Vous devez vous connecter pour publier un commentaire.
Il existe trois grandes méthodes de communication avec les composants i2c partir de l'espace utilisateur.
1. IOCTL I2C_RDWR
Cette méthode permet la mesure simultanée de lecture/écriture et l'envoi d'une séquence ininterrompue de message. Pas tous les composants i2c en charge cette méthode.
Avant d'effectuer des e/s avec cette méthode, vous devez vérifier si l'appareil prend en charge cette méthode à l'aide d'un ioctl
I2C_FUNCS
opération.En utilisant cette méthode, vous ne pas besoin d'effectuer un ioctl
I2C_SLAVE
opération -- c'est fait derrière les scènes à l'aide de l'information contenue dans les messages.2. IOCTL SMBUS
Cette méthode de i/o est plus puissant, mais le code est plus clair. Cette méthode peut être utilisée si l'appareil ne prend pas en charge la
I2C_RDWR
méthode.En utilisant cette méthode, vous ne besoin d'effectuer un ioctl
I2C_SLAVE
opération (ou, si l'appareil est occupé, unI2C_SLAVE_FORCE
opération).3. SYSFS I/O
Cette méthode utilise le fichier de base d'e/s, les appels système
read()
etwrite()
. Sans interruption des opérations séquentielles ne sont pas possibles à l'aide de cette méthode. Cette méthode peut être utilisée si l'appareil ne prend pas en charge laI2C_RDWR
méthode.En utilisant cette méthode, vous ne besoin d'effectuer un ioctl
I2C_SLAVE
opération (ou, si l'appareil est occupé, unI2C_SLAVE_FORCE
opération).Je ne peux pas penser à une situation où cette méthode serait préférable à d'autres personnes, à moins que vous avez besoin de la puce d'être traité comme un fichier.
Plein IOCTL Exemple
Je n'ai pas testé cet exemple, mais il illustre les concepts de flux de l'écriture sur un périphérique i2c.-- détecter automatiquement si l'utilisation de l'ioctl
I2C_RDWR
ou smbus technique.Exemple de code utilise
sizeof(data)
quanddata
est un pointeur, ce qui renvoie toujours sizeof pointeur (4 ou 8 sur la commune de Systèmes d'exploitation). Vous avez besoin pour passer de la taille des données, ne peut pas utilisersizeof
comme ça!Pourriez-vous s'il vous plaît ajouter exécution exemple de commande?.. Ce sera plus utile.
de retard, mais...), vous avez raison. j'ai mis à jour l'exemple de code pour supprimer ce bug.
0xD 0x1337 0xdead 0xbeef (voir aussi l'utilisation de la fonction)
OriginalL'auteur Woodrow Barlow
Si vous utilisez le
read()
etwrite()
méthodes, appelantioctl
avecI2C_SLAVE
il suffit d'une fois. Vous pouvez également utiliserI2C_SLAVE_FORCE
si l'appareil est déjà en cours d'utilisation.Cependant, je n'ai pas encore trouvé un moyen cohérent de lecture spécifique des registres pour chaque appareil à l'aide de la
read()/write()
méthodes.OriginalL'auteur 3c71
Je ne sais pas trop si cela peut vous aider car je n'utilise pas ioctl I2C_RDWR mais j'ai été en utilisant le code suivant avec succès:
Tout ce que je fais est de définir I2C_SLAVE_FORCE une fois au début et je peux lire et écrire autant que je veux à après.
PS - C'est juste un exemple de code et, évidemment, vous devriez vérifier le rendement de l'ensemble de ces fonctions. Je suis en utilisant ce code pour communiquer avec un digital I/O de la puce. Les deux i2c_* fonctions sont juste des wrappers qui appel ioctl(fd, I2C_SMBUS, &args); où args est un struct i2c_smbus_ioctl_data type.
Il a été un moment depuis que j'ai travaillé sur I2C code, mais le programme que je travaillais était un userland programme personnalisé intégré conseil de. Je suppose qu'un pilote a déjà été raccordé à l'appareil et c'est pourquoi j'ai été en utilisant _FORCE.
OriginalL'auteur Ryan