打印

TI davinci DM6467资料汇总

[复制链接]
2094|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangmangui|  楼主 | 2014-12-7 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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_50\DM646x_FlashAndBootUtils_1_50\DM646x\GNU;
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;

资料来自收集   供大家学习使用

相关帖子

沙发
zhangmangui|  楼主 | 2014-12-7 20:56 | 只看该作者
DM6467启动流程
在移植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的工具
2.2             U-Boot启动流程对于嵌入式操作系统移植,比较常见的是只使用两个阶段的bootloader,即RBL和U-boot,但是对于DaVinci系列开发板则不同, 它使用了三个阶段的bootloader。如第一章所述,第二阶段的UBL对PLL、DDR2以及其他一些较底层的部分进行了初始化,并且把U-Boot 复制到了DDR2,所以第三阶段的U-Boot就不需要再次进行底层初始化和代码重定位,因而减少了许多工作量,在移植U-Boot时也更简单。
对于我们的开发板,一个完整、正常的U-Boot启动流程主要包括以下这几个步骤:
(1)     首先需要由UBL在NAND中找到U-Boot的文件头(Header),然后根据header之后的数据将U-Boot复制到内存中的指定位置,然后转到U-Boot运行。
(2)     由cpu/arm926ejs/davinci/u-boot.lds文件设置系统入口,分配各个段(数据段、指令段、bss等)的地址。
(3)     由cpu/arm926ejs/davinci/start.S文件中的汇编程序初始化CPU,清理内存,设置堆栈和中断向量表,然后转到C语言函数入口。
(4)     由lib_arm/board.c文件中的start_armboot()函数分配堆栈和内存空间,初始化各种外设,例如NAND、EMAC、DDR2等,然后进入主循环,等待用户命令。
(5)     用户如果不输入命令,U-Boot就根据预先设置的启动命令来运行,如果用户修改了环境变量和启动参数,则保存数据,然后按照用户指令来启动Linux。
另外,整个U-Boot代码的执行是受include/configs/中的头文件的宏定义来控制的,它决定系统需要使用哪些模块、需要编译哪些代码。
3        U-Boot源码分析在U-Boot源码中,与硬件平台相关的文件是最重要的,需要详细分析其实现过程,即使在移植时不需要修改,但如果能熟悉这部分的程序那么能对U- Boot移植有更清晰的理解。而其他一些文件,比如U-Boot命令和各种驱动程序,这些是已经写好可以直接拿来用的,一般情况下是不需要修改的。
根据2.2 节中的启动流程,下面就对其中主要的几个文件进行详细分析。
3.1             cpu/arm926ejs/u-boot.ldsu-boot.lds是系统的链接文件,决定了一个可执行程序各个段的存储地址和程序的入口地址。u-boot.lds一般是不需要修改,不过,分析其代码可以更加深刻地理解内存中程序和数据的存储情况。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*  指定输出可执行文件是elf格式,32 位ARM指令,,小端 */
OUTPUT_ARCH(arm)       /* 指定输出可执行文件的平台是ARM */
ENTRY(_start)            /* 指定输出可执行文件的起始代码段为_start*/
SECTIONS
{
         . = 0x00000000;      /* 定位当前地址为0 */

         . = ALIGN(4);        /* 四字节对齐 */
         .text :              /* text 段 */
         {
                   cpu/arm926ejs/start.o    (.text)
                   *(.text)
         }

         . = ALIGN(4);
         .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }  /* 只读数据段 */

         . = ALIGN(4);
         .data : { *(.data) }      /* 读写数据段 */

         . = ALIGN(4);
         .got : { *(.got) }       /* got段,非标准段 */

         . = .;
         __u_boot_cmd_start = .;
         .u_boot_cmd : { *(.u_boot_cmd) }
         __u_boot_cmd_end = .;

         . = ALIGN(4);
         __bss_start = .;       /* bss段,用来存储未初始化的全局变量和静态变量 */

         .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
         _end = .;
}
3.2             cpu/arm926ejs/start.Sstart.S是U-Boot启动后执行的第一个文件,主要负责初始化CPU、设置堆栈和中断向量表等任务,执行完成之后就跳转到 lib_arm/board.c中的函数start_armboot()。start.S是ARM926EJS系列CPU通用的初始化文件,所以在移植时 也不用修改。
.globl _start                              /* 系统起始位置 */
_start:
         b       reset                            /* 系统跳到reset处执行 */
         ldr    pc, _undefined_instruction          /* 中断向量表 */

