本帖最后由 zhangmangui 于 2014-12-7 20:59 编辑
TI davinci DM6467通过串口0将UBL和u-boot写入NAND flash
TI的davinci系列一般支持好几种启动模式,如下图TMS320DM6467的datasheet可以查到所有的BOOTMODE
LVS301和LW9226的开发板上有一个选择bootmode的拨码开关
下面以LVS301为例,讲解如何通过通过串口0将UBL和u-boot写入NAND flash:
1. 断电,调整拨码开关SW501,设置为UART0 Boot (LVS301默认的boot mode是SPI Boot);
2. 链接串口CN509;
3. 从网站www.sourceforge.net下载flash utility软件(该软件在UART0 Boot mode烧写NAND flash);
4. 打开命令行工具,进入目录DM646x_FlashAndBootUtils_1_50DM646x_FlashAndBootUtils_1_50DM646xGNU;
5. 运行sfh_DM646x.exe;
windows
sfh_DM646x -nandflash -p COM1 ubl/ubl_DM646x_nand.bin uboot.bin
linux
mono sft_DM646x -nandflash -p /dev/ttyUSB0 ubl/ubl_DM646x_nand.bin uboot.bin
6. 上电,立即进入下载模式,开始烧写NAND flash;
7. 下载完成之后,断电,重新设置拨码开关SW501为NAND flash Boot;
8. 上电重启之后,LVS301就会从NAND flash启动UBL,然后加载u-boot;
资料来自收集 供大家学习使用
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
在移植U-Boot之前,首先需要了解DM6467的启动流程,知道U-Boot在系统启动过程中的位置及作用。DM6467标准的启动过程如图 1‑1所示,主要包括四个步骤:RBL(ROM BootLoader)→UBL(User Boot Loader)→U-Boot →Linux内核。
图1‑1 DM6467启动流程
系统上电时,首先运行的是RBL。RBL是固化在片内ROM的,所以用户不能修改,并且功能比较弱。RBL根据开发板上拨码开关的值来确定下一阶段 的启动方式,它支持NAND、UART和HPI三种启动方式。我们开发板上使用的是NAND启动,所以RBL负责将NAND Flash中的UBL复制到片内RAM,然后转到UBL执行。当RBL启动之后,其实就可以直接运行应用程序了,但是如果要进行嵌入式系统开发,也即要移 植嵌入式操作系统,那么就需要下一阶段的bootloader,这里使用的是UBL。
UBL又称为2nd stagebootloader(第二阶段的bootloader),它主要负责初始化串口、PLL和DDR2 SDRAM,然后根据用户设定来选择下一阶段启动方式。UBL支持NOR、NAND、PCI和UART启动模式,我们选用的是NAND启动,所以UBL负 责将NAND中的U-Boot复制到DDR2中,然后转到U-Boot执行。由于RBL没有初始化DDR2,UBL是复制到片内RAM执行的,而 DM6467的片内RAM只有32K,但U-Boot的bin文件一般都是100K以上,所以系统需要使用第二阶段的UBL来初始化DDR2,然后将U- Boot复制到DDR2上运行。
TI官方提供了标准的UBL源文件和bin文件,兼容性很强,可以直接用于我们的开发板,不过,也可以根据我们的实际需要在其基础上进行一定修改。
第三阶段的U-Boot主要用于建立内存映射以及堆栈、初始化主要功能模块和复制Linux内核到DDR2,然后传递一些参数给内核,最后转到内核 运行。由于这部分与实际的开发板联系紧密,而不同开发板总有些差别,所以需要根据实际情况来修改标准的U-Boot源文件以适应硬件参数。
2 U-Boot简介U-Boot(UniversalBootloader)是一种广泛用于嵌入式设备的开源bootloader。U-Boot支持许多系统架构,包 括PPC、ARM、MIPS、AVR32、X86、68K、Nios和MicroBlaze等。U-Boot也支持各种类型的文件系统,包括 Cramfs、ext2、FAT、FDOS、JFFS2、RegisFS和UBIFS等。U-Boot还支持不同类型操作系统,包括NetBSD,、 VxWorks、QNX、RTEMS、ARTOS、LynxOS和Linux等。
U-Boot源码可以在其官网http://www.denx.de/wiki/U-Boot/下载,U-Boot版本更新比较快,在U- Boot-2009.08版本及之前的版本中不支持DM646x系列SOC,只有对TI的DaVinci系列开发板的通用支持,在U-Boot- 2009.08之后的所有版本都有专门的对DM646x系列SOC的支持,使用这些版本的U-Boot进行移植时可以减少一定工作量。在本文的以下部分, 所有的分析及移植过程都是基于U-Boot-2009.08。
2.1 U-Boot源码结构U-Boot源码解压后所得的目录结构见图 2‑1。从图中可以看到,文件和文件夹很多,并且有些文件夹下面还有很多子文件夹或者有很多文件,但是,由于U-Boot是支持不同架构、不同文件系统、 不同开发板,而我们自己的开发板是ARM926ejs核的CPU,移植Linux操作系统,所以U-Boot源码中的大部分是与我们移植任务不相关的。从 后面也可以看到,我们移植时对源码修改的地方非常少,并且只局限于几个文件。
图2‑1 U-Boot目录结构
为了使U-Boot更简洁,可以删除顶层目录中的doc、lib_avr32、lib_blackfin、lib_generic、 lib_i386、lib_m68k、lib_microblaze、lib_mips、lib_nios、lib_nios2、lib_ppc、 lib_sh、lib_sparc、nand_spl、onenand_spl这些文件夹,还有board/中除davinci之外的所有文件夹、cpu /中除arm926ejs之外的所有文件夹。当然,其实还有很多文件与文件夹是与我们开发板无关的,不过比较琐碎,就不用再一一删除了。
对于U-Boot源码顶层目录中各主要文件夹的内容和功能,表 2‑1给出了简单的介绍。另外,在顶层目录中还有一个很重要的文件Makefile,这是整个U-Boot编译时依据的规则,在移植时也可能需要修改。
表 2‑1 U-Boot顶层目录结构
文件夹名
包含内容
api
独立于硬件的一些API
board
与开发板相关的文件
common
独立于处理器结构的通用代码,如内存大小探测、U-Boot命令
cpu
与cpu相关的文件,每个子文件夹对应一种架构的cpu
disk
一些磁盘操作函数
drivers
通用的驱动程序
doc
参考文档
fs
U-Boot支持的文件系统
include
头文件及系统配置文件
lib_xxx
与具体cpu架构相关的库文件
net
网络功能相关
post
上电自检
tools
生成U-Boot的工具
编译UBL
* Open the UBL project in CCS by clicking 'Project->Open' in CCS and selecting the project file 'ubldavinci.pjt'
inside 'build' directory.
* By default, the UBL build is configured for DM6467 @ 594MHz. To build UBL for DM6467T (alpha EVM), open
file 'ublconfig.cfg' present inside 'build' directory and uncomment the line "#-d UBL_CONFIG_1GHZ" by removing '#' at the
beginning of the line. Save the file and build the project by clicking 'F7' key in CCS. Assuming UBL project is selected
in project window, this will build UBL 'out' file and copy it to tools/util/Image directory.
* Open "Command Prompt(命令行)" and navigate to directory 'tools/util'
* Type 'makeublrom.bat' and press 'ENTER' which will create 'ublDaVinci.bin'
下载UBL
1 Change SW3 to UART boot mode (BM [0-3]:0001).
2 Using CCS, File->Load->nand_flash_writer.out and run (F5)
3 In the dialog box; enter the path of the UBL binary.(必须保证UBL文件在c盘下,路径最好没有中文字符)
4 In the dialog box asking for offset, enter 1
5 Specify 'y' for global erase
6 Wait until the flash writer completes writing ubl is written to NAND.
下载uboot
1 Change SW3 to UART boot mode (BM [0-3]:0001).
2 Using CCS, File->Load->nand_flash_writer.out and run (F5)
3 In the dialog box; enter the path of the u-boot.bin file.(必须保证U-boot文件在c盘下,路径最好没有中文字符)
4 In the dialog box asking for offset, enter 6
5 Specify 'n' for global erase
6 Specify 81080000 for the Application Entry Point
7 Specify 81080000 for the Application Load Address
8 Wait until the flash writer completes writing u-boot to NAND.
jffs2 启动环境变量配置
setenv bootargs 'mem=76M console=ttyS0,115200n8 root=/dev/mtdblock3 noinitrd rootfstype=jffs2 rw ip=off vpif_display.ch2_numbuffers=0 vpif_display.ch3_numbuffers=0'
配置tftp
setenv ipaddr 192.168.1.105
setenv serverip 192.168.1.101
使用tftp将uImage从server放到内存中
tftp 80000000 uImage
擦除nand flash
nand erase 0x160000 0x4000000
写flash
nand write 0x80000000 0x160000 0x200000
使用tftp将数据从server放到内存中
tftp 80000000 jffs2_16.img
擦除nand flash
nand erase 0x560000 0x7900000
写flash
nand write 0x80000000 0x560000 0x1000000
1 U-Boot移植
在U-Boot源码中,与某一个特定的开发板相关的文件或文件夹并不多,主要包括这些(其中有些是自己创建的):
l board/davinci/dm6467evm/
l cpu/arm926ejs/davinci/
l lib_arm/
l include/configs/davinci_dm6467evm.h
l include/asm-arm/arch-davinci
l drivers/mtd/nand
l 顶层Makefile及以上文件夹中的Makefile、config.mk
所以,在阅读U-Boot源码时,只需要专注于这些文件及文件夹,其他的一些U-Boot通用代码、硬件驱动程序等,一般来说是不用改,直接拿来使用就是。不过,如果所使用的一些外设与U-Boot不兼容或者有其他一些问题,那就需要自己去修改驱动程序。其实驱动程序的修改也是挺难的,能不修改就尽量别动,否则改错了后果更严重。
1.1 U-Boot移植的一般步骤
对于不同的开发板进行U-Boot移植时,其实都是按照一个通用的步骤来进行的,只是根据不同的开发板硬件参数和不同的U-boot版本,有些步骤要省去,有些任务要添加。一个通用的U-Boot移植过程如图 4‑1所示。图中的步骤有些其实也不是必须的,同时也可能缺少一些步骤。总之,需要根据实际情况修改。
图4‑1 U-Boot移植步骤[1]
在U-Boot源码包的顶层目录下有一个README文件,里面也有一段讲述U-Boot移植步骤的,不过那是别人用代码写出的步骤,很有意思,这里引用一下。
int main(int argc, char *argv[])
{
sighandler_t no_more_time;
signal(SIGALRM, no_more_time);
alarm(PROJECT_DEADLINE - toSec (3 * WEEK));
Download latest U-Boot source;
while (learning) {
Read the README file in the top level directory;
Read http://www.denx.de/twiki/bin/view/DULG/Manual;
Read applicable doc/*.README;
Read the source, Luke;
/* find . -name "*.[chS]" | xargs grep -i <keyword> */
}
if (a similar board exists) { /* hopefully... */
cp -a board/<similar> board/<myboard>
cp include/configs/<similar>.h include/configs/<myboard>.h
} else {
Create your own board support subdirectory;
Create your own board include/configs/<myboard>.h file;
}
Edit new board/<myboard> files
Edit new include/configs/<myboard>.h
while (!running) {
do {
Add / modify source code;
} until (compiles);
Debug;
}
return 0;
}
void no_more_time (int sig)
{
hire_a_guru();
}
一周热门 更多>