linux驱动启动顺序,如何调整Linux内核启动中的驱动初始化顺序.pdf

如何调整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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值