linux板级设备的,linux板级设备的初始化过程是怎样的?

start_kernel() -> setup_arch(&command_line) -> mdesc = setup_machine(machine_arch_type) -> list = lookup_machine_type(nr) -> return struct machine_desc。

内核在启动的时候就是最先运行start_kernel() , 然后她就会调用体系结构相关的setup_arch(&command_line), 如arm体系结构的在arch/arm/kernel/setup。c中, 进一步, 她就要初始化板级相关的设备,

但在此之前, 她必须找到这块目标板的描述结构, 所以她就先通过lookup_machine_type(nr)来查找这个结构, 传入的参数是又uboot传过来的, 存储在r2中。

如假设她传入的是'SMDK2410' 的nr, lookup_machine_type(nr) 就会找到如下的machine_desc。 这个结构在一个专门描述sddk2410的文件中--arch/arm/mach-s3c2410/mach-smdk2410。

c

MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch

* to SMDK2410 */

/* Maintainer: Jonas Dietsche */

phys_io

= S3C2410_PA_UART,

。io_pg_offst

= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

。boot_params

= S3C2410_SDRAM_PA + 0x100,

//重要的板级初始化函数

map_io

= smdk2410_map_io,

。init_irq

= s3c24xx_init_irq,

。init_machine

= smdk2410_init,

。timer

= &s3c24xx_timer,

MACHINE_END

MACHINE_START的第一个参数是用来构造机器的类型的, 如这里的SMDK2410 ,

又下面的定义

nr

= MACH_TYPE_##_type

有 nr = MACH_TYPE_SMDK2410

而 MACH_TYPE_SMDK2410这些机器类型则在/include/asm-arm/mach-types。h中定义:

#define MACH_TYPE_SMDK2410

193

完整的结构描述如下:

struct machine_desc {

/*

* Note! The first four elements are used

* by assembler code in head-armv。

S

*/

unsigned int

nr;

/* architecture number

*/

unsigned int

phys_io;

/* start of physical io

*/

unsigned int

io_pg_offst;

/* byte offset for io

* page tabe entry

*/

const char

*name;

/* architecture name

*/

unsigned long

boot_params;

/* tagged list

*/

unsigned int

video_start;

/* start of video RAM

*/

unsigned int

video_end;

/* end of video RAM

*/

unsigned int

reserve_lp0 :1;

/* never has lp0

*/

unsigned int

reserve_lp1 :1;

/* never has lp1

*/

unsigned int

reserve_lp2 :1;

/* never has lp2

*/

unsigned int

soft_reboot :1;

/* soft reboot

*/

void

(*fixup)(struct machine_desc *,

struct tag *, char **,

struct meminfo *);

void

(*map_io)(void);/* IO mapping function

*/

void

(*init_irq)(void);

struct sys_timer

*timer;

/* system tick timer

*/

void

(*init_machine)(void);

};。

全部

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值