很多玩arm开发板的新手们经常会碰到一个问题,就是如何将程序烧写到开发板上。
在windows下,这个很容易办到,因为你很容易找到可以直接烧写flash的软件。在linux下,如果你的开发板上本身已有引导加载程序,比如uboot时,烧写开发板也很容易。因为你可以通过uboot来擦除或写flash。可是,如果你的开发板上连uboot都没有,只是一个裸机,就得想想办法了。
网上很容易找到的一个方法是,先将一个小的的初始化程序下载到cpu上的片内sram里,并运行这个程序以初始化cpu和内存。这个小的初始化程序一般很小。因为cpu片内的sram只有4K,而且这个片内的sram在cpu上电复位后,不需程序初始化就可以使用。但需要注意它在开机时所映射的地址。(0x0或0x40000000)。
然后再把一个特殊的uboot下载到开发板内存中,并运行。说它特殊,是因为在它直接在开发板的内存里运行。所以它应跳过内存初始化以及程序般运这部分。因为第二段中的初始化程序已完成内存的初始工作,所以这里的uboot应跳过内存初始化。uboot在启动过程中,墨认会将整个uboot从flash中考到内存中。而这里uboot本身就在内存中,所以应跳过考贝过程。ps在内存中直接运行uboot,这在调试uboot的时候经常用到。
刚玩arm时,只能从网上下载别人写好的上电初始程序,自己却看不懂。后来自己写了一个,在这里记录下,并把全部原码发上来,供广大新手们学习。另外,要看懂这些上电初始程序,需要以下基本知识:s3c2440中关于时钟、存储控制器部分,堆栈,arm汇编指令系统,汇编和C混合编程,gnu-make。
需要说明的是,这里有很多代码均参考了uboot2009版的方法。比如内存控制器的初始化部分lowlevel_init.S文件就来自于uboot2009,我只是将其中的部分参数结我的开发板上所用到的具体芯片做过优化。s3c24xx.h , s3c2410.h也来自于uboot。
初始化程序下载地址: http://download.csdn.net/detail/sir_zy/7702651
编译器:arm-v4t-linux-gnueabi-gcc 4.8.2版本。
开发板:GT2440
内存芯片: H57V2562GTR-60C (32MB,16bits)
先简要介绍用法,再对每个文件做简要说明。
首先将整个工程下载到本地电脑上,并解压。解压后可得到文件夹:GT2440_FLASH。
进入GT2440_FLASH后,。打开Makefile文件。将变量cross_compiler(第5行)的值修改成你用的交叉编译器。
然后打开 ./GT2440_FLASH/config.mk 文件,根据你的内存分配修心TEXT_BASE的值。这里我给的是0x33f00000。因为稍后需要将特殊的uboot下载到0x33f80000处。两者都不会造成干扰。(TEXT_BASE最直观影响是,它决定了初始化程序在内存中运行时的起始位置)
再执行make all命令,即可生成init.bin。将这个文件下载到cpu片内sram中并运行。要注意片内sram的实际映射地址。在GT2440的开发板上,如果能看到四个led在交替闪亮,则说明cpu和内存已初始化完成。可以借用jlink的命令来完成:
loadbin ~/GT2440FLASH/init.bin 0x0 (我的板子从nandflash启动时,片内sram被映射到0x0处)
setpc 0x0
g
内存控制器初始化参数都放在lowlevel_init.S文件中,如果你的开发板上用的内存芯片和我的不一样,请自行对照芯片参数个改相关参数。
关于文件夹下各个文件的作用:
config.mk ---用来配置程序连接时的起始地址。如果对init.bin进行反汇编会发现,整个程序的起始链接地址就是TEXT_BASE。这个地址一定要等于你的片内sram所映射的地址相同。并把init.bin下载到该地址处运行。
crt0.S ---初始化文件。复责初始cpu工作时钟,这里将cpu核的时钟设置为403MHz,fclk:hclk:pclk=1:4:8。注意,hclk大大小会影响到lowlevel_init.S的刷新参数的设置。在crt0.S里,会调用lowlevel_init.S中的lowlevel_init函数,完成存储控制的初始化。这进而的各项参数应参照所采用的内存芯片说明书来设置。
test.c ---循环点亮四个LED灯。当四个LED灯被循环点亮后,说明初始化工作已完成。可以将特殊uboot下载到内存中了。最初时,初始化程序在片内sram里运行(0x0处),但后来会跳到内存中运行(TEXT_BASE处)。所以,当你看到四个LED灯闪亮时,说明初始化完成,并且程序已经能在内存中运行了。(此功能仅针对我的开发板。不同开发板,led灯所接的引脚可能不同,操作方法也不同)
s3c24XX.h s3c2410.h ---是cpu寄存器相应头文件。在test.c中,点亮LED灯时会用到相关gpio的寄存器。
uboot-run-on-ram.bin ---这是为我的开发板编译的特殊uboot2009。可以直接把它下载到开发板内存0x33f80000处,并直接运行。它会跳过cpu、内存初始化,以及程序考贝过程。然后就可以利用在内存中运行的uboot来烧写flash。先将要烧写的二进制文件通过jlink下载到内存里,再通过uboot命令烧写flash。一般烧写norflash用 cp.b 命令。烧写nandflash用 nand write 命令。
*************尊重原创,转载请注明来源*************