我是编写linux设备驱动程序的新手,请原谅我,如果有任何愚蠢的问题和我可怜的英文^^
我正在尝试为触摸面板编写驱动程序,它通过I2C与CPU通信
我试图在Linux平台上添加一个设备驱动程序,并且寄存器成功了,我的意思是驱动程序已加载,但探测功能没有启动!!
以上是我写的驱动程序的部分代码。
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);
以上是用于注册i2c设备的平台(/kernel/arch/arm/mach-pxa/saarb.c)中的部分代码。
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));
...
}
欢迎任何建议和评论,谢谢^^
答案 0 :(得分:7)
因此,linux设备/驱动程序模型可以探测您的驱动程序,必须有一个设备请求它:这是通过比较驱动程序的名称(“i2c_ts”)和i2c_board_info结构中的设备类型来实现的。在你的情况下,我猜这种类型不等于“i2c_ts”。
所以我建议您使用I2C_BOARD_INFO宏来实例化您的设备,如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));
...
}
您还没有为您的设备提供地址,而且I2C_BOARD_INFO需要它。阅读触摸屏的数据表,了解该地址是什么。
最后,如上所述,请确保i2c_ts_id正确无误。我不确定它在内核中的设备/模块关联机制中扮演什么角色,但是我会说它们混淆不清它们都有相同的名称。
答案 1 :(得分:1)
仅当设备与驱动程序名称匹配时才会调用探测方法。如果您已将驱动程序名称称为“i2c_ts”,请检查设备树中的设备名称。两者应该相同。