Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2225579
  • 博文数量: 668
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 8588
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-29 19:22
文章分类

全部博文(668)

文章存档

2011年(1)

2010年(2)

2009年(273)

2008年(392)

分类:

2008-06-05 19:41:11

vivi的第二阶段

 

vivi的第二阶段是从main()函数开始,同一般的C语言程序一样,该函数在/init/main.c文件中,总共可以分为8个步骤。

1    函数开始,通过putstr(vivi_banner)打印出vivi的版本。Vivi_banner/init/version.c文件中定义

2    对开发板进行初始化(board_init函数),board_init是与开发板紧密相关的,这个函数在/arch/s3c2410/smdk.c文件中。开发板初始化主要完成两个功能,时钟初始化(init_time())和通用IO口设置(set_gpios())。

  注意这里vGPxCON中的v表示valueoGPxCON中的o表示offset

void set_gpios(void)

{

                            GPACON  = vGPACON;

                            GPBCON  = vGPBCON;

                            GPBUP   = vGPBUP;

                            GPCCON  = vGPCCON;

                            GPCUP   = vGPCUP;

                            GPDCON  = vGPDCON;

                            GPDUP   = vGPDUP;

                            GPECON  = vGPECON;

                            GPEUP   = vGPEUP;

                            GPFCON  = vGPFCON;

                            GPFUP   = vGPFUP;

                            GPGCON  = vGPGCON;

                            GPGUP   = vGPGUP;

                            GPHCON  = vGPHCON;

                            GPHUP   = vGPHUP;

                            EXTINT0 = vEXTINT0;

                            EXTINT1 = vEXTINT1;

                            EXTINT2 = vEXTINT2;

}

其中,GPIO口在smdk2410.h\vivi\include\platform\目录下)文件中定义。

3    内存映射初始化和内存管理单元的初始化工作:

mem_map_init();

mmu_init();

这两个函数都在/arch/s3c2410/mmu.c文件中。

void mem_map_init(void)

{

#ifdef CONFIG_S3C2410_NAND_BOOT

  mem_map_nand_boot();

#else

  mem_map_nor();

#endif

  cache_clean_invalidate();

  tlb_invalidate();

}

如果配置vivi时使用了NAND作为启动设备,则执行mem_map_nand_boot(),否则执行mem_map_nor()。这里要注意的是,如果使用NOR启动,则必须先把vivi代码复制到RAM中。这个过程是由copy_vivi_to_ram()函数来完成的。代码如下:
     static void copy_vivi_to_ram(void)

{

  putstr_hex("Evacuating 1MB of Flash to DRAM at 0x", VIVI_RAM_BASE);

 memcpy((void *)VIVI_RAM_BASE, (void *)VIVI_ROM_BASE, VIVI_RAM_SIZE);

}

VIVI_RAM_BASEVIVI_ROM_BASEVIVI_RAM_SIZE这些值都可以在smdk2410.h中查到,并且这些值必须根据自己开发板的RAM实际大小修改。这也是在移植vivi的过程中需要注意的一个地方。

mmu_init()函数中执行了arm920_setup函数。这段代码是用汇编语言实现的,针对arm920t核的处理器。

4    初始化堆栈,heap_init()。(定义在\vivi\lib\heap.c文件中)

int heap_init(void)

{

   return mmalloc_init((unsigned char *)(HEAP_BASE), HEAP_SIZE);

}

5    初始化mtd设备,mtd_dev_init()

int mtd_init(void)

{

                     int ret;

#ifdef CONFIG_MTD_CFI

                            ret = cfi_init();

#endif

#ifdef CONFIG_MTD_SMC

                            ret = smc_init();

#endif

#ifdef CONFIG_S3C2410_AMD_BOOT

                            ret = amd_init();

#endif

                     if (ret) {

                            mymtd = NULL;

                            return ret;

                                   }

                     return 0;

}

这几个函数可以在/drivers/mtd/maps/s3c2410_flash.c里找到。

6    初始化私有数据,init_priv_data()。(定义在\vivi\lib\priv_data\rw.c文件中)

     此部分的功能是把vivi可能用到的所有私有参数都放在预先规划的内存区域,大小为48K,基地址为0x33df0000。在内存的分配示意图方面,可以参考《s3c2410完全开发》,到此为止,vivi作为bootloader的三大核心任务:initialise various devices, and eventually call the Linux kernel,passing information to the kernel.,现在只是完成第一方面的工作,设备初始化基本完成,实际上step 6是为启动Linux内核和传递参数做准备的,把vivi的私有信息,内核启动参数,mtd分区信息等都放到特定的内存区域,等待后面两个重要工作使用(在step 8完成,后面的step 7也是为step 8服务的)。

48K区域分为三个组成部分:MTD参数、vivi parameterLinux启动命令。

 

7    初始化内置命令,init_builtin_cmds()

通过add_command函数,加载vivi内置的几个命令。

8    启动boot_or_vivi()

启动成功后,将通过vivi_shell()启动一个shell(如果配置了CONFIG_SERIAL_TERM),此时vivi的任务完成。

阅读(667) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

jn2000022008-06-06 08:54:36

汗....资料不定要看的很多,但是保证看一方面懂一方面...我是新手多交流哇...