static initcall_t __initcall_##fn##id __used \\
__attribute__((__section__(\ level \))) = fn
customize_machine()被放到了.initcall3.init里。
理解:在/include/linux/init.h文件中
#define pure_initcall(fn) __define_initcall(\#define core_initcall(fn) __define_initcall(\#define core_initcall_sync(fn) __define_initcall(\#define postcore_initcall(fn) __define_initcall(\#define postcore_initcall_sync(fn) __define_initcall(\#define arch_initcall(fn) __define_initcall(\
#define arch_initcall_sync(fn) __define_initcall(\#define subsys_initcall(fn) __define_initcall(\#define subsys_initcall_sync(fn) __define_initcall(\#define fs_initcall(fn) __define_initcall(\#define fs_initcall_sync(fn) __define_initcall(\
#define rootfs_initcall(fn) __define_initcall(\#define device_initcall(fn) __define_initcall(\#define device_initcall_sync(fn) __define_initcall(\#define late_initcall(fn) __define_initcall(\
#define late_initcall_sync(fn) __define_initcall(\以上部分,在内核编译的时候就被加入到了代码段。(/arch/armkernel/vmlinux.lds) 具体到我们这个例子,arch_initcall(customize_machine)也就是说customize_machine()在内核编译的时候由arch_initcall(fn)放到了.initcall3.init里。
思考问题2:那么这些被加入到代码段中的fn,是在哪被调用的呢?
回顾上面的内容,有提到过driver模块等是在/init/main.c里do_initcalls()的函数里被调用。
再接着看,machine_desc 加入了.arch.info.init代码段,它的函数调用关系:
start_kernel()-->setup_arch-->setup_machine_tags-->for_each_machine_desc开始调用.arch.info.init代码段中的fn。
machine_desc的结构体的赋值如下图描述:
总结:(这里主要说的是i2c和machine——)
各个i2c device 或是其他驱动放在.arch.init代码段中,这些加入代码段的fn,会被do_initcalls()调用,从/init/main.c文件中的开始内核代码谈起,调用顺序如下: start_kernel-->rest_init-->kernel_init-->do_basic_setup()-->do_initcalls()
machine_desc 加入了.arch.info.init代码段,它的函数调用关系:
start_kernel()-->setup_arch-->setup_machine_tags-->for_each_machine_desc()
I2c驱动的代码流程
结合上图,再联系前面提到的machine_desc和i2c的加载过程,可知: 首先,先将i2c总线作为platform设备加入到platform总线。将i2c设别加到i2c总线上,值得注意的是i2c总线驱动还未加载。
接着,加载i2c总线驱动,也就是调用i2c_imx.c中的初始化函数i2c_adap_imx_init。 最后,加载i2c设备驱动,也egalax tp驱动为例,即调用egalax_ts.c中的egalax_ts_init。
Dev下i2c设备节点
在查看开发板设备下我们发现存在:
那么i2c设备节点在那里创建的呢?
看如下截图,可知是初始化i2c_dev_init时,调用register_chrdev将i2c-dev加入一个map,这个map里有设备与操作的一一对应关系。只要打开这个设备文件,我们就能使用它所定义的操作了。
节点是调用i2c_for_each_dev时,回调i2cdev_attach_adapter创建。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库I2C驱动培训文档(5)在线全文阅读。
相关推荐: