at91sam9261 arm芯片uboot移植记录。

at91sam9261    arm芯片uboot移植记录。


这几天,为了学习uboot在arm上的移植,就下载个最新版的uboot-2011.12版本的uboot。打算烧写到atmel公司的at91sam9261ek中。我用的板子有一个dataflash和nannflash。启动的顺序如下

  1. 处理器复位,根据BMS引脚的设置,选择从内部ROM启动(NOR Flash启动方式不在本文的讨论范围)。
  2. ROM中的代码开始运行,初始化处理器和必要的外设,比如DBGU,USB device port。然后开始从Data Flash或NAND的0地址检索合法( :?:具体参考数据手册的boot program的章节)的启动程序,也就是Bootstrap。
  3. 如果合理的Bootstrap存在,ROMBOOT将其复制到内部SRAM并跳转到Bootstrap运行。如果没有,检测其它支持启动的存储介质,如果都没有,则等待DBGU或者USB口的连接,这部分内容请参考SAM-BA手册。
  4. Bootstrap将初始化一些设备,主要是Data Flash或NAND与SDRAM,然后从Data Flash或NAND的特定位置(在Bootstrap源代码中指定)将U-boot复制到SDRAM的指定位置,然后跳转到U-boot开始位置运行。
  5. U-boot根据环境变量(bootcmd)加载Linux Kernel的image。加载完成后跳转到Kernel运行,并传递启动参数(bootargs)。
  6. Linux Kernel开始运行,加载相关驱动,并加载rootfs。其中的细节,可以参考Linux书籍。  



烧写bootstrap可以参照这个链接http://www.mcuzone.com:8080/dokuwiki/doku.php?id=product:sam9_linux#u-boot

bootstrap的源代码中Bootstrap-v1.11\board\at91sam9261ek\dataflash\at91sam9261ek.h:

有几个参数需要更改:

#define AT91C_SPI_PCS_DATAFLASH		AT91C_SPI_PCS0_DATAFLASH	/* Boot on SPI NCS0 */
 
#define IMG_ADDRESS 		0x8400			/* Image Address in DataFlash */
#define	IMG_SIZE		0x33900			/* Image Size in DataFlash    */
 
#define MACH_TYPE       0x350       /* AT91SAM9261-EK */
#define JUMP_ADDR		0x23F00000		/* Final Jump Address 	      */
 

IMG_ADDRESS 是要烧写的uboot的到dataflash上的开始地址。

IMG_SIZE是uboot的文件的长度

JUMP_ADDR是跳转到的sdram的地址。

bootstrap程序把从ox8400开始的ox33900长度的dataflash中的数据复制到ox23f00000地址处开始运行。

上面uboot文件的长度不要超过uboot所占分区的长度,跳转地址要和uboot里面CFG_SYS_TEXT_BASE一样。




uboot-2011-12源代码的结构和uboot1.3.4的有了一些变化。有一些文件夹合并了。顶层的makefile也做了一些修改。

编译uboot的步骤是。

1make distclean

2make   xxxx_config

3make

其中xxxx_config要 根据自己的arm芯片来确定。新的uboot中把makefile中的一些和板子有关的内容给放在了顶层目录的boards.cfg中,里面主要包含了各种板子的一些信息,如arch,cpu,soc等。可以在里面查找自己要用的是哪个。

我这里用的是at91sam9261ek_dataflash_cs0加上_config。

在uboot1.3.4中的TEXT_BASE参数在最新版本中改名字为CFG_SYS_TEXT_BASE放在include/configs/xxxxxxxx.h中我用的板子是include/configs/at91sam9261ek.h中,这个参数就是bootstrap中要跳转的地方。

编译好后也烧写进板子中,可以运行了。但是在我的板子上运行时可以运行起来,但是uboot设置mac地址总是错误,网络不好用。



你可能感兴趣的:(arm嵌入式开发)