Linux2.6.37 I2C驱动框架分析(三)

来源:互联网 发布:广告铃声制作软件 编辑:程序博客网 时间:2024/06/16 09:43

   最几天忙着公司的sensor驱动,自己的活的忙不过来。终于抽出了点时间继续完成未完的I2C驱动分析。

  当调用i2c_register_adapteri2c_add_driver时,都会遍历已经注册的i2c_driver或i2c_adapter作为参数调用__process_new_adapter或 __process_new_driver。其中:

  __process_new_driver(struct device *dev, void *data)

    i2c_do_add_adapter(data, to_i2c_adapter(dev));

 __process_new_adapter(struct device_driver *d, void *data)

   i2c_do_add_adapter(to_i2c_driver(d), data);

 从上面两个函数调用情况来看,最终都是调用了i2c_do_add_adapter函数。那我们接下来就来分析这个函数的实现。

 i2c_do_add_adapter(struct i2c_driver *driver,struct i2c_adapter *adap)

    i2c_detect(adap, driver);        调用i2c_detect对i2c设备进行探测

    if (driver->attach_adapter) {    如果是老版的驱动调用驱动的attach_adapter函数,不建议使用了
      driver->attach_adapter(adap);
    }

  继续分析i2c_detect函数的实现吧!

 i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver)

    address_list = driver->address_list;
      if (!driver->detect || !address_list)  如果驱动即没有detect函数,又没有设备的地址直接返回了
        return 0;

     if (!(adapter->class & driver->class))  适配器的类和驱动的类不一致也直接返回
        return 0;

     temp_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); 条件满足动态分配一个临时的i2c_client结构

     temp_client->adapter = adapter; 设置i2c设备所属的i2c_adapter

     for (i = 0; address_list[i] != I2C_CLIENT_END; i += 1) {

       temp_client->addr = address_list[i]; 从设备地址列表中依次取出设备地址,直到I2C_CLIENT_END

       i2c_detect_address(temp_client, driver); 调用该函数去探测设备是否真的存在

    }

  毫无疑问,我们知道要去分析i2c_detect_address函数了。

  i2c_detect_address(struct i2c_client *temp_client, struct i2c_driver *driver)

     i2c_check_addr_validity(addr);  检查设备地址的合法性

     i2c_check_addr_busy(adapter, addr)  判断该地址是否在总线上正使用着

     i2c_default_probe(adapter, addr)  调用默认的探测函数了

       i2c_smbus_xfer(adap, addr, 0, I2C_SMBUS_WRITE, 0,I2C_SMBUS_QUICK, NULL); 调用该函数给设备发数据 

      i2c_transfer(adapter, msg, num)algo->master_xfer>;  最终调用适配器驱动的master_xfer给设备地址信息,看能否收到ACK信号。如果能收到表明设备是存在的,探测成功。

到这里关于注册适配器驱动和注册i2c设备驱动的分析就要告一段落了。。。

  接下来我们转去分析一个具体的i2c适配器的驱动。

此时我们应该很清楚,一个适配器的驱动最为关键的地址在于,适配器驱动的通信方法的实现:如发出S信号、发出从机地址、等待ACK信号。发送数据。。。。,这些都是与我们的硬件密切相关的。明天就分析S3C2440的适配器驱动吧!

0 0
原创粉丝点击