I²C, Linux, Raspberry Pi et MPU6050

Posted on mer. 13 novembre 2013 in Linux, Raspberry Pi

Juste un petit post rapide en mode pense bête pour ne pas y repasser 2 heures la prochaine fois :

Comment déclarer qu'un device I²C doit utiliser un driver spécifique (le tout en user-space) ?

Dans cet exemple nous utiliserons une IMU de invensense : MPU-6050. Ce composant possède une adresse I²C fixée à 0x68 et est câblée sur le second adaptateur I²C de mon raspberry pi.

Une fois le module I²C chargé, rendez-vous dans le répertoire /sys/bus/i2c/devices/i2c-1/.

Dans ce répertoire se trouve un fichier new_device. La documentation du kernel explique qu'il faut faire :

echo "nom_du_device" adresse_i2c > new_device

Certes, mais je le trouve où le nom du device ? En fait il s'agit du i2c_device_id tel que décrit dans le driver lui-même :

/*
 * device id table is used to identify what device can be
 * supported by this driver
 */
static const struct i2c_device_id inv_mpu_id[] = {
    {"mpu6050", INV_MPU6050},
    {}
};

Dans notre cas, il faut donc taper :

echo mpu6050 0x68 > new_device

Et hop tout fonctionne correctement. Une fois qu'on connaît la réponse ça parait évident ... mais pas vraiment avant.

Bonus : si vous avez une erreur -ENOMEM pendant l'allocation des descripteurs d'interruptions (NR_IRQS sont déjà alloués), je vous recommande l'utilisation de ce patch :
IRQ Patch MPU6050

Encore merci messire.