I2C驱动培训文档(5)

2025-08-02

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创建。


I2C驱动培训文档(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:[JSP]网上书店

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219