Linux设备驱动程序

时间:2013-06-06 15:06:35

标签: linux linux-kernel driver linux-device-driver

我有关于我的模块的问题,它正确安装/初始化但驱动程序的其他部分未安装或显示在输出中。

   static struct i2c_driver qt2120_dev {
       .probe = qt2120_probe,
       .remove = qt2120_remove,
       .owner = {
           .name = qt2120,
           .module = THIS_MODULE, 
       }
       ....           
   }

  static __init qt2120_init(){
       prink("********init******");
       .......
  }
  module_init(qt2120_init)

  static int qt2120_probe(){
       prink("********probe******");
       .......     
  }

  static __devinit qt2120_remove(){
       prink("********probe******");
       .......     
  }    

输出中仅显示“/ * * init * ”。 该模块已根据输出安装到i2c。

  "bus: i2c. qt2120 as qt2120/input" 

模块有问题,因为printk在探测器中并且从未移除过。

我还在MAKEFILE @ CONFIG_AT2120 + = qt2160.o中更改为qt2120.o作为模块

我的配置有问题吗? qt2120.c与代码极光中的qt2160.c非常相似。

2 个答案:

答案 0 :(得分:2)

由于您尚未使用i2c子系统注册驱动程序,因此未调用探测和删除功能。 使用i2c_add_driver()API注册您的驱动程序。 在你的情况下,

static int __init qt2120_init(void)
{
    return i2c_add_driver(&qt2120_dev);
}

static void __exit qt2120_remove(void)
{
    return i2c_del_driver(&qt2120_dev);
}

答案 1 :(得分:2)

  • 首先你需要让I2C驱动程序注册' struct i2c_driver'使用i2c_add_driver(addr_of_struct i2c_driver)的I2C内核结构。

    static const struct i2c_device_id sample_i2c_id[] = {
      { "qt2120", 0 },
      { }
    };
    static struct i2c_driver qt2120_dev = {
       .probe = qt2120_probe,
       .remove = qt2120_remove,
       .id_table = sample_i2c_id,
       .driver   = {
            .name = "qt2120",
        },
     ....           
    };
    
    • 您需要添加.id_table条目。 id_table成员允许我们告诉框架我们支持哪些I2C从设备芯片。
  

匹配.id_table entry.Driver调用探测功能。