_TEXT_BASE:                             /* 定义U-Boot使用的映射区的标号 */
         .word        TEXT_BASE
.globl _armboot_start
_armboot_start:
         .word _start
.globl _bss_start
_bss_start:
         .word __bss_start
.globl _bss_end
_bss_end:
         .word _end

reset:                           /* 复位操作,设置ARM为SVC32工作模式 */
         mrs  r0,cpsr
         bic    r0,r0,#0x1f
         orr    r0,r0,#0xd3
         msr  cpsr,r0

stack_setup:                               /* 初始化栈空间 */
         ldr    r0, _TEXT_BASE                        /*  upper 128 KiB: relocated uboot */
         sub   r0, r0, #CONFIG_SYS_MALLOC_LEN        /*  malloc area   */
         sub   r0, r0, #CONFIG_SYS_GBL_DATA_SIZE   /*  board info    */

clear_bss:                     /* 清理bss区,全部置0    */
         ldr    r0, _bss_start                /* find start of bss segment    */
         ldr    r1, _bss_end                  /* stop here                */
         mov r2, #0x00000000               /* clear                   */
clbss_l:str         r2, [r0]                    /* clear loop...              */
         add  r0, r0, #4
         cmp r0, r1
         ble    clbss_l

         ldr    pc, _start_armboot
_start_armboot:                 /* 跳转到stage2的star_armboot() C语言函数 */
         .word start_armboot

/* 由于DM6467的U-Boot由UBL引导,UBL进行了底层的初始化并将U-Boot复制到了内存,所以start.S不进行lowlevel_init、relocate、关闭cache、关闭看门狗等操作 */
3.3             lib_arm/board.cstart.S执行完之后就跳到board.c文件中的start_armboot()函数,该函数是整个U-Boot的主函数,它初始化系统的各 种外设,然后转到主循环,根据用户指令来执行对应操作。start_armboot()函数是对ARM平台通用的主函数,在移植时可以不修改,也可以根据 实际需要修改一些。
void start_armboot (void)
{
         init_fnc_t **init_fnc_ptr;
         char *s;

     /* gd是全局变量指针,用于保存一些全局参数,例如IP、波特率、开发板ID、DDR2参数、系统初始化函数列表等。 全局变量存储在DDR2当中,U-Boot分配一个寄存器作为指针指向全局变量的存储地址 */
         gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
   
    /* 将分配给U-Boot全局变量的内存区域全部清零 */
         memset ((void*)gd, 0, sizeof (gd_t));
         gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
         memset (gd->bd, 0, sizeof (bd_t));

    /* 表示U-Boot被复制到RAM */
         gd->flags |= GD_标志寄存器_RELOC;

    /* 计算U-Boot代码段的长度 */
         monitor_flash_len = _bss_start - _armboot_start;

    /* 初始化时钟、环境变量、波特率、串口、控制台、输出控制、I2C、DRAM
如果某个函数初始化失败,即返回值不是0,那么U-Boot会输出提示信息,进入死循环,等待用户重启系统 */
         for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
                   if ((*init_fnc_ptr)() != 0) {
                            hang ();
                   }
         }

         /* 初始化malloc区域(全部置零),其地址是在U-Boot代码区域之前*/
         mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN);

#if defined(CONFIG_CMD_NAND)
         puts ("NAND:  ");
         nand_init();               
#endif

         /* 初始化环境参数 */
         env_relocate ();

#ifdef CONFIG_SERIAL_MULTI
         serial_initialize();
#endif

         gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

    /* 初始化标准输入输出设备 */
         stdio_init ();   

    /* 一些全局函数的初始化 */
         jumptable_init ();

         console_init_r ();     

         enable_interrupts ();

