如您所说的这种驱动具有双重角色,platform driver和I2C_driver都同时对应于platform bus上的platform_device吗?如果是这样的话,那由platfrom driver解发i2c driver注册时只使用了add_i2c_driver这个函数。内核也可以将I2C driverplatform device绑定的吗?这样好像讲不通吧?
platform driver对应的是platform bus上的platform device;i2c driver对应的是i2c bus上的i2c device。
我有看到这段代码我也觉得很奇怪,有些理解不了,这里注册了platform_driver后由它的probe里又注册了一个input_register_device和使用
misc_register一个注册杂项设备,那这个设备的DRIVER也没有看到有注册呢,难道这个input_register_device和misc_register又是一种特殊
的类型吗?这里也没有看到主,次设备号呢。但是对这个设备确实使用了file operations。
以misc_register来说,注意下面
红色部分的代码:
187int misc_register(struct miscdevice * misc)
188{
189 struct miscdevice *c;
190 dev_t dev;
191 int err = 0;
192
193 INIT_LIST_HEAD(&misc->list);
194
195 mutex_lock(&misc_mtx);
196 list_for_each_entry(c, &misc_list, list) {
197 if (c->minor == misc->minor) {
198 mutex_unlock(&misc_mtx);
199 return -EBUSY;
200 }
201 }
202
203 if (misc->minor == MISC_DYNAMIC_MINOR) {
204 int i = DYNAMIC_MINORS;
205 while (--i >= 0)
206 if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)
207 break;
208 if (i<0) {
209 mutex_unlock(&misc_mtx);
210 return -EBUSY;
211 }
212 misc->minor = i;
213 }
214
215 if (misc->minor < DYNAMIC_MINORS)
216 misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
217
dev = MKDEV(MISC_MAJOR, misc->minor); 218
219 misc->this_device = device_create(misc_class, misc->parent, dev,
220 misc, "%s", misc->name);
221 if (IS_ERR(misc->this_device)) {
222 err = PTR_ERR(misc->this_device);
223 goto out;
224 }
225