I2C子系统之 adapter driver注册(3)

static int i2c_do_add_adapter(struct i2c_driver *driver,                     struct i2c_adapter *adap)   {       /* Detect supported devices on that bus, and instantiate them */       i2c_detect(adap, driver);          /* Let legacy drivers scan this bus for matching devices */       if (driver->attach_adapter) {           /* We ignore the return code; if it fails, too bad */           driver->attach_adapter(adap);       }       return 0;   }  

可以发现在i2c_do_add_adapter函数主要执行的是i2c_dectect和driver->attach_adapter。

由于此处驱动并未初始化driver->detect,所以i2c_detect函数未执行有效操作就会退出。

接着通过传统方式执行driver->attach_adapter方法。

tatic int i2cdev_attach_adapter(struct i2c_adapter *adap)   {       struct i2c_dev *i2c_dev;       int res;          i2c_dev = get_free_i2c_dev(adap);       if (IS_ERR(i2c_dev))           return PTR_ERR(i2c_dev);          /* register this i2c device with the driver core */       i2c_dev->dev = device_create(i2c_dev_class, &adap->dev,                        MKDEV(I2C_MAJOR, adap->nr), NULL,                        "i2c-%d", adap->nr);       if (IS_ERR(i2c_dev->dev)) {           res = PTR_ERR(i2c_dev->dev);           goto error;       }       res = device_create_file(i2c_dev->dev, &dev_attr_name);       if (res)           goto error_destroy;          pr_debug("i2c-dev: adapter [%s] registered as minor %d\n",            adap->name, adap->nr);       return 0;   error_destroy:       device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr));   error:       return_i2c_dev(i2c_dev);       return res;   }  

可见attach_adapter函数的作用就是调用device_create()函数 通过之前class_create的类信息在/dev下自动创建设备文件。

并且此设备的设备号是由固定的主设备号I2C_MAJOR 和 从设备号组成的,从设备号取的就是adapter的nr,此处为0。

并且可以推断出系统最多可以容纳0~255 总共256个i2c adapter。

到此i2c部分的初始化就完成了,可以通过read write来操作设备了。

补充:上面说的新方法好像在驱动里面就会detect client,然后把所有检测到的client放到一条链表里。

相关阅读:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/489f7a1d719420dd813a659fc29cebd6.html