/* 初始化EMAC */
#ifdef CONFIG_DRIVER_TI_EMAC
extern void davinci_eth_set_mac_addr (const u_int8_t *addr);
         if (getenv ("ethaddr")) {
                   uchar enetaddr[6];
                   eth_getenv_enetaddr("ethaddr", enetaddr);
                   davinci_eth_set_mac_addr(enetaddr);
         }
#endif

         /* 获得U-Boot在DDR2中的加载地址,即0x8070 0000 */
         if ((s = getenv ("loadaddr")) != NULL) {
                   load_addr = simple_strtoul (s, NULL, 16);
         }

/* 复制启动文件的文件名,支持TFTP协议 */
#if defined(CONFIG_CMD_NET)
         if ((s = getenv ("bootfile")) != NULL) {
                   copy_filename (BootFile, s, sizeof (BootFile));
         }
#endif

/* 初始化以太网 */
#if defined(CONFIG_CMD_NET)
#if defined(CONFIG_NET_MULTI)
         puts ("Net:   ");
#endif
         eth_initialize(gd->bd);
#endif

         /* 主循环main_loop(),只有系统启动才能退出此循环 */
         for (;;) {
                   main_loop ();
         }
}

使用特权

评论回复
板凳
zhangmangui|  楼主 | 2014-12-7 20:59 | 只看该作者
SEED-DVS6467 硬件用户指南.pdf (558.31 KB)

使用特权

评论回复
地板
zhangmangui|  楼主 | 2014-12-7 21:03 | 只看该作者

使用特权

评论回复
5
zhangmangui|  楼主 | 2014-12-7 21:04 | 只看该作者
DM6467 文件系统和启动

编译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

使用特权

评论回复
6
zhangmangui|  楼主 | 2014-12-7 21:12 | 只看该作者
本帖最后由 zhangmangui 于 2014-12-7 21:16 编辑

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();
}
1.2   DM6467 U-Boot移植步骤
针对我们的DM6467开发板,在进行U-Boot移植时,步骤也是按照图 4‑1来进行的。由于我们使用的U-Boot版本是2009.08,它不支持DM6467开发板,所以在移植时我们需要创建对应的一些文件和文件夹,创建方法下面会有详细叙述。

1.2.1  修改Makefile
u-boot-2009.08不支持DM6467开发板,需要手动在顶层的Makefile文件中添加配置信息。
在2910行添加:
davinci_dm6467evm_config : unconfig
         @$(MKCONFIG) $(@:_config=) arm arm926ejs dm6467evm davinci davinci
