2010-06-10 4 views
6

Je suis un débutant dans l'écriture du pilote de périphérique Linux, pardonnez-moi si quelque chose de stupide a demandé et mon pauvre anglais ^^
Je suis en train d'écrire un pilote pour un écran tactile, qui communiquent avec CPU via I2C.
J'ai essayé d'ajouter un pilote de périphérique dans la plate-forme Linux, et le registre a été un succès, je veux dire le pilote a été chargé, mais la fonction de sonde n'a pas tiré haut !!problème de sonde lors de l'écriture d'un pilote de périphérique I2C

Ci-dessus est un code partiel du pilote que j'ai écrit.

static int i2c_ts_probe(struct i2c_client *client, const struct i2c_device_id * id) { 
    /* ... */ 
} 

static int i2c_ts_remove(struct i2c_client *client) { 
    /* ... */ 
} 

static const struct i2c_device_id i2c_ts_id[] = { 
    {"Capacitive TS", 0}, 
    { } 
}; 
MODULE_DEVICE_TABLE(i2c, i2c_ts_id); 

static struct i2c_driver i2c_ts = { 
    .id_table = i2c_ts_id, 
    .probe = i2c_ts_probe, 
    .remove = i1c_ts_remobe, 
    .driver = { 
     .name = "i2c_ts", 
    }, 
}; 

static int __init i2c_ts_init(void) { 
    return i2c_add_driver(&i2c_ts); 
} 

static int __init i2c_ts_exit(void) { 
    return i2c_del_driver(&i2c_ts); 
} 

module_init(i2c_ts_init); 
module_exit(i2c_ts_exit); 

est Ci-dessus, le code partiel dans la plate-forme (/kernel/arch/arm/mach-pxa/saarb.c) utilisée pour l'enregistrement du dispositif I2C.

static struct i2c_board_info i2c_board_info_ts[] = { 
    { 
     .type = i2c_ts, 
     .irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)), 
    }, 
}; 

static void __init saarb_init(void) { 
    ... 
    i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts)); 
    ... 
} 

toute suggestion et commentaires seront les bienvenus, merci ^^

+1

est-ce que i2c_ts_id est correct? –

Répondre

7

Alors que le modèle périphérique Linux/pilote peut sonder votre pilote, il doit y avoir un dispositif demandant: ceci est réalisé en comparant le nom du pilote ("i2c_ts") et le type du périphérique dans la structure i2c_board_info. Dans votre cas, je suppose que le type n'est pas égal à "i2c_ts".

Je vous suggère donc d'utiliser la macro I2C_BOARD_INFO pour instancier votre périphérique, comme indiqué dans Documentation/i2c/instantiating_devices.

static struct i2c_board_info i2c_board_info_ts[] = { 
    { 
     I2C_BOARD_INFO("i2c_ts", 0x12), 
     .irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)), 
    }, 
}; 

static void __init saarb_init(void) { 
    ... 
    i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts)); 
    ... 
} 

Vous n'avez pas non plus indiqué d'adresse sur votre appareil, et I2C_BOARD_INFO en a besoin. Lisez la fiche technique de votre écran tactile pour savoir quelle est cette adresse.

Enfin, comme suggéré ci-dessus, assurez-vous que i2c_ts_id est correct. Je ne suis pas sûr qu'il joue un rôle dans le mécanisme d'association périphérique/module dans le noyau, mais je dirais que c'est beaucoup moins déroutant qu'ils partagent tous le même nom.

1

La méthode sonde ne sera appelée que lorsque le périphérique correspond au nom du pilote. Comme vous l'avez mentionné, le nom du pilote est 'i2c_ts', vérifiez le nom du périphérique dans votre arborescence.

Questions connexes