linux内核板级函数,linux内核移植详解1——板级初始化过程

之前虽然已经为sep4020移植内核了linux2.6的内核,但当初做的时候还是很多地方不是很明白为什么要这样做,仅仅是把项目完成了,没有真正理解透彻,最近有点时间再把以前的工作好好理清楚。

(各位读者如果有兴趣,请和之前一篇Porting

Linux2.6.16内核到sep4020(arm720T)一起阅读,这一系列会对我前面做的工作深化)

1.之前谈到我们要为我们的处理器设置一个它独有的机器号,在arch/arm/tools/mach-types中,我写了这么一句话:

# machine_is_xxx   CONFIG_xxxx   MACH_TYPE_xxx   number

sep4020            ARCH_4020     GFD4020         194

我们说bootloader一定要把机器号传给内核,这样内核才能找到相应的处理器,这里uboot传的机器号就是(number)194,但是内核又是如何根据这个194找到我们的处理器,找到我们的板级设备。

2.上面那段定义看似一定意义都没有,但是实际是有的,通过我们的gen-mach-types会在include/asm-arm/mach-types.h中自动生成这么一段话:

#define MACH_TYPE_GFD4020              194

#ifdef CONFIG_ARCH_4020

# ifdef machine_arch_type

#  undef machine_arch_type

#  define machine_arch_type __machine_arch_type

# else

#  define machine_arch_type MACH_TYPE_GFD4020

# endif

# define machine_is_sep4020() (machine_arch_type == MACH_TYPE_GFD4020)

#else

# define machine_is_sep4020() (0)

#endif

3.在我们的arch/arm/4020.c中有一个函数,这个函数包括了我们板级初始化的所有初始化步骤。

MACHINE_START(GFD4020, "4020 board")

.phys_io = 0x10000000,

.io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,

.boot_params = 0x30000100,

.fixup  = fixup_gfd4020,

.map_io  = sep4020_map_io,

.init_irq =  sep4020_init_irq,

.init_machine = sep4020_init,

.timer  = &sep4020_timer,

MACHINE_END

跟进去发现其实这一步其实是定义了一个结构体,

struct machine_desc __mach_desc_##_type

{

.nr  = MACH_TYPE_GFD4020,  //可见就是194

.name  = "4020 board",

//重要的板级初始化函数 .map_io        = sep4020_map_io,

.init_irq    = sep4020_init_irq,

.init_machine    = sep4020_init,

.timer        = &sep4020_timer,

}

4.linux起来之后会进入start_kernel大函数,在这个启动的大函数中的最前面几步会到一个setup_arch的子函数,我们的板级初始化过程就是通过这个函数实现的。

setup_arch->setup_machine->lookup_machine_type(nr);

mdesc = setup_machine(machine_arch_type);这个参数就是通过uboot传过来的机器号194;然后通过lookup_machine_type函数得到之前提到的machine_desc结构体;

得到了这个板级结构体之后,就把这个板级结构体中的我们cpu的信息赋给系统通用的全局变量,如下:

machine_name = mdesc->name;

init_arch_irq = mdesc->init_irq;

system_timer = mdesc->timer;

init_machine= mdesc->init_machine;

到此板级的钩子算是勾上了,但是还没有真正的实现注册,具体的timer,irq注册就是通过红字标出的这几个全局变量结构体在后面的init_IRQ,init_timers,中实现的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值