天桥陨石分享 http://blog.sciencenet.cn/u/chrujun 让地球物理仪器飞起来

博文

ARM处理器AT91RM9200启动流程

已有 6720 次阅读 2010-6-5 11:30 |个人分类:地球物理及仪器|系统分类:科研笔记| 流程, boot, AR91, AT91RM9200

ARM处理器AT91RM9200启动流程

仇洁婷,陈儒军

     at91rm9200有片内引导和片外引导两种启动方式,可由跳线控制。上电后AT91RM9200检测BMS的电平,如果是高则选择片内ROM启动, 如果是低则从外部flash启动。
   (1)片外引导:  执行烧在flash上的引导程序。
   (2)片内引导:  at91rm9200内部本身有128k的片内rom, 其固化了一个bootloader和uploader,片内引导时启动uploader,uploader开启xmodem协议,等待用户上传程序,上传的程序将载入片内SRAM,重映射,然后pc跳转到片内SRAM执行上传的用户程序。注:片内SRAM只有16k,除去3-4k片内启动程序的占用的部分数据空间,因此下载的程序大小限制在12k内。
   官方at91rm9200DK u-boot Flash Programming Solutions文档提供的解决方案。
   刚开始flash上没有引导程序,因此只能用片内引导方式。载入一个12k以内的小程序到内部SRAM运行,而这个小程序初始化SDRAM后,再把u-boot下载到SDRAM运行(u-boot大于12k)。pc跳到SDRAM的u-boot位置运行u-boot,u-boot启动后再用u-boot自己的flash烧写命令把自己烧到flash去,以后就可以片外flash启动了。官方文档中并不是直接烧u-boot.bin,而是烧入了boot.bin和u-boot.gz 2个文件。
   Loader.bin 和 boot.bin是修改好的,这里重点先研究uboot的启动和移植。了解了一下它们的启动流程,以便更好的去移植uboot。

 loader.bin, boot.bin, u-boot.bin代码执行流分析.
 以上三个文件时at91rm9200启动所需要的三个bin,他们的实现代码并不难。可以从网上下载针对at91rm9200的评估版的源码,再做相应修改。
   loader.bin 执行流程,这个文件主要在片内启动从串口下载代码时会用到

-------------------------------------------------------------------------
(1)

   loader/entry.S   初始化CPU
   b main ---> crt0.S
   --> copydata --> clearbss --> b boot
   main.c --> boot -->
   /*Get internel rom service address*/
   /* Init of ROM services structure */
   pAT91 = AT91C_ROM_BOOT_ADDRESS;
  
   /* Xmodem Initialization */
   --> pAT91->OpenSBuffer
   --> pAT91->OpenSvcXmodem
  
   /* System Timer initialization */
   ---> AT91F_AIC_ConfigureIt
  

   /* Enable ST interrupt */
   AT91F_AIC_EnableIt
   AT91F_DBGU_Printk("XMODEM: Download U-BOOT ");

   Jump.S
   // Jump to Uboot BaseAddr exec
   Jump((unsigned int)AT91C_UBOOT_BASE_ADDRESS)

-------------------------------------------------------------------------
(2)
   boot.bin执行流程:该文件会在从片内启动时被下载到板子上,以后还会被烧写到片外Flash中,以便在片外启动时用它来引导并解压u-boot.bin.gz,并跳转到u-boot来执行。
   boot/entry.S
   b main --> crt0.S --> copydata --> clearbss --> b boot

   boot/misc.s /* unzip uboot.bin.gz */
   ----> decompress_image(SRC,DST,LEN) --> gunzip

   //jump to ubootBaseAddr exec 这里跳转到解压u-boot.bin.gz的地址处直接开始执行u-boot
   asm("mov pc,%0" : : "r" (DST));


-------------------------------------------------------------------------
(3)
u-boot.bin执行流程
   u-boot/cpu/at91rm9200/start.S
   start --->reset
   ---> copyex ---> cpu_init_crit
   ---> /* set up the stack */ --> start_armboot
   u-boot/lib_arm/board.c


   init_fnc_t *init_sequence[] = {
   cpu_init, /* basic cpu dependent setup */
   board_init, /* basic board dependent setup */
   interrupt_init, /* set up exceptions */
   env_init, /* initialize environment */
   init_baudrate, /* initialze baudrate settings */
   serial_init, /* serial communications setup */
   console_init_f, /* stage 1 init of console */
   display_banner, /* say that we are here */
   dram_init, /* configure available RAM banks */
   display_dram_config,
   checkboard,
   NULL,
   };
   ---> start_armboot ---> call init_sequence
   ---> flash_init --> display_flash_config
   ---> nand_init ---> AT91F_DataflashInit
   ---> dataflash_print_info --> env_relocate
   ---> drv_vfd_init --> devices_init --> jumptable_init
   ---> console_init_r --> misc_init_r --> enable_interrupts
   ---> cs8900_get_enetaddr --> board_post_init -->

u-boot/common/main.c
   for (;;)
   { /* shell parser */
   main_loop () --> u_boot_hush_start --> readline
   --> abortboot
   -->printf("Hit any key to stop autoboot: %2d ", bootdelay);
   }
   以上是at91rm9200启动并进入u-boot的执行流分析。后面u-boot还会将uImage解压到特定的位置并开始启动内核代码。




https://blog.sciencenet.cn/blog-39626-332323.html

上一篇:印度的神奇和伟大令中国望尘莫及
下一篇:修改ARM处理器AT91RM9200 LOADER和BOOT源代码
收藏 IP: .*| 热度|

4 申瑞杰 唐常杰 邓景华 zhangcz07

发表评论 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-21 17:43

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部