如何调整Linux内核启动中的驱动初始化顺序,linux驱动初始化顺序,linux内核初始化,linux内核驱动开发,linux内核驱动,linux驱动编译进内核,linux内核驱动api手册,linux内核ar9271驱动,linux内核配置u盘驱动,linux内核原生驱动
网址/thread-1950216-1-1.html
如何调整Linux 内核启动中的驱动初始化顺序
【问题】
此处我要实现的是将芯片的ID 用于网卡MAC 地址,网卡驱动是enc28j60_init 。
但是,读取芯片ID 的函数,在as352x_afe_init 模块中,所以要先初始化as352x_afe_init 。
此处,内核编译完之后,在生成的system.map 中可以看到,
enc28j60_init 在as352x_afe_init 之前,所以,无法去读芯片ID。
所以我们的目标是,将as352x_afe_init 驱动初始化放到enc28j60_init 之前,
然后才能读取芯片ID,才能用于网卡初始化的时候的,将芯片ID 设置成网卡MAC 地址。
【解决过程】
【1】
最简单想到的,是内核里面的
arch\arm\mach-as352x\core.c
中,去改devices 设备列表中的顺序。
enc28j60_init 对应的是ssp_device,因为网卡初始化用到的是SPI 驱动去进行和通讯的。
as352x_afe_init 对应的是afe_device 。
原先是:
static struct platform_device *devices[] =
{
&uart_device,
&nand_device,
&afe_device,
&audio_device,
&usb_device,
&as352xkbd_device,
&ssp_device,
};
复制代码
把afe 改到最前面:
static struct platform_device *devices[] =
{
&afe_device,
&uart_device,
&nand_device,
&audio_device,
&usb_device,
&as352xkbd_device,
&ssp_device,
};
复制代码
但是,实际结果是,没有任何影响,连systemp.map 生成的,那么模块初始化顺序,都没有
任何变化。
也就说明,想要实现驱动加载顺序的改变,改core.c 里面的设备列表顺序是没有用的。
【2】
在网上看到很多帖子,主要就是这几个:
怎么确定驱动加载顺序
/u2/72751/showart_1074704.html
Linux 内核驱动程序初始化顺序的调整
/tech/OS/Linux/2006-12-21/74501.html
内核启动时,设备及驱动初始化的实现
/bbs/archiver/tid-1109340.html
其说明的也很清楚了,就是:
Linux 内核为不同驱动的加载顺序对应不同的优先级,定义了一些宏:
include\linux\init.h
#define pure_initcall(fn) __define_initcall("0",fn,1)
#define core_initcall(fn) __define_initcall("1",fn,1)
#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
#define postcore_initcall(fn) __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn) __define_initcall("3",fn,3)
#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn) __define_initcall("6",fn,6)
#defi