6

我是编写linux设备驱动程序的新手,如果有什么愚蠢的问题和我的英语不好请原谅我^^
我正在尝试为触摸面板编写驱动程序,它通过I2C与CPU通信。
我尝试在linux平台上添加一个设备驱动,注册成功,我的意思是驱动加载了,但是probe函数没有启动!!

以上是我写的驱动的部分代码。

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));  
    ...  
}

欢迎任何建议和意见,谢谢^^

4

2 回答 2

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 是正确的。我不确定它是否在内核中的设备/模块关联机制中发挥作用,但我会说它们都具有相同的名称,因此不会让人感到困惑。

于 2010-06-12T07:51:23.457 回答
1

仅当设备与驱动程序名称匹配时才会调用探测方法。由于您提到您的驱动程序名称为“i2c_ts”,请检查您的设备树中的设备名称。两者应该相同。

于 2013-05-24T21:09:15.010 回答