IIC设备驱动程序(四)————IIC总线驱动程序框架分析

一、驱动程序分析
drivers\i2c\chips\Eeprom.c

static struct i2c_driver eeprom_driver = {
    .driver = {
    .name = "eeprom",
    },
    .id = I2C_DRIVERID_EEPROM,
    .attach_adapter = eeprom_attach_adapter,
    .detach_client = eeprom_detach_client,
};

i2c_add_driver(&eeprom_driver);
          i2c_register_driver(THIS_MODULE, driver);
                    driver->driver.bus = &i2c_bus_type;
                    /* 把驱动加入iic总线驱动列表 */
                    list_add_tail(&driver->list,&drivers);
                    /* 遍历适配器链表,对每一个适配器调用driver->attach_adapter函数 */
                    list_for_each_entry(adapter, &adapters, list) { 
                              driver->attach_adapter(adapter);}
                                      eeprom_attach_adapter(struct i2c_adapter *adapter)
                                                i2c_probe(adapter, &addr_data, eeprom_detect);
                                                           i2c_probe_address(adapter, address_data->normal_i2c[i], -1, found_proc);//见注释1
                                                                     i2c_smbus_xfer(adapter, addr, 0, 0, 0,I2C_SMBUS_QUICK, NULL);
                                                                              i2c_smbus_xfer_emulated(adapter,addr,flags,read_write, command,size,data);
                                                                                     i2c_transfer(adapter, msg, num)
                                                                                           adap->algo->master_xfer
                                                                                                   /* 这个函数在适配器里面有定义 */
                                                                                                   s3c24xx_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg *msgs, int num)
                                                                                                                     /* S信号和设备地址最终通过适配器里面的这个函数来发送 */
                                                                                                                   s3c24xx_i2c_doxfer(i2c, msgs, num);

注释1:
i2c_probe_address(adapter, address_data->normal_i2c[i], -1, found_proc);这个函数会将address_data里面定义的设备地址通过适配器里面的发送函数发送给设备,如果存在相应的设备的话就会调用found_proc函数,在这个函数里面做了如下事情:
struct i2c_client *new_client;//定义一个i2c_client结构体,下面需要设置
new_client->addr = address;//这个是设备地址
new_client->adapter = adapter;//这时找到的适配器
new_client->driver = &eeprom_driver;//这是驱动
i2c_attach_client(new_client);//添加客户

二、适配器

platform_driver_register(&s3c2410_i2c_driver);
          s3c24xx_i2c_probe(struct platform_device *pdev)
                    s3c24xx_i2c_init(i2c);
                     request_irq(res->start, s3c24xx_i2c_irq, IRQF_DISABLED,pdev->name, i2c);
                     i2c_add_adapter(&i2c->adap);
                     i2c_add_adapter(&i2c->adap);
                               i2c_register_adapter(adapter);
                                         list_add_tail(&adap->list, &adapters);
                                          list_for_each(item,&drivers) {
                                      driver = list_entry(item, struct i2c_driver, list);
                                      if (driver->attach_adapter)
                              driver->attach_adapter(adap);}

这里写图片描述

在驱动这边:
(1)将定义的i2c_driver结构体加入总线的驱动链表
(2)遍历适配器,调用驱动里面的attach_adapter函数
(3)attach_adapter函数会调用i2c_probe()函数,它的第二个参数是设备地址,第三个参数是功能函数。它会调用适配器里面的master_xfer函数发送这个地址,来检测是否存在这样的设备,如果存在就会调用功能函数。

在适配器这边:
(1)定义适配器,并且加入总线适配器链表
(2)遍历每一个驱动,调用驱动的attach_adapter函数
(3)attach_adapter函数会调用i2c_probe()函数,它的第二个参数是设备地址,第三个参数是功能函数。它会调用适配器里面的master_xfer函数发送这个地址,来检测是否存在这样的设备,如果存在就会调用功能函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值