2015-11-02 71 views
0

我针对飞思卡尔iMX53 Arm CPU板的嵌入式Linux 2.6.35.3。更改内核驱动程序中内置的驱动程序的初始化顺序?

当内核启动过程中,所有与CAN总线相关的各种驱动程序(FlexCAN)都被初始化并准备使用时,我需要更改它。我需要更早地初始化CAN总线,然后才能在用户空间准备好脚本完成工作之前尽早发送一些特定的CAN原始消息。

如何控制内核在编译(内置)内核模块/驱动程序在启动和初始化序列期间内部由内核探测的时间。

我不是在谈论文件系统级别的.ko文件,这些文件可以在脚本中进行模块化检测..这是在此之前的方式。

对不起,我格式不好的linux问题..我不经常在内核空间工作..尝试破解我的方式尽可能快。

回答

1

initcall排序定义如下:

http://lxr.free-electrons.com/source/include/linux/init.h#L194

是,以供参考:

/* 
* A "pure" initcall has no dependencies on anything else, and purely 
* initializes variables that couldn't be statically initialized. 
* 
* This only exists for built-in code, not for modules. 
* Keep main.c:initcall_level_names[] in sync. 
*/ 
#define pure_initcall(fn)    __define_initcall(fn, 0) 

#define core_initcall(fn)    __define_initcall(fn, 1) 
#define core_initcall_sync(fn)   __define_initcall(fn, 1s) 
#define postcore_initcall(fn)   __define_initcall(fn, 2) 
#define postcore_initcall_sync(fn)  __define_initcall(fn, 2s) 
#define arch_initcall(fn)    __define_initcall(fn, 3) 
#define arch_initcall_sync(fn)   __define_initcall(fn, 3s) 
#define subsys_initcall(fn)    __define_initcall(fn, 4) 
#define subsys_initcall_sync(fn)  __define_initcall(fn, 4s) 
#define fs_initcall(fn)     __define_initcall(fn, 5) 
#define fs_initcall_sync(fn)   __define_initcall(fn, 5s) 
#define rootfs_initcall(fn)    __define_initcall(fn, rootfs) 
#define device_initcall(fn)    __define_initcall(fn, 6) 
#define device_initcall_sync(fn)  __define_initcall(fn, 6s) 
#define late_initcall(fn)    __define_initcall(fn, 7) 
#define late_initcall_sync(fn)   __define_initcall(fn, 7s) 

由于module_init已经#defined是device_initcall,什么也没有依赖于它得到一个通用模块初始化序列的结尾。早加载模块,您只需改变其module_init调用别的东西,发生较早(如subsys_initcall,例如)

注:刚接通事物的秩序可以打破其他依赖,并且可以在一个catch-得到22来自地狱的依赖循环。

+0

反正这还不是完整的图片。我们有两个阶段:模块初始化,驱动程序被探测。第二个驱动程序的' - > probe()'将在设备出现**和**模块初始化时被调用。在依赖关系的情况下,' - > probe()'可能会失败并返回-EPROBE_DEFER,以允许稍后重新探测。此外,现在有一个用于推迟探测的异步机制。 – 0andriy

相关问题