OMAP-L138_FlashAndBootUtils使用及编译指导
2013-07-01
作者:吴红军
来源:TI通用数字信号处理系统技术支持
摘要
本文介绍OMAP-L138_FlashAndBootUtils工具包基本框架和串口烧写工具sfh_OMAP-L138.exe工作原理,使用方法,以及针对客户的硬件如何修改代码,搭建编译环境并重新编译,并总结了使用该工具的常见问题。
关键字:OMAPL138, 串口烧写, UBL
简介
OMAP-L138支持多种启动模式,包括SPI,NAND,NOR等。TI为用户提供了两套flash烧写工具:
(1) 使用TI 在PSP 包或OMAP-L138_FlashAndBootUtils 包中提供的flash writer 的CCS工程,通过仿真器连接硬件板,按照提示步骤烧写flash。
(2) 使用OMAP-L138_FlashAndBootUtils工具包中的串口烧写工具(如sfh_OMAP-L138.exe),通过串口连接,进行命令行烧写。
本文接下来将针对第二种方式进行详细介绍。
用户可以从开源网站上下载最新的OMAP-L138_FlashAndBootUtils版本[1]。最新的版本为OMAPL138_FlashAndBootUtils_2_40,本文以此版本展开讨论。
OMAP-L138_FlashAndBootUtils_2_40工具包支持TI公司的多种芯片平台的flash烧写,包括OMAPL138,AM1808,C6748等。工具包内的代码是对应LogicPD的OMAL138/AM1808 EVM板的。如果用于用户自己的硬件板,可能需要修改工具包中相应代码并重新编译。
该工具包中包括多种flash工具及代码。主要目录如表1所示。
表1 OMAP-L138_FlashAndBootUtils_2_40工具包目录结构
1.串口烧写工具sfh_OMAP-L138.exe的工作原理
sfh_OMAP-L138是OMAP-L138_FlashAndBootUtils包中用于实现串口烧写flash的应用程序。与UartHost.exe[3]工具不同,UartHost.exe是UART启动工具,不能烧写flash。
运行sfh_OMAP-L138.exe时,通过UART启动方式下载并运行OMAPL138/GNU/sft目录下的AIS格式bin文件,完成芯片的初始化操作。然后通过UART与sfh进行命令交换,实现flash的擦除和烧写工作。
从OMAP-L138/GNU/sft/build目录中的makefile文件可知,编译sft目录内各bin文件时需要sft.c,device.c,uart.c以及针对不同flash对应的flash初始化文件。
例如sft_OMAPL138_SPI_MEM.bin是由sft.c,device.c,uart.c等文件与spi.c,spi_mem.c,device_spi.c一起编译,并通过OMAP-L138/GNU/AISUtils目录下的HexAIS_OMAP-L138.exe,根据sft目录下的配置文件sft_hexais.ini内的配置信息,将.out文件转换成AIS格式的.bin文件。
2.命令格式介绍
在命令行下输入sfh_OMAP-L138.exe –help输出命令格式说明如下:
sfh_OMAP-L138 3. sfh_OMAPL138.exe常用命令的使用 sfh_OMAPL138.exe常用命令如表2所示。 表2 sfh_OMAPL138.exe常用命令表 以SPI flash启动为例,准备如下文件: . sfh_OMAPL138.exe,来源于OMAP-L138_FlashAndBootUtils_2_40工具包。 . ubl-spi_ais.bin,来源于OMAP-L138_FlashAndBootUtils_2_40工具包。 . u-boot.bin,来源于SDK PSP目录下的UBoot。 . u-boot-ais.bin,由UBoot编译出的elf格式文件u-boot,通过AIS转换工具生成。 首先将OMAL138/AM1808 EVM板设置为UART2启动模式,S7开关设置如图1所示。用直连串口线连接PC与EVM板,打开EVM板电源。在命令行模式下进入目录:OMAP-L138_FlashAndBootUtils_2_40\OMAPL138\GNU。 图1 S7开关设置 3.1全局擦除flash命令 sfh_OMAPL138.exe –targetType OMAP-L138 –flashType SPI_MEM –erase 图2 sfh_OMAPL138.exe –erase命令运行界面 运行结果如图2所示,如果是先上电,后执行该命令,则需要按下板子上的reset键输出“BOOTME”给上位机的sfh。 3.2烧写单个AIS格式的应用程序 sfh_OMAP-L138.exe –targetType OMAP-L138 –flashType SPI_MEM -flash_noubl u-boot-ais.bin OMAP-L138的RBL支持AIS格式,可以在启动过程中通过AIS格式文件中的配置信息初始化芯片,如PLL,DDR等。这样就可以直接将程序加载到片外内存,而不受片上内存大小限制,省略二级Boot。 编译UBoot时,在UBoot根目录下会生成一个elf格式的u-boot文件,如图3所示,在AISgen.exe工具里添加PLL,DDR等配置参数,将此文件转换成AIS格式的bin文件,可以直接烧写并启动。 图3 AISgen配置界面 该命令将AIS格式的UBoot文件写到flash的起始地址。命令执行显示结果如图4所示:重新上电,从图5启动信息可见没有UBL的运行信息,是直接从UBoot运行的。 图4 sfh_OMAPL138.exe –flash_noubl命令运行界面 重新上电,从图5启动信息可见没有UBL的运行信息,是直接从UBoot运行的。 图5从UBoot直接运行界面 3.3烧写UBL和UBoot sfh_OMAP-L138.exe –targetType OMAP-L138 –flashType SPI_MEM -flash ubl-spi-ais.bin u-boot.bin命令执行结果显示如图5所示。该命令将ubl-spi-ais.bin写到flash的起始地址,u-boot.bin写到flash的0x10000的偏移地址。 图6 sfh_OMAPL138.exe –flash命令运行界面 UBL和UBoot烧写完后,关闭EVM板电源,按图6所示,将EVM板的S7开关设为SPI flash启动。 图7 S7开关设置为SPI Flash启动 打开串口终端如Hyper terminal,打开EVM板电源,串口终端输出信息如图7所示,表示UBL和UBoot成功烧写,并成功从SPI flash启动 图8终端调试信息输出 使用sfh_OMAP-L138.exe烧写UBL和UBoot时,建议使用工具包自带的UBL。因为UBoot的烧写地址,要与UBL的读取地址一致,这样UBL运行时,才能正确的读取UBoot。工具包自带的UBL与烧写工具保证了这一点。其它版本的UBL需要用户自行确认。 4.根据硬件改动修改serial flash utility 开发者自己的硬件板与TI的EVM比较,会影响工具使用的不同部分可能存在于: (1)DDR型号 (2)FLASH型号 (3)时钟频率 (4)UART配置 4.1 DDR参数修改 EVM板用的是mDDR,大多数用户用的是DDR2,需要修改OMAP-L138/Common/src/device.c文件中函数Uint32 DEVICE_ExternalMemInit( )的5个DDR参数值。这个函数同样被UBL调用,如果不用UBL,则要在AISgen界面里配置正确的DDR参数。 可使用TI提供的DDR寄存器配置工具[5]。根据DDR手册进行DDR参数的计算, 4.2 SPI flash 如果更改了SPI flash的硬件连接,可在OMAP-L138\Common\include\device_spi.h文件中修改配置。 #define DEVICE_SPIBOOT_PERIPHNUM (1)//选择SPI1 #define DEVICE_SPI_UBL_HDR_OFFSET (0*1024)//ubl在SPI flash中的偏移地址 #define DEVICE_SPI_APP_HDR_OFFSET (64*1024)//application image在SPI flash中的偏移地址如果更换了与EVM板不同的SPI flash,必要时需要修改如下两个文件: OMAP-L138\Common\drivers\include\Spi_mem.h OMAP-L138\Common\drivers\src\Spi_mem.c 4.3 NAND flash NAND flash的数据位宽配置在OMAP-L138\Common\include\device_async_mem.h文件中定义: #define DEVICE_ASYNC_MEM_NANDBOOT_BUSWIDTH (DEVICE_BUSWIDTH_8BIT) 如果NAND flash更换的与EVM上的不同,必要时需要修改如下两个文件 OMAP-L138\Common\drivers\include\Device_nand.h OMAP-L138\Common\drivers\src\Device_nand.c 4.4 NOR flash NOR flash是标准设备,除了时序参数之外,一般不需要修改,NOR flash相关代码文件如下: OMAP-L138_FlashAndBootUtils_2_40\Common\drivers\src\nor.c OMAP-L138_FlashAndBootUtils_2_40\Common\drivers\include\nor.h OMAP-L138\Common\src\device_async_mem.c OMAP-L138\Common\include\device_async_mem.h OMAP-L138_FlashAndBootUtils_2_40\Common\drivers\src\ async_mem.c 4.5时钟及PLL 如果外部输入时钟频率不是24MHz,则需要OMAP-L138\Common\src\device.c文件中函数DEVICE_PLL0Init()和DEVICE_PLL1Init()的参数值。 函数原型Uint32 DEVICE_PLL0Init(Uint8 clk_src, Uint8 pllm, Uint8 prediv, Uint8 postdiv, Uint8 div1 ,Uint8 div3, Uint8 div7)中pllm是PLL的倍频系数,主频计算公式为: 函数DEVICE_PLL1Init()参数含义与PLL0的类同,为DDR提供时钟。 4.6 UART配置 如果系统主频发生变化,相应的模块时钟也改变,调试串口的分频值需要做相应调整,否则串口输出会因为波特率不正确而出现乱码。根据不同的主频修改OMAP-L138\Common\src\device_uart.c中DEVICE_UART_config的UART时钟分频系数divider的值,得到合适的UART波特率。 如果不是用UART2做为调试串口,修改OMAP-L138\Common\include\ device_uart.h文件中的DEVICE_UART_PERIPHNUM定义。 5. OMAP-L138_FlashAndBootUtils编译环境搭建 在根据硬件改动,修改了代码后,需要对工具包重新编译,生成UBL和sfh_OMAP-L138.exe。如果在Linux下使用此工具,需要在Linux下进行编译(具体编译过程参考参考文献4)。下面介绍如何在Windows环境下搭建OMAP-L138_FlashAndBootUtils的编译环境。 编译环境需要的几个工具如下[6]: (1)cygwin (2).NET framework (3)ARM Compiler tools(CodeSourcery G++ Lite) (4)C6x Compiler Tools (5)CCSV5 5.1 Cygwin安装 从http:/ / www. cygwin. com/下载并运行在线安装工具setup.exe,注意安装路径中不能带有空格。具体步骤如下: 1) 选择从互联网安装;也可以选择先下载,再从本地安装。 图9 cygwin安装界面1 2) 选择安装路径。 图10 cygwin安装界面2 3) 可选择直接连接或使用代理。 图11 cygwin安装界面3 4) 选择从哪个网址或者服务器上进行下载。 图12 cygwin安装界面4 5) 选择安装包 图13 cygwin安装界面4 一般选择以下三项,其他默认即可。 • Devel-->make: The GNU version of the 'make' utility • Devel-->subversion: A version control subsystem • Editor-->vim (or similar) 安装后要先运行一次cygwin 后,才会在cygwin/home/下出现Administrator 目录,进入该目录,修改.bashrc。 同时,需要验证变量TMP和TEMP是否包含/tmp。使用如下命令: echo $TMP echo $TEMP 如果找不到"unset TMP" and "unset TEMP",可在cygwin\home\[user]\.bashrc 文件中添加如下命令创建: export TMP=/tmp export TEMP=/tmp 设置完后,重新打开cygwin即可。至此,cygwin安装完成。 5.2 NET framework 从下面网址下载安装最新的.NET Framework(4.0或者更高的版本) http:/ / www. microsoft. com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=en 安装默认路径为C盘。然后将C#编译器路径添加到windows系统环境变量中。进入目录 C:\WINDOWS\Microsoft.NET\Framework查看软件的版本号并复制,如 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319。然后右键我的电脑->属性->高级->环境变量,如图13所示,选择系统变量中的path 点击编辑,在原有变量值后粘帖添加刚刚复制的内容,路径之间以’;’分隔。至此,Net Framework安装结束。 图14 windows环境变量设置 5.3 C6x Compiler Tools 在CCSV5安装目录下ccsv5\tools\compiler\c6000_7.3.4即为C6x编译器目录,在CCSV3.3下的路径为CCStudio_v3.3\C6000\cgtools\bin。如果没有安装CCS,从下面网址下载TI的C6x 编译工具并安装,如不确认版本则下载最新版本。 https:/ / www-a. ti. com/ downloads/ sds_support/ TICodegenerationTools/download. htm 将C6x编译器路径添加到windows环境变量。 5.4 ARM Compiler tools(CodeSourcery G++ Lite) 从下面网址下载安装GCC交叉编译器。注意交叉编译工具的安装目录名不能含有空格,否则编译时会报错。 https://sourcery.mentor.com/sgpp/lite/arm/portal/release858 修改OMAP-L138_FlashAndBootUtils_2_40\Common\build.mak文件中的ARM_TOOLS_PATH变量为交叉编译器的安装路径。例如ARM_TOOLS_PATH?=C:\\CodeSourcery\\arm-2009q1-203\\ 5.5 CCSV5 如果需要用CCS编译工程,则安装CCS。 6.编译OMAP-L138_FlashAndBootUtils 6.1查看环境变量 打开cygwin,输入export,查看环境变量是否设置成功。显示如下,黑色加粗的目录为之前添加的环境变量。 如未添加成功,可以使用如下命令添加: export PATH= 6.2编译工具包 cd OMAP-L138 如果只是编译命令行工具(如sfh_OMAP-L138),而不需要重新编译CCS 工程,则进入GNU目录进行编译;如果只需要重新编译CCS工程,则进入CCS目录进行编译;如果两者都需要,则在OMAP-L138这个目录进行编译。编译命令如下: make clean make 7.使用serial flash utility常见问题及解决方法 7.1收不到“BOOTME” 在带电情况下,复位芯片,如果还是收不到正确的“BOOTME”,检查BOOTMODE设置,串口终端波特率等参数设置,串口线连接方式。 7.2停在Waiting for SFT on the OMAP-L138… 如图14 所示,这种情况的原因通常有两种:一是由于DDR 参数配置不正确从而导致程序运行异常,不能返回正确的指令给主机;二是硬件原因,可能是焊接,或硬件连接上的错误造成的。可以通过仿真器连接目标板用BSL库提供的测试程序验证一下DDR,和相应的flash。如果没有仿真器,可以通过间接的方法,比如用AISgen 工具包里提供的UART 启动工具UartHost.exe 来加载运行测试程序,检测DDR,flash 等,将测试结果通过串口回传显示,或者设置GPIO的状态来反映。 图15 sfh_OMAP-L138.exe命令运行异常 7.3烧写中途停止 如图15所示,烧写在中途停止,这种情况通常是因为DDR工作不稳定,原因可能是DDR布线问题导致信号完整性差,可以尝试降低DDR时钟,并用示波器测量信号质量。 DDR不稳定也可能表现在能成功烧写,但运行不正常,通常表现为串口打印停在解压或启动内核阶段。 图16 sfh_OMAP-L138.exe命令运行异常信息 7.4启动后串口没打印 烧写成功,启动后串口没打印,检查U-boot里的调试串口配置,默认为UART2。 参考文献: (1)http://sourceforge.net/projects/dvflashutils/files/OMAP-L138/v2.40/ (2) AISgen工具下载地址:http://www-s.ti.com/sc/techlit/sprab41.zip (3)http://www.ti.com/lit/an/spraba5b/spraba5b.pdf (4)http://processors.wiki.ti.com/index.php/Serial_Boot_and_Flash_Loading_Utility_for_OMAP-L138 (5)http://processors.wiki.ti.com/images/d/db/MDDR_DDR2_Memory_Controller_Register_Calc_Rev4.zip (6)http://processors.wiki.ti.com/index.php/Rebuilding_the_Flash_and_Boot_Utils_Package