Linux设备驱动剖析之IIC(二)
953行,适配器的编号大于MAX_ID_MASK是不行的,MAX_ID_MASK是一个宏,展开后的值为61。
957至968行,关于管理小整形ID数的,没怎么了解,略过。
974行,调用i2c_register_adapter函数注册IIC适配器,下面是它的定义:
00000837 static int i2c_register_adapter(struct i2c_adapter *adap) 00000838 { 00000839 int res = 0; 00000840 00000841 /* Can't register until after driver model init */ 00000842 if (unlikely(WARN_ON(!i2c_bus_type.p))) { 00000843 res = -EAGAIN; 00000844 goto out_list; 00000845 } 00000846 00000847 rt_mutex_init(&adap->bus_lock); 00000848 mutex_init(&adap->userspace_clients_lock); 00000849 INIT_LIST_HEAD(&adap->userspace_clients); 00000850 00000851 /* Set default timeout to 1 second if not already set */ 00000852 if (adap->timeout == 0) 00000853 adap->timeout = HZ; 00000854 00000855 dev_set_name(&adap->dev, "i2c-%d", adap->nr); 00000856 adap->dev.bus = &i2c_bus_type; 00000857 adap->dev.type = &i2c_adapter_type; 00000858 res = device_register(&adap->dev); 00000859 if (res) 00000860 goto out_list; 00000861 00000862 dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); 00000863 00000864 #ifdef CONFIG_I2C_COMPAT 00000865 res = class_compat_create_link(i2c_adapter_compat_class, &adap->dev, 00000866 adap->dev.parent); 00000867 if (res) 00000868 dev_warn(&adap->dev, 00000869 "Failed to create compatibility class link\n"); 00000870 #endif 00000871 00000872 /* create pre-declared device nodes */ 00000873 if (adap->nr < __i2c_first_dynamic_bus_num) 00000874 i2c_scan_static_board_info(adap); 00000875 00000876 /* Notify drivers */ 00000877 mutex_lock(&core_lock); 00000878 bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter); 00000879 mutex_unlock(&core_lock); 00000880 00000881 return 0; 00000882 00000883 out_list: 00000884 mutex_lock(&core_lock); 00000885 idr_remove(&i2c_adapter_idr, adap->nr); 00000886 mutex_unlock(&core_lock); 00000887 return res; 00000888 }
842至845行,i2c_bus_type的私有成员p在IIC子系统初始化时在bus_register函数里已经被初始化了,因此if条件不会成立,可以继续往下走。
848、849行,之前说struct i2c_adapter时被略过的最后两个成员在这里被初始化。
852、853行,如果timeout没有设置,那么就给它个默认值HZ。一路走来可以发现,timeout在这里会被设置成HZ。
858行,注册适配器这个设备。
864至870行,兼容性方面的,略过。
874行,调用i2c_scan_static_board_info函数注册所有在板文件里定义的设备,下面看它的定义:
00000802 static void i2c_scan_static_board_info(struct i2c_adapter *adapter) 00000803 { 00000804 struct i2c_devinfo *devinfo; 00000805 00000806 down_read(&__i2c_board_lock); 00000807 list_for_each_entry(devinfo, &__i2c_board_list, list) { 00000808 if (devinfo->busnum == adapter->nr 00000809 && !i2c_new_device(adapter, 00000810 &devinfo->board_info)) 00000811 dev_err(&adapter->dev, 00000812 "Can't create device at 0x%02x\n", 00000813 devinfo->board_info.addr); 00000814 } 00000815 up_read(&__i2c_board_lock); 00000816 }
807行,遍历__i2c_board_list链表,每找到一个成员就调用i2c_new_device函数创建一个IIC从机设备,下面是i2c_new_device函数的定义:
00000523 struct i2c_client * 00000524 i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) 00000525 { 00000526 struct i2c_client *client; 00000527 int status; 00000528 00000529 client = kzalloc(sizeof *client, GFP_KERNEL); 00000530 if (!client) 00000531 return NULL; 00000532 00000533 client->adapter = adap; 00000534 00000535 client->dev.platform_data = info->platform_data; 00000536 00000537 if (info->archdata) 00000538 client->dev.archdata = *info->archdata; 00000539 00000540 client->flags = info->flags; 00000541 client->addr = info->addr; 00000542 client->irq = info->irq; 00000543 00000544 strlcpy(client->name, info->type, sizeof(client->name)); 00000545 00000546 /* Check for address validity */ 00000547 status = i2c_check_client_addr_validity(client); 00000548 if (status) { 00000549 dev_err(&adap->dev, "Invalid %d-bit I2C address 0x%02hx\n", 00000550 client->flags & I2C_CLIENT_TEN ? 10 : 7, client->addr); 00000551 goto out_err_silent; 00000552 } 00000553 00000554 /* Check for address business */ 00000555 status = i2c_check_addr_busy(adap, client->addr); 00000556 if (status) 00000557 goto out_err; 00000558 00000559 client->dev.parent = &client->adapter->dev; 00000560 client->dev.bus = &i2c_bus_type; 00000561 client->dev.type = &i2c_client_type; 00000562 #ifdef CONFIG_OF 00000563 client->dev.of_node = info->of_node; 00000564 #endif 00000565 00000566 dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap), 00000567 client->addr); 00000568 status = device_register(&client->dev); 00000569 if (status) 00000570 goto out_err; 00000571 00000572 dev_dbg(&adap->dev, "client [%s] registered with bus id %s\n", 00000573 client->name, dev_name(&client->dev)); 00000574 00000575 return client; 00000576 00000577 out_err: 00000578 dev_err(&adap->dev, "Failed to register i2c client %s at 0x%02x " 00000579 "(%d)\n", client->name, client->addr, status); 00000580 out_err_silent: 00000581 kfree(client); 00000582 return NULL; 00000583 }
529行,为IIC从机设备结构体申请内存。
533至542行,一些赋值。
544行,为client的name成员赋值,IIC总线的match函数能否匹配成功就要看这里了。从这里也可以知道如何让板文件里定义的设备与驱动匹配起来。
547行,检查IIC从机设备地址的合法性,怎样才合法?如果从机使用十位地址的话,那么地址的最大值不能大于0x3ff;如果使用的是七位地址,那么地址的最大值不能大于0x7f,也不能为0。
555行,检查当前IIC从机设备的地址有没有被使用,一条IIC总线或者一个IIC适配器上可以挂多个从机设备,靠设备的地址来识别不同的设备,因此一条总线上不能有两个同样地址的设备。
561行,设备的类型,IIC从机设备在IIC子系统里属于client类型。
568行,将IIC从机设备注册进系统。
回到i2c_register_adapter函数,878行,遍历IIC总线上的所有已经注册了的驱动,每找到一个就调用__process_new_adapter函数进行处理,__process_new_adapter函数的定义如下:
00000832 static int __process_new_adapter(struct device_driver *d, void *data) 00000833 { 00000834 return i2c_do_add_adapter(to_i2c_driver(d), data); 00000835 }
里面就是调用i2c_do_add_adapter函数:
00000818 static int i2c_do_add_adapter(struct i2c_driver *driver, 00000819 struct i2c_adapter *adap) 00000820 { 00000821 /* Detect supported devices on that bus, and instantiate them */ 00000822 i2c_detect(adap, driver); 00000823 00000824 /* Let legacy drivers scan this bus for matching devices */ 00000825 if (driver->attach_adapter) { 00000826 /* We ignore the return code; if it fails, too bad */ 00000827 driver->attach_adapter(adap); 00000828 } 00000829 return 0; 00000830 }
822行,检查驱动是否能够与该适配器所在总线上的设备匹配。
825行,如果驱动的attach_adapter函数有定义就调用之,这主要针对旧的驱动,像i2c-dev.c就是使用这种方式来驱动IIC适配器的,这个函数指针在将来可能会被移除。
到这里,说完了s3c6410的IIC控制器驱动的初始化过程。下面开始说drivers/i2c/i2c-dev.c这个通用的i2c驱动,首先看它的初始化函数i2c_dev_init:
00000595 static int __init i2c_dev_init(void) 00000596 { 00000597 int res; 00000598 00000599 printk(KERN_INFO "i2c /dev entries driver\n"); 00000600 00000601 res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops); 00000602 if (res) 00000603 goto out; 00000604 00000605 i2c_dev_class = class_create(THIS_MODULE, "i2c-dev"); 00000606 if (IS_ERR(i2c_dev_class)) { 00000607 res = PTR_ERR(i2c_dev_class); 00000608 goto out_unreg_chrdev; 00000609 } 00000610 00000611 res = i2c_add_driver(&i2cdev_driver); 00000612 if (res) 00000613 goto out_unreg_class; 00000614 00000615 return 0; 00000616 00000617 out_unreg_class: 00000618 class_destroy(i2c_dev_class); 00000619 out_unreg_chrdev: 00000620 unregister_chrdev(I2C_MAJOR, "i2c"); 00000621 out: 00000622 printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__); 00000623 return res; 00000624 }
601行,注册IIC设备,主设备号为I2C_MAJOR,它的值为89,文件操作结构体对象是i2cdev_fops,定义为:
00000514 static const struct file_operations i2cdev_fops = { 00000515 .owner = THIS_MODULE, 00000516 .llseek = no_llseek, 00000517 .read = i2cdev_read, 00000518 .write = i2cdev_write, 00000519 .unlocked_ioctl = i2cdev_ioctl, 00000520 .open = i2cdev_open, 00000521 .release = i2cdev_release, 00000522 };
后面会以i2cdev_ioctl为例说说它的工作过程。
605至609行,创建IIC设备类,是后面自动创建设备节点的基础。
611行,添加IIC驱动,起始里面是对i2c_register_driver函数的包装,在include/linux/i2c.h里定义:
00000434 static inline int i2c_add_driver(struct i2c_driver *driver) 00000435 { 00000436 return i2c_register_driver(THIS_MODULE, driver); 00000437 }
这样就可以省去写THIS_MODULE,也可以避免忘记写THIS_MODULE。下面看i2c_register_driver函数的定义,在drivers/i2c/i2c-core.c中:
00001108 int i2c_register_driver(struct module *owner, struct i2c_driver *driver) 00001109 { 00001110 int res; 00001111 00001112 /* Can't register until after driver model init */ 00001113 if (unlikely(WARN_ON(!i2c_bus_type.p))) 00001114 return -EAGAIN; 00001115 00001116 /* add the driver to the list of i2c drivers in the driver core */ 00001117 driver->driver.owner = owner; 00001118 driver->driver.bus = &i2c_bus_type; 00001119 00001120 /* When registration returns, the driver core 00001121 * will have called probe() for all matching-but-unbound devices. 00001122 */ 00001123 res = driver_register(&driver->driver); 00001124 if (res) 00001125 return res; 00001126 00001127 pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name); 00001128 00001129 INIT_LIST_HEAD(&driver->clients); 00001130 /* Walk the adapters that are already present */ 00001131 mutex_lock(&core_lock); 00001132 bus_for_each_dev(&i2c_bus_type, NULL, driver, __process_new_driver); 00001133 mutex_unlock(&core_lock); 00001134 00001135 return 0; 00001136 }
1113行,检查IIC总线的私有数据p是否已经初始化,前面已经说过了,在IIC子系统初始化的时候p就已经被初始化了。
1117、1118行,没什么好说的吧。
1123行,将该驱动注册进系统,经过一层层调用后会调用IIC总线的match函数。
1132行,遍历IIC总线上的所有设备,每找到一个就调用__process_new_driver函数进行处理,__process_new_driver函数的定义:
00001096 static int __process_new_driver(struct device *dev, void *data) 00001097 { 00001098 if (dev->type != &i2c_adapter_type) 00001099 return 0; 00001100 return i2c_do_add_adapter(data, to_i2c_adapter(dev)); 00001101 }
1098行,如果设备不是适配器类型,就表示不是要找的设备,直接返回0。否则调用1100行的i2c_do_add_adapter函数,这个函数前面已经说过了,这里就不重复了。
我们知道,此驱动注册进系统后会导致i2cdev_attach_adapter函数被调用,下面看它的定义:
00000534 static int i2cdev_attach_adapter(struct i2c_adapter *adap) 00000535 { 00000536 struct i2c_dev *i2c_dev; 00000537 int res; 00000538 00000539 i2c_dev = get_free_i2c_dev(adap); 00000540 if (IS_ERR(i2c_dev)) 00000541 return PTR_ERR(i2c_dev); 00000542 00000543 /* register this i2c device with the driver core */ 00000544 i2c_dev->dev = device_create(i2c_dev_class, &adap->dev, 00000545 MKDEV(I2C_MAJOR, adap->nr), NULL, 00000546 "i2c-%d", adap->nr); 00000547 if (IS_ERR(i2c_dev->dev)) { 00000548 res = PTR_ERR(i2c_dev->dev); 00000549 goto error; 00000550 } 00000551 res = device_create_file(i2c_dev->dev, &dev_attr_name); 00000552 if (res) 00000553 goto error_destroy; 00000554 00000555 pr_debug("i2c-dev: adapter [%s] registered as minor %d\n", 00000556 adap->name, adap->nr); 00000557 return 0; 00000558 error_destroy: 00000559 device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); 00000560 error: 00000561 return_i2c_dev(i2c_dev); 00000562 return res; 00000563 }
539行,不要被它的名字所迷惑,看它的定义:
00000076 static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap) 00000077 { 00000078 struct i2c_dev *i2c_dev; 00000079 00000080 if (adap->nr >= I2C_MINORS) { 00000081 printk(KERN_ERR "i2c-dev: Out of device minors (%d)\n", 00000082 adap->nr); 00000083 return ERR_PTR(-ENODEV); 00000084 } 00000085 00000086 i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL); 00000087 if (!i2c_dev) 00000088 return ERR_PTR(-ENOMEM); 00000089 i2c_dev->adap = adap; 00000090 00000091 spin_lock(&i2c_dev_list_lock); 00000092 list_add_tail(&i2c_dev->list, &i2c_dev_list); 00000093 spin_unlock(&i2c_dev_list_lock); 00000094 return i2c_dev; 00000095 }
80至84行,如果适配器的编号大于最大的次设备号,那么就返回出错。I2C_MINORS的值为256。
86行,为i2c_dev对象申请内存。
92行,将i2c_dev对象加入到i2c_dev_list链表中。
回到i2cdev_attach_adapter函数,544行,创建设备节点,主设备号为I2C_MAJOR,次设备号为适配器的编号,设备节点的名字为i2c-x,x的值就是适配器的编号。如果适配器的编号为0,那么就会在/dev下创建一个名为i2c-0的文件,即/dev/i2c-0,但在某些嵌入式Linux平台上没有看到这个文件,而是/dev/i2c/0这种形式,原因在于在启动文件里调用了mdev –s这条命令,导致/dev/i2c-0变成了/dev/i2c/0,不信?把i2c-x的-去掉,变成i2cx,重新编译后启动内核,看生成的是否是/dev/i2cx文件。之所以会造成那样是因为字符‘-’引起的。
551行,创建设备文件,关于设备模型的,不多说了。
到此,i2c-dev.c的初始化过程也说完了。
某某大侠说得对:“内核代码就像酒,有的苦有的烈,这样的滋味你我早晚要体会,请与我举起杯,与内核干杯。”多么形象的比喻!多么可爱的文字!
不管多“苦”多“累”,既然认定了前方,路还是要走下去的。