U-Boot是根据此配置信息来确定开发板的型号和CPU架构等信息。同样,由于u-boot-2009.08不支持DM6467开发板,所以需要在board\davinci\文件夹中添加对应的开发板的文件夹,并在include\configs\目录中添加对应的头文件。u-boot-2009.08中对davinci系列开发板提供了通用的支持,我们可以直接修改在dvevm基础上修改,也可以创建自己的开发板文件夹,这里我们使用后者。
#在终端中使用以下命令创建开发板文件夹和头文件
cd /<your_dir>/u-boot-209.08/board/davinci
cp –f dvevm/* dm6467evm/
cd /<your_dir>/u-boot-2009.08/include/configs
cp –f davinci_dvevm.h davinci_dm6467evm.h
另外,如果使用的U-Boot版本比2009.08新的话,那么本节中的几个步骤就可以省去了。

1.2.2  修改lib_arm/config.mk
要生成ARM端可执行文件,需要使用交叉编译工具。这里使用的交叉编译器是Sourcery G++,安装在/opt/arm-2009q1/bin目录下。要使编译器生效,需要先在/root/.bashrc文件最后添加“export PATH=$PATH:/opt/arm-2009q1/bin:”,然后在终端中运行“source /root/.bashrc”才能使用该交叉编译器。
lib_arm/config.mk文件的修改如下所示:
24行修改为:
CROSS_COMPILE ?= arm-none-linux-gnueabi-
在修改完此处后,就可以编译生成u-boot.bin文件了。
cd /<your_dir>/u-boot-2009.08
make distclean
make davinci_dm6467evm_config
make
如果编译通过,就可以在顶层目录看到u-boot.bin等文件,这表明前面几个步骤是正确的。
1.2.3  修改include/configs/davinci_dm6467evm.h
davinci_dm6467evm.h文件是移植U-Boot时最核心的文件,需要在此文件中根据开发板上的资源和实际的功能需求来设置或者修改对应的参数以及宏定义。
在此文件中,主要的可能需要修改的部分包括时钟、网口、NAND Flash、DDR2 和启动参数等。
/*=======*/
/* Board */
/*=======*/
#define DAVINCI_DM6467EVM            /* 定义开发板型号 */
#define CONFIG_SYS_NAND_SMALLPAGE    /* NAND的page大小为512字节 */
/* #define CONFIG_SYS_USE_NOR */       /*注释此行代码,表示使用NAND不用NOR*/
#define CONFIG_SYS_USE_NAND          /* 我们使用的Flash是NAND */
/* #define CONFIG_SOC_DM644X */       /* 注释此行代码,使用下面的DM646x */
#define CONFIG_SOC_DM646x            /* 定义SOC型号,注意大小写!!! */
#define CFG_REFCLK_FREQ     33000000     /* 系统输入时钟为33MHz */

/*=============*/
/* Memory Info */
/*=============*/
/* 我们开发板使用的DDR2是256M,8个BANK,起始地址为0x8000000,都是默认参数,不需要修改 */

/*=====================*/
/* Flash & Environment */
/*=====================*/
/* 我们开发板上没有使用mtd,故屏蔽以下几行代码,不屏蔽会编译出错 */
/*
#define CONFIG_MTD_PARTITIONS
#define CONFIG_CMD_MTDPARTS
#define MTDIDS_DEFAULT                \
         "nand0=davinci_nand.0"
#define MTDPARTS_DEFAULT \
         "mtdparts=davinci_nand.0:384k(bootloader)ro,4m(kernel),-(filesystem)"
*/
/* 我们开发板上NAND的起始地址是0x42000000,大小128M,smallpage */
#define CONFIG_SYS_NAND_BASE          0x42000000  

/*==============================*/
/* U-Boot general configuration */
/*==============================*/
/* 设置bootdelay参数,在u-boot启动时,有3秒延时,用户可以按下任意键后推出自启动,进行个性化参数设置 */
#define CONFIG_BOOTDELAY                3
/* 这个宏定义用于条件编译输出ARM和DDR2时钟频率的函数,U-Boot-2009.08里没有此函数,所以屏蔽此行代码,当然,也可以自己编写 */
/* #define CONFIG_MISC_INIT_R */         

/*===================*/
/* Linux Information */
/*===================*/
#define CONFIG_BOOTARGS                     "mem=120M console=ttyS0,115200n8 root=/dev/hda1 rw noinitrd ip=dhcp"
/* 根据开发板设置的启动参数,在调试开发板时使用此参数比较方便 */
/* linux的文件系统使用NFS协议共享主机上的文件 */
/*
#define CONFIG_BOOTARGS                     "mem=76M console=ttyS0,115200n8 noinitrd rw " \
         "ip=192.168.0.68:192.168.0.83:192.168.0.254:255.255.255.0::eth0:off
eth=00:0c:29:89:09:82 " \
"root=/dev/nfs nfsroot=192.168.0.83:/home/tirvideo/lyb/armfs vpif_display.ch2_numbuffers=0"
*/

#define CONFIG_BOOTCOMMAND                  "setenv setboot setenv bootargs \\$(bootargs) video=dm64xxfb:output=\\$(videostd);run setboot; bootm 0x2050000"
/* 根据开发板设置的启动命令 */
/* 使用TFTP协议从主机下载linux内核映像文件到0x80700000地址(SDRAM)处进行启动 */
/* #define CONFIG_BOOTCONMMAND          "tftp 0x80700000 uImage;ping 192.168.0.83; bootm" */
1.2.4  修改board/davinci/dm6467evm/dm6467evm.c
此文件中主要包含了board_init()函数,用于开发板初始化。board_init()函数的功能是指定全局变量中的开发板ID、初始化一些必须使用的外设模块、设置某些寄存器等。
#define DAVINCI_DM646X_LPSC_EMAC         14    /* PSC模块中EMAC的ID */

int board_init(void)
{
         gd->bd->bi_arch_number = MACH_TYPE_DAVINCI_DM6467_EVM;
         gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;

         lpsc_on(DAVINCI_DM646X_LPSC_EMAC);    /* 使能EMAC */
    REG(PSC_PTCMD) = 1;  /* 设置PTCMD.GO = 1,使EMAC状态变成enable状态 */                  
   
         return 0;
}
1.2.5 其他修改
以上几个步骤是进行U-Boot移植时所必需的。但是完成以上几个步骤后编译U-Boot时会提示有错误。这是因为u-boot-2009.08版本没有完全支持DM6467,在driver/mtd/davinci_emac.c和cpu/arm926ejs/davinci/Makefile中还有需要修改的地方。
1.2.5.1 修改drivers/mtd/davinci_emac.c
对于DM6467 EMAC特有的寄存器,在u-boot-2009.08中是没有足够的支持的,所以需要修改此处以兼容DM6467。

/* davinci_eth_open()函数中添加红色标识的代码: */
static int davinci_eth_open(struct eth_device *dev, bd_t *bis)
{
         dv_reg_p          addr;
         u_int32_t                   clkdiv, cnt;
         volatile emac_desc *rx_desc;
         debug_emac("+ emac_open\n");
         adap_emac->SOFTRESET = 1;
         while (adap_emac->SOFTRESET != 0) {;}

#if defined(CONFIG_SOC_DM646x)
         adap_ewrap->SOFTRST = 1;
         while (adap_ewrap->SOFTRST != 0) {;}
#else
         adap_ewrap->EWCTL = 0;
         for (cnt = 0; cnt < 5; cnt++) {
                   clkdiv = adap_ewrap->EWCTL;
         }
#endif

         rx_desc = emac_rx_desc;
         adap_emac->TXCONTROL = 0x01;
         adap_emac->RXCONTROL = 0x01;
         adap_emac->MACINDEX = 0;
         adap_emac->MACADDRHI =
                   (davinci_eth_mac_addr[3] << 24) |
                   (davinci_eth_mac_addr[2] << 16) |
                   (davinci_eth_mac_addr[1] << 8)  |
                   (davinci_eth_mac_addr[0]);

#if defined(CONFIG_SOC_DM646x)
         /* Set VALID and MATCH bit along with MAC address bytes */
         adap_emac->MACADDRLO =
                   (davinci_eth_mac_addr[5] << 8) |
                   (davinci_eth_mac_addr[4]) | (1 << 19) | (1 << 20);
#else
         adap_emac->MACADDRLO =
                   (davinci_eth_mac_addr[5] << 8) |
                   (davinci_eth_mac_addr[4]);
#endif

/* dvinci_eth_close()函数中添加红色标识的代码 */
static void davinci_eth_close(struct eth_device *dev)
{
         debug_emac("+ emac_close\n");
         davinci_eth_ch_teardown(EMAC_CH_TX);    /* TX Channel teardown */
         davinci_eth_ch_teardown(EMAC_CH_RX);    /* RX Channel teardown */
         adap_emac->SOFTRESET = 1;

#if defined(CONFIG_SOC_DM646X)
         adap_ewrap->SOFTRST = 0;
#else
         adap_ewrap->EWCTL = 0;
#endif

         debug_emac("- emac_close\n");
}
1.2.5.2 修改cpu/arm926ejs/davinci/makefile
我们使用的cpu是属于DM646x系列,在u-boot-2009.08中只是有对于此系列芯片的定义,但是代码并不完全兼容。在cpu/arm926ejs/davinci/Makefile中没有指定要生成dm646x.o的目标文件,所以需要添加相关代码。

33行添加:
COBJS-$(CONFIG_SOC_DM646x)    += dm646x.o
1.3 改变硬件结构时如何修改U-Boot
对于Spectrum公司设计的DM6467开发板,TI推出了对应的修改过后的U-Boot源码和bin文件,但是,我们自己的开发板肯定和Spectrum公司的有一些不同,这些不同主要集中在NAND Flash、DDR2 SDRAM和输入时钟频率等,这就需要自己去修改U-Boot。

1.3.1   改变NAND Flash
在U-Boot中,对于NAND的支持主要通过两条途径实现。

第一,U-Boot中有它所支持的所有NAND型号的一个结构数组nand_flash_ids[],它存在于drivers/mtd/nand/nand_ids.c文件中,每种支持的NANDFlash都有对应的ID。在进行NAND初始化时,程序向NAND发送0x90命令,NAND就会返回其ID及参数信息,U-Boot通过匹配ID而获取NAND的型号和参数。例如,我们开发板上的NAND ID是0x78。
第二,在include/configs/davinci_dm6467evm.h头文件中,需要对NAND进行一些参数设置,例如“#defineCONFIG_SYS_USE_NAND”表示系统使用NAND Flash,“#define CONFIG_SYS_NAND_SMALLPAGE”表示NAND的页大小为512字节。
在自己设计开发板时,如果使用的NANDFlash型号与U-Boot不兼容,那么需要手动在nand_flash_ids[]中按格式添加所使用NAND的ID及其他参数信息。
如果所使用的NAND与U-Boot兼容,但是参数与默认参数设置不匹配时,需要在davinci_dm6467evm.h中修改。一般来说要修改的只有一个参数,即页大小。例如我们自己设计的开发板上的NAND页大小为2048字节(2K),所以需要在头文件中注释掉“#define CONFIG_SYS_NAND_SMALLPAGE”。
另外需要注意的是NAND在系统内存空间中的起始地址,如果设置错误那U-Boot是无法启动的。在DM6467中NAND的起始地址是0x4200 0000。
1.3.2  改变DDR2
对于DDR2的初始化是在UBL中完成的,U-Boot只需要根据头文件中定义的几个参数就可以直接使用DDR2.所以,如果使用了不同的DDR2,那么主要的修改是在UBL中,在U-Boot中的修改很少,主要是包括两三个宏定义。第一,“#define PHYS_SDRAM_1_SIZE 0x10000000”,定义DDR2的大小,默认是256M。第二,“#defineDDR_8BANKS”定义DDR2的bank数,默认是8个bank

1.3.3  改变时钟输入频率
对于系统PLL的设置是在UBL中完成的,在U-Boot中不需要再次设置PLL。不过,在U-Boot中要设置参考时钟输入频率,因为U-Boot要根据它来计算出正确的ARM和DDR2时钟频率然后输出。

当系统的输入时钟频率发生变化时,只需要在davinci_dm6467evm.h中修改宏定义的值,“#defineCONFIG_SYS_HZ_CLOCK 33000000”表示设置系统输入时钟为33MHz,默认参数是27MHz。

使用特权

评论回复
7
cer1991| | 2014-12-8 07:38 | 只看该作者
好贴,顶一下

使用特权

评论回复
8
大秦正声| | 2014-12-8 10:56 | 只看该作者
好高大上

使用特权

评论回复
9
edishen| | 2014-12-8 17:58 | 只看该作者
楼主 威武 帖子不错哦

使用特权

评论回复
10
zhangmangui|  楼主 | 2014-12-8 21:54 | 只看该作者
cer1991 发表于 2014-12-8 07:38
好贴,顶一下

有没有相关资料  分享一下   

使用特权

评论回复
11
zhangmangui|  楼主 | 2015-1-3 22:44 | 只看该作者
TI davinci DM6467资料汇总

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入【TI DSP 论坛】 & 【DSP 技术】           TI忠诚粉丝!

934

主题

26373

帖子

585

粉丝